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

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

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