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

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

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