1: # The LearningOnline Network with CAPA
2: # Routines to control the menu
3: #
4: # $Id: lonmenu.pm,v 1.203 2006/08/14 09:11:55 foxr Exp $
5: #
6: # Copyright Michigan State University Board of Trustees
7: #
8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
9: #
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.
14: #
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: #
29: # There are two parameters controlling the action of this module:
30: #
31: # browser.interface - if this is 'textual', it overrides the second parameter
32: # and goes to screen reader PDA mode
33: #
34: # environment.remote - if this is 'on', the routines controll the remote
35: # control, otherwise they render the main window controls; ignored it
36: # browser.interface is 'textual'
37: #
38:
39: package Apache::lonmenu;
40:
41: use strict;
42: use Apache::lonnet;
43: use Apache::lonhtmlcommon();
44: use Apache::loncommon();
45: use Apache::lonenc();
46: use Apache::lonlocal;
47: use lib '/home/httpd/lib/perl/';
48: use LONCAPA;
49:
50: use vars qw(@desklines $readdesk);
51:
52:
53: my @inlineremote;
54:
55:
56:
57: # ================================================================ Little texts
58:
59: sub initlittle {
60: return &Apache::lonlocal::texthash('ret' => 'Return to Last Location',
61: 'nav' => 'Navigate Contents',
62: 'main' => 'Main Menu',
63: 'roles' => ($env{'user.adv'}?
64: 'Roles':'Courses'),
65: 'docs' => 'Course Documents',
66: 'exit' => 'Exit',
67: 'login' => 'Log In',
68: 'launch' => 'Launch Remote Control',
69: 'groups' => 'Groups',
70: 'gdoc' => 'Group Documents',
71: );
72: }
73:
74: # ============================= This gets called at the top of the body section
75:
76: sub menubuttons {
77: my $forcereg=shift;
78: my $registration=shift;
79: my $titletable=shift;
80: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
81: ['inhibitmenu']);
82: if (($env{'form.inhibitmenu'} eq 'yes') ||
83: ($ENV{'REQUEST_URI'} eq '/adm/logout')) { return ''; }
84:
85: if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
86:
87: my %lt=&initlittle();
88: my $navmaps='';
89: my $reloadlink='';
90: my $docs='';
91: my $groups='';
92: my $showgroups=0;
93: my $escurl=&escape(&Apache::lonenc::check_encrypt($env{'request.noversionuri'}));
94: my $escsymb=&escape(&Apache::lonenc::check_encrypt($env{'request.symb'}));
95:
96: my $logo=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/minilogo.gif");
97: $logo = '<td class="LC_top_nav_logo"><a href="/adm/about.html"><img src="'.
98: $logo.'" alt="LON-CAPA Logo" /></a></td>';
99:
100: if ($env{'request.state'} eq 'construct') {
101: if (($env{'request.noversionuri'} eq '') || (!defined($env{'request.noversionuri'}))) {
102: my $returnurl = $env{'request.filename'};
103: $returnurl =~ s:^/home/([^/]+)/public_html/(.*)$:/priv/$1/$2:;
104: $escurl = &escape($returnurl);
105: }
106: }
107: if ($env{'request.course.id'}) {
108: my %coursegroups;
109: my $viewgrps_permission =
110: &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
111: if (!$viewgrps_permission) {
112: %coursegroups = &Apache::lonnet::get_active_groups($env{'user.domain'},$env{'user.name'},$env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'});
113: }
114: if ((keys(%coursegroups) > 0) || ($viewgrps_permission)) {
115: $showgroups = 1;
116: }
117: }
118:
119: if ($env{'browser.interface'} eq 'textual') {
120: # Textual display only
121: if ($env{'request.course.id'}) {
122: $navmaps=(<<ENDNAV);
123: <a href="/adm/navmaps?postdata=$escurl&postsymb=$escsymb" target="_top">$lt{'nav'}</a>
124: ENDNAV
125: if (($env{'request.noversionuri'}=~/^\/adm\//) &&
126: ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&
127: ($env{'request.noversionuri'}!~/^\/adm\/.*\/(smppg|bulletinboard|aboutme)(\?|$)/)) {
128: my $escreload=&escape('return:');
129: $reloadlink=(<<ENDRELOAD);
130: <a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a>
131: ENDRELOAD
132: }
133: if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
134: $docs=(<<ENDDOCS);
135: <a href="/adm/coursedocs" target="_top">$lt{'docs'}</a>
136: ENDDOCS
137: }
138: if ($showgroups) {
139: $groups =(<<ENDGROUPS);
140: <a href="/adm/coursegroups" target="_top">$lt{'groups'}</a>
141: ENDGROUPS
142: }
143: }
144: my $form=&serverform();
145: my $utility=&utilityfunctions();
146: my $output=(<<ENDMAINMENU);
147: <script type="text/javascript">
148: // BEGIN LON-CAPA Internal
149: $utility
150: </script>
151: <div id="LC_top_nav">
152: <a href="/adm/menu" target="_top">$lt{'main'}</a>
153: $reloadlink $navmaps $docs $groups
154: <a href="/adm/roles" target="_top">$lt{'roles'}</a>
155: <a href="/adm/logout" target="_top">$lt{'exit'}</a>
156: </div>
157: <br />
158: <script type="text/javascript">
159: // END LON-CAPA Internal
160: </script>
161: $form
162: ENDMAINMENU
163: if ($registration) { $output.=&innerregister($forcereg); }
164: return $output."<hr />";
165: } elsif ($env{'environment.remote'} eq 'off') {
166: # Remote Control is switched off
167: # figure out colors
168: my %lt=&initlittle();
169:
170: my $domain=&Apache::loncommon::determinedomain();
171: my $function =&Apache::loncommon::get_users_function();
172: my $link=&Apache::loncommon::designparm($function.'.link',$domain);
173: my $alink=&Apache::loncommon::designparm($function.'.alink',$domain);
174: my $vlink=&Apache::loncommon::designparm($function.'.vlink',$domain);
175: my $sidebg=&Apache::loncommon::designparm($function.'.sidebg',$domain);
176: if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {
177: return (<<ENDINLINEMENU);
178: <table id="LC_top_nav">
179: <tr>
180: $logo
181: <td></td>
182: <td class="LC_top_nav_login">
183: <a href="/adm/roles" target="_top">$lt{'login'}</a>
184: </td>
185: </tr>
186: </table>
187: </font>
188: ENDINLINEMENU
189: }
190: # Do we have a NAV link?
191: if ($env{'request.course.id'}) {
192: my $link='/adm/navmaps?postdata='.$escurl.'&postsymb='.
193: $escsymb;
194: if ($env{'environment.remotenavmap'} eq 'on') {
195: $link="javascript:gonav('".$link."')";
196: }
197: $navmaps=(<<ENDNAV);
198: <td><a href="$link" target="_top">$lt{'nav'}</a></td>
199: ENDNAV
200: my $is_group = (&Apache::loncommon::course_type() eq 'Group');
201: if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
202: my $text = ($is_group) ? $lt{'gdoc'} : $lt{'docs'};
203: $docs=(<<ENDDOCS);
204: <td><a href="/adm/coursedocs" target="_top">$text</a></td>
205: ENDDOCS
206: }
207: if ($showgroups) {
208: $groups =(<<ENDGROUPS);
209: <td><a href="/adm/coursegroups" target="_top">$lt{'groups'}</a></td>
210: ENDGROUPS
211: }
212: if (
213: ($env{'request.noversionuri'}=~m[^/(res|public)/] &&
214: $env{'request.symb'} eq '')
215: ||
216: (($env{'request.noversionuri'}=~/^\/adm\//) &&
217: ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&
218: ($env{'request.noversionuri'}!~
219: m[^/adm/.*/(smppg|bulletinboard|aboutme)($|\?)])
220: )
221: ) {
222: my $escreload=&escape('return:');
223: $reloadlink=(<<ENDRELOAD);
224: <td><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></td>
225: ENDRELOAD
226: }
227: }
228: if (($env{'request.state'} eq 'construct') && ($env{'request.course.id'})) {
229: my $escreload=&escape('return:');
230: $reloadlink=(<<ENDCRELOAD);
231: <td><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></td>
232: ENDCRELOAD
233: }
234: my $reg='';
235: if ($registration) {
236: $reg=&innerregister($forcereg,$titletable);
237: }
238: my $form=&serverform();
239: my $utility=&utilityfunctions();
240: my $remote;
241: if ($env{'user.adv'}) {
242: $remote = '<td><a href="/adm/remote?action=launch&url='.$escurl.'" target="_top">'.$lt{'launch'}.'</a></td>'
243: }
244:
245: my $helplink=&Apache::loncommon::top_nav_help('Help');
246: return (<<ENDINLINEMENU);
247: <script type="text/javascript">
248: // BEGIN LON-CAPA Internal
249: // <![CDATA[
250: $utility
251: // ]]>
252: </script>
253: <table id="LC_top_nav">
254: <tr>
255: $logo
256: <td><a href="/adm/menu" target="_top">$lt{'main'}</a></td>
257: $reloadlink
258: $navmaps
259: $docs
260: $groups
261: $remote
262: <td><a href="/adm/roles" target="_top">$lt{'roles'}</a></td>
263: <td class="LC_top_nav_help">$helplink</td>
264: <td class="LC_top_nav_exit"><a href="/adm/logout" target="_top">$lt{'exit'}</a></td>
265: </tr>
266: </table>
267: $form
268: <script type="text/javascript">
269: // END LON-CAPA Internal
270: </script>
271: $reg
272: ENDINLINEMENU
273: } else {
274: return '';
275: }
276: }
277:
278: # ====================================== This gets called in the header section
279:
280: sub registerurl {
281: my ($forcereg) = @_;
282: my $result = '';
283: if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
284: my $force_title='';
285: if ($env{'request.state'} eq 'construct') {
286: $force_title=&Apache::lonxml::display_title();
287: }
288: if (($env{'browser.interface'} eq 'textual') ||
289: ($env{'environment.remote'} eq 'off') ||
290: ((($env{'request.publicaccess'}) ||
291: (!&Apache::lonnet::is_on_map(
292: &unescape($env{'request.noversionuri'})))) &&
293: (!$forcereg))) {
294: return $result.
295: '<script type="text/javascript">function LONCAPAreg(){;} function LONCAPAstale(){}</script>'.$force_title;
296: }
297: # Graphical display after login only
298: if ($env{'request.registered'} && !$forcereg) { return ''; }
299: $result.=&innerregister($forcereg);
300: return $result.$force_title;
301: }
302:
303: # =========== This gets called in order to register a URL, both with the Remote
304: # =========== and in the body of the document
305:
306: sub innerregister {
307: my ($forcereg, $titletable) = @_;
308: my $result = '';
309: my ($uname,$thisdisfn);
310: my $const_space = ($env{'request.state'} eq 'construct');
311: my $is_const_dir = 0;
312:
313: if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
314:
315: $env{'request.registered'} = 1;
316:
317: my $textinter=($env{'browser.interface'} eq 'textual');
318: my $noremote=($env{'environment.remote'} eq 'off');
319:
320: my $textual=($textinter || $noremote);
321:
322: undef(@inlineremote);
323:
324: my $reopen=&Apache::lonmenu::reopenmenu();
325:
326: my $newmail='';
327: if ($noremote) {
328: $newmail='<table id="LC_nav_location"><tr>';
329: }
330: if (&Apache::lonmsg::newmail()) {
331: if ($textual) {
332: $newmail.= '<td class="LC_new_mail">
333: <a href="/adm/communicate" target="_top">'.
334: &mt('You have new messages').'</a></td>';
335: } else {
336: $newmail= 'swmenu.setstatus("you have","messages");';
337: }
338: } elsif (($textual)
339: && ($env{'request.symb'})
340: && ($env{'request.course.id'})) {
341: $newmail.= '<td class="LC_current_location">';
342: my ($mapurl,$rid,$resurl)=
343: &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());
344: $newmail.=$env{'course.'.$env{'request.course.id'}.'.description'};
345: my $maptitle=&Apache::lonnet::gettitle($mapurl);
346: my $restitle=&Apache::lonnet::gettitle(&Apache::lonnet::symbread());
347: if ($maptitle && $maptitle ne 'default.sequence') {
348: $newmail.=', '.$maptitle;
349: }
350: if ($restitle) {
351: $newmail.=': '.$restitle;
352: }
353: $newmail.=' </td>';
354: }
355: if ($env{'request.state'} eq 'construct') {
356: $newmail = $titletable;
357: } else {
358: if ($noremote) {
359: $newmail.='</tr></table>';
360: }
361: }
362: my $timesync=($textual?'':'swmenu.syncclock(1000*'.time.');');
363: my $tablestart=($noremote?'<table id="LC_menubuttons">':'').
364: ($textinter?'<br /><a href="#content">'.&mt('Skip to Content').'</a><br />':'');
365: my $tableend=($noremote?'</table>':'').($textinter?'<a name="content" />':'');
366: # =============================================================================
367: # ============================ This is for URLs that actually can be registered
368: if (($env{'request.noversionuri'}!~m|^/(res/)*adm/|) || ($forcereg)) {
369: # -- This applies to homework problems for users with grading privileges
370: my $crs='/'.$env{'request.course.id'};
371: if ($env{'request.course.sec'}) {
372: $crs.='_'.$env{'request.course.sec'};
373: }
374: $crs=~s/\_/\//g;
375:
376: my $hwkadd='';
377: if ($env{'request.symb'} ne '' &&
378: $env{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form|task)$/) {
379: if (&Apache::lonnet::allowed('mgr',$crs)) {
380: $hwkadd.=&switch('','',7,2,'pgrd.gif','problem[_1]','grades[_3]',
381: "gocmd('/adm/grades','gradingmenu')",
382: 'Modify user grades for this assessment resource');
383: } elsif (&Apache::lonnet::allowed('vgr',$crs)) {
384: $hwkadd.=&switch('','',7,2,'subm.gif','view sub-[_1]','missions[_1]',
385: "gocmd('/adm/grades','submission')",
386: 'View user submissions for this assessment resource');
387: }
388: }
389: if ($env{'request.symb'} ne '' &&
390: &Apache::lonnet::allowed('opa',$crs)) {
391: $hwkadd.=&switch('','',7,3,'pparm.gif','problem[_2]','parms[_2]',
392: "gocmd('/adm/parmset','set')",
393: 'Modify parameter settings for this resource');
394: }
395: # -- End Homework
396: ###
397: ### Determine whether or not to display the 'cstr' button for this
398: ### resource
399: ###
400: my $editbutton = '';
401: if ($env{'user.author'}) {
402: if ($env{'request.role'}=~/^(ca|au)/) {
403: # Set defaults for authors
404: my ($top,$bottom) = ('con-','struct');
405: my $action = "go('/priv/".$env{'user.name'}."');";
406: my $cadom = $env{'request.role.domain'};
407: my $caname = $env{'user.name'};
408: my $desc = "Enter my resource construction space";
409: # Set defaults for co-authors
410: if ($env{'request.role'} =~ /^ca/) {
411: ($cadom,$caname)=($env{'request.role'}=~/(\w+)\/(\w+)$/);
412: ($top,$bottom) = ('co con-','struct');
413: $action = "go('/priv/".$caname."');";
414: $desc = "Enter construction space as co-author";
415: }
416: # Check that we are on the correct machine
417: my $home = &Apache::lonnet::homeserver($caname,$cadom);
418: my $allowed=0;
419: my @ids=&Apache::lonnet::current_machine_ids();
420: foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
421: if (!$allowed) {
422: $editbutton=&switch('','',6,1,$top,,$bottom,$action,$desc);
423: }
424: }
425: ##
426: ## Determine if user can edit url.
427: ##
428: my $cfile='';
429: my $cfuname='';
430: my $cfudom='';
431: if ($env{'request.filename'}) {
432: my $file=&Apache::lonnet::declutter($env{'request.filename'});
433: $file=~s/^(\w+)\/(\w+)/\/priv\/$2/;
434: # Check that the user has permission to edit this resource
435: ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$1);
436: if (defined($cfudom)) {
437: my $home=&Apache::lonnet::homeserver($cfuname,$cfudom);
438: my $allowed=0;
439: my @ids=&Apache::lonnet::current_machine_ids();
440: foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
441: if ($allowed) {
442: $cfile=$file;
443: }
444: }
445: }
446: # Finally, turn the button on or off
447: if ($cfile && !$const_space) {
448: $editbutton=&switch
449: ('','',6,1,'cstr.gif','edit[_1]','resource[_2]',
450: "go('".$cfile."');","Edit this resource");
451: } elsif ($editbutton eq '') {
452: $editbutton=&clear(6,1);
453: }
454: }
455: ###
456: ###
457: # Prepare the rest of the buttons
458: my $menuitems;
459: if ($const_space) {
460: my ($uname,$thisdisfn) =
461: ($env{'request.filename'}=~m|^/home/([^/]+)/public_html/(.*)|);
462: my $currdir = '/priv/'.$uname.'/'.$thisdisfn;
463: if ($currdir =~ m-/$-) {
464: $is_const_dir = 1;
465: } else {
466: $currdir =~ s#[^/]+$##;
467: my $cleandisfn = &Apache::loncommon::escape_single($thisdisfn);
468: $menuitems=(<<ENDMENUITEMS);
469: s&6&1&list.gif&list[_1]&dir[_1]&golist('$currdir')&List current directory
470: s&6&2&rtrv.gif&retrieve[_1]&version[_1]&gocstr('/adm/retrieve','/~$uname/$cleandisfn')&Retrieve old version
471: s&6&3&pub.gif&publish[_1]&resource[_1]&gocstr('/adm/publish','/~$uname/$cleandisfn')&Publish this resource
472: s&7&1&del.gif&delete[_1]&resource[_2]&gocstr('/adm/cfile?action=delete','/~$uname/$cleandisfn')&Delete this resource
473: s&7&2&prt.gif&prepare[_1]&printout[_1]&gocstr('/adm/printout','/~$uname/$cleandisfn')&Prepare a printable document
474: ENDMENUITEMS
475: }
476: } elsif ( defined($env{'request.course.id'}) &&
477: $env{'request.symb'} ne '' ) {
478: $menuitems=(<<ENDMENUITEMS);
479: c&3&1
480: s&2&1&back.gif&backward[_1]&&gopost('/adm/flip','back:'+currentURL)&Go to the previous resource in the course sequence&1
481: s&2&3&forw.gif&forward[_1]&&gopost('/adm/flip','forward:'+currentURL)&Go to the next resource in the course sequence&3
482: c&6&3
483: c&8&1
484: c&8&2
485: s&8&3&prt.gif&prepare[_1]&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
486: s&9&1&sbkm.gif&set[_1]&bookmark[_2]&set_bookmark()&Set a bookmark for this resource&1
487: s&9&3&anot.gif&anno-[_1]&tations[_1]&annotate()&Make notes and annotations about this resource&1
488: ENDMENUITEMS
489: unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme)(\?|$)/) {
490: $menuitems.=(<<ENDREALRES);
491: s&6&3&catalog.gif&catalog[_1]&info[_1]&catalog_info()&Show catalog information
492: s&8&1&eval.gif&evaluate[_1]&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource
493: s&8&2&fdbk.gif&feedback[_1]&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource
494: ENDREALRES
495: }
496: }
497: if ($env{'request.uri'} =~ /^\/res/) {
498: $menuitems .= (<<ENDMENUITEMS);
499: s&8&3&prt.gif&prepare[_1]&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
500: ENDMENUITEMS
501: }
502: &Apache::lonnet::logthis("Menu items:\n$menuitems\n");
503: my $buttons='';
504: foreach (split(/\n/,$menuitems)) {
505: my ($command,@rest)=split(/\&/,$_);
506: if ($command eq 's') {
507: $buttons.=&switch('','',@rest);
508: } else {
509: $buttons.=&clear(@rest);
510: }
511: }
512: &Apache::lonnet::logthis("buttons = $buttons");
513:
514: if ($textual) {
515: my $addremote=0;
516: foreach (@inlineremote) { if ($_ ne '') { $addremote=1; } }
517: my $inlinebuttons='';
518: if ($addremote) {
519: # Registered, textual output
520:
521: if ($env{'browser.interface'} eq 'textual') {
522: $inlinebuttons=
523: join('',map { (defined($_)?$_:'') } @inlineremote);
524: } else {
525: $inlinebuttons=(<<ENDINLINE);
526: <tr><td>$inlineremote[21]</td><td> </td><td>$inlineremote[23]</td></tr>
527: <tr><td>$inlineremote[61]</td><td>$inlineremote[62]</td><td>$inlineremote[63]</td></tr>
528: <tr><td>$inlineremote[71]</td><td>$inlineremote[72]</td><td>$inlineremote[73]</td></tr>
529: <tr><td>$inlineremote[81]</td><td>$inlineremote[82]</td><td>$inlineremote[83]</td></tr>
530: <tr><td>$inlineremote[91]</td><td>$inlineremote[92]</td><td>$inlineremote[93]</td></tr>
531: ENDINLINE
532: }
533: }
534: &Apache::lonnet::logthis("Inline:\n $inlinebuttons \n");
535: $result =(<<ENDREGTEXT);
536: <script type="text/javascript">
537: // BEGIN LON-CAPA Internal
538: </script>
539: $timesync
540: $newmail
541: $tablestart
542: $inlinebuttons
543: $tableend
544: <script type="text/javascript">
545: // END LON-CAPA Internal
546: </script>
547:
548: ENDREGTEXT
549: # Registered, graphical output
550: } else {
551: my $requri=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0]));
552: $requri=&Apache::lonenc::check_encrypt(&unescape($requri));
553: my $cursymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
554: my $navstatus=&get_nav_status();
555: my $clearcstr;
556:
557: if ($env{'user.adv'}) { $clearcstr='clearbut(6,1)'; }
558: $result = (<<ENDREGTHIS);
559:
560: <script type="text/javascript">
561: // BEGIN LON-CAPA Internal
562: var swmenu=null;
563:
564: function LONCAPAreg() {
565: swmenu=$reopen;
566: swmenu.clearTimeout(swmenu.menucltim);
567: $timesync
568: $newmail
569: $buttons
570: swmenu.currentURL="$requri";
571: swmenu.reloadURL=swmenu.currentURL+window.location.search;
572: swmenu.currentSymb="$cursymb";
573: swmenu.reloadSymb="$cursymb";
574: swmenu.currentStale=0;
575: $navstatus
576: $hwkadd
577: $editbutton
578: }
579:
580: function LONCAPAstale() {
581: swmenu=$reopen
582: swmenu.currentStale=1;
583: if (swmenu.reloadURL!='' && swmenu.reloadURL!= null) {
584: swmenu.switchbutton
585: (3,1,'reload.gif','return','location','go(reloadURL)','Return to the last known location in the course sequence');
586: }
587: swmenu.clearbut(7,2);
588: swmenu.clearbut(7,3);
589: swmenu.menucltim=swmenu.setTimeout(
590: 'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+
591: 'clearbut(9,1);clearbut(9,3);clearbut(6,3);$clearcstr',
592: 2000);
593: }
594:
595: // END LON-CAPA Internal
596: </script>
597: ENDREGTHIS
598: }
599: # =============================================================================
600: } else {
601: # ========================================== This can or will not be registered
602: if ($textual) {
603: # Not registered, textual
604: $result= (<<ENDDONOTREGTEXT);
605: ENDDONOTREGTEXT
606: } else {
607: # Not registered, graphical
608: $result = (<<ENDDONOTREGTHIS);
609:
610: <script type="text/javascript">
611: // BEGIN LON-CAPA Internal
612: var swmenu=null;
613:
614: function LONCAPAreg() {
615: swmenu=$reopen
616: $timesync
617: swmenu.currentStale=1;
618: swmenu.clearbut(2,1);
619: swmenu.clearbut(2,3);
620: swmenu.clearbut(8,1);
621: swmenu.clearbut(8,2);
622: swmenu.clearbut(8,3);
623: if (swmenu.currentURL) {
624: swmenu.switchbutton
625: (3,1,'reload.gif','return','location','go(currentURL)');
626: } else {
627: swmenu.clearbut(3,1);
628: }
629: }
630:
631: function LONCAPAstale() {
632: }
633:
634: // END LON-CAPA Internal
635: </script>
636: ENDDONOTREGTHIS
637: }
638: # =============================================================================
639: }
640: return $result;
641: }
642:
643: sub loadevents() {
644: if ($env{'request.state'} eq 'construct' ||
645: $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
646: return 'LONCAPAreg();';
647: }
648:
649: sub unloadevents() {
650: if ($env{'request.state'} eq 'construct' ||
651: $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
652: return 'LONCAPAstale();';
653: }
654:
655: # ============================================================= Start up remote
656:
657: sub startupremote {
658: my ($lowerurl)=@_;
659: if (($env{'browser.interface'} eq 'textual') ||
660: ($env{'environment.remote'} eq 'off')) {
661: return ('<meta HTTP-EQUIV="Refresh" CONTENT="0.5; url='.$lowerurl.'" />');
662: }
663: #
664: # The Remote actually gets launched!
665: #
666: my $configmenu=&rawconfig();
667: my $esclowerurl=&escape($lowerurl);
668: my $message=&mt('"Waiting for Remote Control window to load: "+[_1]','waited');
669: return(<<ENDREMOTESTARTUP);
670: <script type="text/javascript">
671: var timestart;
672: function wheelswitch() {
673: if (typeof(document.wheel) != 'undefined') {
674: if (typeof(document.wheel.spin) != 'undefined') {
675: var date=new Date();
676: var waited=Math.round(30-((date.getTime()-timestart)/1000));
677: document.wheel.spin.value=$message;
678: }
679: }
680: if (window.status=='|') {
681: window.status='/';
682: } else {
683: if (window.status=='/') {
684: window.status='-';
685: } else {
686: if (window.status=='-') {
687: window.status='\\\\';
688: } else {
689: if (window.status=='\\\\') { window.status='|'; }
690: }
691: }
692: }
693: }
694:
695: // ---------------------------------------------------------- The wait function
696: var canceltim;
697: function wait() {
698: if ((menuloaded==1) || (tim==1)) {
699: window.status='Done.';
700: if (tim==0) {
701: clearTimeout(canceltim);
702: $configmenu
703: window.location='$lowerurl';
704: } else {
705: window.location='/adm/remote?action=collapse&url=$esclowerurl';
706: }
707: } else {
708: wheelswitch();
709: setTimeout('wait();',200);
710: }
711: }
712:
713: function main() {
714: canceltim=setTimeout('tim=1;',30000);
715: window.status='-';
716: var date=new Date();
717: timestart=date.getTime();
718: wait();
719: }
720:
721: </script>
722: ENDREMOTESTARTUP
723: }
724:
725: sub setflags() {
726: return(<<ENDSETFLAGS);
727: <script type="text/javascript">
728: menuloaded=0;
729: tim=0;
730: </script>
731: ENDSETFLAGS
732: }
733:
734: sub maincall() {
735: if (($env{'browser.interface'} eq 'textual') ||
736: ($env{'environment.remote'} eq 'off')) { return ''; }
737: return(<<ENDMAINCALL);
738: <script type="text/javascript">
739: main();
740: </script>
741: ENDMAINCALL
742: }
743:
744: sub load_remote_msg {
745: my ($lowerurl)=@_;
746:
747: if (($env{'browser.interface'} eq 'textual') ||
748: ($env{'environment.remote'} eq 'off')) { return ''; }
749:
750: my $esclowerurl=&escape($lowerurl);
751: my $link=&mt('<a href="[_1]">Continue</a> on in Inline Menu mode',
752: "/adm/remote?action=collapse&url=$esclowerurl");
753: return(<<ENDREMOTEFORM);
754: <p>
755: <form name="wheel">
756: <input name="spin" type="text" size="60" />
757: </form>
758: </p>
759: <p>$link</p>
760: ENDREMOTEFORM
761: }
762: # ================================================================= Reopen menu
763:
764: sub reopenmenu {
765: if (($env{'browser.interface'} eq 'textual') ||
766: ($env{'environment.remote'} eq 'off')) { return ''; }
767: my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};
768: my $nothing = &Apache::lonhtmlcommon::javascript_nothing();
769: return('window.open('.$nothing.',"'.$menuname.'","",false);');
770: }
771:
772: # =============================================================== Open the menu
773:
774: sub open {
775: my $returnval='';
776: if (($env{'browser.interface'} eq 'textual') ||
777: ($env{'environment.remote'} eq 'off')) {
778: return '<script type="text/javascript">self.name="loncapaclient";</script>';
779: }
780: my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};
781: unless (shift eq 'unix') {
782: # resizing does not work on linux because of virtual desktop sizes
783: $returnval.=(<<ENDRESIZE);
784: if (window.screen) {
785: self.resizeTo(screen.availWidth-215,screen.availHeight-55);
786: self.moveTo(190,15);
787: }
788: ENDRESIZE
789: }
790: $returnval.=(<<ENDOPEN);
791: window.status='Opening LON-CAPA Remote Control';
792: var menu=window.open("/res/adm/pages/menu.html","$menuname",
793: "height=375,width=150,scrollbars=no,menubar=no,top=5,left=5,screenX=5,screenY=5");
794: self.name='loncapaclient';
795: ENDOPEN
796: return '<script type="text/javascript">'.$returnval.'</script>';
797: }
798:
799:
800: # ================================================================== Raw Config
801:
802: sub clear {
803: my ($row,$col)=@_;
804: unless (($env{'browser.interface'} eq 'textual') ||
805: ($env{'environment.remote'} eq 'off')) {
806: return "\n".qq(window.status+='.';swmenu.clearbut($row,$col););
807: } else {
808: $inlineremote[10*$row+$col]='';
809: return '';
810: }
811: }
812:
813: # ============================================ Switch a button or create a link
814: # Switch acts on the javascript that is executed when a button is clicked.
815: # The javascript is usually similar to "go('/adm/roles')" or "cstrgo(..)".
816:
817: sub switch {
818: my ($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$nobreak)=@_;
819: $act=~s/\$uname/$uname/g;
820: $act=~s/\$udom/$udom/g;
821: $top=&mt($top);
822: $bot=&mt($bot);
823: $desc=&mt($desc);
824: $img=&mt($img);
825:
826: unless (($env{'browser.interface'} eq 'textual') ||
827: ($env{'environment.remote'} eq 'off')) {
828: # Remote
829: return "\n".
830: qq(window.status+='.';swmenu.switchbutton($row,$col,"$img","$top","$bot","$act","$desc"););
831: } elsif ($env{'browser.interface'} eq 'textual') {
832: # Accessibility
833: if ($nobreak==2) { return ''; }
834: my $text=$top.' '.$bot;
835: $text=~s/\s*\-\s*//gs;
836: if ($nobreak) {
837: $inlineremote[10*$row+$col]=
838: '<a href="javascript:'.$act.';">'.$text.'</a>';
839: } else {
840: $inlineremote[10*$row+$col]="\n<br />".
841: $desc.' <a href="javascript:'.$act.';">'.$text.'</a>';
842: }
843: } else {
844: # Inline Remote
845: if ($nobreak==2) { return ''; }
846: my $text=$top.' '.$bot;
847: $text=~s/\s*\-\s*//gs;
848:
849: my $lonhttpdPort=$Apache::lonnet::perlvar{'lonhttpdPort'};
850: if (!defined($lonhttpdPort)) { $lonhttpdPort='8080'; }
851: my $pic=
852: '<img alt="'.$text.'" src="http://'.$ENV{'HTTP_HOST'}.
853: ':'.$lonhttpdPort.'/res/adm/pages/'.$img.'" align="'.
854: ($nobreak==3?'right':'left').'" />';
855: if ($env{'browser.interface'} eq 'faketextual') {
856: # Accessibility
857: if ($nobreak==3) {
858: $inlineremote[10*$row+$col]="\n".
859: '<td class="LC_menubuttons_text" align="right">'.$text.
860: '</td><td class="LC_menubuttons_img" align="left">'.
861: '<a href="javascript:'.$act.';">'.$pic.'</a></td></tr>';
862: } elsif ($nobreak) {
863: $inlineremote[10*$row+$col]="\n<tr>".
864: '<td class="LC_menubuttons_img" align="left">'.
865: '<a href="javascript:'.$act.';">'.$pic.'</a></td>
866: <td class="LC_menubuttons_text" align="left">'.$text.'</td>';
867: } else {
868: $inlineremote[10*$row+$col]="\n<tr>".
869: '<td class="LC_menubuttons_img" align="left">'.
870: '<a href="javascript:'.$act.';">'.$pic.
871: '</a></td><td class="LC_menubuttons_text" colspan="3">'.
872: $desc.'</td></tr>';
873: }
874: } else {
875: # Inline Menu
876: $inlineremote[10*$row+$col]=
877: '<a href="javascript:'.$act.';">'.$pic.
878: '</a><span class="LC_menubuttons_inline_text">'.$desc.'</span>';
879: }
880: }
881: return '';
882: }
883:
884: sub secondlevel {
885: my $output='';
886: my
887: ($uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc)=@_;
888: if ($prt eq 'any') {
889: $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);
890: } elsif ($prt=~/^r(\w+)/) {
891: if ($rol eq $1) {
892: $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);
893: }
894: }
895: return $output;
896: }
897:
898: sub openmenu {
899: my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};
900: if (($env{'browser.interface'} eq 'textual') ||
901: ($env{'environment.remote'} eq 'off')) { return ''; }
902: my $nothing = &Apache::lonhtmlcommon::javascript_nothing();
903: return "window.open(".$nothing.",'".$menuname."');";
904: }
905:
906: sub inlinemenu {
907: @inlineremote=();
908: undef @inlineremote;
909: &rawconfig(1);
910: return join('',map { (defined($_)?$_:'') } @inlineremote);
911: }
912:
913: sub rawconfig {
914: my $textualoverride=shift;
915: my $output='';
916: unless (($env{'browser.interface'} eq 'textual') ||
917: ($env{'environment.remote'} eq 'off')) {
918: $output.=
919: "window.status='Opening Remote Control';var swmenu=".&openmenu().
920: "\nwindow.status='Configuring Remote Control ';";
921: } else {
922: unless ($textualoverride) { return ''; }
923: }
924: my $uname=$env{'user.name'};
925: my $udom=$env{'user.domain'};
926: my $adv=$env{'user.adv'};
927: my $author=$env{'user.author'};
928: my $crs='';
929: if ($env{'request.course.id'}) {
930: $crs='/'.$env{'request.course.id'};
931: if ($env{'request.course.sec'}) {
932: $crs.='_'.$env{'request.course.sec'};
933: }
934: $crs=~s/\_/\//g;
935: }
936: my $pub=($env{'request.state'} eq 'published');
937: my $con=($env{'request.state'} eq 'construct');
938: my $rol=$env{'request.role'};
939: my $requested_domain = $env{'request.role.domain'};
940: foreach my $line (@desklines) {
941: my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc)=split(/\:/,$line);
942: $prt=~s/\$uname/$uname/g;
943: $prt=~s/\$udom/$udom/g;
944: $prt=~s/\$crs/$crs/g;
945: $prt=~s/\$requested_domain/$requested_domain/g;
946: my $type = &Apache::loncommon::course_type();
947: if ($type eq 'Group') {
948: $desc = &convert_menu_function($desc,$type);
949: }
950: if ($pro eq 'clear') {
951: $output.=&clear($row,$col);
952: } elsif ($pro eq 'any') {
953: $output.=&secondlevel(
954: $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc);
955: } elsif ($pro eq 'smp') {
956: unless ($adv) {
957: $output.=&secondlevel(
958: $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc);
959: }
960: } elsif ($pro eq 'adv') {
961: if ($adv) {
962: $output.=&secondlevel(
963: $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc);
964: }
965: } elsif (($pro=~/^p(\w+)/) && ($prt)) {
966: if (&Apache::lonnet::allowed($1,$prt)) {
967: $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);
968: }
969: } elsif ($pro eq 'course') {
970: if ($env{'request.course.fn'}) {
971: $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);
972: }
973: } elsif ($pro =~ /^courseenv_(.*)$/) {
974: my $key = $1;
975: if ($env{'course.'.$env{'request.course.id'}.'.'.$key}) {
976: $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);
977: }
978: } elsif ($pro =~ /^course_(.*)$/) {
979: # Check for permissions inside of a course
980: if (($env{'request.course.id'}) &&
981: (&Apache::lonnet::allowed($1,$env{'request.course.id'}.
982: ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))
983: )) {
984: $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);
985: }
986: } elsif ($pro eq 'author') {
987: if ($author) {
988: if ((($prt eq 'rca') && ($env{'request.role'}=~/^ca/)) ||
989: (($prt eq 'rau') && ($env{'request.role'}=~/^au/))) {
990: # Check that we are on the correct machine
991: my $cadom=$requested_domain;
992: my $caname=$env{'user.name'};
993: if ($prt eq 'rca') {
994: ($cadom,$caname)=
995: ($env{'request.role'}=~/(\w+)\/(\w+)$/);
996: }
997: $act =~ s/\$caname/$caname/g;
998: my $home = &Apache::lonnet::homeserver($caname,$cadom);
999: my $allowed=0;
1000: my @ids=&Apache::lonnet::current_machine_ids();
1001: foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
1002: if ($allowed) {
1003: $output.=switch($caname,$cadom,
1004: $row,$col,$img,$top,$bot,$act,$desc);
1005: }
1006: }
1007: }
1008: }
1009: }
1010: unless (($env{'browser.interface'} eq 'textual') ||
1011: ($env{'environment.remote'} eq 'off')) {
1012: $output.="\nwindow.status='Synchronizing Time';swmenu.syncclock(1000*".time.");\nwindow.status='Remote Control Configured.';";
1013: if (&Apache::lonmsg::newmail()) {
1014: $output.='swmenu.setstatus("you have","messages");';
1015: }
1016: }
1017:
1018: return $output;
1019: }
1020:
1021: # ======================================================================= Close
1022:
1023: sub close {
1024: if (($env{'browser.interface'} eq 'textual') ||
1025: ($env{'environment.remote'} eq 'off')) { return ''; }
1026: my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};
1027: return(<<ENDCLOSE);
1028: <script type="text/javascript">
1029: window.status='Accessing Remote Control';
1030: menu=window.open("/adm/rat/empty.html","$menuname",
1031: "height=350,width=150,scrollbars=no,menubar=no");
1032: window.status='Disabling Remote Control';
1033: menu.active=0;
1034: menu.autologout=0;
1035: window.status='Closing Remote Control';
1036: menu.close();
1037: window.status='Done.';
1038: </script>
1039: ENDCLOSE
1040: }
1041:
1042: # ====================================================================== Footer
1043:
1044: sub footer {
1045:
1046: }
1047:
1048: sub nav_control_js {
1049: my $nav=($env{'environment.remotenavmap'} eq 'on');
1050: return (<<NAVCONTROL);
1051: var w_loncapanav_flag="$nav";
1052:
1053:
1054: function gonav(url) {
1055: if (w_loncapanav_flag != 1) {
1056: gopost(url,'');
1057: } else {
1058: navwindow=window.open(url,
1059: "loncapanav","height=600,width=400,scrollbars=1");
1060: }
1061: }
1062: NAVCONTROL
1063: }
1064:
1065: sub utilityfunctions {
1066: my $caller = shift;
1067: unless (($env{'browser.interface'} eq 'textual') ||
1068: ($env{'environment.remote'} eq 'off') || ($caller eq '/adm/menu')) { return ''; }
1069: my $currenturl=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0]));
1070: $currenturl=&Apache::lonenc::check_encrypt(&unescape($currenturl));
1071:
1072: my $currentsymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
1073: my $nav_control=&nav_control_js();
1074:
1075: my $start_page_annotate =
1076: &Apache::loncommon::start_page('Annotator',undef,
1077: {'only_body' => 1,
1078: 'js_ready' => 1,
1079: 'bgcolor' => '#BBBBBB',
1080: 'add_entries' => {
1081: 'onload' => 'javascript:document.goannotate.submit();'}});
1082:
1083: my $start_page_bookmark =
1084: &Apache::loncommon::start_page('Bookmarks',undef,
1085: {'only_body' => 1,
1086: 'js_ready' => 1,
1087: 'bgcolor' => '#BBBBBB',});
1088:
1089: my $end_page =
1090: &Apache::loncommon::end_page({'js_ready' => 1});
1091:
1092: return (<<ENDUTILITY)
1093:
1094: var currentURL="$currenturl";
1095: var reloadURL="$currenturl";
1096: var currentSymb="$currentsymb";
1097:
1098: $nav_control
1099:
1100: function go(url) {
1101: if (url!='' && url!= null) {
1102: currentURL = null;
1103: currentSymb= null;
1104: window.location.href=url;
1105: }
1106: }
1107:
1108: function gopost(url,postdata) {
1109: if (url!='') {
1110: this.document.server.action=url;
1111: this.document.server.postdata.value=postdata;
1112: this.document.server.command.value='';
1113: this.document.server.url.value='';
1114: this.document.server.symb.value='';
1115: this.document.server.submit();
1116: }
1117: }
1118:
1119: function gocmd(url,cmd) {
1120: if (url!='') {
1121: this.document.server.action=url;
1122: this.document.server.postdata.value='';
1123: this.document.server.command.value=cmd;
1124: this.document.server.url.value=currentURL;
1125: this.document.server.symb.value=currentSymb;
1126: this.document.server.submit();
1127: }
1128: }
1129:
1130: function gocstr(url,filename) {
1131: if (url == '/adm/cfile?action=delete') {
1132: this.document.cstrdelete.filename.value = filename
1133: this.document.cstrdelete.submit();
1134: return;
1135: }
1136: if (url == '/adm/printout') {
1137: this.document.cstrprint.postdata.value = filename
1138: this.document.cstrprint.curseed.value = 0;
1139: this.document.cstrprint.problemtype.value = 0;
1140: if (this.document.lonhomework) {
1141: if ((this.document.lonhomework.rndseed) && (this.document.lonhomework.rndseed.value != null) && (this.document.lonhomework.rndseed.value != '')) {
1142: this.document.cstrprint.curseed.value = this.document.lonhomework.rndseed.value
1143: }
1144: if (this.document.lonhomework.problemtype) {
1145: if (this.document.lonhomework.problemtype.value) {
1146: this.document.cstrprint.problemtype.value =
1147: this.document.lonhomework.problemtype.value;
1148: } else if (this.document.lonhomework.problemtype.options) {
1149: for (var i=0; i<this.document.lonhomework.problemtype.options.length; i++) {
1150: if (this.document.lonhomework.problemtype.options[i].selected) {
1151: if (this.document.lonhomework.problemtype.options[i].value != null && this.document.lonhomework.problemtype.options[i].value != '') {
1152: this.document.cstrprint.problemtype.value = this.document.lonhomework.problemtype.options[i].value
1153: }
1154: }
1155: }
1156: }
1157: }
1158: }
1159: this.document.cstrprint.submit();
1160: return;
1161: }
1162: if (url !='') {
1163: this.document.constspace.filename.value = filename;
1164: this.document.constspace.action = url;
1165: this.document.constspace.submit();
1166: }
1167: }
1168:
1169: function golist(url) {
1170: if (url!='' && url!= null) {
1171: currentURL = null;
1172: currentSymb= null;
1173: top.location.href=url;
1174: }
1175: }
1176:
1177:
1178:
1179: function catalog_info() {
1180: loncatinfo=window.open(window.location.pathname+'.meta',"LONcatInfo",'height=320,width=280,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no');
1181: }
1182:
1183: function chat_win() {
1184: lonchat=window.open('/res/adm/pages/chatroom.html',"LONchat",'height=320,width=280,resizable=yes,location=no,menubar=no,toolbar=no');
1185: }
1186:
1187: function group_chat(group) {
1188: var url = '/adm/groupchat?group='+group;
1189: var winName = 'LONchat_'+group;
1190: grpchat=window.open(url,winName,'height=320,width=280,resizable=yes,location=no,menubar=no,toolbar=no');
1191: }
1192:
1193: function edit_bookmarks() {
1194: go('');
1195: w_BookmarkPal_flag=1;
1196: bookmarkpal=window.open("/adm/bookmarks",
1197: "BookmarkPal", "width=400,height=505,scrollbars=0");
1198: }
1199:
1200: function annotate() {
1201: w_Annotator_flag=1;
1202: annotator=window.open('','Annotator','width=365,height=265,scrollbars=0');
1203: annotator.document.write(
1204: '$start_page_annotate'
1205: +"<form name='goannotate' target='Annotator' method='post' "
1206: +"action='/adm/annotations'>"
1207: +"<input type='hidden' name='urlnew' value='"+currentURL+"' />"
1208: +"<\\/form>"
1209: +'$end_page');
1210: annotator.document.close();
1211: }
1212:
1213: function set_bookmark() {
1214: go('');
1215: clienttitle=document.title;
1216: clienthref=location.pathname;
1217: w_bmquery_flag=1;
1218: bmquery=window.open('','bmquery','width=365,height=165,scrollbars=0');
1219: bmquery.document.write(
1220: '$start_page_bookmark'
1221: +"<center><form method='post'"
1222: +" name='newlink' action='/adm/bookmarks' target='bmquery' "
1223: +">\\n <table width=340 height=150 "
1224: +"bgcolor='ffffff' align=center><tr><td>Link Name:<br /><input "
1225: +"type='text' name='title' size=45 value='"+clienttitle+"' />"
1226: +"<br />Address:<br /><input type='text' name='address' size='45' "
1227: +"value='"+clienthref+"' /><br /><center><input type='submit' "
1228: +"value='Save' /> <input type='button' value='Close (no save)' "
1229: +"onclick='javascript:window.close();' /><\\/center><\\/td>"
1230: +"<\\/tr><\\/table><\\/form><\\/center>"
1231: +'$end_page' );
1232: bmquery.document.close();
1233: }
1234:
1235: ENDUTILITY
1236: }
1237:
1238: sub serverform {
1239: return(<<ENDSERVERFORM);
1240: <form name="server" action="/adm/logout" method="post" target="_top">
1241: <input type="hidden" name="postdata" value="none" />
1242: <input type="hidden" name="command" value="none" />
1243: <input type="hidden" name="url" value="none" />
1244: <input type="hidden" name="symb" value="none" />
1245: </form>
1246: ENDSERVERFORM
1247: }
1248:
1249: sub constspaceform {
1250: return(<<ENDCONSTSPACEFORM);
1251: <form name="constspace" action="/adm/logout" method="post" target="_top">
1252: <input type="hidden" name="filename" value="" />
1253: </form>
1254: <form name="cstrdelete" action="/adm/cfile" method="post" target="_top">
1255: <input type="hidden" name="action" value="delete" />
1256: <input type="hidden" name="filename" value="" />
1257: </form>
1258: <form name="cstrprint" action="/adm/printout" target="_parent" method="post">
1259: <input type="hidden" name="postdata" value="" />
1260: <input type="hidden" name="curseed" value="" />
1261: <input type="hidden" name="problemtype" value="" />
1262: </form>
1263:
1264: ENDCONSTSPACEFORM
1265: }
1266:
1267:
1268: sub get_nav_status {
1269: my $navstatus="swmenu.w_loncapanav_flag=";
1270: if ($env{'environment.remotenavmap'} eq 'on') {
1271: $navstatus.="1";
1272: } else {
1273: $navstatus.="-1";
1274: }
1275: return $navstatus;
1276: }
1277:
1278: #FIXME this needs to move into mydesktab and the other locations
1279: # the text is generated
1280: sub convert_menu_function {
1281: my ($rolename,$type) = @_;
1282: if ($type eq 'Group') {
1283: $rolename =~ s/student/member/g;
1284: $rolename =~ s/group/team/g;
1285: $rolename =~ s/course/group/g;
1286: $rolename =~ s/Course/Group/g;
1287: }
1288: return $rolename;
1289: }
1290:
1291:
1292: # ================================================================ Main Program
1293:
1294: BEGIN {
1295: if (! defined($readdesk)) {
1296: {
1297: my $tabfile = $Apache::lonnet::perlvar{'lonTabDir'}.'/mydesk.tab';
1298: if ( CORE::open( my $config,"<$tabfile") ) {
1299: while (my $configline=<$config>) {
1300: $configline=(split(/\#/,$configline))[0];
1301: $configline=~s/^\s+//;
1302: chomp($configline);
1303: if ($configline) {
1304: push(@desklines,$configline);
1305: }
1306: }
1307: CORE::close($config);
1308: }
1309: }
1310: $readdesk='done';
1311: }
1312: }
1313:
1314: 1;
1315: __END__
1316:
1317:
1318:
1319:
1320:
1321:
1322:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>