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

1.1       www         1: # The LearningOnline Network
1.2       www         2: # Documents
1.1       www         3: #
1.254   ! albertel    4: # $Id: londocs.pm,v 1.253 2006/11/15 14:33:46 www Exp $
1.1       www         5: #
1.3       www         6: # Copyright Michigan State University Board of Trustees
1.1       www         7: #
1.3       www         8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
1.1       www         9: #
1.3       www        10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
1.1       www        14: #
1.3       www        15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
                     28: 
1.2       www        29: package Apache::londocs;
1.1       www        30: 
                     31: use strict;
1.28      www        32: use Apache::Constants qw(:common :http);
1.158     raeburn    33: use Apache::imsexport;
1.4       www        34: use Apache::lonnet;
                     35: use Apache::loncommon;
1.245     albertel   36: use LONCAPA::map();
                     37: use Apache::lonratedt();
1.15      www        38: use Apache::lonxml;
1.244     albertel   39: use Apache::lonclonecourse;
1.138     raeburn    40: use Apache::lonnavmaps;
1.38      www        41: use HTML::Entities;
1.27      www        42: use GDBM_File;
1.81      www        43: use Apache::lonlocal;
1.143     raeburn    44: use Cwd;
1.228     www        45: use LONCAPA;
1.7       www        46: 
1.8       www        47: my $iconpath;
1.7       www        48: 
1.27      www        49: my %hash;
                     50: 
                     51: my $hashtied;
1.29      www        52: my %alreadyseen=();
1.27      www        53: 
1.40      www        54: my $hadchanges;
                     55: 
1.47      www        56: # Available help topics
                     57: 
                     58: my %help=();
                     59: 
1.245     albertel   60: # Mapread read maps into LONCAPA::map:: global arrays 
1.10      www        61: # @order and @resources, determines status
1.7       www        62: # sets @order - pointer to resources in right order
                     63: # sets @resources - array with the resources with correct idx
                     64: #
                     65: 
                     66: sub mapread {
                     67:     my ($coursenum,$coursedom,$map)=@_;
                     68:     return
1.245     albertel   69:       &LONCAPA::map::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
                     70: 			     $map);
1.7       www        71: }
                     72: 
                     73: sub storemap {
                     74:     my ($coursenum,$coursedom,$map)=@_;
1.104     albertel   75:     my ($outtext,$errtext)=
1.245     albertel   76:       &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
                     77: 			      $map,1);
1.104     albertel   78:     if ($errtext) { return ($errtext,2); }
                     79:     
                     80:     $hadchanges=1;
                     81:     return ($errtext,0);
1.7       www        82: }
                     83: 
1.74      www        84: # ----------------------------------------- Return hash with valid author names
                     85: 
                     86: sub authorhosts {
                     87:     my %outhash=();
                     88:     my $home=0;
                     89:     my $other=0;
1.174     albertel   90:     foreach (keys %env) {
1.74      www        91: 	if ($_=~/^user\.role\.(au|ca)\.(.+)$/) {
                     92: 	    my $role=$1;
                     93: 	    my $realm=$2;
1.174     albertel   94: 	    my ($start,$end)=split(/\./,$env{$_});
1.74      www        95: 	    if (($start) && ($start>time)) { next; }
                     96: 	    if (($end) && (time>$end)) { next; }
                     97: 	    my $ca; my $cd;
                     98: 	    if ($1 eq 'au') {
1.174     albertel   99: 		$ca=$env{'user.name'};
                    100: 		$cd=$env{'user.domain'};
1.74      www       101: 	    } else {
                    102: 		($cd,$ca)=($realm=~/^\/(\w+)\/(\w+)$/);
                    103: 	    }
1.107     albertel  104: 	    my $allowed=0;
                    105: 	    my $myhome=&Apache::lonnet::homeserver($ca,$cd);
                    106: 	    my @ids=&Apache::lonnet::current_machine_ids();
                    107: 	    foreach my $id (@ids) { if ($id eq $myhome) { $allowed=1; } }
                    108: 	    if ($allowed) {
1.74      www       109: 		$home++;
                    110: 		$outhash{'home_'.$ca.'@'.$cd}=1;
                    111: 	    } else {
1.107     albertel  112: 		$outhash{'otherhome_'.$ca.'@'.$cd}=$myhome;
1.74      www       113: 		$other++;
                    114: 	    }
                    115: 	}
                    116:     }
                    117:     return ($home,$other,%outhash);
                    118: }
                    119: # ------------------------------------------------------ Generate "dump" button
                    120: 
                    121: sub dumpbutton {
                    122:     my ($home,$other,%outhash)=&authorhosts();
1.230     albertel  123:     my $type = &Apache::loncommon::course_type();
1.74      www       124:     if ($home+$other==0) { return ''; }
                    125:     my $output='</td><td bgcolor="#DDDDCC">';
                    126:     if ($home) {
                    127: 	return '</td><td bgcolor="#DDDDCC">'.
1.81      www       128: 	    '<input type="submit" name="dumpcourse" value="'.
1.230     albertel  129: 	    &mt('Dump '.$type.' DOCS to Construction Space').'" />'.
1.130     www       130: 	    &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs');
1.74      www       131:     } else {
                    132: 	return'</td><td bgcolor="#DDDDCC">'.
1.230     albertel  133:      &mt('Dump '.$type.
                    134: 	 ' DOCS to Construction Space: available on other servers');
1.74      www       135:     }
                    136: }
                    137: 
1.164     albertel  138: sub clean {
                    139:     my ($title)=@_;
                    140:     $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs;
                    141:     return $title;	
                    142: }
1.74      www       143: # -------------------------------------------------------- Actually dump course
                    144: 
                    145: sub dumpcourse {
1.224     albertel  146:     my ($r) = @_;
1.230     albertel  147:     my $type = &Apache::loncommon::course_type();
                    148:     $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space').
                    149: 	      '<form name="dumpdoc" method="post">');
1.74      www       150:     my ($home,$other,%outhash)=&authorhosts();
1.75      www       151:     unless ($home) { return ''; }
1.174     albertel  152:     my $origcrsid=$env{'request.course.id'};
1.76      www       153:     my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);
1.174     albertel  154:     if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
1.76      www       155: # Do the dumping
1.174     albertel  156: 	unless ($outhash{'home_'.$env{'form.authorspace'}}) { return ''; }
                    157: 	my ($ca,$cd)=split(/\@/,$env{'form.authorspace'});
1.87      www       158: 	$r->print('<h3>'.&mt('Copying Files').'</h3>');
1.174     albertel  159: 	my $title=$env{'form.authorfolder'};
1.164     albertel  160: 	$title=&clean($title);
1.79      www       161: 	my %replacehash=();
1.174     albertel  162: 	foreach (keys %env) {
1.79      www       163: 	    if ($_=~/^form\.namefor\_(.+)/) {
1.174     albertel  164: 		$replacehash{$1}=$env{$_};
1.79      www       165: 	    }
                    166: 	}
1.174     albertel  167: 	my $crs='/uploaded/'.$env{'request.course.id'}.'/';
1.79      www       168: 	$crs=~s/\_/\//g;
                    169: 	foreach (keys %replacehash) {
                    170: 	    my $newfilename=$title.'/'.$replacehash{$_};
1.205     albertel  171: 	    $newfilename=~s/\.(\w+)$//;
                    172: 	    my $ext=$1;
1.164     albertel  173: 	    $newfilename=&clean($newfilename);
1.205     albertel  174: 	    $newfilename.='.'.$ext;
1.79      www       175: 	    my @dirs=split(/\//,$newfilename);
                    176: 	    my $path='/home/'.$ca.'/public_html';
                    177: 	    my $makepath=$path;
                    178: 	    my $fail=0;
                    179: 	    for (my $i=0;$i<$#dirs;$i++) {
                    180: 		$makepath.='/'.$dirs[$i];
                    181: 		unless (-e $makepath) { 
                    182: 		    unless(mkdir($makepath,0777)) { $fail=1; } 
                    183: 		}
                    184: 	    }
                    185: 	    $r->print('<br /><tt>'.$_.'</tt> => <tt>'.$newfilename.'</tt>: ');
                    186: 	    if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {
                    187: 		if ($_=~/\.(sequence|page|html|htm|xml|xhtml)$/) {
1.244     albertel  188: 		    print $fh &Apache::lonclonecourse::rewritefile(
                    189:          &Apache::lonclonecourse::readfile($env{'request.course.id'},$_),
1.79      www       190: 				     (%replacehash,$crs => '')
                    191: 								    );
                    192: 		} else {
                    193: 		    print $fh
1.244     albertel  194:          &Apache::lonclonecourse::readfile($env{'request.course.id'},$_);
1.79      www       195: 		       }
                    196: 		$fh->close();
                    197: 	    } else {
                    198: 		$fail=1;
                    199: 	    }
                    200: 	    if ($fail) {
                    201: 		$r->print('<font color="red">fail</font>');
                    202: 	    } else {
                    203: 		$r->print('<font color="green">ok</font>');
                    204: 	    }
                    205: 	}
1.76      www       206:     } else {
                    207: # Input form
                    208: 	unless ($home==1) {
                    209: 	    $r->print(
1.81      www       210: 		      '<h3>'.&mt('Select the Construction Space').'</h3><select name="authorspace">');
1.76      www       211: 	}
                    212: 	foreach (sort keys %outhash) {
                    213: 	    if ($_=~/^home_(.+)$/) {
                    214: 		if ($home==1) {
                    215: 		    $r->print(
                    216: 		  '<input type="hidden" name="authorspace" value="'.$1.'" />');
                    217: 		} else {
1.133     www       218: 		    $r->print('<option value="'.$1.'">'.$1.' - '.
                    219: 			      &Apache::loncommon::plainname(split(/\@/,$1)).'</option>');
1.76      www       220: 		}
                    221: 	    }
                    222: 	}
                    223: 	unless ($home==1) {
                    224: 	    $r->print('</select>');
                    225: 	}
                    226: 	my $title=$origcrsdata{'description'};
1.227     albertel  227: 	$title=~s/[\/\s]+/\_/gs;
1.164     albertel  228: 	$title=&clean($title);
1.81      www       229: 	$r->print('<h3>'.&mt('Folder in Construction Space').'</h3><input type="text" size="50" name="authorfolder" value="'.$title.'" /><br />');
1.76      www       230: 	&tiehash();
1.81      www       231: 	$r->print('<h3>'.&mt('Filenames in Construction Space').'</h3><table border="2"><tr><th>'.&mt('Internal Filename').'</th><th>'.&mt('Title').'</th><th>'.&mt('Save as ...').'</th></tr>');
1.244     albertel  232: 	foreach (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
1.78      www       233: 	    $r->print('<tr><td>'.$_.'</td>');
                    234: 	    my ($ext)=($_=~/\.(\w+)$/);
                    235: 	    my $title=$hash{'title_'.$hash{
                    236: 		'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}};
1.163     albertel  237: 	    $title=~s/&colon;/:/g;
1.78      www       238: 	    $r->print('<td>'.($title?$title:'&nbsp;').'</td>');
1.235     albertel  239: 	    if (!$title) {
1.78      www       240: 		$title=$_;
1.235     albertel  241: 	    } else {
                    242: 		$title=~s|/|_|g;
1.78      www       243: 	    }
                    244: 	    $title=~s/\.(\w+)$//;
1.164     albertel  245: 	    $title=&clean($title);
1.78      www       246: 	    $title.='.'.$ext;
1.79      www       247: 	    $r->print("\n<td><input type='text' size='60' name='namefor_".$_."' value='".$title."' /></td></tr>\n");
1.76      www       248: 	}
1.78      www       249: 	$r->print("</table>\n");
1.76      www       250: 	&untiehash();
                    251: 	$r->print(
1.229     raeburn   252:   '<p><input type="submit" name="dumpcourse" value="'.&mt('Dump [_1] DOCS',$type).'" /></p></form>');
1.75      www       253:     }
1.74      www       254: }
1.76      www       255: 
1.138     raeburn   256: # ------------------------------------------------------ Generate "export" button
                    257: 
                    258: sub exportbutton {
1.230     albertel  259:     my $type = &Apache::loncommon::course_type();
1.138     raeburn   260:     return '</td><td bgcolor="#DDDDCC">'.
                    261:             '<input type="submit" name="exportcourse" value="'.
1.230     albertel  262:             &mt('Export '.$type.' to IMS').'" />'.
1.203     raeburn   263:     &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs');
1.138     raeburn   264: }
                    265: 
                    266: sub exportcourse {
                    267:     my $r=shift;
1.230     albertel  268:     my $type = &Apache::loncommon::course_type();
1.138     raeburn   269:     my %discussiontime = &Apache::lonnet::dump('discussiontimes',
1.174     albertel  270:                                                $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'});
1.138     raeburn   271:     my $numdisc = keys %discussiontime;
                    272:     my $navmap = Apache::lonnavmaps::navmap->new();
                    273:     my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
                    274:     my $curRes;
1.143     raeburn   275:     my $outcome;
1.138     raeburn   276: 
                    277:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                    278:                                             ['finishexport']);
1.174     albertel  279:     if ($env{'form.finishexport'}) {
1.138     raeburn   280:         &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                    281:                                             ['archive','discussion']);
                    282: 
1.175     albertel  283:         my @exportitems = &Apache::loncommon::get_env_multiple('form.archive');
                    284:         my @discussions = &Apache::loncommon::get_env_multiple('form.discussion');
1.143     raeburn   285:         if (@exportitems == 0 && @discussions == 0) {
                    286:             $outcome = '<br />As you did not select any content items or discussions for export, an IMS package has not been created.  Please <a href="javascript:history.go(-1)">go back</a> to select either content items or discussions for export';
                    287:         } else {
                    288:             my $now = time;
                    289:             my %symbs;
                    290:             my $manifestok = 0;
                    291:             my $imsresources;
                    292:             my $tempexport;
                    293:             my $copyresult;
                    294:             my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport);
                    295:             if ($manifestok) {
1.157     raeburn   296:                 &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest);
1.143     raeburn   297:                 close($ims_manifest);
                    298: 
                    299: #Create zip file in prtspool
                    300:                 my $imszipfile = '/prtspool/'.
1.174     albertel  301:                 $env{'user.name'}.'_'.$env{'user.domain'}.'_'.
1.143     raeburn   302:                    time.'_'.rand(1000000000).'.zip';
                    303:                 my $cwd = &Cwd::getcwd();
                    304:                 my $imszip = '/home/httpd/'.$imszipfile;
                    305:                 chdir $tempexport;
                    306:                 open(OUTPUT, "zip -r $imszip *  2> /dev/null |");
                    307:                 close(OUTPUT);
                    308:                 chdir $cwd;
1.230     albertel  309:                 $outcome .= &mt('Download the zip file from <a href="[_1]">IMS '.lc($type).' archive</a><br />',$imszipfile,);
1.143     raeburn   310:                 if ($copyresult) {
                    311:                     $outcome .= 'The following errors occurred during export - '.$copyresult;
1.138     raeburn   312:                 }
1.143     raeburn   313:             } else {
                    314:                 $outcome = '<br />Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.<br />';
1.138     raeburn   315:             }
                    316:         }
