File:  [LON-CAPA] / loncom / interface / lonannounce.pm
Revision 1.16: download - view: text, annotated - select for diffs
Thu Jul 10 10:27:04 2003 UTC (20 years, 9 months ago) by www
Branches: MAIN
CVS tags: version_1_0_3, version_1_0_2, version_1_0_1, version_1_0_0, version_0_99_5, version_0_99_4, HEAD
Bug #1486: remove confusing checkboxes from any entry but that on the first
day.

# The LearningOnline Network
# Announce
#
# $Id: lonannounce.pm,v 1.16 2003/07/10 10:27:04 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#

package Apache::lonannounce;

use strict;
use Apache::Constants qw(:common);
use Apache::loncommon;
use Apache::lonhtmlcommon();
use HTML::Entities();

my %todayhash;
my %showedcheck;

sub editfield {
    my ($r,$start,$end,$text)=@_;
    # Deal with date forms
    my $startdateform = &Apache::lonhtmlcommon::date_setter('anno',
                                                            'startdate',
                                                            $start);
    my $enddateform = &Apache::lonhtmlcommon::date_setter('anno',
                                                          'enddate',
                                                          $end);

    $r->print(<<ENDFORM);
<form name="anno" method="post">
<input type="hidden" value=''          name="action"      >
<table><tr><td>Starting date:</td><td>$startdateform</td></tr>
<tr><td>Ending date:</td><td>$enddateform</td></tr></table>
<textarea name="msg" rows="4" cols="60">$text</textarea>
<input type="button" onClick="trysubmit()" value="Post Announcement"><hr>
ENDFORM
}

sub readcalendar {
    my $courseid=shift;
    my $coursenum=$ENV{'course.'.$courseid.'.num'};
    my $coursedom=$ENV{'course.'.$courseid.'.domain'};
    my %thiscal=&Apache::lonnet::dump('calendar',$coursedom,$coursenum);
    my %returnhash=();
    foreach (keys %thiscal) {
        unless (($_=~/^error\:/) || ($thiscal{$_}=~/^error\:/)) {
	   $returnhash{$courseid.'@'.$_}=$thiscal{$_};
        }
    }
    return %returnhash;
}

sub emptycell {
    return '<td bgcolor="#AAAAAA">&nbsp;</td>';
}

sub normalcell {
    my ($day,$month,$year,$text)=@_;
    my $output='';
    foreach (split(/\_\_\_\&\&\&\_\_\_/,$text)) {
        if ($_) {
	    my ($courseid,$start,$end,@msg)=split(/\@/,$_);
            my $msg=join('@',@msg);
            my $fullmsg=$ENV{'course.'.$courseid.'.description'}.
		', '.localtime($start).' - '.localtime($end).': '.$msg;
            if ($courseid eq $ENV{'request.course.id'}) {
              if ((&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))
               && (!$showedcheck{$start.'_'.$end})) {
               $output.='<input type="checkbox" name="remove_'.$start.'_'.
		   $end.'">';
               $showedcheck{$start.'_'.$end}=1;
	      }
	    }
            $fullmsg=&HTML::Entities::encode($fullmsg,'<>&"\'');
            $fullmsg=~s/&/\\&/g;
            $output.='<a href="javascript:alert('."'$fullmsg'".')">'.
	       substr($msg,0,20).'...</a><br />';
       }
    }
    return '<td'.
	((($day eq $todayhash{'day'}) &&
          ($month eq $todayhash{'month'}) &&
          ($year eq $todayhash{'year'}))?' bgcolor="#FFFF00"':'').
           '><b>'.$day.'</b><br>'.$output.'</td>';
}

sub plaincell {
    my ($text)=@_;
    my $output='';
    foreach (split(/\_\_\_\&\&\&\_\_\_/,$text)) {
        if ($_) {
	    my ($courseid,$start,$end,@msg)=split(/\@/,$_);
            my $msg=join('@',@msg);
            my $fullmsg=$ENV{'course.'.$courseid.'.description'}.
		', '.localtime($start).' - '.localtime($end).': '.$msg;
            $fullmsg=&HTML::Entities::encode($fullmsg,'<>&"\'');
            $fullmsg=~s/&/\\&/g;
            $output.='<a href="javascript:alert('."'$fullmsg'".')">'.
	       substr($msg,0,40).'...</a><br />';
       }
    }
    return $output;
}

