Annotation of loncom/interface/lonsupportreq.pm, revision 1.27
1.24 albertel 1: #
1.27 ! raeburn 2: # $Id: lonsupportreq.pm,v 1.26 2005/04/10 23:37:21 raeburn Exp $
1.24 albertel 3: #
4: # Copyright Michigan State University Board of Trustees
5: #
6: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
7: #
8: # LON-CAPA is free software; you can redistribute it and/or modify
9: # it under the terms of the GNU General Public License as published by
10: # the Free Software Foundation; either version 2 of the License, or
11: # (at your option) any later version.
12: #
13: # LON-CAPA is distributed in the hope that it will be useful,
14: # but WITHOUT ANY WARRANTY; without even the implied warranty of
15: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16: # GNU General Public License for more details.
17: #
18: # You should have received a copy of the GNU General Public License
19: # along with LON-CAPA; if not, write to the Free Software
20: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21: #
22: # /home/httpd/html/adm/gpl.txt
23: #
24: # http://www.lon-capa.org/
25: #
26:
1.1 raeburn 27: package Apache::lonsupportreq;
28:
29: use strict;
30: use lib qw(/home/httpd/lib/perl);
1.5 raeburn 31: use MIME::Types;
32: use MIME::Lite;
1.27 ! raeburn 33: use CGI::Cookie();
1.1 raeburn 34: use Apache::Constants qw(:common);
1.2 albertel 35: use Apache::loncommon();
1.24 albertel 36: use Apache::lonnet;
1.1 raeburn 37: use Apache::lonlocal;
38:
39: sub handler {
1.2 albertel 40: my ($r) = @_;
41: &Apache::loncommon::content_type($r,'text/html');
1.1 raeburn 42: $r->send_http_header;
43:
44: if ($r->header_only) {
45: return OK;
46: }
1.12 raeburn 47: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['origurl','function']);
48: if ($r->uri eq '/adm/helpdesk') {
49: &Apache::loncommon::get_posted_cgi($r);
50: }
1.25 albertel 51: my $function = $env{'form.function'};
52: my $origurl = &Apache::lonnet::unescape($env{'form.origurl'});
53: my $action = $env{'form.action'};
1.12 raeburn 54:
1.1 raeburn 55: if ($action eq 'process') {
56: &print_request_receipt($r,$origurl,$function);
57: } else {
58: &print_request_form($r,$origurl,$function);
59: }
60: return OK;
61: }
62:
63: sub print_request_form {
64: my ($r,$origurl,$function) = @_;
65: my ($os,$browser,$bversion,$uhost,$uname,$udom,$uhome,$urole,$usec,$email,$cid,$cdom,$cnum,$ctitle,$ccode,$sectionlist,$lastname,$firstname,$server);
1.22 raeburn 66: my $bodytag = &Apache::loncommon::bodytag('',$function,'topmargin="0" marginheight="0" onLoad="initialize_codes()"',1);
1.1 raeburn 67: my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg');
1.5 raeburn 68: if (($tablecolor eq '') || ($tablecolor eq '#FFFFFF')) {
1.14 raeburn 69: $tablecolor = '#EEEE99';
1.5 raeburn 70: }
1.10 raeburn 71: $ccode = '';
1.25 albertel 72: $os = $env{'browser.os'};
73: $browser = $env{'browser.type'};
74: $bversion = $env{'browser.version'};
75: $uhost = $env{'request.host'};
76: $uname = $env{'user.name'};
77: $udom = $env{'user.domain'};
78: $uhome = $env{'user.home'};
79: $urole = $env{'request.role'};
80: $usec = $env{'request.course.sec'};
81: $cid = $env{'request.course.id'};
1.21 raeburn 82: if ($origurl =~ m-^http://-) {
83: $server = $origurl;
84: } else {
85: $server = 'http://'.$ENV{'SERVER_NAME'}.$origurl;
86: }
1.13 raeburn 87: my $scripttag = (<<'END');
1.5 raeburn 88: function validate() {
1.13 raeburn 89: if (validmail(document.logproblem.email) == false) {
90: alert("The e-mail address you entered: "+document.logproblem.email.value+" is not a valid e-mail address.");
91: return;
1.5 raeburn 92: }
93: document.logproblem.submit();
94: }
1.13 raeburn 95:
96: function validmail(field) {
97: var str = field.value;
98: if (window.RegExp) {
99: var reg1str = "(@.*@)|(\\.\\.)|(@\\.)|(\\.@)|(^\\.)";
100: var reg2str = "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$";
101: var reg1 = new RegExp(reg1str);
102: var reg2 = new RegExp(reg2str);
103: if (!reg1.test(str) && reg2.test(str)) {
104: return true;
105: }
106: return false;
107: }
108: else
109: {
110: if(str.indexOf("@") >= 0) {
111: return true;
112: }
113: return false;
114: }
115: }
1.5 raeburn 116: END
1.25 albertel 117: #" stupid emacs
1.1 raeburn 118: if ($cid =~ m/_/) {
119: ($cdom,$cnum) = split/_/,$cid;
120: }
121: if ($cdom && $cnum) {
122: my %csettings = &Apache::lonnet::get('environment',['description','internal.coursecode','internal.sectionnums'],$cdom,$cnum);
123: $ctitle = $csettings{'description'};
124: $ccode = $csettings{'internal.coursecode'};
125: $sectionlist = $csettings{'internal.sectionnums'};
126: }
1.25 albertel 127: if ($env{'environment.critnotification'}) {
128: $email = $env{'environment.critnotification'};
1.1 raeburn 129: }
1.25 albertel 130: if (!$email && $env{'environment.notification'}) {
131: $email = $env{'environment.notification'};
1.1 raeburn 132: }
1.25 albertel 133: if ($env{'environment.lastname'}) {
134: $lastname = $env{'environment.lastname'};
1.1 raeburn 135: }
1.25 albertel 136: if ($env{'environment.firstname'}) {
137: $firstname = $env{'environment.firstname'};
1.1 raeburn 138: }
139: my @sections = split/,/,$sectionlist;
140: my %groupid = ();
141: foreach (@sections) {
142: my ($sec,$grp) = split/:/,$_;
143: $groupid{$sec} = $grp;
144: }
1.19 raeburn 145: my $codedom = $Apache::lonnet::perlvar{'lonDefDomain'};
146: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['codedom']);
1.25 albertel 147: if (exists($env{'form.codedom'})) {
148: $codedom = $env{'form.codedom'};
1.19 raeburn 149: }
1.21 raeburn 150: my $details_title;
151: if ($codedom) {
152: $details_title = '<br />('.$codedom.')';
153: }
1.1 raeburn 154: my %coursecodes = ();
155: my %codes = ();
156: my @codetitles = ();
157: my %cat_titles = ();
158: my %cat_order = ();
1.6 raeburn 159: my %idlist = ();
160: my %idnums = ();
161: my %idlist_titles = ();
1.1 raeburn 162: my $caller = 'global';
163: my $totcodes = 0;
164: my $format_reply;
1.6 raeburn 165: my $jscript = '';
1.22 raeburn 166: my $loaditems = qq|
167: function initialize_codes() {
168: return;
169: }
170: |;
1.1 raeburn 171: if ($cdom) {
172: $codedom = $cdom;
173: }
174: if ($cnum) {
175: $coursecodes{$cnum} = $ccode;
176: if ($ccode eq '') {
177: $totcodes = &retrieve_instcodes(\%coursecodes,$codedom,$totcodes);
178: } else {
179: $coursecodes{$cnum} = $ccode;
180: $caller = $cnum;
181: $totcodes ++;
182: }
183: } else {
184: $totcodes = &retrieve_instcodes(\%coursecodes,$codedom,$totcodes);
185: }
186: if ($totcodes > 0) {
1.6 raeburn 187: if ($ccode eq '') {
1.22 raeburn 188: $format_reply = &Apache::lonnet::auto_instcode_format($caller,$codedom,\%coursecodes,\%codes,\@codetitles,\%cat_titles,\%cat_order);
189: if ($format_reply eq 'ok') {
190: my $numtypes = @codetitles;
191: &build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles);
192: &javascript_code_selections($numtypes,\%cat_titles,\$jscript,\%idlist,\%idnums,\%idlist_titles,\@codetitles);
193: $loaditems = '';
194: }
1.6 raeburn 195: }
1.1 raeburn 196: }
1.23 albertel 197: my $html=&Apache::lonxml::xmlbegin();
1.14 raeburn 198: $r->print(<<ENDHEAD);
1.23 albertel 199: $html
1.1 raeburn 200: <head>
201: <title>LON-CAPA support request</title>
1.18 raeburn 202: <script type"text/javascript">
1.1 raeburn 203: $scripttag
1.6 raeburn 204: $jscript
205: </script>
1.1 raeburn 206: </head>
207: $bodytag
1.14 raeburn 208: ENDHEAD
1.15 raeburn 209: if ($r->uri eq '/adm/helpdesk') {
1.14 raeburn 210: &print_header($r,$origurl);
211: }
212: $r->print(<<"END");
1.15 raeburn 213: <form method="post" name="logproblem" enctype="multipart/form-data">
1.1 raeburn 214: <table width="580" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000">
215: <tr>
216: <td>
217: <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#000000">
218: <tr>
219: <td>
220: <table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff">
221: <tr>
222: <td>
223: <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#ffffff">
224: <tr>
225: <td width="140" bgcolor="$tablecolor">
226: <table width="140" border="0" cellpadding="8" cellspacing="0">
227: <tr>
228: <td align="right"><b>Name:</b>
229: </td>
230: </tr>
231: </table>
232: </td>
233: <td width="100%" valign="top">
234: <table width="100%" border="0" cellpadding="8" cellspacing="0">
235: <tr>
236: <td>
237: END
238: my $fullname = '';
239: if ((defined($lastname) && $lastname ne '') && (defined($firstname) && $firstname ne '')) {
240: $fullname = "$firstname $lastname";
241: $r->print("$fullname<input type=\"hidden\" name=\"username\" value=\"$fullname\" />");
242: } else {
243: if (defined($firstname) && $firstname ne '') {
244: $fullname = $firstname;
245: } elsif (defined($lastname) && $lastname ne '') {
246: $fullname= " $lastname";
247: }
1.17 raeburn 248: $r->print('<input type="text" size="20" name="username" value="'.$fullname.'" />');
1.1 raeburn 249: }
250: $r->print(<<END);
1.18 raeburn 251: <input type="button" value="Submit Request" onClick="validate()" />
1.1 raeburn 252: </td>
253: </tr>
254: </table>
255: </td>
256: </tr>
257: <tr>
258: <td width="100%" colspan="2" bgcolor="#000000">
1.3 albertel 259: <img src="/adm/lonMisc/blackdot.gif" /><br />
1.1 raeburn 260: </td>
261: </tr>
262: <tr>
263: <td width="140" bgcolor="$tablecolor">
264: <table width="140" border="0" cellpadding="8" cellspacing="0">
265: <tr>
266: <td align="right"><b>E-mail address:</b>
267: </td>
268: </tr>
269: </table>
270: </td>
271: <td width="100%" valign="top">
272: <table width="100%" border="0" cellpadding="8" cellspacing="0">
273: <tr>
274: <td>
275: <input type="text" size="20" name="email" value="$email" /><br />
276: </td>
277: </tr>
278: </table>
279: </td>
280: </tr>
281: <tr>
282: <td width="100%" colspan="2" bgcolor="#000000">
1.3 albertel 283: <img src="/adm/lonMisc/blackdot.gif" /><br />
1.1 raeburn 284: </td>
285: </tr>
286: <tr>
287: <td width="140" bgcolor="$tablecolor">
288: <table width="140" border="0" cellpadding="8" cellspacing="0">
289: <tr>
290: <td align="right"><b>username/domain:</b>
291: </td>
292: </tr>
293: </table>
294: </td>
295: <td width="100%" valign="top">
296: <table width="100%" border="0" cellpadding="8" cellspacing="0">
297: <tr>
298: <td>
299: END
300: my $udom_input = '<input type="hidden" name="udom" value="'.$udom.'" />';
301: my $uname_input = '<input type="hidden" name="uname" value="'.$uname.'" />';
302: if (defined($uname) && defined($udom)) {
303: $r->print('<i>username</i>: '.$uname.' <i>domain</i>: '.$udom.$udom_input.$uname_input);
304: } else {
305: my $udomform = '';
306: my $unameform = '';
307: if (defined($udom)) {
308: $udomform = '<i>domain</i>: '.$udom.$udom_input;
309: } elsif (defined($uname)) {
310: $unameform = '<i>username</i>: '.$uname.' '.$uname_input;
311: }
312: if ($udomform eq '') {
313: $udomform = '<i>domain</i>: ';
1.19 raeburn 314: $udomform .= &Apache::loncommon::select_dom_form($codedom,'udom');
1.1 raeburn 315: }
316: if ($unameform eq '') {
1.19 raeburn 317: $unameform= '<i>username</i>: <input type="text" size="12" name="uname" value="'.$uname.'" /> ';
1.1 raeburn 318: }
319: $r->print($unameform.$udomform.'<br />Enter the username you use to log-in to your LON-CAPA system, and choose your domain.');
320: }
321: $r->print(<<END);
322: </td>
323: </tr>
324: </table>
325: </td>
326: </tr>
327: <tr>
328: <td width="100%" colspan="2" bgcolor="#000000">
1.3 albertel 329: <img src="/adm/lonMisc/blackdot.gif" /><br />
1.1 raeburn 330: </td>
331: </tr>
332: <tr>
333: <td width="140" bgcolor="$tablecolor">
334: <table width="140" border="0" cellpadding="8" cellspacing="0">
335: <tr>
336: <td align="right"><b>URL of page:</b>
337: </td>
338: </tr>
339: </table>
340: </td>
341: <td width="100%" valign="top">
342: <table width="100%" border="0" cellpadding="8" cellspacing="0">
343: <tr>
344: <td>
1.21 raeburn 345: $server<input type="hidden" name="sourceurl" value="$server" />
1.1 raeburn 346: </td>
347: </tr>
348: </table>
349: </td>
350: </tr>
351: <tr>
352: <td width="100%" colspan="2" bgcolor="#000000">
1.3 albertel 353: <img src="/adm/lonMisc/blackdot.gif" /><br />
1.1 raeburn 354: </td>
355: </tr>
356: <tr>
357: <td width="140" bgcolor="$tablecolor">
358: <table width="140" border="0" cellpadding="8" cellspacing="0">
359: <tr>
360: <td align="right"><b>Phone #:</b>
361: </td>
362: </tr>
363: </table>
364: </td>
365: <td width="100%" valign="top">
366: <table width="100%" border="0" cellpadding="8" cellspacing="0">
367: <tr>
368: <td>
369: <input type="text" size="15" name="phone"><br>
370: </td>
371: </tr>
372: </table>
373: </td>
374: </tr>
375: <tr>
376: <td width="100%" colspan="2" bgcolor="#000000">
1.3 albertel 377: <img src="/adm/lonMisc/blackdot.gif" /><br />
1.1 raeburn 378: </td>
379: </tr>
380: <tr>
381: <td width="140" bgcolor="$tablecolor">
382: <table width="140" border="0" cellpadding="8" cellspacing="0">
383: <tr>
1.21 raeburn 384: <td align="right"><b>Course Details:</b>$details_title
1.1 raeburn 385: </td>
386: </tr>
387: </table>
388: </td>
389: <td width="100%" valign="top">
390: <table border="0" cellpadding="3" cellspacing="3">
391: <tr>
392: <td>
393: END
1.10 raeburn 394: if ($cnum) {
395: if ($coursecodes{$cnum}) {
396: foreach (@codetitles) {
397: $r->print('<i>'.$_.'</i>: '.$codes{$cnum}{$_}.'; ');
398: }
399: $r->print(' <input type="hidden" name="coursecode" value="'.$coursecodes{$cnum}.'" />');
400: } else {
401: $r->print('Enter institutional course code:
402: <input type="text" name="coursecode" size="15" value="" />');
1.1 raeburn 403: }
404: } else {
1.10 raeburn 405: if ($totcodes > 0) {
406: my $numtitles = @codetitles;
407: if ($numtitles == 0) {
408: $r->print('Enter institutional course code:
1.1 raeburn 409: <input type="text" name="coursecode" size="15" value="" />');
1.10 raeburn 410: } else {
411: my $lasttitle = $numtitles;
412: if ($numtitles > 4) {
413: $lasttitle = 4;
414: }
415: $r->print('<table><tr><td>'.$codetitles[0].'<br />'."\n".
416: '<select name="'.$codetitles[0].'" onChange="courseSet('."'$codetitles[0]'".')">'."\n".
417: ' <option value="-1" />Select'."\n");
418: my @items = ();
1.20 raeburn 419: my @longitems = ();
1.10 raeburn 420: if ($idlist{$codetitles[0]} =~ /","/) {
421: @items = split/","/,$idlist{$codetitles[0]};
422: } else {
423: $items[0] = $idlist{$codetitles[0]};
424: }
1.20 raeburn 425: if (defined($idlist_titles{$codetitles[0]})) {
426: if ($idlist_titles{$codetitles[0]} =~ /","/) {
427: @longitems = split/","/,$idlist_titles{$codetitles[0]};
428: } else {
429: $longitems[0] = $idlist_titles{$codetitles[0]};
430: }
1.22 raeburn 431: for (my $i=0; $i<@longitems; $i++) {
432: if ($longitems[$i] eq '') {
433: $longitems[$i] = $items[$i];
434: }
435: }
1.20 raeburn 436: } else {
437: @longitems = @items;
438: }
439: for (my $i=0; $i<@items; $i++) {
440: $r->print(' <option value="'.$items[$i].'">'.$longitems[$i].'</option>');
1.10 raeburn 441: }
442: $r->print('</select></td>');
443: for (my $i=1; $i<$numtitles; $i++) {
444: $r->print('<td>'.$codetitles[$i].'<br />'."\n".
445: '<select name="'.$codetitles[$i].'" onChange="courseSet('."'$codetitles[$i]'".')">'."\n".
446: '<option value="-1"><-Pick '.$codetitles[$i-1].'</option>'."\n".
447: '</select>'."\n".
448: '</td>'
449: );
450: }
451: $r->print('</tr></table>');
452: if ($numtitles > 4) {
453: $r->print('<br /><br />'.$codetitles[$numtitles].'<br />'."\n".
454: '<select name="'.$codetitles[$numtitles].'" onChange="courseSet('."'$codetitles[$numtitles]'".')">'."\n".
455: '<option value="-1"><-Pick '.$codetitles[$numtitles-1].'</option>'."\n".
456: '</select>'."\n");
457: }
458: }
459: } else {
460: $r->print('Enter institutional course code:
461: <input type="text" name="coursecode" size="15" value="" />');
462: }
1.1 raeburn 463: }
464: if ($ctitle) {
465: $r->print('<br /><i>Title</i>: '.$ctitle.'<input type="hidden" name="title" value="'.$ctitle.'" />');
466: } else {
467: $r->print('<br />Enter course title:
1.10 raeburn 468: <input type="text" name="title" size="25" value="" />');
1.1 raeburn 469: }
470: $r->print(<<END);
471: </td>
472: </tr>
473: </table>
474: </td>
475: </tr>
476: <tr>
477: <td width="100%" colspan="2" bgcolor="#000000">
1.3 albertel 478: <img src="/adm/lonMisc/blackdot.gif" /><br />
1.1 raeburn 479: </td>
480: </tr>
481: <tr>
482: <td width="140" bgcolor="$tablecolor">
483: <table width="140" border="0" cellpadding="8" cellspacing="0">
484: <tr>
485: <td align="right"><b>Section Number: </b>
486: </td>
487: </tr>
488: </table>
489: </td>
490: <td width="100%" valign="top">
491: <table width="100%" border="0" cellpadding="8" cellspacing="0">
492: <tr>
493: <td>
494: END
495: if ($sectionlist) {
1.22 raeburn 496: $r->print("<select name=\"section\"\n>".
497: " <option value=\"\" selected=\"selected\">Select</option>\n");
1.1 raeburn 498: foreach (sort keys %groupid) {
499: if ($_ eq $groupid{$_} || $groupid{$_} eq '') {
1.22 raeburn 500: $r->print(" <option value=\"$_\" >$_</option>\n");
1.1 raeburn 501: } else {
1.22 raeburn 502: $r->print(" <option value=\"$_\" >$_ - (LON-CAPA sec: $groupid{$_})</option>\n");
1.1 raeburn 503: }
504: }
505: $r->print("</select>");
506: } else {
507: $r->print("<input type=\"text\" name=\"section\" size=\"10\"/>");
508: }
509: $r->print(<<END);
510: </td>
511: </tr>
512: </table>
513: </td>
514: </tr>
515: <tr>
516: <td width="100%" colspan="2" bgcolor="#000000">
1.3 albertel 517: <img src="/adm/lonMisc/blackdot.gif" /><br />
1.1 raeburn 518: </td>
519: </tr>
520: <tr>
521: <td width="140" bgcolor="$tablecolor">
522: <table width="140" border="0" cellpadding="8" cellspacing="0">
523: <tr>
524: <td align="right"><b>Subject</b>
525: </td>
526: </tr>
527: </table>
528: </td>
529: <td width="100%" valign="top">
530: <table width="100%" border="0" cellpadding="8" cellspacing="0">
531: <tr>
532: <td>
533: <input type="text" size="40" name="subject">
534: </td>
535: </tr>
536: </table>
537: </td>
538: </tr>
539: <tr>
540: <td width="100%" colspan="2" bgcolor="#000000">
1.3 albertel 541: <img src="/adm/lonMisc/blackdot.gif" /><br />
1.1 raeburn 542: </td>
543: </tr>
544: <tr>
545: <td width="140" bgcolor="$tablecolor">
546: <table width="140" border="0" cellpadding="8" cellspacing="0">
547: <tr>
548: <td align="right"><b>Detailed description:</b>
549: </td>
550: </tr>
551: </table>
552: </td>
553: <td width="100%" valign="top">
554: <table width="100%" border="0" cellpadding="8" cellspacing="0">
555: <tr>
556: <td>
557: <textarea rows="10" cols="45" name="description" wrap="virtual"></textarea>
558: </td>
559: </tr>
560: </table>
561: </td>
562: </tr>
563: <tr>
564: <td width="100%" colspan="2" bgcolor="#000000">
1.3 albertel 565: <img src="/adm/lonMisc/blackdot.gif" /><br />
1.1 raeburn 566: </td>
567: </tr>
1.5 raeburn 568: END
1.25 albertel 569: if (defined($env{'user.name'})) {
1.5 raeburn 570: $r->print(<<END);
571: <tr>
572: <td width="140" bgcolor="$tablecolor">
573: <table width="140" border="0" cellpadding="8" cellspacing="0">
574: <tr>
575: <td align="right"><b>Optional file upload:</b>
576: </td>
577: </tr>
578: </table>
579: </td>
580: <td width="100%" valign="top">
581: <table width="100%" border="0" cellpadding="8" cellspacing="0">
582: <tr>
583: <td>
584: <input type="file" name="screenshot" size="20" /><br />Upload a file (e.g., a screenshot) relevant to your support request (128 KB max. size).
585: </td>
586: </tr>
587: </table>
588: </td>
589: </tr>
590: <tr>
591: <td width="100%" colspan="2" bgcolor="#000000">
592: <img src="/adm/lonMisc/blackdot.gif" /><br />
593: </td>
594: </tr>
595: END
596: }
597: $r->print(<<END);
1.1 raeburn 598: <tr>
599: <td width="140" bgcolor="$tablecolor">
600: <table width="140" border="0" cellpadding="8" cellspacing="0">
601: <tr>
602: <td align="right"><b>Finish:</b>
603: </td>
604: </tr>
605: </table>
606: </td>
607: <td width="100%" valign="top">
608: <table border="0" cellpadding="8" cellspacing="0">
609: <tr>
610: <td>
611: <input type="hidden" name="action" value="process" />
1.15 raeburn 612: <input type="button" value="Submit Request" onClick="validate()"/>
1.1 raeburn 613: </td>
614: <td> </td>
615: <td>
616: <input type="reset" value="Clear Form">
617: </td>
618: </tr>
619: </table>
620: </td>
621: </tr>
622: </table>
623: </td>
624: </tr>
625: </table>
626: </td>
627: </tr>
628: </table>
629: </td>
630: </tr>
631: </table>
1.14 raeburn 632: </form>
633: </body>
634: </html>
1.1 raeburn 635: END
1.5 raeburn 636: return;
1.1 raeburn 637: }
638:
639: sub print_request_receipt {
640: my ($r,$url,$function) = @_;
1.26 raeburn 641: my @ENVvars = ('HTTP_HOST','HTTP_USER_AGENT','REMOTE_ADDR','SERVER_ADDR','SERVER_NAME');
642: my @envvars = ('browser.os','browser.type','browser.version','user.home','request.role');
1.5 raeburn 643: my @loncvars = ('user.name','user.domain','request.course.sec','request.course.id');
1.27 ! raeburn 644: my @cookievars = ('lonID');
1.5 raeburn 645:
1.1 raeburn 646: my $bodytag = &Apache::loncommon::bodytag('',$function,'topmargin="0" marginheight="0"',1);
1.5 raeburn 647: my $admin = $Apache::lonnet::perlvar{'lonAdminMail'};
1.1 raeburn 648: my $to = $Apache::lonnet::perlvar{'lonSupportEMail'};
1.5 raeburn 649: my $from = $admin;
1.1 raeburn 650: my $reporttime = &Apache::lonlocal::locallocaltime(time);
651: my $fontcolor = &Apache::loncommon::designparm($function.'.font');
652: my $vlinkcolor = &Apache::loncommon::designparm($function.'.vlink');
653: my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg');
1.14 raeburn 654: my @formvars = ('username','email','uname','udom','sourceurl','phone','section','coursecode','title','subject','description','screenshot');
1.20 raeburn 655:
1.1 raeburn 656: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},\@formvars);
1.25 albertel 657: my $coursecode = $env{'form.coursecode'};
1.19 raeburn 658: if ($coursecode eq '') {
1.25 albertel 659: if (defined($env{'form.Year'})) {
660: $coursecode .= $env{'form.Year'};
1.19 raeburn 661: }
1.25 albertel 662: if (defined($env{'form.Semester'})) {
663: $coursecode .= $env{'form.Semester'};
1.19 raeburn 664: }
1.25 albertel 665: if (defined($env{'form.Department'})) {
666: $coursecode .= $env{'form.Department'};
1.19 raeburn 667: }
1.25 albertel 668: if (defined($env{'form.Number'})) {
669: $coursecode .= $env{'form.Number'};
1.19 raeburn 670: }
671: }
1.1 raeburn 672: my $supportmsg = qq|
1.25 albertel 673: Name: $env{'form.username'}
674: Email: $env{'form.email'}
675: Username/domain: $env{'form.uname'} - $env{'form.udom'}
676: Tel: $env{'form.phone'}
677: Course Information: $env{'form.title'} - $coursecode - section: $env{'form.section'}
678: Subject: $env{'form.subject'}
679: Description: $env{'form.description'}
680: URL: $env{'form.sourceurl'}
1.1 raeburn 681: Date/Time: $reporttime
682:
683: |;
1.25 albertel 684: my $descrip = $env{'form.description'};
1.5 raeburn 685: $descrip =~ s#\n#<br />#g;
686: my $displaymsg = qq|
1.25 albertel 687: <font color="$fontcolor">Name:</font><font color="$vlinkcolor"> $env{'form.username'}</font><br />
688: <font color="$fontcolor">Email: </font><font color="$vlinkcolor">$env{'form.email'}</font><br />
689: <font color="$fontcolor">Username/domain: </font><font color="$vlinkcolor">$env{'form.uname'} - $env{'form.udom'}</font><br />
690: <font color="$fontcolor">Tel: </font><font color="$vlinkcolor">$env{'form.phone'}</font><br />
691: <font color="$fontcolor">Course Information: </font><font color="$vlinkcolor">$env{'form.title'} - $coursecode - section: $env{'form.section'}</font><br />
692: <font color="$fontcolor">Subject: </font><font color="$vlinkcolor">$env{'form.subject'}</font><br />
1.5 raeburn 693: <font color="$fontcolor">Description: </font><font color="$vlinkcolor">$descrip</font><br />
1.25 albertel 694: <font color="$fontcolor">URL: </font><font color="$vlinkcolor">$env{'form.sourceurl'}</font><br />
1.5 raeburn 695: <font color="$fontcolor">Date/Time: </font><font color="$vlinkcolor">$reporttime</font><br />
696: |;
1.23 albertel 697: my $html=&Apache::lonxml::xmlbegin();
1.14 raeburn 698: $r->print(<<"END");
1.23 albertel 699: $html
1.1 raeburn 700: <head>
701: <title>LON-CAPA support request recorded</title>
702: </head>
703: $bodytag
1.16 raeburn 704: <form name="logproblem">
1.18 raeburn 705: <input type="hidden" name="action" value="result" />
1.16 raeburn 706: </form>
1.1 raeburn 707: END
1.14 raeburn 708: if ($r->uri eq '/adm/helpdesk') {
709: &print_header($r,$url,'process');
710: }
711: if ($to =~ m/^[^\@]+\@[^\@]+$/) {
712: $r->print("<h3>A support request has been sent to $to</h3>");
1.9 raeburn 713: } else {
714: $to = $admin;
715: if ($to =~ m/^[^\@]+\@[^\@]+$/) {
1.14 raeburn 716: $r->print("<h3>A support request has been sent to $to</h3>");
1.9 raeburn 717: END
718: } else {
719: $r->print(<<END);
1.1 raeburn 720: <h3>Warning: Problem with support e-mail address</h3>
1.9 raeburn 721: As the e-mail address provided for this LON-CAPA server ($to) does not appear to be a valid e-mail address, your support request has <b>not</b> been sent to the LON-CAPA support staff or administrator at your institution. Instead a copy has been sent to the LON-CAPA support team at Michigan State University.
1.1 raeburn 722: END
1.9 raeburn 723: $to = 'helpdesk@lon-capa.org';
724: }
1.1 raeburn 725: }
1.25 albertel 726: if (defined($env{'form.email'})) {
727: if ($env{'form.email'} =~ m/^[^\@]+\@[^\@]+$/) {
728: $from = $env{'form.email'};
1.5 raeburn 729: }
730: }
731:
1.25 albertel 732: my $subject = $env{'form.subject'};
1.5 raeburn 733: $subject =~ s#(`)#'#g;
734: $subject =~ s#\$#\(\$\)#g;
735: $supportmsg =~ s#(`)#'#g;
736: $supportmsg =~ s#\$#\(\$\)#g;
737: $displaymsg =~ s#(`)#'#g;
738: $displaymsg =~ s#\$#\(\$\)#g;
739: my $fname;
740:
741: my $attachmentpath = '';
742: my $attachmentsize = '';
1.25 albertel 743: if (defined($env{'user.name'})) {
744: if ($env{'form.screenshot.filename'}) {
745: $attachmentsize = length($env{'form.screenshot'});
1.5 raeburn 746: if ($attachmentsize > 131072) {
747: $displaymsg .= "<br />The uploaded screenshot file ($attachmentsize bytes) included with your request exceeded the maximum allowed size - 128 KB, and has therefore been discarded.";
748: } else {
749: $attachmentpath=&Apache::lonnet::userfileupload('screenshot',undef,'helprequests');
750: }
751: }
752: }
753:
1.27 ! raeburn 754: my %cookies = ();
! 755: my $cookie=CGI::Cookie->parse($r->header_in('Cookie'));
! 756: if ($$cookie{'lonID'} =~ /lonID=(\w+);/) {
! 757: $cookies{'lonID'} = $1;
! 758: }
! 759:
1.5 raeburn 760: if ($attachmentpath =~ m-/([^/]+)$-) {
761: $fname = $1;
1.25 albertel 762: $displaymsg .= "<br />An uploaded screenshot file - $fname ($attachmentsize bytes) was included in the request sent by $env{'user.name'} from LON-CAPA domain: $env{'user.domain'}";
1.5 raeburn 763: $supportmsg .= "\n";
1.27 ! raeburn 764: foreach (@cookievars) {
! 765: $supportmsg .= "$_: $cookies{$_}\n";
! 766: }
1.26 raeburn 767: foreach (@ENVvars) {
768: $supportmsg .= "$_: $ENV{$_}\n";
769: }
1.5 raeburn 770: foreach (@envvars) {
1.25 albertel 771: $supportmsg .= "$_: $env{$_}\n";
1.5 raeburn 772: }
773: }
774:
775: my $msg = MIME::Lite->new(
776: From => $from,
777: To => $to,
778: Subject => $subject,
779: Type =>'TEXT',
780: Data => $supportmsg,
781: );
782:
783: if ($attachmentpath) {
784: my ($type, $encoding) = MIME::Types::by_suffix($attachmentpath);
785: $msg->attach(Type => $type,
786: Path => $attachmentpath,
787: Filename => $fname
788: );
789:
790: } else {
791: my $envdata = '';
1.27 ! raeburn 792: foreach (@cookievars) {
! 793: $envdata .= "$_: $cookies{$_}\n";
! 794: }
1.26 raeburn 795: foreach (@ENVvars) {
796: $envdata .= "$_: $ENV{$_}\n";
797: }
1.5 raeburn 798: foreach (@envvars) {
1.25 albertel 799: $envdata .= "$_: $env{$_}\n";
1.5 raeburn 800: }
801: foreach (@loncvars) {
1.25 albertel 802: $envdata .= "$_: $env{$_}\n";
1.5 raeburn 803: }
804: $msg->attach(Type => 'TEXT',
805: Data => $envdata);
806: }
807:
808: ### Send it:
809: $msg->send('sendmail');
810:
811: if ($attachmentpath =~ m#$Apache::lonnet::perlvar{'lonDaemons'}/tmp/helprequests/(\d+)/[^/]+#) {
812: unlink($attachmentpath);
813: }
814: $r->print(qq|
1.1 raeburn 815: <b>Your support request contained the following information</b>:<br /><br />
816: <table width="580" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000">
817: <tr>
818: <td>
819: <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#000000">
820: <tr>
821: <td>
822: <table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff">
823: <tr>
824: <td>
825: <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#ffffff">
826: <tr>
827: <td width="140" bgcolor="$tablecolor">
828: <table width="140" border="0" cellpadding="8" cellspacing="0">
829: <tr>
830: <td align="right"><b>Information supplied</b>
831: </td>
832: </tr>
833: </table>
834: </td>
835: <td width="100%" valign="top">
836: <table width="100%" border="0" cellpadding="8" cellspacing="0">
837: <tr>
1.5 raeburn 838: <td>$displaymsg</td>
1.1 raeburn 839: </tr>
840: </table>
841: </td>
842: </tr>
843: <tr>
1.5 raeburn 844: <td width="100%" colspan="2" bgcolor="#000000">
845: <img src="/adm/lonMisc/blackdot.gif" /><br />
846: </td>
847: </tr>
848: <tr>
849: <td width="140" bgcolor="$tablecolor">
850: <table width="140" border="0" cellpadding="8" cellspacing="0">
1.1 raeburn 851: <tr>
852: <td align="right"><b>Additional information recorded</b>
853: </td>
854: </tr>
855: </table>
856: </td>
857: <td width="100%" valign="top">
858: <table width="100%" border="0" cellpadding="8" cellspacing="0">
859: <tr>
860: <td>
1.5 raeburn 861: |);
1.27 ! raeburn 862: foreach (@cookievars) {
! 863: unless($cookies{$_} eq '') {
! 864: $r->print("$_: <font color='$vlinkcolor'>$cookies{$_}</font>, ");
! 865: }
! 866: }
1.26 raeburn 867: foreach (@ENVvars) {
868: unless($ENV{$_} eq '') {
869: $r->print("$_: <font color='$vlinkcolor'>$ENV{$_}</font>, ");
870: }
871: }
1.1 raeburn 872: foreach (@envvars) {
1.25 albertel 873: unless($env{$_} eq '') {
874: $r->print("$_: <font color='$vlinkcolor'>$env{$_}</font>, ");
1.5 raeburn 875: }
1.1 raeburn 876: }
877: $r->print("
878: </td>
879: </tr>
880: </table>
881: </td>
882: </tr>
883: </table>
884: </td>
885: </tr>
886: </table>
887: </td>
888: </tr>
889: </table>
890: </td>
891: </tr>
892: </table>
1.14 raeburn 893: </body>
894: </html>
1.1 raeburn 895: ");
896: }
897:
1.14 raeburn 898: sub print_header {
899: my ($r,$origurl,$action) = @_;
900: my $location=&Apache::loncommon::lonhttpdurl("/adm");
901: my $tablecolor = '#EEEE99';
902: my ($component_url);
903: my $helpdesk_link = '<a href="javascript:validate()">';
904: if ($action eq 'process') {
905: $helpdesk_link = '<a href="/adm/helpdesk">';
906: }
907: my %lt = &Apache::lonlocal::texthash (
908: login => 'Log-in help',
909: ask => 'Ask helpdesk',
910: getst => 'Getting started guide',
911: back => 'Back to last location'
1.21 raeburn 912: );
913: my ($getstartlink,$getstarttext);
914: if (-e $Apache::lonnet::perlvar{'lonDocRoot'}.'/adm/gettingstarted.html') {
915: $getstartlink = qq|<td align="center"> <b><a href="/adm/gettingstarted.html">$lt{'getst'}</a></td>|;
916: $getstarttext = ' '.&mt('and the "Getting started" guide').' ';
917: }
1.14 raeburn 918: $r->print(<<END);
919: <table width="620" border="0" cellspacing="0" cellpadding="0" height="55"> <tr height="50"> <td width='5'> </td>
920: <td>
921: <fieldset><legend><img src="$location/lonIcons/minilogo.gif" height='20' width='29' valign='bottom' /> <b><font size="+1">LON-CAPA help/support</font></b></legend>
922: <table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000">
923: <tr>
924: <td>
925: <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#000000">
926: <tr>
927: <td>
928: <table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#ffffff">
929: <tr>
930: <td>
931: <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#ffffff">
932: <tr bgcolor="$tablecolor">
933: <td align="center"><img src="$location/help/gif/smallHelp.gif" border="0" alt="(Login help)" valign="middle" /> <b><a href="/adm/loginproblems.html">$lt{'login'}</a></td>
1.21 raeburn 934: <td align="center"> <b>$helpdesk_link<img src="$location/lonIcons/helpdesk.gif" border="0" alt="(Ask helpdesk)" valign="middle" /> $lt{'ask'}</a></b> </td>$getstartlink
1.14 raeburn 935: <td align="center"> <b><a href="$origurl" target="_top"><img src="$location/lonIcons/move_up.gif" border="0" alt="(Back to last location)" valign="middle" /> $lt{'back'}</a></b> </td>
936: </tr>
937: </table>
938: </td>
939: </tr>
940: </table>
941: </td>
942: </tr>
943: </table>
944: </td>
945: </tr>
946: </table>
947: </fieldset>
948: </td>
949: <td width='5'> </td>
950: </tr>
951: <tr height='5'>
952: <td colspan='3' height='5'> </td>
953: </tr>
954: END
955: unless ($action eq 'process') {
956: $r->print('
957: <tr>
958: <td colspan="3">'.&mt('
1.21 raeburn 959: Please review the information in "Log-in help"').$getstarttext.' '.&mt('if you are unable to log-in').'. '.&mt('If your problem is still unresolved, the form below can be used to send a question to the LON-CAPA helpdesk').'.<br /><font size="-1"><b>'.&mt('Note').':</b> '.&mt('Student questions about course content should be directed to the course instructor').'.</font><br /><br />
1.14 raeburn 960: </td>
961: </tr>');
962: }
963: $r->print('
964: </table>');
965: return;
966: }
967:
1.1 raeburn 968: sub retrieve_instcodes {
969: my ($coursecodes,$codedom,$totcodes) = @_;
1.11 raeburn 970: my %courses = &Apache::lonnet::courseiddump($codedom,'.',1,'.','.');
1.1 raeburn 971: foreach my $course (keys %courses) {
1.11 raeburn 972: if ($courses{$course} =~ m/^[^:]*:([^:]+)/) {
1.1 raeburn 973: $$coursecodes{$course} = &Apache::lonnet::unescape($1);
974: $totcodes ++;
975: }
976: }
977: return $totcodes;
978: }
979:
1.6 raeburn 980: sub build_code_selections {
981: my ($codes,$codetitles,$cat_titles,$cat_order,$idlist,$idnums,$idlist_titles) = @_;
982: my %idarrays = ();
983: for (my $i=1; $i<@{$codetitles}; $i++) {
984: %{$idarrays{$$codetitles[$i]}} = ();
985: }
986: foreach my $cid (sort keys %{$codes}) {
987: &recurse_list($cid,$codetitles,$codes,0,\%idarrays);
988: }
989: for (my $num=0; $num<@{$codetitles}; $num++) {
990: if ($num == 0) {
991: my @contents = ();
992: my @contents_titles = ();
993: &sort_cats($num,$cat_order,$codetitles,\@{$idarrays{$$codetitles[0]}},\@contents);
994: if (defined($$cat_titles{$$codetitles[0]})) {
995: foreach (@contents) {
996: push @contents_titles, $$cat_titles{$$codetitles[0]}{$_};
997: }
998: }
999: $$idlist{$$codetitles[0]} = join('","',@contents);
1000: $$idnums{$$codetitles[0]} = scalar(@contents);
1001: if (defined($$cat_titles{$$codetitles[0]})) {
1002: $$idlist_titles{$$codetitles[0]} = join('","',@contents_titles);
1003: }
1004: } elsif ($num == 1) {
1005: %{$$idlist{$$codetitles[1]}} = ();
1006: %{$$idlist_titles{$$codetitles[1]}} = ();
1007: foreach my $key_a (keys %{$idarrays{$$codetitles[1]}}) {
1008: my @sorted_a = ();
1009: my @sorted_a_titles = ();
1010: &sort_cats($num,$cat_order,$codetitles,\@{$idarrays{$$codetitles[1]}{$key_a}},\@sorted_a);
1011: if (defined($$cat_titles{$$codetitles[1]})) {
1012: foreach (@sorted_a) {
1013: push @sorted_a_titles, $$cat_titles{$$codetitles[1]}{$_};
1014: }
1015: }
1016: $$idlist{$$codetitles[1]}{$key_a} = join('","',@sorted_a);
1017: $$idnums{$$codetitles[1]}{$key_a} = scalar(@sorted_a);
1018: if (defined($$cat_titles{$$codetitles[1]})) {
1019: $$idlist_titles{$$codetitles[1]}{$key_a} = join('","',@sorted_a_titles);
1020: }
1021: }
1022: } elsif ($num == 2) {
1023: %{$$idlist{$$codetitles[2]}} = ();
1024: %{$$idlist_titles{$$codetitles[2]}} = ();
1025: foreach my $key_a (keys %{$idarrays{$$codetitles[2]}}) {
1026: %{$$idlist{$$codetitles[2]}{$key_a}} = ();
1027: %{$$idlist_titles{$$codetitles[2]}{$key_a}} = ();
1028: foreach my $key_b (keys %{$idarrays{$$codetitles[2]}{$key_a}}) {
1029: my @sorted_b = ();
1030: my @sorted_b_titles = ();
1031: &sort_cats($num,$cat_order,$codetitles,\@{$idarrays{$$codetitles[2]}{$key_a}{$key_b}},\@sorted_b);
1.19 raeburn 1032: if (defined($$cat_titles{$$codetitles[2]})) {
1.6 raeburn 1033: foreach (@sorted_b) {
1.19 raeburn 1034: push @sorted_b_titles, $$cat_titles{$$codetitles[2]}{$_};
1.6 raeburn 1035: }
1036: }
1037: $$idlist{$$codetitles[2]}{$key_a}{$key_b} = join('","',@sorted_b);
1038: $$idnums{$$codetitles[2]}{$key_a}{$key_b} = scalar(@sorted_b);
1039: if (defined($$cat_titles{$$codetitles[2]})) {
1040: $$idlist_titles{$$codetitles[2]}{$key_a}{$key_b} = join('","',@sorted_b_titles);
1041: }
1042: }
1043: }
1044: } elsif ($num == 3) {
1045: %{$$idlist{$$codetitles[3]}} = ();
1046: foreach my $key_a (keys %{$idarrays{$$codetitles[3]}}) {
1047: %{$$idlist{$$codetitles[3]}{$key_a}} = ();
1048: foreach my $key_b (keys %{$idarrays{$$codetitles[3]}{$key_a}}) {
1049: %{$$idlist{$$codetitles[3]}{$key_a}{$key_b}} = ();
1050: foreach my $key_c (keys %{$idarrays{$$codetitles[3]}{$key_a}{$key_b}}) {
1051: my @sorted_c = ();
1.20 raeburn 1052: my @sorted_c_titles = ();
1.6 raeburn 1053: &sort_cats($num,$cat_order,$codetitles,\@{$idarrays{$$codetitles[3]}{$key_a}{$key_b}{$key_c}},\@sorted_c);
1.20 raeburn 1054: if (defined($$cat_titles{$$codetitles[3]})) {
1055: foreach (@sorted_c) {
1056: push @sorted_c_titles, $$cat_titles{$$codetitles[3]}{$_};
1057: }
1058: }
1.6 raeburn 1059: $$idlist{$$codetitles[3]}{$key_a}{$key_b}{$key_c} = join('","',@sorted_c);
1060: $$idnums{$$codetitles[3]}{$key_a}{$key_b}{$key_c} = scalar(@sorted_c);
1.20 raeburn 1061: if (defined($$cat_titles{$$codetitles[3]})) {
1062: $$idlist_titles{$$codetitles[2]}{$key_a}{$key_b} = join('","',@sorted_c_titles);
1063: }
1.6 raeburn 1064: }
1065: }
1066: }
1067: } elsif ($num == 4) {
1068: %{$$idlist{$$codetitles[4]}} = ();
1069: foreach my $key_a (keys %{$idarrays{$$codetitles[4]}}) {
1070: %{$$idlist{$$codetitles[4]}{$key_a}} = ();
1071: foreach my $key_b (keys %{$idarrays{$$codetitles[4]}{$key_a}}) {
1072: %{$$idlist{$$codetitles[4]}{$key_a}{$key_b}} = ();
1073: foreach my $key_c (keys %{$idarrays{$$codetitles[4]}{$key_a}{$key_b}}) {
1074: %{$$idlist{$$codetitles[4]}{$key_a}{$key_b}{$key_c}} = ();
1075: foreach my $key_d (keys %{$idarrays{$$codetitles[4]}{$key_a}{$key_b}{$key_c}}) {
1076: my @sorted_d = ();
1.20 raeburn 1077: my @sorted_d_titles = ();
1.6 raeburn 1078: &sort_cats($num,$cat_order,$codetitles,$idarrays{$$codetitles[4]}{$key_a}{$key_b}{$key_c}{$key_d},\@sorted_d);
1.20 raeburn 1079: if (defined($$cat_titles{$$codetitles[4]})) {
1080: foreach (@sorted_d) {
1081: push @sorted_d_titles, $$cat_titles{$$codetitles[4]}{$_};
1082: }
1083: }
1.6 raeburn 1084: $$idlist{$$codetitles[4]}{$key_a}{$key_b}{$key_c}{$key_d} = join('","',@sorted_d);
1085: $$idnums{$$codetitles[4]}{$key_a}{$key_b}{$key_c}{$key_d} = scalar(@sorted_d);
1086: }
1087: }
1088: }
1089: }
1090: }
1091: }
1092: }
1093:
1094: sub sort_cats {
1095: my ($num,$cat_order,$codetitles,$idsarrayref,$sorted) = @_;
1096: my @unsorted = @{$idsarrayref};
1097: if (defined($$cat_order{$$codetitles[$num]})) {
1098: foreach (@{$$cat_order{$$codetitles[$num]}}) {
1099: if (grep/^$_$/,@unsorted) {
1100: push @{$sorted}, $_;
1101: }
1102: }
1103: } else {
1104: @{$sorted} = sort (@unsorted);
1105: }
1106: }
1107:
1108:
1109: sub recurse_list {
1110: my ($cid,$codetitles,$codes,$num,$idarrays) = @_;
1111: if ($num == 0) {
1112: if (!grep/^$$codes{$cid}{$$codetitles[0]}$/,@{$$idarrays{$$codetitles[0]}}) {
1113: push @{$$idarrays{$$codetitles[0]}}, $$codes{$cid}{$$codetitles[0]};
1114: }
1115: } elsif ($num == 1) {
1116: if (defined($$idarrays{$$codetitles[1]}{$$codes{$cid}{$$codetitles[0]}})) {
1117: if (!grep/^$$codes{$cid}{$$codetitles[1]}$/,@{$$idarrays{$$codetitles[1]}{$$codes{$cid}{$$codetitles[0]}}}) {
1118: push @{$$idarrays{$$codetitles[1]}{$$codes{$cid}{$$codetitles[0]}}}, $$codes{$cid}{$$codetitles[1]};
1119: }
1120: } else {
1121: @{$$idarrays{$$codetitles[1]}{$$codes{$cid}{$$codetitles[0]}}} = ("$$codes{$cid}{$$codetitles[1]}");
1122: }
1123: } elsif ($num == 2) {
1124: if (defined($$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}})) {
1125: if (defined($$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}})) {
1126: if (!grep/^$$codes{$cid}{$$codetitles[2]}$/,@{$$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}}) {
1127: push @{$$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}}, $$codes{$cid}{$$codetitles[2]};
1128: }
1129: } else {
1130: @{$$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}} = ("$$codes{$cid}{$$codetitles[2]}");
1131: }
1132: } else {
1133: %{$$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}}} = ();
1134: @{$$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}} = ("$$codes{$cid}{$$codetitles[2]}");
1135: }
1136: } elsif ($num == 3) {
1137: if (defined($$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}})) {
1138: if (defined($$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}})) {
1139: if (defined($$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}})) {
1140: if (!grep/^$$codes{$cid}{$$codetitles[3]}$/,@{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}}) {
1141: push @{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}}, $$codes{$cid}{$$codetitles[3]};
1142: }
1143: } else {
1144: @{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}} = ("$$codes{$cid}{$$codetitles[3]}");
1145: }
1146: } else {
1147: %{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}} = ();
1148: @{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}} = ("$$codes{$cid}{$$codetitles[3]}");
1149: }
1150: } else {
1151: %{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}} = ();
1152: %{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}} = ();
1153: @{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}} = ("$$codes{$cid}{$$codetitles[3]}");
1154: }
1155: } elsif ($num == 4) {
1156: if (defined($$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}})) {
1157: if (defined($$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}})) {
1158: if (defined($$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}})) {
1159: if (defined($$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}{$$codes{$cid}{$$codetitles[3]}})) {
1160: if (!grep/^$$codes{$cid}{$$codetitles[4]}$/,@{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}{$$codes{$cid}{$$codetitles[3]}}}) {
1161: push @{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}{$$codes{$cid}{$$codetitles[3]}}}, $$codes{$cid}{$$codetitles[4]};
1162: }
1163: } else {
1164: @{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}{$$codes{$cid}{$$codetitles[3]}}} = ("$$codes{$cid}{$$codetitles[4]}");
1165: }
1166: } else {
1167: %{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}} = ();
1168: @{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}{$$codes{$cid}{$$codetitles[3]}}} = ("$$codes{$cid}{$$codetitles[4]}");
1169: }
1170: } else {
1171: %{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}} = ();
1172: %{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}} = ();
1173: @{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}{$$codes{$cid}{$$codetitles[3]}}} = ("$$codes{$cid}{$$codetitles[4]}");
1174: }
1175: } else {
1176: %{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}} = ();
1177: %{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}} = ();
1178: %{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}} = ();
1179: @{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[3]}}} = ("$$codes{$cid}{$$codetitles[3]}");
1180: }
1181: }
1182: $num ++;
1183: if ($num <@{$codetitles}) {
1184: &recurse_list($cid,$codetitles,$codes,$num,$idarrays);
1185: }
1186: }
1187:
1188: sub javascript_code_selections {
1.20 raeburn 1189: my ($numcats,$cat_titles,$script_tag,$idlist,$idnums,$idlist_titles,$codetitles) = @_;
1.10 raeburn 1190: my $numtitles = @{$codetitles};
1.20 raeburn 1191: my @seltitles = ();
1.10 raeburn 1192: for (my $j=0; $j<$numtitles; $j++) {
1193: $seltitles[$j] = 'id'.$$codetitles[$j];
1194: }
1195: my $seltitle_str = join('","',@seltitles);
1.20 raeburn 1196: my @longtitles = ();
1197: for (my $i=0; $i<$numtitles; $i++) {
1198: if (defined($$cat_titles{$$codetitles[$i]})) {
1199: $longtitles[$i] = 1;
1200: } else {
1201: $longtitles[$i] = 0;
1202: }
1203: }
1204: my $longtitles_str = join('","',@longtitles);
1.6 raeburn 1205: $$script_tag .= <<END;
1206: function courseSet(caller) {
1.10 raeburn 1207: var ids = new Array ("$seltitle_str");
1208: var formitems = new Array ($numtitles);
1.20 raeburn 1209: var longtitles = new Array ("$longtitles_str");
1.15 raeburn 1210: var idyr = document.logproblem.Year.selectedIndex
1211: var idsem = document.logproblem.Semester.selectedIndex
1212: var iddept = document.logproblem.Department.selectedIndex
1213: var idclass = document.logproblem.Number.selectedIndex
1.6 raeburn 1214: var idyears = new Array("$$idlist{$$codetitles[0]}");
1215: END
1.20 raeburn 1216: if ($longtitles[0]) {
1217: $$script_tag .=
1218: qq| var idyearslongs = new Array("$$idlist_titles{$$codetitles[0]}")\n|;
1219: }
1220: $$script_tag .=
1221: " var idsems = new Array ($$idnums{$$codetitles[0]})\n";
1222: if ($longtitles[1]) {
1223: $$script_tag .=
1224: " var idsemslongs = new Array ($$idnums{$$codetitles[0]})\n";
1225: }
1226: $$script_tag .=
1227: " var idcodes = new Array ($$idnums{$$codetitles[0]})\n";
1228: if ($longtitles[2]) {
1229: $$script_tag .=
1230: " var idcodeslongs = new Array ($$idnums{$$codetitles[0]})\n";
1231: }
1232: $$script_tag .=
1233: " var idcourses = new Array ($$idnums{$$codetitles[0]})\n";
1234: if ($longtitles[3]) {
1235: $$script_tag .=
1236: " var idcourseslongs = new Array ($$idnums{$$codetitles[0]})\n";
1237: }
1238: my @sort_a = split/","/,$$idlist{$$codetitles[0]};
1.6 raeburn 1239: for (my $j=0; $j<@sort_a; $j++) {
1240: $$script_tag .= qq| idsems[$j] = new Array("$$idlist{$$codetitles[1]}{$sort_a[$j]}")\n|;
1.20 raeburn 1241: if ($longtitles[1]) {
1242: $$script_tag .= qq| idsemslongs[$j] = new Array("$$idlist_titles{$$codetitles[1]}{$sort_a[$j]}")\n|;
1243: }
1.6 raeburn 1244: $$script_tag .= qq| idcodes[$j] = new Array($$idnums{$$codetitles[1]}{$sort_a[$j]})\n|;
1.20 raeburn 1245: if ($longtitles[2]) {
1246: $$script_tag .= qq| idcodeslongs[$j] = new Array($$idnums{$$codetitles[1]}{$sort_a[$j]})\n|;
1247: }
1.6 raeburn 1248: $$script_tag .= qq| idcourses[$j] = new Array($$idnums{$$codetitles[1]}{$sort_a[$j]})\n|;
1.20 raeburn 1249: if ($longtitles[3]) {
1250: $$script_tag .= qq| idcourseslongs[$j] = new Array($$idnums{$$codetitles[1]}{$sort_a[$j]})\n|;
1251: }
1.6 raeburn 1252: my @sort_b = split/","/,$$idlist{$$codetitles[1]}{$sort_a[$j]};
1253: for (my $k=0; $k<@sort_b; $k++) {
1254: my $idcode_entry = $$idlist{$$codetitles[2]}{$sort_a[$j]}{$sort_b[$k]};
1255: $$script_tag .= qq| idcodes[$j][$k] = new Array("$idcode_entry")\n|;
1.20 raeburn 1256: if ($longtitles[2]) {
1257: my $idcodelong_entry = $$idlist_titles{$$codetitles[2]}{$sort_a[$j]}{$sort_b[$k]};
1258: $$script_tag .= qq| idcodeslongs[$j][$k] = new Array("$idcodelong_entry")\n|;
1259: }
1.6 raeburn 1260: $$script_tag .= qq| idcourses[$j][$k] = new Array($$idnums{$$codetitles[2]}{$sort_a[$j]}{$sort_b[$k]})\n|;
1.20 raeburn 1261: if ($longtitles[3]) {
1262: $$script_tag .= qq| idcourseslongs[$j][$k] = new Array($$idnums{$$codetitles[2]}{$sort_a[$j]}{$sort_b[$k]})\n|;
1263: }
1.6 raeburn 1264: my @sort_c = split/","/,$$idlist{$$codetitles[2]}{$sort_a[$j]}{$sort_b[$k]};
1265: for (my $l=0; $l<@sort_c; $l++) {
1266: my $idcourse_entry = $$idlist{$$codetitles[3]}{$sort_a[$j]}{$sort_b[$k]}{$sort_c[$l]};
1267: $$script_tag .= qq| idcourses[$j][$k][$l] = new Array("$idcourse_entry")\n|;
1.20 raeburn 1268: if ($longtitles[3]) {
1269: my $idcourselong_entry = $$idlist_titles{$$codetitles[3]}{$sort_a[$j]}{$sort_b[$k]}{$sort_c[$l]};
1270: $$script_tag .= qq| idcourseslongs[$j][$k][$l] = new Array("$idcourselong_entry")\n|;
1271: }
1.6 raeburn 1272: }
1273: }
1274: }
1275: $$script_tag .= (<<END_OF_BLOCK);
1.22 raeburn 1276: var display = new Array($numtitles)
1277: if (caller == "") {
1278: document.logproblem.Year.length = 0
1279: document.logproblem.Year.options[0] = new Option("Select","-1",true,true)
1280: display[0] = new Array(idyears.length)
1281: for (var i=0; i<idyears.length; i++) {
1282: display[0][i] = idyears[i]
1283: if (longtitles[0] == 1) {
1284: if (idyearslongs[i] != "") {
1285: display[0][i] = idyearslongs[i]
1286: }
1287: }
1288: document.logproblem.Year.options[i+1] = new Option(display[0][i],idyears[i],false,false)
1289: }
1290: document.logproblem.Year.selectedIndex = 0;
1291: }
1.19 raeburn 1292: if (caller == "$$codetitles[0]") {
1.15 raeburn 1293: document.logproblem.Department.length = 0
1294: document.logproblem.Number.length = 0
1.19 raeburn 1295: document.logproblem.Department.options[0] = new Option("<-Pick $$codetitles[1]","-1",true,true)
1296: document.logproblem.Number.options[0] = new Option("<-Pick $$codetitles[2]","-1",true,true)
1.6 raeburn 1297: if (idyr == 0) {
1.15 raeburn 1298: document.logproblem.Semester.length = 0
1.19 raeburn 1299: document.logproblem.Semester.options[0] = new Option("<-Pick $$codetitles[0]","-1",true,true)
1.6 raeburn 1300: }
1301: else {
1.15 raeburn 1302: document.logproblem.Semester.length = 0
1303: document.logproblem.Semester.options[0] = new Option("Select","-1",true,true)
1.22 raeburn 1304: display[1] = new Array(idsems[idyr-1].length)
1.6 raeburn 1305: for (var i=0; i<idsems[idyr-1].length; i++) {
1.22 raeburn 1306: display[1][i] = idsems[idyr-1][i]
1.20 raeburn 1307: if (longtitles[1] == 1) {
1.22 raeburn 1308: if (idsemslongs[idyr-1][i] != "") {
1309: display[1][i] = idsemslongs[idyr-1][i]
1310: }
1.20 raeburn 1311: }
1.22 raeburn 1312: document.logproblem.Semester.options[i+1] = new Option(display[1][i],idsems[idyr-1][i],false,false)
1.6 raeburn 1313: }
1314: }
1.15 raeburn 1315: document.logproblem.Semester.selectedIndex = 0;
1.6 raeburn 1316: }
1.19 raeburn 1317: if (caller == "$$codetitles[1]") {
1.15 raeburn 1318: document.logproblem.Department.length = 0
1319: document.logproblem.Number.length = 0
1.19 raeburn 1320: document.logproblem.Number.options[0] = new Option("<-Pick $$codetitles[2]","-1",true,true)
1.6 raeburn 1321: if (idsem == 0) {
1.19 raeburn 1322: document.logproblem.Department.options[0] = new Option("<-Pick $$codetitles[1]","-1",true,true)
1.6 raeburn 1323: }
1324: else {
1.15 raeburn 1325: document.logproblem.Department.options[0] = new Option("Select","-1",true,true)
1.22 raeburn 1326: display[2] = new Array(idcodes[idyr-1][idsem-1].length)
1.6 raeburn 1327: for (var i=0; i<idcodes[idyr-1][idsem-1].length; i++) {
1.22 raeburn 1328: display[2][i] = idcodes[idyr-1][idsem-1][i]
1.20 raeburn 1329: if (longtitles[2] == 1) {
1.22 raeburn 1330: if (idcodeslongs[idyr-1][idsem-1][i] != "") {
1331: display[2][i] = idcodeslongs[idyr-1][idsem-1][i]
1332: }
1.20 raeburn 1333: }
1.22 raeburn 1334: document.logproblem.Department.options[i+1] = new Option(display[2][i],idcodes[idyr-1][idsem-1][i],false,false)
1.6 raeburn 1335: }
1336: }
1.15 raeburn 1337: document.logproblem.Department.selectedIndex = 0
1.6 raeburn 1338: }
1.19 raeburn 1339: if (caller == "$$codetitles[2]") {
1.15 raeburn 1340: document.logproblem.Number.length = 0
1.6 raeburn 1341: if (iddept == 0) {
1.19 raeburn 1342: document.logproblem.Number.options[0] = new Option("<-Pick $$codetitles[2]","-1",true,true)
1.6 raeburn 1343: }
1344: else {
1.15 raeburn 1345: document.logproblem.Number.options[0] = new Option("Select","-1",true,true)
1.22 raeburn 1346: display[3] = new Array (idcourses[idyr-1][idsem-1][iddept-1].length)
1.6 raeburn 1347: for (var i=0; i<idcourses[idyr-1][idsem-1][iddept-1].length; i++) {
1.22 raeburn 1348: display[3][i] = idcourses[idyr-1][idsem-1][iddept-1][i]
1.20 raeburn 1349: if (longtitles[3] == 1) {
1.22 raeburn 1350: if (idcourseslongs[idyr-1][idsem-1][iddept-1][i] != "") {
1351: display[3][i] = idcourseslongs[idyr-1][idsem-1][iddept-1][i]
1352: }
1.20 raeburn 1353: }
1.22 raeburn 1354: document.logproblem.Number.options[i+1] = new Option(display[3][i],idcourses[idyr-1][idsem-1][iddept-1][i],false,false)
1.6 raeburn 1355: }
1356: }
1.15 raeburn 1357: document.logproblem.Number.selectedIndex = 0
1.6 raeburn 1358: }
1359: }
1.22 raeburn 1360:
1361: function initialize_codes() {
1362: courseSet();
1363: return;
1364: }
1.6 raeburn 1365: END_OF_BLOCK
1366: }
1367:
1.1 raeburn 1368: 1;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>