1.229     raeburn   317:         $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package'));
1.143     raeburn   318:         $r->print($outcome);
1.224     albertel  319:         $r->print(&Apache::loncommon::end_page());
1.138     raeburn   320:     } else {
                    321:         my $display;
                    322:         $display = '<form name="exportdoc" method="post">'."\n";
1.230     albertel  323:         $display .= &mt('Choose which items you wish to export from your '.$type.'.<br /><br />');
1.138     raeburn   324:         $display .= '<table border="0" cellspacing="0" cellpadding="3">'.
                    325:                     '<tr><td><fieldset><legend>&nbsp;<b>Content items</b></legend>'.
                    326:                     '<input type="button" value="check all" '.
                    327:                     'onclick="javascript:checkAll(document.exportdoc.archive)" />'.
                    328:                     '&nbsp;&nbsp;<input type="button" value="uncheck all"'.
                    329:                     ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset></td>'.
                    330:                     '<td>&nbsp;</td><td>&nbsp;</td>'.
                    331:                     '<td align="right"><fieldset><legend>&nbsp;<b>Discussion posts'.
                    332:                     '</b></legend><input type="button" value="check all"'.
                    333:                     ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'.
                    334:                     '&nbsp;&nbsp;<input type="button" value="uncheck all"'.
                    335:                     ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" /></fieldset></td>'.
                    336:                     '</tr></table>';
                    337:         my $curRes;
                    338:         my $depth = 0;
                    339:         my $count = 0;
                    340:         my $boards = 0;
                    341:         my $startcount = 5;
                    342:         my %parent = ();
                    343:         my %children = ();
                    344:         my $lastcontainer = $startcount;
                    345:         my @bgcolors = ('#F6F6F6','#FFFFFF');
                    346:         $display .= '<table cellspacing="0"><tr>'.
                    347:             '<td><b>Export content item?<br /></b></td><td>&nbsp;</td><td align="right">'."\n";
                    348:         if ($numdisc > 0) {
                    349:             $display.='<b>Export&nbsp;discussion posts?</b>'."\n";
                    350:         }
                    351:         $display.='&nbsp;</td></tr>';
                    352:         while ($curRes = $it->next()) {
                    353:             if (ref($curRes)) {
                    354:                 $count ++;
                    355:             }
                    356:             if ($curRes == $it->BEGIN_MAP()) {
                    357:                 $depth++;
                    358:                 $parent{$depth} = $lastcontainer;
                    359:             }
                    360:             if ($curRes == $it->END_MAP()) {
                    361:                 $depth--;
                    362:                 $lastcontainer = $parent{$depth};
                    363:             }
                    364:             if (ref($curRes)) {
                    365:                 my $symb = $curRes->symb();
1.158     raeburn   366:                 my $ressymb = $symb;
                    367:                 if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
                    368:                     unless ($ressymb =~ m|adm/wrapper/adm|) {
                    369:                         $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                    370:                     }
                    371:                 }
1.138     raeburn   372:                 my $color = $count%2;
                    373:                 $display .='<tr bgcolor='.$bgcolors[$color].'><td>'."\n".
                    374:                     '<input type="checkbox" name="archive" value="'.$count.'" ';
                    375:                 if (($curRes->is_sequence()) || ($curRes->is_page())) {
                    376:                     my $checkitem = $count + $boards + $startcount;
                    377:                     $display .= 'onClick="javascript:propagateCheck('."'$checkitem'".')"';
                    378:                 }
                    379:                 $display .= ' />'."\n";
                    380:                 for (my $i=0; $i<$depth; $i++) {
                    381:                     $display .= '<img src="/adm/lonIcons/whitespace1.gif" width="25" height="1" alt="" border="0" /><img src="/adm/lonIcons/whitespace1.gif" width="25" height="1" alt="" border="0" />'."\n";
                    382:                 }
                    383:                 if ($curRes->is_sequence()) {
                    384:                     $display .= '<img src="/adm/lonIcons/navmap.folder.open.gif">&nbsp;'."\n";
                    385:                     $lastcontainer = $count + $startcount + $boards;
                    386:                 } elsif ($curRes->is_page()) {
                    387:                     $display .= '<img src="/adm/lonIcons/navmap.page.open.gif">&nbsp;'."\n";
                    388:                     $lastcontainer = $count + $startcount + $boards;
                    389:                 }
                    390:                 my $currelem = $count+$boards+$startcount;
                    391:                 $children{$parent{$depth}} .= $currelem.':';
                    392:                 $display .= '&nbsp;'.$curRes->title().'</td>';
1.158     raeburn   393:                 if ($discussiontime{$ressymb} > 0) {
1.138     raeburn   394:                     $boards ++;
                    395:                     $currelem = $count+$boards+$startcount;
                    396:                     $display .= '<td>&nbsp;</td><td align="right"><input type="checkbox" name="discussion" value="'.$count.'" />&nbsp;</td>'."\n";
                    397:                 } else {
                    398:                     $display .= '<td colspan="2">&nbsp;</td>'."\n";
                    399:                 }
                    400:             }
                    401:         }
                    402:         my $scripttag = qq|
                    403: <script>
                    404: 
                    405: function checkAll(field) {
1.158     raeburn   406:     if (field.length > 0) {
                    407:         for (i = 0; i < field.length; i++) {
                    408:             field[i].checked = true ;
                    409:         }
                    410:     } else {
                    411:         field.checked = true
                    412:     }
1.138     raeburn   413: }
1.158     raeburn   414:                                                                                 
1.138     raeburn   415: function uncheckAll(field) {
1.158     raeburn   416:     if (field.length > 0) {
                    417:         for (i = 0; i < field.length; i++) {
                    418:             field[i].checked = false ;
                    419:         }
                    420:     } else {
                    421:         field.checked = false ;
                    422:     }
1.138     raeburn   423: }
                    424: 
                    425: function propagateCheck(item) {
                    426:     if (document.exportdoc.elements[item].checked == true) {
                    427:         containerCheck(item)
                    428:     }
                    429: } 
                    430: 
                    431: function containerCheck(item) {
                    432:     document.exportdoc.elements[item].checked = true
                    433:     var numitems = $count + $boards + $startcount
                    434:     var parents = new Array(numitems)
                    435:     for (var i=$startcount; i<numitems; i++) {
                    436:         parents[i] = new Array
                    437:     }
                    438:         |;
                    439: 
                    440:         foreach my $container (sort { $a <=> $b } keys %children) {
                    441:             my @contents = split/:/,$children{$container};
                    442:             for (my $i=0; $i<@contents; $i ++) {
                    443:                 $scripttag .= '    parents['.$container.']['.$i.'] = '.$contents[$i]."\n";
                    444:             }
                    445:         }
                    446: 
                    447:         $scripttag .= qq|
                    448:     if (parents[item].length > 0) {
                    449:         for (var j=0; j<parents[item].length; j++) {
                    450:             containerCheck(parents[item][j])
                    451:         }
                    452:      }   
                    453: }
                    454: 
                    455: </script>
                    456:         |;