sub listcell {
    my ($text)=@_;
    my $output='';
    foreach (split(/\_\_\_\&\&\&\_\_\_/,$text)) {
        if ($_) {
	    my ($courseid,$start,$end,@msg)=split(/\@/,$_);
            my $msg=join('@',@msg);
            my $fullmsg=localtime($start).' to '.localtime($end).':<br /><b>'.
               $msg.'</b>';
            $output.='<li>'.$fullmsg.'</li>';
       }
    }
    return $output;
}

sub nextday {
    my %th=@_;
    $th{'day'}++;
    return (&Apache::loncommon::maketime(%th),$th{'month'});
}

sub showday {
    my ($tk,$mode,%allcal)=@_;
    my %th=&Apache::loncommon::timehash($tk);
    my ($nextday,$nextmonth)=&nextday(%th);
    my $outp='';
    my $oneday=24*3600;
    foreach (keys %allcal) {
	my ($course,$startdate,$enddate)=($_=~/^(\w+)\@(\d+)\_(\d+)$/);
        if (($startdate<$nextday) && ($enddate>$tk))  {
	    $outp.='___&&&___'.$course.'@'.$startdate.'@'.$enddate.'@'.
            $allcal{$_};
        }
    }
    unless ($mode) {
       return ($nextday,$nextmonth,&normalcell(
               $th{'day'},$th{'month'},$th{'year'},$outp));
   } elsif ($outp) {
       if ($mode==1) {
          return '<br />'.&plaincell($outp);
      } else {
          return '<ul>'.&listcell($outp).'</ul>';
      }
   } else {
       return '';
   }
}

sub handler {
    my $r = shift;
    $r->content_type('text/html');
    $r->send_http_header;
    return OK if $r->header_only;

# ---------------------------------------------------------- Get time right now
    my $today=time;
    %todayhash=&Apache::loncommon::timehash($today);
# ----------------------------------------------------------------- Check marks
    %showedcheck=();
    undef %showedcheck;
# ---------------------------------------------------------- Get month and year
    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                            ['month','year']);
# --------------------------------------------------- Decide what month to show
    my $year=$todayhash{'year'};
    if ($ENV{'form.year'}) { $year=$ENV{'form.year'}; }
    my $month=$todayhash{'month'};
    if ($ENV{'form.month'}) { $month=$ENV{'form.month'}; }
# --------------------------------------------- Find out first day of the month

    my %firstday=&Apache::loncommon::timehash(
       &Apache::loncommon::maketime( 'day' => 1, 'month'=> $month,
                                     'year' => $year, 'hours' => 0,
				     'minutes' => 0, 'seconds' => 0,
                                     'dlsav' => $todayhash{'dlsav'} ));
    my $weekday=$firstday{'weekday'};
# ------------------------------------------------------------ Print the screen

    $r->print(<<ENDDOCUMENT);
<html>
<head>
<title>The LearningOnline Network with CAPA</title>
<script>

    function trysubmit() {
        document.anno.action.value="new";
	document.anno.submit();
    }

    function removesub() {
        document.anno.action.value="del";
	document.anno.submit();
    }
</script>
</head>
ENDDOCUMENT
    $r->print(&Apache::loncommon::bodytag("Announcements and Calendar"));