1.229     raeburn   457: 	$r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package',
1.224     albertel  458: 						 $scripttag));
                    459: 	$r->print($display.'</table>'.
1.138     raeburn   460:                   '<p><input type="hidden" name="finishexport" value="1">'.
                    461:                   '<input type="submit" name="exportcourse" value="'.
1.230     albertel  462:                   &mt('Export '.$type.' DOCS').'" /></p></form>'.
1.224     albertel  463: 		  &Apache::loncommon::end_page());
1.138     raeburn   464:     }
                    465: }
                    466: 
1.143     raeburn   467: sub create_ims_store {
                    468:     my ($now,$manifestok,$outcome,$tempexport) = @_;
                    469:     $$tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports';
                    470:     my $ims_manifest;
                    471:     if (!-e $$tempexport) {
                    472:         mkdir($$tempexport,0700);
                    473:     }
                    474:     $$tempexport .= '/'.$now;
                    475:     if (!-e $$tempexport) {
                    476:         mkdir($$tempexport,0700);
                    477:     }
1.174     albertel  478:     $$tempexport .= '/'.$env{'user.domain'}.'_'.$env{'user.name'};
1.143     raeburn   479:     if (!-e $$tempexport) {
                    480:         mkdir($$tempexport,0700);
                    481:     }
1.159     raeburn   482:     if (!-e "$$tempexport/resources") {
                    483:         mkdir("$$tempexport/resources",0700);
                    484:     }
1.143     raeburn   485: # open manifest file
                    486:     my $manifest = '/imsmanifest.xml';
                    487:     my $manifestfilename = $$tempexport.$manifest;
                    488:     if ($ims_manifest = Apache::File->new('>'.$manifestfilename)) {
                    489:         $$manifestok=1;
                    490:         print $ims_manifest
                    491: '<?xml version="1.0" encoding="UTF-8"?>'."\n".
                    492: '<manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"'.
                    493: ' xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"'.
                    494: ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'.
1.174     albertel  495: ' identifier="MANIFEST-'.$env{'request.course.id'}.'-'.$now.'"'.
1.143     raeburn   496: '  xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1imscp_v1p1.xsd'.
                    497: '  http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p2.xsd">'."\n".
1.199     raeburn   498: '  <metadata>
                    499:     <schema></schema>
                    500:     <imsmd:lom>
                    501:       <imsmd:general>
                    502:         <imsmd:identifier>'.$env{'request.course.id'}.'</imsmd:identifier>
                    503:         <imsmd:title>
                    504:           <imsmd:langstring xml:lang="en">'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</imsmd:langstring>
                    505:         </imsmd:title>
                    506:       </imsmd:general>
                    507:     </imsmd:lom>
                    508:   </metadata>'."\n".
1.174     albertel  509: '  <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n".
                    510: '    <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'.
1.143     raeburn   511: ' structure="hierarchical">'."\n".
1.199     raeburn   512: '      <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>'
1.143     raeburn   513:     } else {
                    514:         $$outcome .= 'An error occurred opening the IMS manifest file.<br />'
                    515: ;
                    516:     }
                    517:     return $ims_manifest;
                    518: }
                    519: 
                    520: sub build_package {
                    521:     my ($now,$navmap,$exportitems,$discussions,$outcome,$tempexport,$copyresult,$ims_manifest) = @_;
                    522: # first iterator to look for dependencies
                    523:     my $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
                    524:     my $curRes;
                    525:     my $count = 0;
                    526:     my $depth = 0;
                    527:     my $lastcontainer = 0;
                    528:     my %parent = ();
                    529:     my @dependencies = ();
1.174     albertel  530:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    531:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.143     raeburn   532:     while ($curRes = $it->next()) {
                    533:         if (ref($curRes)) {
                    534:             $count ++;
                    535:         }
                    536:         if ($curRes == $it->BEGIN_MAP()) {
                    537:             $depth++;
                    538:             $parent{$depth} = $lastcontainer;
                    539:         }
                    540:         if ($curRes == $it->END_MAP()) {
                    541:             $depth--;
                    542:             $lastcontainer = $parent{$depth};
                    543:         }
                    544:         if (ref($curRes)) {
                    545:             if ($curRes->is_sequence() || $curRes->is_page()) {
                    546:                 $lastcontainer = $count;
                    547:             }
                    548:             if (grep/^$count$/,@$exportitems) {
                    549:                 &get_dependencies($exportitems,\%parent,$depth,\@dependencies);
                    550:             }
                    551:         }
                    552:     }
                    553: # second iterator to build manifest and store resources
                    554:     $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
                    555:     $depth = 0;
                    556:     my $prevdepth;
                    557:     $count = 0;
                    558:     my $imsresources;
                    559:     my $pkgdepth;
1.157     raeburn   560:     while ($curRes = $it->next()) {
                    561:         if ($curRes == $it->BEGIN_MAP()) {
                    562:             $prevdepth = $depth;
                    563:             $depth++;
                    564:         }
                    565:         if ($curRes == $it->END_MAP()) {
1.143     raeburn   566:             $prevdepth = $depth;
1.157     raeburn   567:             $depth--;
                    568:         }
                    569: 
                    570:         if (ref($curRes)) {
                    571:             $count ++;
                    572:             if ((grep/^$count$/,@$exportitems) || (grep/^$count$/,@dependencies)) {
                    573:                 my $symb = $curRes->symb();
                    574:                 my $isvisible = 'true';
                    575:                 my $resourceref;
                    576:                 if ($curRes->randomout()) {
                    577:                     $isvisible = 'false';
                    578:                 }
                    579:                 unless ($curRes->is_sequence()) {
1.174     albertel  580:                     $resourceref = 'identifierref="RES-'.$env{'request.course.id'}.'-'.$count.'"';
1.157     raeburn   581:                 }
1.199     raeburn   582:                 my $step = $prevdepth - $depth;
                    583:                 if (($step >= 0) && ($count > 1)) {
                    584:                     while ($step >= 0) {
                    585:                         print $ims_manifest "\n".'  </item>'."\n";
                    586:                         $step --;
                    587:                     }
1.157     raeburn   588:                 }
                    589:                 $prevdepth = $depth;
1.143     raeburn   590: 
1.157     raeburn   591:                 my $itementry =
1.174     albertel  592:               '<item identifier="ITEM-'.$env{'request.course.id'}.'-'.$count.
1.143     raeburn   593:               '" isvisible="'.$isvisible.'" '.$resourceref.'>'.
                    594:               '<title>'.$curRes->title().'</title>';
1.157     raeburn   595:                 print $ims_manifest "\n".$itementry;
1.143     raeburn   596: 
1.157     raeburn   597:                 unless ($curRes->is_sequence()) {
                    598:                     my $content_file;
                    599:                     my @hrefs = ();
                    600:                     &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport);
                    601:                     if ($content_file) {
                    602:                         $imsresources .= "\n".
1.174     albertel  603:                      '   <resource identifier="RES-'.$env{'request.course.id'}.'-'.$count.
1.143     raeburn   604:                      '" type="webcontent" href="'.$content_file.'">'."\n".
                    605:                      '       <file href="'.$content_file.'" />'."\n";
1.157     raeburn   606:                         foreach (@hrefs) {
                    607:                             $imsresources .=
1.143     raeburn   608:                      '        <file href="'.$_.'" />'."\n";
1.157     raeburn   609:                         }
1.158     raeburn   610:                         if (grep/^$count$/,@$discussions) {
                    611:                             my $ressymb = $symb;
                    612:                             my $mode;
                    613:                             if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
                    614:                                 unless ($ressymb =~ m|adm/wrapper/adm|) {
                    615:                                     $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                    616:                                 }
                    617:                                 $mode = 'board';
                    618:                             }
                    619:                             my %extras = (
                    620:                                           caller => 'imsexport',
1.159     raeburn   621:                                           tempexport => $tempexport.'/resources',
1.158     raeburn   622:                                           count => $count
                    623:                                          );
                    624:                             my $discresult = &Apache::lonfeedback::list_discussion($mode,undef,$ressymb,\%extras);
                    625:                         }
1.157     raeburn   626:                         $imsresources .= '    </resource>'."\n";
1.143     raeburn   627:                     }
                    628:                 }
1.157     raeburn   629:                 $pkgdepth = $depth;
1.143     raeburn   630:             }
                    631:         }
                    632:     }
1.157     raeburn   633:     while ($pkgdepth > 0) {
1.143     raeburn   634:         print $ims_manifest "    </item>\n";
                    635:         $pkgdepth --;
                    636:     }
                    637:     my $resource_text = qq|
                    638:     </organization>
                    639:   </organizations>
                    640:   <resources>
                    641:     $imsresources
                    642:   </resources>
                    643: </manifest>
                    644:     |;
                    645:     print $ims_manifest $resource_text;
                    646: }
                    647: 
                    648: sub get_dependencies {
                    649:     my ($exportitems,$parent,$depth,$dependencies) = @_;
                    650:     if ($depth > 1) {
1.157     raeburn   651:         if ((!grep/^$$parent{$depth}$/,@$exportitems) && (!grep/^$$parent{$depth}$/,@$dependencies)) {
1.143     raeburn   652:             push @$dependencies, $$parent{$depth};
                    653:             if ($depth > 2) {
                    654:                 &get_dependencies($exportitems,$parent,$depth-1,$dependencies);
                    655:             }
                    656:         }
                    657:     }
                    658: }
                    659: 
                    660: sub process_content {
                    661:     my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport) = @_;
                    662:     my $content_type;
                    663:     my $message;
1.158     raeburn   664:     my @uploads = ();
1.157     raeburn   665:     if ($curRes->is_sequence()) {
                    666:         $content_type = 'sequence';
                    667:     } elsif ($curRes->is_page()) {
                    668:         $content_type = 'page'; # need to handle individual items in pages.
1.143     raeburn   669:     } elsif ($symb =~ m-public/$cdom/$cnum/syllabus$-) {
                    670:         $content_type = 'syllabus';
1.158     raeburn   671:         my $contents = &Apache::imsexport::templatedpage($content_type);
                    672:         if ($contents) {
                    673:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    674:         }
1.157     raeburn   675:     } elsif ($symb =~ m-\.sequence___\d+___ext-) {
1.143     raeburn   676:         $content_type = 'external';
1.158     raeburn   677:         my $title = $curRes->title;
                    678:         my $contents =  &Apache::imsexport::external($symb,$title);
                    679:         if ($contents) {
                    680:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    681:         }
1.143     raeburn   682:     } elsif ($symb =~ m-adm/navmaps$-) {
                    683:         $content_type =  'navmap';
1.158     raeburn   684:     } elsif ($symb =~ m-adm/[^/]+/[^/]+/(\d+)/smppg$-) {
1.143     raeburn   685:         $content_type = 'simplepage';
1.158     raeburn   686:         my $contents = &Apache::imsexport::templatedpage($content_type,$1,$count,\@uploads);
                    687:         if ($contents) {
                    688:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    689:         }
                    690:     } elsif ($symb =~ m-lib/templates/simpleproblem\.problem$-) {
1.143     raeburn   691:         $content_type = 'simpleproblem';
1.158     raeburn   692:         my $contents =  &Apache::imsexport::simpleproblem($symb);
                    693:         if ($contents) {
                    694:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    695:         }
1.188     raeburn   696:     } elsif ($symb =~ m-lib/templates/examupload\.problem$-) {
1.158     raeburn   697:         $content_type = 'examupload';
                    698:     } elsif ($symb =~ m-adm/(\w+)/(\w+)/(\d+)/bulletinboard$-) {
1.143     raeburn   699:         $content_type = 'bulletinboard';
1.158     raeburn   700:         my $contents =  &Apache::imsexport::templatedpage($content_type,$3,$count,\@uploads,$1,$2);
                    701:         if ($contents) {
                    702:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    703:         }
                    704:     } elsif ($symb =~ m-adm/([^/]+)/([^/]+)/aboutme$-) {
1.143     raeburn   705:         $content_type = 'aboutme';
1.158     raeburn   706:         my $contents =  &Apache::imsexport::templatedpage($content_type,undef,$count,\@uploads,$1,$2);
                    707:         if ($contents) {
                    708:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    709:         }
1.157     raeburn   710:     } elsif ($symb =~ m-\.(sequence|page)___\d+___uploaded/$cdom/$cnum/-) {
                    711:         $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
1.162     raeburn   712:     } elsif ($symb =~ m-\.(sequence|page)___\d+___([^/]+)/([^/]+)-) {
1.143     raeburn   713:         my $canedit = 0;
1.174     albertel  714:         if ($2 eq $env{'user.domain'} && $3 eq $env{'user.name'})  {
1.143     raeburn   715:             $canedit= 1;
                    716:         }
1.200     raeburn   717: # only include problem code where current user is author
1.143     raeburn   718:         if ($canedit) {
1.157     raeburn   719:             $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource');
1.143     raeburn   720:         } else {
1.157     raeburn   721:             $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit');
1.143     raeburn   722:         }
1.162     raeburn   723:     } elsif ($symb =~ m-uploaded/$cdom/$cnum-) {
                    724:         $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
1.143     raeburn   725:     }
1.158     raeburn   726:     if (@uploads > 0) {
                    727:         foreach my $item (@uploads) {
                    728:             my $uploadmsg = '';
1.159     raeburn   729:             &replicate_content($cdom,$cnum,$tempexport,$item,$count,\$uploadmsg,$href,'templateupload');
1.158     raeburn   730:             if ($uploadmsg) {
                    731:                 $$copyresult .= $uploadmsg."\n";
                    732:             }
                    733:         }
                    734:     }
1.157     raeburn   735:     if ($message) {
                    736:         $$copyresult .= $message."\n";
                    737:     }
1.143     raeburn   738: }
                    739: 
                    740: sub replicate_content {
1.157     raeburn   741:     my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller) = @_;
1.159     raeburn   742:     my ($map,$ind,$url);
                    743:     if ($caller eq 'templateupload') {
                    744:         $url = $symb;
                    745:         $url =~ s#//#/#g;
                    746:     } else { 
                    747:         ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
                    748:     }
1.143     raeburn   749:     my $content;
                    750:     my $filename;
                    751:     my $repstatus;
1.157     raeburn   752:     my $content_name;
                    753:     if ($url =~ m-/([^/]+)$-) {
1.143     raeburn   754:         $filename = $1;
                    755:         if (!-e $tempexport.'/resources') {
                    756:             mkdir($tempexport.'/resources',0700);
                    757:         }
1.157     raeburn   758:         if (!-e $tempexport.'/resources/'.$count) {
1.143     raeburn   759:             mkdir($tempexport.'/resources/'.$count,0700);
                    760:         }
1.157     raeburn   761:         my $destination = $tempexport.'/resources/'.$count.'/'.$filename;
1.143     raeburn   762:         my $copiedfile;
                    763:         if ($copiedfile = Apache::File->new('>'.$destination)) {
                    764:             my $content;
1.157     raeburn   765:             if ($caller eq 'resource') {
1.197     raeburn   766:                 my $respath =  $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';
                    767:                 my $filepath = &Apache::lonnet::filelocation($respath,$url);
                    768:                 $content = &Apache::lonnet::getfile($filepath);
1.143     raeburn   769:                 if ($content eq -1) {
                    770:                     $$message = 'Could not copy file '.$filename;
                    771:                 } else {
1.197     raeburn   772:                     &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'resource');
1.143     raeburn   773:                     $repstatus = 'ok';
                    774:                 }
1.162     raeburn   775:             } elsif ($caller eq 'uploaded' || $caller eq 'templateupload') {
1.143     raeburn   776:                 my $rtncode;
1.157     raeburn   777:                 $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode);
                    778:                 if ($repstatus eq 'ok') {
                    779:                     if ($url =~ /\.html?$/i) {
1.197     raeburn   780:                         &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'uploaded');
1.157     raeburn   781:                     }
                    782:                 } else {
1.197     raeburn   783:                     $$message = 'Could not render '.$url.' server message - '.$rtncode."<br />\n";
1.143     raeburn   784:                 }
1.162     raeburn   785:             } elsif ($caller eq 'noedit') {
                    786: # Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this. 
                    787:                 $repstatus = 'ok';
                    788:                 $content = 'Not the owner of this resource'; 
1.143     raeburn   789:             }
                    790:             if ($repstatus eq 'ok') {
                    791:                 print $copiedfile $content;
                    792:             }
                    793:             close($copiedfile);
                    794:         } else {
1.197     raeburn   795:             $$message = 'Could not open destination file for '.$filename."<br />\n";
1.143     raeburn   796:         }
                    797:     } else {
1.197     raeburn   798:         $$message = 'Could not determine name of file for '.$symb."<br />\n";
1.143     raeburn   799:     }
1.157     raeburn   800:     if ($repstatus eq 'ok') {
1.198     raeburn   801:         $content_name = 'resources/'.$count.'/'.$filename;
1.157     raeburn   802:     }
                    803:     return $content_name;
                    804: }
                    805: 
                    806: sub extract_media {
1.197     raeburn   807:     my ($url,$cdom,$cnum,$content,$count,$tempexport,$href,$message,$caller) = @_;
1.198     raeburn   808:     my ($dirpath,$container);
1.197     raeburn   809:     my %allfiles = ();
                    810:     my %codebase = ();
1.198     raeburn   811:     if ($url =~ m-(.*/)([^/]+)$-) {
                    812:         $dirpath = $1;
                    813:         $container = $2;
                    814:     } else {
                    815:         $dirpath = $url;
                    816:         $container = '';
                    817:     }
1.197     raeburn   818:     &Apache::lonnet::extract_embedded_items(undef,undef,\%allfiles,\%codebase,$content);
                    819:     foreach my $embed_file (keys(%allfiles)) {
                    820:         my $filename;
                    821:         if ($embed_file =~ m#([^/]+)$#) {
                    822:             $filename = $1;
                    823:         } else {
                    824:             $filename = $embed_file;
                    825:         }
                    826:         my $newname = 'res/'.$filename;
                    827:         my ($rtncode,$embed_content,$repstatus);
                    828:         my $embed_url;
                    829:         if ($embed_file =~ m-^/-) {
                    830:             $embed_url = $embed_file;           # points to absolute path
                    831:         } else {
                    832:             if ($embed_file =~ m-https?://-) {
                    833:                 next;                           # points to url
                    834:             } else {
1.198     raeburn   835:                 $embed_url = $dirpath.$embed_file;  # points to relative path
1.197     raeburn   836:             }
                    837:         }
                    838:         if ($caller eq 'resource') {
                    839:             my $respath =  $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';  
                    840:             my $embed_path = &Apache::lonnet::filelocation($respath,$embed_url); 
                    841:             $embed_content = &Apache::lonnet::getfile($embed_path);
                    842:             unless ($embed_content eq -1) {
                    843:                 $repstatus = 'ok';
                    844:             }
                    845:         } elsif ($caller eq 'uploaded') {
                    846:             
                    847:             $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode);
                    848:         }
                    849:         if ($repstatus eq 'ok') {
                    850:             my $destination = $tempexport.'/resources/'.$count.'/res';
                    851:             if (!-e "$destination") {
                    852:                 mkdir($destination,0755);
                    853:             }
                    854:             $destination .= '/'.$filename;
                    855:             my $copiedfile;
                    856:             if ($copiedfile = Apache::File->new('>'.$destination)) {
                    857:                 print $copiedfile $embed_content;
1.198     raeburn   858:                 push @{$href}, 'resources/'.$count.'/res/'.$filename;
1.197     raeburn   859:                 my $attrib_regexp = '';
                    860:                 if (@{$allfiles{$embed_file}} > 1) {
                    861:                     $attrib_regexp = join('|',@{$allfiles{$embed_file}});
                    862:                 } else {
                    863:                     $attrib_regexp = $allfiles{$embed_file}[0];
                    864:                 }
                    865:                 $$content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$embed_file\E(['"]?)#$1$newname$2#gi;
1.198     raeburn   866:                 if ($caller eq 'resource' && $container =~ /\.(problem|library)$/) {
1.197     raeburn   867:                     $$content =~ s#\Q$embed_file\E#$newname#gi;
                    868:                 }
                    869:             }
                    870:         } else {
                    871:             $$message .= 'replication of embedded file - '.$embed_file.' in '.$url.' failed, reason -'.$rtncode."<br />\n";
                    872:         }
                    873:     }
1.157     raeburn   874:     return;
1.143     raeburn   875: }
1.74      www       876: 
1.158     raeburn   877: sub store_template {
                    878:     my ($contents,$tempexport,$count,$content_type) = @_;
                    879:     if ($contents) {
1.159     raeburn   880:         if ($tempexport) {
                    881:             if (!-e $tempexport.'/resources') {
                    882:                 mkdir($tempexport.'/resources',0700);
                    883:             }
                    884:             if (!-e $tempexport.'/resources/'.$count) {
                    885:                 mkdir($tempexport.'/resources/'.$count,0700);
                    886:             }
                    887:             my $destination = $tempexport.'/resources/'.$count.'/'.$content_type.'.xml';
                    888:             my $storetemplate;
                    889:             if ($storetemplate = Apache::File->new('>'.$destination)) {
                    890:                 print $storetemplate $contents;
                    891:                 close($storetemplate);
                    892:             }
                    893:             if ($content_type eq 'external') {
1.198     raeburn   894:                 return 'resources/'.$count.'/'.$content_type.'.html';
1.159     raeburn   895:             } else {
1.198     raeburn   896:                 return 'resources/'.$count.'/'.$content_type.'.xml';
1.159     raeburn   897:             }
1.158     raeburn   898:         }
                    899:     }
                    900: }
                    901: 
1.73      bowersj2  902: # Imports the given (name, url) resources into the course
                    903: # coursenum, coursedom, and folder must precede the list
                    904: sub group_import {
                    905:     my $coursenum = shift;
                    906:     my $coursedom = shift;
                    907:     my $folder = shift;
1.142     raeburn   908:     my $container = shift;
                    909:     my $caller = shift;
1.73      bowersj2  910:     while (@_) {
                    911: 	my $name = shift;
                    912: 	my $url = shift;
1.142     raeburn   913:         if (($url =~ m#^/uploaded/$coursedom/$coursenum/(default_\d+\.)(page|sequence)$#) && ($caller eq 'londocs')) {
                    914:             my $errtext = '';
                    915:             my $fatal = 0;
                    916:             my $newmapstr = '<map>'."\n".
                    917:                             '<resource id="1" src="" type="start"></resource>'."\n".
                    918:                             '<link from="1" to="2" index="1"></link>'."\n".
                    919:                             '<resource id="2" src="" type="finish"></resource>'."\n".
                    920:                             '</map>';
1.174     albertel  921:             $env{'form.output'}=$newmapstr;
1.189     albertel  922:             my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
1.142     raeburn   923:                                                 'output',$1.$2);
                    924:             if ($result != m|^/uploaded/|) {
                    925:                 $errtext.='Map not saved: A network error occured when trying to save the new map. ';
                    926:                 $fatal = 2;
                    927:             }
                    928:             if ($fatal) {
                    929:                 return ($errtext,$fatal);
                    930:             }
                    931:         }
1.73      bowersj2  932: 	if ($url) {
1.245     albertel  933: 	    my $idx = &LONCAPA::map::getresidx($url);
                    934: 	    $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
1.73      bowersj2  935: 	    my $ext = 'false';
                    936: 	    if ($url=~/^http:\/\//) { $ext = 'true'; }
                    937: 	    $url =~ s/:/\&colon;/g;
                    938: 	    $name =~ s/:/\&colon;/g;
1.245     albertel  939: 	    $LONCAPA::map::resources[$idx] = 
1.73      bowersj2  940: 		join ':', ($name, $url, $ext, 'normal', 'res');
                    941: 	}
                    942:     }
1.142     raeburn   943:     return &storemap($coursenum, $coursedom, $folder.'.'.$container);
1.73      bowersj2  944: }
                    945: 
1.114     albertel  946: sub breadcrumbs {
                    947:     my ($where)=@_;
                    948:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.142     raeburn   949:     my (@folders);
1.174     albertel  950:     if ($env{'form.pagepath'}) {
                    951:         @folders = split('&',$env{'form.pagepath'});
1.142     raeburn   952:     } else {
1.174     albertel  953:         @folders=split('&',$env{'form.folderpath'});
1.142     raeburn   954:     }
1.116     albertel  955:     my $folderpath;
1.168     www       956:     my $cpinfo='';
1.251     www       957:     my $plain='';
1.174     albertel  958:     if ($env{'form.markedcopy_url'}) {
1.168     www       959:        $cpinfo='&markedcopy_url='.
1.228     www       960:                &escape($env{'form.markedcopy_url'}).
1.168     www       961:                '&markedcopy_title='.
1.228     www       962:                &escape($env{'form.markedcopy_title'});
1.168     www       963:     }
1.242     www       964:     my $randompick=-1;
                    965:     my $isencrypted=0;
                    966:     my $ishidden=0;
1.116     albertel  967:     while (@folders) {
                    968: 	my $folder=shift(@folders);
                    969: 	my $foldername=shift(@folders);
                    970: 	if ($folderpath) {$folderpath.='&';}
                    971: 	$folderpath.=$folder.'&'.$foldername;
                    972: 	my $url='/adm/coursedocs?folderpath='.
1.228     www       973: 	    &escape($folderpath);
1.242     www       974:             my $name=&unescape($foldername);
                    975: # randompick number, hidden, encrypted is appended with ":"s to the foldername	
                    976:             $name=~s/\:(\d*)\:(\w*)\:(\w*)$//;
                    977:             if ($1 ne '') { 
                    978:                $randompick=$1;
                    979:             } else {
                    980:                $randompick=-1;
                    981:             }
                    982:             if ($2) { $ishidden=1; }
                    983:             if ($3) { $isencrypted=1; }
1.114     albertel  984: 	    &Apache::lonhtmlcommon::add_breadcrumb(
1.168     www       985: 		      {'href'=>$url.$cpinfo,
1.242     www       986: 		       'title'=>$name,
1.117     albertel  987: 		       'text'=>'<font size="+1">'.
1.242     www       988: 			   $name.'</font>'
1.117     albertel  989: 		       });
1.251     www       990: 	$plain.=$name.' &gt; ';
1.114     albertel  991:     }
1.251     www       992:     $plain=~s/\&gt\;\s*$//;
1.242     www       993:     return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp',
1.251     www       994: 					       'LC_docs_path'),$randompick,$ishidden,$isencrypted,$plain);
1.114     albertel  995: }
                    996: 