# does this user have privileges to post, etc?
    my $allowed=0;
    if ($ENV{'request.course.id'}) {
       $allowed=&Apache::lonnet::allowed('srm',$ENV{'request.course.id'});
    }

    if ($allowed) {
        my $coursenum=$ENV{'course.'.$ENV{'request.course.id'}.'.num'};
        my $coursedom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
# ----------------------------------------------------- Store new submitted one
        if ($ENV{'form.action'} eq 'new') {
	    my $startdate = 
		&Apache::lonhtmlcommon::get_date_from_form('startdate');
	    my $enddate   = 
		&Apache::lonhtmlcommon::get_date_from_form('enddate');
	    unless ($startdate=~/^\d+$/) { $startdate=time; }
            unless ($enddate=~/^\d+$/) { $enddate=$startdate+1; }
            if ($startdate>$enddate) {
		my $buffer=$startdate;
		$startdate=$enddate;
		$enddate=$buffer;
            }
	    &Apache::lonnet::put('calendar',{ 
		$startdate.'_'.$enddate => 
		    $ENV{'form.msg'} },$coursedom,$coursenum);
        }
# ---------------------------------------------------------------- Remove items
        if ($ENV{'form.action'} eq 'del') {
	    my @delwhich=();
            foreach (keys %ENV) {
		if ($_=~/^form\.remove\_(.+)$/) {
		    push(@delwhich,$1);
                }
            }
            &Apache::lonnet::del('calendar',\@delwhich,$coursedom,$coursenum);
        }
# -------------------------------------------------------- Form to post new one
        my %tomorrowhash=%todayhash;
        $tomorrowhash{'day'}++;
        my $tomorrow=&Apache::loncommon::maketime(%tomorrowhash);
        
        &editfield($r,$today,$tomorrow,'');
    }
# ----------------------------------------------------- Summarize all calendars
    my %allcal=();
    foreach (&Apache::loncommon::findallcourses()) {
	%allcal=(%allcal,&readcalendar($_));
    }

# ------------------------------- Initialize table and forward backward buttons
    my ($pm,$py,$fm,$fy)=($month-1,$year,$month+1,$year);
    if ($pm<1) { ($pm,$py)=(12,$year-1); }
    if ($fm>12){ ($fm,$fy)=(1,$year+1); }

    $r->print('<h1>'.('','January','February','March','April','May',
		      'June','July','August','September','October',
                      'November','December')[$month].' '.$year.'</h1>');
# Reached the end of times, give up
    if (($year<1970) || ($year>2037)) {
	$r->print('<h3>No calendar available for this date.</h3>'.
 '<a href="/adm/announcements?month='.$todayhash{'month'}.
 '&year='.$todayhash{'year'}.'">Current Month</a></body></html>');
	return OK;
    }
    $r->print(
 '<a href="/adm/announcements?month='.$pm.'&year='.$py.'">Previous Month</a> '.
 '<a href="/adm/announcements?month='.$fm.'&year='.$fy.'">Next Month</a>'.
 '&nbsp;&nbsp;&nbsp;<a href="/adm/announcements?month='.$todayhash{'month'}.
 '&year='.$todayhash{'year'}.'">Current Month</a><p>'.
        '<table border="2" cols="7" rows="5"><tr><th>Sun</th><th>Mon</th>'.
        '<th>Tue</th><th>Wed</th><th>Thu</th><th>Fri</th><th>Sat</th></tr>');

    my $tk=&Apache::loncommon::maketime(%firstday);
    my $outp;
    my $nm;

# ---------------------------------------------------------------- Actual table
    $r->print('<tr>');
    for (my $i=0;$i<$weekday;$i++) { $r->print(&emptycell); }
    for (my $i=$weekday;$i<=6;$i++) { 
        ($tk,$nm,$outp)=&showday($tk,0,%allcal);
        $r->print($outp);
    }
    $r->print('</tr>');

    for (my $k=0;$k<=3;$k++) {
        $r->print('<tr>');
        for (my $i=0;$i<=6;$i++) {
            ($tk,$nm,$outp)=&showday($tk,0,%allcal);
            if ($month!=$nm) { $outp=&emptycell; }
            $r->print($outp);
        }
        $r->print('</tr>');
    }
# ------------------------------------------------------------------- End table
    $r->print('</table>');
# ----------------------------------------------------------------- Check marks
    %showedcheck=();
    undef %showedcheck;
# --------------------------------------------------------------- Remove button
    if ($allowed) { $r->print('<input type="button" onClick="removesub()" value="Remove Checked Entries"></form>'); }
    $r->print('<p>'.
 '<a href="/adm/announcements?month='.$pm.'&year='.$py.'">Previous Month</a> '.
 '<a href="/adm/announcements?month='.$fm.'&year='.$fy.'">Next Month</a>'.
 '&nbsp;&nbsp;&nbsp;<a href="/adm/announcements?month='.$todayhash{'month'}.
 '&year='.$todayhash{'year'}.'">Current Month</a></p>'.
 '</body></html>');
    return OK;
} 

1;
__END__

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