1.247     www       997: sub log_docs {
                    998:     return &Apache::lonnet::instructor_log('docslog',@_);
                    999: }
                   1000: 
                   1001: {
                   1002:     my @oldresources=();
                   1003:     my @oldorder=();
                   1004:     my $parmidx;
                   1005:     my %parmaction=();
                   1006:     my %parmvalue=();
1.249     www      1007:     my $changedflag;
1.247     www      1008: 
                   1009:     sub snapshotbefore {
1.248     albertel 1010:         @oldresources=@LONCAPA::map::resources;
                   1011:         @oldorder=@LONCAPA::map::order;
1.247     www      1012:         $parmidx=undef;
                   1013:         %parmaction=();
                   1014:         %parmvalue=();
1.249     www      1015:         $changedflag=0;
1.247     www      1016:     }
                   1017: 
                   1018:     sub remember_parms {
                   1019:         my ($idx,$parameter,$action,$value)=@_;
                   1020:         $parmidx=$idx;
                   1021:         $parmaction{$parameter}=$action;
                   1022:         $parmvalue{$parameter}=$value;
1.249     www      1023:         $changedflag=1;
1.247     www      1024:     }
                   1025: 
                   1026:     sub log_differences {
1.251     www      1027:         my ($plain)=@_;
                   1028:         my %storehash=('folder' => $plain);
1.247     www      1029:         if ($parmidx) {
                   1030:            $storehash{'parameter_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');
                   2362:     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
1.142     raeburn  2363: 
1.209     albertel 2364: # does this user have privileges to modify docs
                   2365:     my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
                   2366: 
                   2367:   if ($allowed && $env{'form.verify'}) {
1.75      www      2368:       &verifycontent($r);
1.209     albertel 2369:   } elsif ($allowed && $env{'form.listsymbs'}) {
1.208     albertel 2370:       &list_symbs($r);
1.247     www      2371:   } elsif ($allowed && $env{'form.docslog'}) {
                   2372:       &docs_change_log($r);
1.209     albertel 2373:   } elsif ($allowed && $env{'form.versions'}) {
1.75      www      2374:       &checkversions($r);
1.209     albertel 2375:   } elsif ($allowed && $env{'form.dumpcourse'}) {
1.75      www      2376:       &dumpcourse($r);
1.209     albertel 2377:   } elsif ($allowed && $env{'form.exportcourse'}) {
1.138     raeburn  2378:       &exportcourse($r);
1.26      www      2379:   } else {
1.7       www      2380: # is this a standard course?
                   2381: 
1.174     albertel 2382:     my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
1.155     raeburn  2383:     my $forcestandard = 0;
1.15      www      2384:     my $forcesupplement;
                   2385:     my $script='';
1.19      www      2386:     my $showdoc=0;
1.142     raeburn  2387:     my $containertag;
                   2388:     my $uploadtag;
1.15      www      2389:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.224     albertel 2390: 					    ['folderpath','pagepath',
                   2391: 					     'pagesymb','markedcopy_url',
                   2392: 					     'markedcopy_title']);
1.174     albertel 2393:     if ($env{'form.folderpath'}) {
                   2394: 	my (@folderpath)=split('&',$env{'form.folderpath'});
1.228     www      2395: 	$env{'form.foldername'}=&unescape(pop(@folderpath));
1.174     albertel 2396: 	$env{'form.folder'}=pop(@folderpath);
                   2397:     }
                   2398:     if ($env{'form.pagepath'}) {
                   2399:         my (@pagepath)=split('&',$env{'form.pagepath'});
1.228     www      2400:         $env{'form.pagename'}=&unescape(pop(@pagepath));
1.174     albertel 2401:         $env{'form.folder'}=pop(@pagepath);
1.156     albertel 2402:         $containertag = '<input type="hidden" name="pagepath" value="" />'.
                   2403: 	    '<input type="hidden" name="pagesymb" value="" />';
1.174     albertel 2404:         $uploadtag = '<input type="hidden" name="pagepath" value="'.$env{'form.pagepath'}.'" />'.
                   2405: 	    '<input type="hidden" name="pagesymb" value="'.$env{'form.pagesymb'}.'" />';
1.142     raeburn  2406:     }
1.21      www      2407:     if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
1.127     albertel 2408:        $showdoc='/'.$1;
1.21      www      2409:     }
                   2410:     unless ($showdoc) { # got called from remote
1.237     albertel 2411:        if (($env{'form.folder'}=~/^(?:group|default)_/) || 
1.209     albertel 2412:           ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {
1.155     raeburn  2413:            $forcestandard = 1;
                   2414:        } 
1.174     albertel 2415:        $forcesupplement=($env{'form.folder'}=~/^supplemental_/);
1.7       www      2416: 
1.15      www      2417:        if ($allowed) { 
                   2418:          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
                   2419:          $script=&Apache::lonratedt::editscript('simple'); 
                   2420:        }
                   2421:     } else { # got called in sequence from course
                   2422:        $allowed=0;
1.3       www      2423:     }
1.4       www      2424: 
                   2425: # get course data
1.174     albertel 2426:     my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
                   2427:     my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.4       www      2428: 
1.225     albertel 2429: # get personal data 
1.174     albertel 2430:     my $uname=$env{'user.name'};
                   2431:     my $udom=$env{'user.domain'};
1.245     albertel 2432:     my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom));
1.14      www      2433: 
1.8       www      2434: # graphics settings
1.4       www      2435: 
1.176     albertel 2436:     $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
1.8       www      2437: 
1.224     albertel 2438:     if ($allowed) {
                   2439: 	$script .= &editing_js($udom,$uname);
1.171     www      2440:     }
1.42      www      2441: # -------------------------------------------------------------------- Body tag
1.224     albertel 2442:     $script = '<script type="text/javascript">'."\n".$script."\n".'</script>';
1.229     raeburn  2443:     $r->print(&Apache::loncommon::start_page("$type Documents", $script,
1.225     albertel 2444: 					     {'force_register' => $showdoc,}).
1.233     albertel 2445: 	      &Apache::loncommon::help_open_menu('','',273,'RAT'));
1.224     albertel 2446:   
1.188     raeburn  2447:   my %allfiles = ();
                   2448:   my %codebase = ();
                   2449:   my ($upload_result,$upload_output);
                   2450:   if ($allowed) {
                   2451:       if (($env{'form.uploaddoc.filename'}) &&                                               ($env{'form.cmd'}=~/^upload_(\w+)/)) {
                   2452: # Process file upload - phase one - upload and parse primary file.  
1.190     albertel 2453:           $upload_result = &process_file_upload(\$upload_output,$coursenum,
                   2454: 						$coursedom,\%allfiles,
1.194     raeburn  2455: 						\%codebase,$1);
1.188     raeburn  2456:           if ($upload_result eq 'phasetwo') {
                   2457:               $r->print($upload_output);
                   2458:           }
                   2459:       } elsif ($env{'form.phasetwo'}) {
                   2460:           my %newname = ();
                   2461:           my %origname = ();
                   2462:           my %attribs = ();
                   2463:           my $updateflag = 0;
                   2464:           my $residx = $env{'form.newidx'};
1.228     www      2465:           my $primary_url = &unescape($env{'form.primaryurl'});
1.188     raeburn  2466: # Process file upload - phase two - gather secondary files.
                   2467:           for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {
                   2468:               if ($env{'form.embedded_item_'.$i.'.filename'}) {
                   2469:                   my $javacodebase;
                   2470:                   $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);
1.228     www      2471:                   $origname{$i} = &unescape($env{'form.embedded_orig_'.$i});
1.188     raeburn  2472:                   if (exists($env{'form.embedded_codebase_'.$i})) {
1.228     www      2473:                       $javacodebase =  &unescape($env{'form.embedded_codebase_'.$i});  
1.188     raeburn  2474:                       $origname{$i} =~ s#^\Q$javacodebase\E/##; 
                   2475:                   }
                   2476:                   my @attributes = ();
                   2477:                   if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
                   2478:                       @attributes = split/:/,$env{'form.embedded_attrib_'.$i};
                   2479:                   } else {
                   2480:                       @attributes = ($env{'form.embedded_attrib_'.$i});
                   2481:                   }
                   2482:                   foreach (@attributes) {
1.228     www      2483:                       push(@{$attribs{$i}},&unescape($_));
1.188     raeburn  2484:                   }
                   2485:                   if ($javacodebase) {
                   2486:                       $codebase{$i} = $javacodebase;
                   2487:                       $codebase{$i} =~ s#/$##;
                   2488:                       $updateflag = 1;
                   2489:                   }
                   2490:               }
                   2491:               unless ($newname{$i} eq $origname{$i}) {
                   2492:                   $updateflag = 1;
                   2493:               }
                   2494:           }
                   2495: # Process file upload - phase three - modify primary file
                   2496:           if ($updateflag) {
                   2497:               my ($content,$rtncode);
                   2498:               my $updateflag = 0;
                   2499:               my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
                   2500:               if ($getstatus eq 'ok') {
                   2501:                   foreach my $item (keys %newname) {
                   2502:                       if ($newname{$item} ne $origname{$item}) {
                   2503:                           my $attrib_regexp = '';
                   2504:                           if (@{$attribs{$item}} > 1) {
                   2505:                               $attrib_regexp = join('|',@{$attribs{$item}});
                   2506:                           } else {
                   2507:                               $attrib_regexp = $attribs{$item}[0];
                   2508:                           }
                   2509:                           if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {
                   2510:                           } 
                   2511:                           $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi; 
                   2512:                       }
                   2513:                       if (exists($codebase{$item})) {
1.224     albertel 2514:                           $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs
1.188     raeburn  2515:                       }
                   2516:                   }
                   2517: # Save edited file.
                   2518:                   my $saveresult;
                   2519:                   my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
                   2520:                   my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.191     raeburn  2521:                   my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);
1.188     raeburn  2522:               } else {
                   2523:                   &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus); 
                   2524:               }
                   2525:           }
                   2526:       }
                   2527:   }
                   2528: 
                   2529:   unless ($showdoc ||  $upload_result eq 'phasetwo') {
1.81      www      2530: # -----------------------------------------------------------------------------
                   2531:        my %lt=&Apache::lonlocal::texthash(
1.229     raeburn  2532:                 'uplm' => 'Upload a new main '.lc($type).' document',
                   2533:                 'upls' => 'Upload a new supplemental '.lc($type).' document',
1.168     www      2534:                 'impp' => 'Import a document',
                   2535:                 'pubd' => 'Published documents',
1.181     www      2536: 		'copm' => 'All documents out of a published map into this folder',
1.81      www      2537:                 'spec' => 'Special documents',
                   2538:                 'upld' => 'Upload Document',
                   2539:                 'srch' => 'Search',
                   2540:                 'impo' => 'Import',
1.232     www      2541: 		'book' => 'Import Bookmarks',
1.81      www      2542:                 'selm' => 'Select Map',
                   2543:                 'load' => 'Load Map',
1.186     www      2544:                 'reco' => 'Recover Deleted Resources',
1.81      www      2545:                 'newf' => 'New Folder',
1.142     raeburn  2546:                 'newp' => 'New Composite Page',
1.81      www      2547:                 'extr' => 'External Resource',
                   2548:                 'syll' => 'Syllabus',
                   2549:                 'navc' => 'Navigate Contents',
                   2550:                 'sipa' => 'Simple Page',
                   2551:                 'sipr' => 'Simple Problem',
1.219     www      2552:                 'drbx' => 'Drop Box',
1.81      www      2553:                 'scuf' => 'Score Upload Form',
                   2554:                 'bull' => 'Bulletin Board',
1.96      sakharuk 2555:                 'mypi' => 'My Personal Info',
1.101     www      2556: 		'abou' => 'About User',
1.110     raeburn  2557:                 'imsf' => 'Import IMS package',
1.96      sakharuk 2558:                 'file' =>  'File',
                   2559:                 'title' => 'Title',
1.188     raeburn  2560:                 'comment' => 'Comment',
                   2561:                 'parse' => 'If HTML file, upload embedded images/multimedia files'
1.81      www      2562: 					  );
                   2563: # -----------------------------------------------------------------------------
1.42      www      2564:     if ($allowed) {
1.74      www      2565:        my $dumpbut=&dumpbutton();
1.138     raeburn  2566:        my $exportbut=&exportbutton();
1.88      www      2567:        my %lt=&Apache::lonlocal::texthash(
                   2568: 					 'vc' => 'Verify Content',
                   2569: 					 'cv' => 'Check/Set Resource Versions',
1.208     albertel 2570: 					 'ls' => 'List Symbs',
1.247     www      2571:                                          'sl' => 'Show Log'
1.88      www      2572: 					  );
1.118     albertel 2573: 
1.174     albertel 2574:        my $folderpath=$env{'form.folderpath'};
1.118     albertel 2575:        if (!$folderpath) {
1.174     albertel 2576: 	   if ($env{'form.folder'} eq '' ||
                   2577: 	       $env{'form.folder'} eq 'supplemental') {
1.118     albertel 2578: 	       $folderpath='default&'.
1.230     albertel 2579: 		   &escape(&mt('Main '.$type.' Documents'));
1.118     albertel 2580: 	   }
                   2581:        }
1.174     albertel 2582:        unless ($env{'form.pagepath'}) {
1.142     raeburn  2583:            $containertag = '<input type="hidden" name="folderpath" value="" />';
                   2584:            $uploadtag = '<input type="hidden" name="folderpath" value="'.$folderpath.'" />';
                   2585:        }
                   2586: 
1.42      www      2587:        $r->print(<<ENDCOURSEVERIFY);
1.36      www      2588: <form name="renameform" method="post" action="/adm/coursedocs">
                   2589: <input type="hidden" name="title" />
                   2590: <input type="hidden" name="cmd" />
1.168     www      2591: <input type="hidden" name="markcopy" />
1.142     raeburn  2592: $containertag
1.36      www      2593: </form>
1.39      www      2594: <form name="simpleedit" method="post" action="/adm/coursedocs">
                   2595: <input type=hidden name="importdetail" value="">
1.142     raeburn  2596: $uploadtag
1.39      www      2597: </form>
1.26      www      2598: <form action="/adm/coursedocs" method="post" name="courseverify">
1.74      www      2599: <table bgcolor="#AAAAAA" width="100%" cellspacing="4" cellpadding="4">
                   2600: <tr><td bgcolor="#DDDDCC">
1.130     www      2601: <input type="submit" name="verify" value="$lt{'vc'}" />$help{'Verify_Content'}
1.74      www      2602: </td><td bgcolor="#DDDDCC">
1.130     www      2603:     <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}
1.74      www      2604: $dumpbut
1.138     raeburn  2605: $exportbut
1.218     albertel 2606: </td><td bgcolor="#DDDDCC">
1.208     albertel 2607:     <input type="submit" name="listsymbs" value="$lt{'ls'}" />
1.247     www      2608: </td><td bgcolor="#DDDDCC">
                   2609:     <input type="submit" name="docslog" value="$lt{'sl'}" />
1.218     albertel 2610: </td></tr></table>
1.25      www      2611: </form>
                   2612: ENDCOURSEVERIFY
1.74      www      2613:        $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc',
1.230     albertel 2614: 		     &mt('Editing the Table of Contents for your '.$type)));
1.25      www      2615:     }
1.17      www      2616: # --------------------------------------------------------- Standard documents
1.43      www      2617:     $r->print('<table border=2 cellspacing=4 cellpadding=4>');
1.7       www      2618:     if (($standard) && ($allowed) && (!$forcesupplement)) {
1.116     albertel 2619: 	$r->print('<tr><td bgcolor="#BBBBBB">');
                   2620: #  '<h2>'.&mt('Main Course Documents').
                   2621: #  ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>');
1.174     albertel 2622:        my $folder=$env{'form.folder'};
1.117     albertel 2623:        if ($folder eq '' || $folder eq 'supplemental') {
1.112     raeburn  2624:            $folder='default';
1.230     albertel 2625: 	   $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));
1.112     raeburn  2626:        }
1.51      www      2627:        my $postexec='';
                   2628:        if ($folder eq 'default') {
                   2629: 	   $r->print('<script>this.window.name="loncapaclient";</script>');
                   2630:        } else {
1.117     albertel 2631:            #$postexec='self.close();';
1.51      www      2632:        }
1.40      www      2633:        $hadchanges=0;
1.188     raeburn  2634:        &editor($r,$coursenum,$coursedom,$folder,$allowed,$upload_output);
1.40      www      2635:        if ($hadchanges) {
1.136     albertel 2636: 	   &mark_hash_old()
1.40      www      2637:        }
1.136     albertel 2638:        &changewarning($r,$postexec);
1.16      www      2639:        my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                   2640:                      '.sequence';
1.142     raeburn  2641:        my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                   2642:                      '.page';
1.186     www      2643: 	my $container='sequence';
                   2644: 	if ($env{'form.pagepath'}) {
                   2645: 	    $container='page';
                   2646: 	}
                   2647: 	my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
1.8       www      2648:        $r->print(<<ENDFORM);
1.43      www      2649: <table cellspacing=4 cellpadding=4><tr>
1.81      www      2650: <th bgcolor="#DDDDDD">$lt{'uplm'}</th>
                   2651: <th bgcolor="#DDDDDD">$lt{'impp'}</th>
                   2652: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.11      www      2653: </tr>
1.16      www      2654: <tr><td bgcolor="#DDDDDD">
1.96      sakharuk 2655: $lt{'file'}:<br />
1.182     albertel 2656: <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59      www      2657: <input type="file" name="uploaddoc" size="40">
1.8       www      2658: <br />
1.96      sakharuk 2659: $lt{'title'}:<br />
1.11      www      2660: <input type="text" size="50" name="comment">
1.142     raeburn  2661: $uploadtag
1.10      www      2662: <input type="hidden" name="cmd" value="upload_default">
1.188     raeburn  2663: <br />
                   2664: <nobr>
1.190     albertel 2665: <label>$lt{'parse'}?
1.188     raeburn  2666: <input type="checkbox" name="parserflag" />
1.190     albertel 2667: </label>
1.188     raeburn  2668: </nobr>
                   2669: <br />
                   2670: <br />
1.129     albertel 2671: <nobr>
1.81      www      2672: <input type="submit" value="$lt{'upld'}">
1.60      albertel 2673:  $help{'Uploading_From_Harddrive'}
1.58      albertel 2674: </nobr>
1.60      albertel 2675: </form>
1.11      www      2676: </td>
1.16      www      2677: <td bgcolor="#DDDDDD">
1.39      www      2678: <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
1.168     www      2679: $lt{'pubd'}<br />
1.142     raeburn  2680: $uploadtag
1.232     www      2681: <input type=button onClick="javascript:groupsearch()" value="$lt{'srch'}" />
                   2682: <br />
1.58      albertel 2683: <nobr>
1.232     www      2684: <input type=button onClick="javascript:groupimport();" value="$lt{'impo'}" />
1.58      albertel 2685: $help{'Importing_LON-CAPA_Resource'}
                   2686: </nobr>
1.232     www      2687: <br />
                   2688: <input type=button onClick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />
1.59      www      2689: <p>
                   2690: <hr />
1.181     www      2691: $lt{'copm'}<br />
                   2692: <input type="text" size="40" name="importmap"><br />
1.68      bowersj2 2693: <nobr><input type=button 
1.52      www      2694: onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
1.81      www      2695: value="$lt{'selm'}"> <input type="submit" name="loadmap" value="$lt{'load'}">
1.68      bowersj2 2696: $help{'Load_Map'}</nobr>
1.59      www      2697: </p>
1.52      www      2698: </form>
1.186     www      2699: <hr />
                   2700: <form action="/adm/groupsort" method="post" name="recover">
1.232     www      2701: <input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />
1.186     www      2702: </form>
1.142     raeburn  2703: ENDFORM
1.174     albertel 2704:        unless ($env{'form.pagepath'}) {
1.168     www      2705: 	   $r->print(<<ENDFORM);
                   2706: <hr />
                   2707: <form action="/adm/coursedocs" method="post" name="newext">
                   2708: $uploadtag
                   2709: <input type=hidden name="importdetail" value="">
                   2710: <nobr>
                   2711: <input name="newext" type="button" onClick="javascript:makenewext('newext');"
                   2712: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
                   2713: </nobr>
                   2714: </form>
1.214     www      2715: <br /><form action="/adm/imsimportdocs" method="post" name="ims">
1.168     www      2716: <input type="hidden" name="folder" value="$folder" />
                   2717: <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />
                   2718: </nobr>
                   2719: </form>
                   2720: ENDFORM
                   2721:        }
                   2722:        $r->print('</td><td bgcolor="#DDDDDD">');
1.174     albertel 2723:        unless ($env{'form.pagepath'}) {
1.142     raeburn  2724:            $r->print(<<ENDFORM);
1.214     www      2725: <br /><form action="/adm/coursedocs" method="post" name="newfolder">
1.174     albertel 2726: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.13      www      2727: <input type=hidden name="importdetail" value="">
1.58      albertel 2728: <nobr>
1.16      www      2729: <input name="newfolder" type="button"
                   2730: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81      www      2731: value="$lt{'newf'}" />$help{'Adding_Folders'}
1.58      albertel 2732: </nobr>
1.11      www      2733: </form>
1.214     www      2734: <br /><form action="/adm/coursedocs" method="post" name="newpage">
1.174     albertel 2735: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.142     raeburn  2736: <input type=hidden name="importdetail" value="">
                   2737: <nobr>
                   2738: <input name="newpage" type="button"
                   2739: onClick="javascript:makenewpage(this.form,'$pageseq');"
                   2740: value="$lt{'newp'}" />$help{'Adding_Pages'}
                   2741: </nobr>
                   2742: </form>
1.214     www      2743: <br /><form action="/adm/coursedocs" method="post" name="newsyl">
1.142     raeburn  2744: $uploadtag
1.14      www      2745: <input type=hidden name="importdetail" 
                   2746: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
1.58      albertel 2747: <nobr>
1.81      www      2748: <input name="newsyl" type="submit" value="$lt{'syll'}" /> 
1.65      bowersj2 2749:  $help{'Syllabus'}
1.58      albertel 2750: </nobr>
                   2751: </form>
1.214     www      2752: <br /><form action="/adm/coursedocs" method="post" name="newnav">
1.142     raeburn  2753: $uploadtag
1.15      www      2754: <input type=hidden name="importdetail" 
                   2755: value="Navigate Content=/adm/navmaps">
1.58      albertel 2756: <nobr>
1.81      www      2757: <input name="newnav" type="submit" value="$lt{'navc'}" />
1.47      www      2758: $help{'Navigate_Content'}
1.58      albertel 2759: </nobr>
1.22      www      2760: </form>
1.214     www      2761: <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
1.142     raeburn  2762: $uploadtag
1.22      www      2763: <input type=hidden name="importdetail" value="">
1.58      albertel 2764: <nobr>
1.81      www      2765: <input name="newsmppg" type="button" value="$lt{'sipa'}"
1.65      bowersj2 2766: onClick="javascript:makesmppage();" /> $help{'Simple Page'}
1.58      albertel 2767: </nobr>
1.55      www      2768: </form>
1.214     www      2769: <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
1.142     raeburn  2770: $uploadtag
1.55      www      2771: <input type=hidden name="importdetail" value="">
1.58      albertel 2772: <nobr>
1.81      www      2773: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
1.65      bowersj2 2774: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.62      www      2775: </nobr>
                   2776: </form>
1.219     www      2777: <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
                   2778: $uploadtag      
                   2779: <input type=hidden name="importdetail" value="">
                   2780: <nobr>          
                   2781: <input name="newdropbox" type="button" value="$lt{'drbx'}"
                   2782: onClick="javascript:makedropbox();" />
                   2783: </nobr>         
                   2784: </form> 
1.214     www      2785: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142     raeburn  2786: $uploadtag
1.62      www      2787: <input type=hidden name="importdetail" value="">
                   2788: <nobr>
1.81      www      2789: <input name="newexamupload" type="button" value="$lt{'scuf'}"
1.62      www      2790: onClick="javascript:makeexamupload();" />
1.66      bowersj2 2791: $help{'Score_Upload_Form'}
1.58      albertel 2792: </nobr>
1.22      www      2793: </form>
1.214     www      2794: <br /><form action="/adm/coursedocs" method="post" name="newbul">
1.142     raeburn  2795: $uploadtag
1.22      www      2796: <input type=hidden name="importdetail" value="">
1.58      albertel 2797: <nobr>
1.81      www      2798: <input name="newbulletin" type="button" value="$lt{'bull'}"
1.22      www      2799: onClick="javascript:makebulboard();" />
1.65      bowersj2 2800: $help{'Bulletin Board'}
1.58      albertel 2801: </nobr>
                   2802: </form>
1.214     www      2803: <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
1.142     raeburn  2804: $uploadtag
1.14      www      2805: <input type=hidden name="importdetail" 
                   2806: value="$plainname=/adm/$udom/$uname/aboutme">
1.58      albertel 2807: <nobr>
1.81      www      2808: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65      bowersj2 2809: $help{'My Personal Info'}
1.101     www      2810: </nobr>
                   2811: </form>
1.214     www      2812: <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
1.142     raeburn  2813: $uploadtag
1.101     www      2814: <input type=hidden name="importdetail" value="">
                   2815: <nobr>
                   2816: <input name="newaboutsomeone" type="button" value="$lt{'abou'}" 
                   2817: onClick="javascript:makeabout();" />
1.110     raeburn  2818: </nobr>
1.182     albertel 2819: </form>
1.142     raeburn  2820: ENDFORM
                   2821:        }
1.174     albertel 2822:        if ($env{'form.pagepath'}) {
1.142     raeburn  2823:            $r->print(<<ENDBLOCK);
                   2824: <form action="/adm/coursedocs" method="post" name="newsmpproblem">
                   2825: $uploadtag
                   2826: <input type=hidden name="importdetail" value="">
                   2827: <nobr>
                   2828: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
                   2829: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
                   2830: </nobr>
                   2831: </form>
1.214     www      2832: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142     raeburn  2833: $uploadtag
                   2834: <input type=hidden name="importdetail" value="">
                   2835: <nobr>
                   2836: <input name="newexamupload" type="button" value="$lt{'scuf'}"
                   2837: onClick="javascript:makeexamupload();" />
                   2838: $help{'Score_Upload_Form'}
                   2839: </nobr>
1.182     albertel 2840: </form>
1.142     raeburn  2841: ENDBLOCK
                   2842:        }
                   2843:        $r->print('</td></tr>'."\n".
                   2844: '</table>');
1.24      www      2845:        $r->print('</td></tr>');
1.7       www      2846:     }
                   2847: # ----------------------------------------------------- Supplemental documents
                   2848:     if (!$forcestandard) {
1.116     albertel 2849:        $r->print('<tr><td bgcolor="#BBBBBB">');
                   2850: # '<h2>'.&mt('Supplemental Course Documents').
                   2851: #  ($allowed?' '.$help{'Supplemental'}:'').'</h2>');
1.174     albertel 2852:        my $folder=$env{'form.folder'};
1.117     albertel 2853:        unless ($folder=~/^supplemental/) {
1.116     albertel 2854: 	   $folder='supplemental';
1.117     albertel 2855:        }
                   2856:        if ($folder =~ /^supplemental$/ &&
1.174     albertel 2857: 	   $env{'form.folderpath'} =~ /^default\&/) {
                   2858: 	   $env{'form.folderpath'}='supplemental&'.
1.230     albertel 2859: 	       &escape(&mt('Supplemental '.$type.' Documents'));
1.116     albertel 2860:        }
1.7       www      2861:        &editor($r,$coursenum,$coursedom,$folder,$allowed);
1.8       www      2862:        if ($allowed) {
1.17      www      2863:        my $folderseq=
                   2864:                   '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
                   2865:                      '.sequence';
                   2866: 
1.8       www      2867:           $r->print(<<ENDSUPFORM);
1.43      www      2868: <table cellspacing=4 cellpadding=4><tr>
1.81      www      2869: <th bgcolor="#DDDDDD">$lt{'upls'}</th>
                   2870: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.17      www      2871: </tr>
                   2872: <tr><td bgcolor="#DDDDDD">
1.10      www      2873: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59      www      2874: <input type="file" name="uploaddoc" size="40">
1.196     raeburn  2875: <br />
                   2876: <br />
                   2877: <nobr>
                   2878: <label>$lt{'parse'}?
                   2879: <input type="checkbox" name="parserflag" />
                   2880: </label>
                   2881: </nobr>
                   2882: <br /><br />
                   2883: $lt{'comment'}:<br />
1.4       www      2884: <textarea cols=50 rows=4 name='comment'>
                   2885: </textarea>
1.115     albertel 2886: <br />
1.174     albertel 2887: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.10      www      2888: <input type="hidden" name="cmd" value="upload_supplemental">
1.58      albertel 2889: <nobr>
1.81      www      2890: <input type="submit" value="$lt{'upld'}">
1.58      albertel 2891:  $help{'Uploading_From_Harddrive'}
                   2892: </nobr>
                   2893: </form>
1.17      www      2894: </td>
                   2895: <td bgcolor="#DDDDDD">
1.18      www      2896: <form action="/adm/coursedocs" method="post" name="supnewfolder">
1.174     albertel 2897: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2898: <input type=hidden name="importdetail" value="">
1.58      albertel 2899: <nobr>
1.17      www      2900: <input name="newfolder" type="button"
                   2901: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81      www      2902: value="$lt{'newf'}" /> $help{'Adding_Folders'}
1.58      albertel 2903: </nobr>
1.17      www      2904: </form>
1.214     www      2905: <br /><form action="/adm/coursedocs" method="post" name="supnewext">
1.174     albertel 2906: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2907: <input type=hidden name="importdetail" value="">
1.58      albertel 2908: <nobr>
1.18      www      2909: <input name="newext" type="button" 
                   2910: onClick="javascript:makenewext('supnewext');"
1.81      www      2911: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.58      albertel 2912: </nobr>
1.17      www      2913: </form>
1.214     www      2914: <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
1.174     albertel 2915: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2916: <input type=hidden name="importdetail" 
                   2917: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
1.58      albertel 2918: <nobr>
1.81      www      2919: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65      bowersj2 2920: $help{'Syllabus'}
1.58      albertel 2921: </nobr>
                   2922: </form>
1.214     www      2923: <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
1.174     albertel 2924: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2925: <input type=hidden name="importdetail" 
                   2926: value="$plainname=/adm/$udom/$uname/aboutme">
1.58      albertel 2927: <nobr>
1.81      www      2928: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65      bowersj2 2929: $help{'My Personal Info'}
1.58      albertel 2930: </nobr>
                   2931: </form>
1.17      www      2932: </td></tr>
1.24      www      2933: </table></td></tr>
1.8       www      2934: ENDSUPFORM
                   2935:        }
1.7       www      2936:     }
1.18      www      2937:     if ($allowed) {
1.182     albertel 2938: 	$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      2939:     }
1.24      www      2940:     $r->print('</table>');
1.19      www      2941:   } else {
1.188     raeburn  2942:       unless ($upload_result eq 'phasetwo') {
1.19      www      2943: # -------------------------------------------------------- This is showdoc mode
1.188     raeburn  2944:           $r->print("<h1>".&mt('Uploaded Document').' - '.
1.141     albertel 2945: 		&Apache::lonnet::gettitle($r->uri).'</h1><p>'.
1.81      www      2946: &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><p><table>".
1.188     raeburn  2947:           &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table></p>');
                   2948:       }
1.19      www      2949:   }
1.26      www      2950:  }
1.224     albertel 2951:  $r->print(&Apache::loncommon::end_page());
1.26      www      2952:  return OK;
1.1       www      2953: } 
                   2954: 
1.224     albertel 2955: 
                   2956: sub editing_js {
                   2957:     my ($udom,$uname) = @_;
                   2958:     my $now = time();
                   2959: 
                   2960:     return <<ENDNEWSCRIPT;
                   2961: function makenewfolder(targetform,folderseq) {
                   2962:     var foldername=prompt('Name of New Folder','New Folder');
                   2963:     if (foldername) {
1.236     albertel 2964:        targetform.importdetail.value=escape(foldername)+"="+folderseq;
1.224     albertel 2965:         targetform.submit();
                   2966:     }
                   2967: }
                   2968: 
                   2969: function makenewpage(targetform,folderseq) {
                   2970:     var pagename=prompt('Name of New Page','New Page');
                   2971:     if (pagename) {
1.236     albertel 2972:         targetform.importdetail.value=escape(pagename)+"="+folderseq;
1.224     albertel 2973:         targetform.submit();
                   2974:     }
                   2975: }
                   2976: 
                   2977: function makenewext(targetname) {
                   2978:     this.document.forms.extimport.useform.value=targetname;
                   2979:     window.open('/adm/rat/extpickframe.html');
                   2980: }
                   2981: 
                   2982: function makeexamupload() {
                   2983:    var title=prompt('Listed Title for the Uploaded Score');
                   2984:    if (title) { 
                   2985:     this.document.forms.newexamupload.importdetail.value=
1.236     albertel 2986: 	escape(title)+'=/res/lib/templates/examupload.problem';
1.224     albertel 2987:     this.document.forms.newexamupload.submit();
                   2988:    }
                   2989: }
                   2990: 
                   2991: function makesmppage() {
                   2992:    var title=prompt('Listed Title for the Page');
                   2993:    if (title) { 
                   2994:     this.document.forms.newsmppg.importdetail.value=
1.236     albertel 2995: 	escape(title)+'=/adm/$udom/$uname/$now/smppg';
1.224     albertel 2996:     this.document.forms.newsmppg.submit();
                   2997:    }
                   2998: }
                   2999: 
                   3000: function makesmpproblem() {
                   3001:    var title=prompt('Listed Title for the Problem');
                   3002:    if (title) { 
                   3003:     this.document.forms.newsmpproblem.importdetail.value=
1.236     albertel 3004: 	escape(title)+'=/res/lib/templates/simpleproblem.problem';
1.224     albertel 3005:     this.document.forms.newsmpproblem.submit();
                   3006:    }
                   3007: }
                   3008: 
                   3009: function makedropbox() {
                   3010:    var title=prompt('Listed Title for the Drop Box');
                   3011:    if (title) { 
                   3012:     this.document.forms.newdropbox.importdetail.value=
1.236     albertel 3013:         escape(title)+'=/res/lib/templates/DropBox.problem';
1.224     albertel 3014:     this.document.forms.newdropbox.submit();
                   3015:    }
                   3016: }
                   3017: 
                   3018: function makebulboard() {
                   3019:    var title=prompt('Listed Title for the Bulletin Board');
                   3020:    if (title) {
                   3021:     this.document.forms.newbul.importdetail.value=
1.236     albertel 3022: 	escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';
1.224     albertel 3023:     this.document.forms.newbul.submit();
                   3024:    }
                   3025: }
                   3026: 
                   3027: function makeabout() {
1.236     albertel 3028:    var user=prompt("Enter user:domain for User's 'About Me' Page");
1.224     albertel 3029:    if (user) {
                   3030:        var comp=new Array();
1.236     albertel 3031:        comp=user.split(':');
1.224     albertel 3032:        if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {
                   3033: 	   if ((comp[0]) && (comp[1])) {
                   3034: 	       this.document.forms.newaboutsomeone.importdetail.value=
1.236     albertel 3035: 		   'About '+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
1.224     albertel 3036: 	       this.document.forms.newaboutsomeone.submit();
                   3037: 	   } else {
1.236     albertel 3038:                alert("Not a valid user:domain");
1.224     albertel 3039:            }
                   3040:        } else {
1.236     albertel 3041:            alert("Please enter both user and domain in the format user:domain"); 
1.224     albertel 3042:        }
                   3043:    }
                   3044: }
                   3045: 
                   3046: function makeims() {
                   3047:     var caller = document.forms.ims.folder.value;
                   3048:     var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";
                   3049:     newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");
                   3050:     newWindow.location.href = newlocation;
                   3051: }
                   3052: 
                   3053: 
                   3054: function finishpick() {
                   3055:     var title=this.document.forms.extimport.title.value;
                   3056:     var url=this.document.forms.extimport.url.value;
                   3057:     var form=this.document.forms.extimport.useform.value;
                   3058:     eval
                   3059:      ('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+
                   3060:     '";this.document.forms.'+form+'.submit();');
                   3061: }
                   3062: 
                   3063: function changename(folderpath,index,oldtitle,container,pagesymb) {
                   3064:     var title=prompt('New Title',oldtitle);
                   3065:     if (title) {
                   3066: 	this.document.forms.renameform.title.value=title;
                   3067: 	this.document.forms.renameform.cmd.value='rename_'+index;
                   3068:         if (container == 'sequence') {
                   3069: 	    this.document.forms.renameform.folderpath.value=folderpath;
                   3070:         }
                   3071:         if (container == 'page') {
                   3072:             this.document.forms.renameform.pagepath.value=folderpath;
                   3073:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   3074:         }
                   3075:         this.document.forms.renameform.submit();
                   3076:     }
                   3077: }
                   3078: 
                   3079: function removeres(folderpath,index,oldtitle,container,pagesymb) {
                   3080:     if (confirm('WARNING: Removing a resource makes associated grades and scores inaccessible!\\nRemove "'+oldtitle+'"?')) {
                   3081: 	this.document.forms.renameform.cmd.value='del_'+index;
                   3082:         if (container == 'sequence') {
                   3083:             this.document.forms.renameform.folderpath.value=folderpath;
                   3084:         }
                   3085:         if (container == 'page') {
                   3086:             this.document.forms.renameform.pagepath.value=folderpath;
                   3087:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   3088:         }
                   3089:         this.document.forms.renameform.submit();
                   3090:     }
                   3091: }
                   3092: 
                   3093: function cutres(folderpath,index,oldtitle,container,pagesymb) {
                   3094:     if (confirm('WARNING: Cutting a resource makes associated grades and scores inaccessible!\\nGrades remain inaccessible if resource is pasted into another folder.\\nCut "'+oldtitle+'"?')) {
                   3095: 	this.document.forms.renameform.cmd.value='cut_'+index;
                   3096: 	this.document.forms.renameform.markcopy.value=index;
                   3097:         if (container == 'sequence') {
                   3098:             this.document.forms.renameform.folderpath.value=folderpath;
                   3099:         }
                   3100:         if (container == 'page') {
                   3101:             this.document.forms.renameform.pagepath.value=folderpath;
                   3102:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   3103:         }
                   3104:         this.document.forms.renameform.submit();
                   3105:     }
                   3106: }
                   3107: 
                   3108: function markcopy(folderpath,index,oldtitle,container,pagesymb) {
                   3109:     this.document.forms.renameform.markcopy.value=index;
                   3110:     if (container == 'sequence') {
                   3111: 	this.document.forms.renameform.folderpath.value=folderpath;
                   3112:     }
                   3113:     if (container == 'page') {
                   3114: 	this.document.forms.renameform.pagepath.value=folderpath;
                   3115: 	this.document.forms.renameform.pagesymb.value=pagesymb;
                   3116:     }
                   3117:     this.document.forms.renameform.submit();
                   3118: }
                   3119: 
                   3120: ENDNEWSCRIPT
                   3121: }
1.1       www      3122: 1;
                   3123: __END__

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