#============================================================ # Calendar #============================================================ package Calendar; use Common; @ISA = qw(Common); #公開したいサブルーチン #@EXPORT = qw(erfc tan); @EXPORT_OK = qw(); use strict; my @WeekDayStrs = qw(Su Mo Tu We Th Fr Sa); #============================================================ # コンストラクタ、デストラクタ #============================================================ sub new { my ($module) = @_; my $this = {}; bless $this; # $this->SUPER::new(@_); return $this; } sub DESTROY { my $this = shift; $this->SUPER::DESTROY(@_); } #============================================================ # メンバー関数 #============================================================ sub GetNowDate { my ($this) = @_; my ($ss, $mm, $hh, $day, $month, $year) = localtime(time); $year += 1900; $month++; return ($year, $month, $day, $hh, $mm, $ss); } sub FillDate { my ($this, $Year, $Month, $Day) = @_; my ($year, $month, $day, $hh, $mm, $ss) = $this->GetNowDate(); $Year = $year if($Year <= 0 or $Year < 1900); $Month = $month if($Month <= 0 or $Month >= 13); $Day = $day if($Day <= 0 or $Day >= 32); return ($Year, $Month, $Day); } sub CheckDate { my ($this, $App, $Year, $Month, $Day) = @_; if($Year > 1900) { if(1 <= $Month and $Month <= 12) { my ($FirstDayOfMonday, $DaysInMonth) = $App->GetFirstWday($Year, $Month); if(1 <= $Day and $Day <= $DaysInMonth) { return 1; } } } return 0; } sub CorrectMonth { my ($this, $App, $Year, $Month) = @_; if($Month <= 0) { $Month = 12 + $Month; $Year--; } elsif($Month >= 13) { $Month = $Month - 12; $Year++; } return ($Year, $Month); } sub CorrectDate { my ($this, $App, $Year, $Month, $Day, $NonRecursive) = @_; #$App->print("Maaaaaaaaaaaaaaaaaaaaaaaaaa: $Year/$Month/$Day => "); if($this->CheckDate($App, $Year, $Month, $Day)) { #$App->print("-2: $Year/$Month/$Day\n"); return ($Year, $Month, $Day) } ($Year, $Month) = $this->CorrectMonth($App, $Year, $Month); if($this->CheckDate($App, $Year, $Month, $Day)) { #$App->print("-1: $Year/$Month/$Day\n"); return ($Year, $Month, $Day) } my ($FirstDayOfMonday, $DaysInMonth) = $App->GetFirstWday($Year, $Month); #$App->print("Maaaaaaaaaaaaaaaaaaaaaaaaaa: $Year/$Month/$Day => $DaysInMonth
\n"); if($Day <= 0) { ($Year, $Month) = $this->CorrectMonth($App, $Year, $Month - 1); my ($fwday, $days) = $App->GetFirstWday($Year, $Month); $Day = $days + $Day; if($this->CheckDate($App, $Year, $Month, $Day)) { #$App->print("1: $Year/$Month/$Day\n"); return ($Year, $Month, $Day); } } elsif($Day >= $DaysInMonth) { # ($Year, $Month) = $this->CorrectMonth($App, $Year, $Month + 1); my ($fwday, $days) = $App->GetFirstWday($Year, $Month); $Day = $Day - $days; ($Year, $Month) = $this->CorrectMonth($App, $Year, $Month + 1); if($this->CheckDate($App, $Year, $Month, $Day)) { #$App->print("2: $Year/$Month/$Day\n"); return ($Year, $Month, $Day); } } ($Year, $Month, $Day) = $this->CorrectDate($App, $Year, $Month, $Day, 0); # ($Year, $Month, $Day) = $this->CorrectDate($App, $Year, $Month, $Day, 1) if(!$NonRecursive); #$App->print("Final: $Year/$Month/$Day\n"); return ($Year, $Month, $Day); } sub GetToDoPageString { my ($this, $SApp, %arg) = @_; my $UseJavaScript = $arg{UseJavaScript}; my $LoadJavaScript = $arg{LoadJavaScript}; my $Year = $arg{Year}; my $Month = $arg{Month}; my $Day = $arg{Day}; my $DBConfig = $arg{DBConfig}; my $Apparatus = $arg{Apparatus}; my $EMail = $arg{EMail}; my $Password = $arg{Password}; my $ShowAll = $arg{ShowAll}; my $FontSize = $arg{FontSize}; my $ShowAll = $arg{ShowAll}; my $ViewMonthLink = $arg{ViewMonthLink}; my $ViewDayLink = $arg{ViewDayLink}; my $FromDate = $arg{FromDate}; my $ToDate = $arg{ToDate}; my $CharCode = $arg{CharCode}; my $s = ''; my ($DB, $DBConfigName, $DBMName, $DBServer, $DBUser, $DBPassword, $DBName, $UsersTableName, $ScheduleTableName, $MessageTableName) = $SApp->OpenDB($DBConfig); if(!defined $DB) { return "

Error in Schedule.pm: Can not open Schedule DB

"; } my $LogonUserPrivilege = $SApp->GetPrivilege($DB, $EMail); my $LogonLevel = $SApp->UserAuthorization($DB, $EMail, $Password, $Apparatus); if($LogonLevel <= 0) { $s .= "
Error in Schedule.pm: [$EMail:$LogonLevel] does not have right to show Schedule
\n"; return $s; } my %Holiday; for(my $m = $Month - 1 ; $m <= $Month + 1 ; $m++) { my ($y2, $m2, $d2) = $this->CorrectDate($SApp, $Year, $m, $Day, 1); $SApp->SearchSchedule($DB, $EMail, "(Year=$y2 and Month=$m2 and Apparatus='Holiday')", 'Holiday', $ShowAll); # $SApp->SearchSchedule($DB, $EMail, "Year=$Year and Month=$Month and Apparatus='Holiday' and (DeleteTime is null or DeleteTime='' or DeleteTime='NULL')", ""); my $nHit = $SApp->nHit(); #$s .= "Holiday: Start [$nHit]
\n"; while(1) { my %Hit = $SApp->GetNextHit(); last if(!defined $Hit{sn}); $Holiday{"$Hit{Year}/$Hit{Month}/$Hit{Day}"} = $Hit{Comment}; #$s .= "Holiday: $Hit{Year}/$Hit{Month}/$Hit{Day} $Hit{Apparatus}
\n"; } } $SApp->SearchSchedule($DB, $EMail, "(Year=$Year and Month=$Month)", $Apparatus, $ShowAll); my $SourceCharCode = ''; while(1) { my %Hit = $DB->GetNextHit(); last if(!defined $Hit{sn}); if($SourceCharCode eq '' or $SourceCharCode eq 'ascii') { $SourceCharCode = Jcode::getcode($Hit{Comment} . $Hit{Secret}); } else { last; } } $SourceCharCode = $CharCode if($SourceCharCode eq ''); my %ToDo; $SApp->SearchSchedule($DB, $EMail, "(Year=$Year and Month=$Month)", $Apparatus, $ShowAll); while(1) { my %Hit = $DB->GetNextHit(); last if(!defined $Hit{sn}); my $line = "$Hit{Year}/$Hit{Month}/$Hit{Day}: $Hit{Comment}
\n"; if($SourceCharCode ne '' and $SourceCharCode ne 'ascii') { Jcode::convert(\$line, $CharCode, $SourceCharCode); } $ToDo{"$Hit{Year}/$Hit{Month}/$Hit{Day}"} = "%s"; ##$Hit{Comment}; } $s .= "\n"; $s .= "\n"; $s .= " \n"; $s .= " \n"; $s .= "\n"; $s .= "
\n"; $s .= $this->GetMonthHTMLString($SApp, { Minimize => 0, ShowHeadingLine => 1, FontSize => $FontSize, Year => $Year, Month => $Month, Day => $Day, pHoliday => \%Holiday, pToDo => \%ToDo, MonthLink => "$ViewMonthLink&EMail=$EMail&Password=$Password&App=$Apparatus&DBConfigName=$DBConfigName", } ); if($UseJavaScript) { my $TodayString = Utils::BuildDateString(time(), undef, '{year}/{monthZero}/{dayZero}'); my $s1 = < EOT $s .= $s1 if($LoadJavaScript); $s1 = <
EOT $s .= $s1; } $s .= "
\n"; my %Today; #$SourceCharCode = ''; for(my $diff = $FromDate ; $diff <= $ToDate ; $diff++) { my ($year, $month, $day) = $this->CorrectDate($SApp, $Year, $Month, $Day + $diff); $SApp->SearchSchedule($DB, $EMail, "(Year=$year and Month=$month and Day=$day)", $Apparatus, $ShowAll); while(1) { my %Hit = $DB->GetNextHit(); last if(!defined $Hit{sn}); #if($SourceCharCode eq '' or $SourceCharCode eq 'ascii') { # my $s = $Hit{Comment} . $Hit{Secret}; # $SourceCharCode = Jcode::getcode($s); #} my $wd = Utils::getDayOfWeekString($Hit{Year}, $Hit{Month}, $Hit{Day}, 3, 'jp', $CharCode); #Jcode::convert(\$wd, $CharCode, $SourceCharCode); my $t = ''; if($Hit{Starttime} >= 0) { $t .= " " . $SApp->IntToTimeStr($Hit{Starttime}) . "-"; } if($Hit{Endtime} >= 0) { $t .= $SApp->IntToTimeStr($Hit{Endtime}); } $Hit{Comment} =~ s/[\r\n].*$//s; $Hit{Comment} = 'no message' if($Hit{Comment} eq ''); my $line = ''; if($SourceCharCode ne '' and $SourceCharCode ne 'ascii') { Jcode::convert(\$Hit{Comment}, $CharCode, $SourceCharCode); } if($EMail eq $Hit{EMail}) { $line = "$Hit{Year}/$Hit{Month}/$Hit{Day}($wd)$t: $Hit{Comment}
\n"; #Jcode::convert(\$line, $CharCode); } else { $line = "$Hit{Year}/$Hit{Month}/$Hit{Day}($wd)$t: $Hit{Comment}
\n"; #Jcode::convert(\$line, $CharCode); } $s .= $line; $ToDo{"$Hit{Year}/$Hit{Month}/$Hit{Day}"} = "%s"; } } $s .= "
\n"; return $s; } sub GetMonthHTMLString { my ($this, $App, $pParams) = @_; my $Year = $pParams->{Year}; my $Month = $pParams->{Month}; my $Day = $pParams->{Day}; my $pHoliday = $pParams->{pHoliday}; my $pToDo = $pParams->{pToDo}; my $fontsize = $pParams->{FontSize}; $fontsize = 2 if(!defined $fontsize); my $MonthLink = $pParams->{MonthLink}; my $pwdaystrs = $pParams->{pWeekDayText}; my @wday = ($pwdaystrs)? @$pwdaystrs : @WeekDayStrs; my ($bold0, $bold1) = ($pParams->{Minimize})? ("", "") : ("", ""); my $content = ''; ($Year, $Month, $Day) = $this->FillDate($Year, $Month, $Day); my $DateKey = "$Year/$Month/Day"; my $today = $Day; # my ($prev_year, $prev_month, $prev_day) = $this->CorrectDate($App, $Year, $Month-1, $Day); # my ($next_year, $next_month, $next_day) = $this->CorrectDate($App, $Year, $Month+1, $Day); my ($prev_year, $prev_month, $prev_day) = $this->CorrectDate($App, $Year, $Month-1, 1); my ($next_year, $next_month, $next_day) = $this->CorrectDate($App, $Year, $Month+1, 1); $content .= "\n"; if($pParams->{ShowHeadingLine}) { $content .= "\n"; my ($link0, $link1) = ('', ''); if($MonthLink ne '') { $link0 = ""; $link1 = ""; } if($pParams->{Minimize}) { $content .= " \n"; } elsif($prev_year != $Year) { $content .= " \n"; } else { $content .= " \n"; } if($MonthLink ne '') { $link0 = ""; $link1 = ""; } $content .= " \n"; if($MonthLink ne '') { $link0 = ""; $link1 = ""; } if($pParams->{Minimize}) { $content .= " \n"; } elsif($next_year != $Year) { $content .= " \n"; } else { $content .= " \n"; } $content .= "\n"; } $content .= " "; my ($FirstDayOfMonday, $DaysInMonth) = $App->GetFirstWday($Year, $Month); my($color, $bgcolor, $desc); my $d = 1; my $daym1 = 0; for (my $i = 0; ; $i++) { my $s = ''; last if ($i % 7 == 0 && $i > $DaysInMonth+7); $content .= "\n" if ($i % 7 == 0); my $day = $i - $FirstDayOfMonday; $daym1 = $day + 1; my $diffYear = $Year; my $diffMon = 0; my $diffDay = 0; if ($i < $FirstDayOfMonday) { # 先月 ($diffYear, $diffMon, $diffDay) = $this->CorrectDate($App, $diffYear, $diffMon-1, $diffDay); $diffMon = $Month - 1; my ($fwday2, $days2) = $App->GetFirstWday($diffYear, $diffMon); $diffDay = $days2 - ($FirstDayOfMonday-$i) + 1; } elsif ($i >= ($FirstDayOfMonday + $DaysInMonth)) { # 来月 last if ($i % 7 == 0); $diffMon = $Month + 1; if($diffMon > 12) { $diffYear = $Year + 1; $diffMon = 1; } my ($fwday2, $days2) = $App->GetFirstWday($diffYear, $diffMon); $diffDay = $i - ($FirstDayOfMonday+$DaysInMonth) + 1; } if($diffDay <= 0) { $diffYear = $Year; $diffMon = $Month; $diffDay = $daym1; } ($diffYear, $diffMon, $diffDay) = $this->CorrectDate($App, $diffYear, $diffMon, $diffDay); my $IsHoliday = 0; my $diffDateKey = "$diffYear/$diffMon/$diffDay"; if($pHoliday->{$diffDateKey} ne '') { $IsHoliday = 1; } #$s .= "IsHoliday=$IsHoliday
\n"; my $DateFormat = '%d'; if($pToDo->{$diffDateKey} ne '') { $DateFormat = $pToDo->{$diffDateKey}; } if($d == $today) { # 今日 $color = "#000000"; $bgcolor = "#FF9900"; $day = $d++; } elsif($IsHoliday) { # 祝日 $day = $d++; $color = "#FFFFFF"; $bgcolor = "#FF0000"; } elsif($i < $FirstDayOfMonday) { # 先月 $color = "#000000"; $bgcolor = "#C0C0C0"; $day = -1; } elsif($i >= ($FirstDayOfMonday + $DaysInMonth)) { # 来月 $color = "#000000"; $bgcolor = "#C0C0C0"; $day = -1; } elsif($i % 7 == 0) { # 日曜日 $color = "#000000"; $bgcolor ="#FFA6A6"; $day = $d++; } elsif($i % 7 == 6) { # 土曜日 $color = "#000000"; $bgcolor = "#A8A8FF"; $day = $d++; } else { # 平日 $color = "#000000"; $bgcolor = "#E0E0F0"; $day = $d++; } # if($IsHoliday) { # 祝日 # $color = "#FFFFFF"; # $bgcolor = "#FF0000"; # } $content .= "\n"; $content .= "\n" if ($i % 7 == 6); } $content .= "
" ."$link0<<$link1" ."$link0$prev_year/$prev_month$link1" ."$link0$prev_month$link1" ."$link0$bold0$Year/$Month$bold1$link1" ."$link0>>$link1" ."$link0$next_year/$next_month$link1" ."$link0$next_month$link1
$bold0$wday[0]$bold1 $bold0$wday[1]$bold1 $bold0$wday[2]$bold1 $bold0$wday[3]$bold1 $bold0$wday[4]$bold1 $bold0$wday[5]$bold1 $bold0$wday[6]$bold1
"; if($diffDay > 0) { $day = "$diffMon/$diffDay"; } else { $day = "--"; } my $daystr = sprintf($DateFormat, $diffDay); $content .= ""; $content .= "$daystr"; $content .= ""; $content .= "
\n"; return $content; } sub ShowMonth { my ($this, $App, $pParams) = @_; my $s = $this->GetMonthHTMLString($App, $pParams); $App->PrintRawHTML($s); return $s; my $Year = $pParams->{Year}; my $Month = $pParams->{Month}; my $Day = $pParams->{Day}; my $pHoliday = $pParams->{pHoliday}; my $pToDo = $pParams->{pToDo}; my $fontsize = $pParams->{FontSize}; $fontsize = 2 if(!defined $fontsize); my $MonthLink = $pParams->{MonthLink}; my $pwdaystrs = $pParams->{pWeekDayText}; my @wday = ($pwdaystrs)? @$pwdaystrs : @WeekDayStrs; my ($bold0, $bold1) = ($pParams->{Minimize})? ("", "") : ("", ""); $App->print(""); ($Year, $Month, $Day) = $this->FillDate($Year, $Month, $Day); my $DateKey = "$Year/$Month/Day"; my $today = $Day; my ($prev_year, $prev_month, $prev_day) = $this->CorrectDate($App, $Year, $Month-1, $Day); my ($next_year, $next_month, $next_day) = $this->CorrectDate($App, $Year, $Month+1, $Day); $App->PrintRawHTML("\n"); if($pParams->{ShowHeadingLine}) { $App->PrintRawHTML("\n"); my ($link0, $link1) = ('', ''); if($MonthLink ne '') { $link0 = ""; $link1 = ""; } else { ($link0, $link1) = ('', ''); } if($pParams->{Minimize}) { $App->PrintRawHTML(" \n"); } elsif($prev_year != $Year) { $App->PrintRawHTML(" \n"); } else { $App->PrintRawHTML(" \n"); } $App->PrintRawHTML(" \n"); if($pParams->{Minimize}) { $App->PrintRawHTML(" \n"); } elsif($next_year != $Year) { $App->PrintRawHTML(" \n"); } else { $App->PrintRawHTML(" \n"); } $App->PrintRawHTML("\n"); } print < EOT my ($FirstDayOfMonday, $DaysInMonth) = $App->GetFirstWday($Year, $Month); my($color, $bgcolor, $desc); my $d = 1; my $daym1 = 0; for (my $i = 0; ; $i++) { my $s = ''; last if ($i % 7 == 0 && $i > $DaysInMonth+7); $App->PrintRawHTML("\n") if ($i % 7 == 0); # $App->PrintRawHTML("\n") if ($i % 7 == 0); my $day = $i - $FirstDayOfMonday; $daym1 = $day + 1; my $diffYear = $Year; my $diffMon = 0; my $diffDay = 0; if ($i < $FirstDayOfMonday) { # 先月 ($diffYear, $diffMon, $diffDay) = $this->CorrectDate($App, $diffYear, $diffMon-1, $diffDay); $diffMon = $Month - 1; my ($fwday2, $days2) = $App->GetFirstWday($diffYear, $diffMon); $diffDay = $days2 - ($FirstDayOfMonday-$i) + 1; } elsif ($i >= ($FirstDayOfMonday + $DaysInMonth)) { # 来月 last if ($i % 7 == 0); $diffMon = $Month + 1; if($diffMon > 12) { $diffYear = $Year + 1; $diffMon = 1; } my ($fwday2, $days2) = $App->GetFirstWday($diffYear, $diffMon); $diffDay = $i - ($FirstDayOfMonday+$DaysInMonth) + 1; } if($diffDay <= 0) { $diffYear = $Year; $diffMon = $Month; $diffDay = $daym1; } ($diffYear, $diffMon, $diffDay) = $this->CorrectDate($App, $diffYear, $diffMon, $diffDay); my $IsHoliday = 0; my $diffDateKey = "$diffYear/$diffMon/$diffDay"; if($pHoliday->{$diffDateKey} ne '') { $IsHoliday = 1; } my $DateFormat = '%d'; if($pToDo->{$diffDateKey} ne '') { $DateFormat = $pToDo->{$diffDateKey}; } #$App->print("d: $diffYear/$diffMon/$diffDay [$IsHoliday]
\n"); if($i < $FirstDayOfMonday) { # 先月 $color = "#000000"; $bgcolor = "#C0C0C0"; $day = -1; } elsif($i >= ($FirstDayOfMonday + $DaysInMonth)) { # 来月 $color = "#000000"; $bgcolor = "#C0C0C0"; $day = -1; } elsif($d == $today) { # 今日 $color = "#000000"; $bgcolor = "#FF9900"; $day = $d++; } elsif($IsHoliday) { # 祝日 $day = $d++; $color = "#FFFFFF"; $bgcolor = "#FF0000"; } elsif($i % 7 == 0) { # 日曜日 $color = "#000000"; $bgcolor ="#FFA6A6"; $day = $d++; } elsif($i % 7 == 6) { # 土曜日 $color = "#000000"; $bgcolor = "#A8A8FF"; $day = $d++; } else { # 平日 $color = "#000000"; $bgcolor = "#E0E0F0"; $day = $d++; } # if($IsHoliday) { # 祝日 # $color = "#FFFFFF"; # $bgcolor = "#FF0000"; # } $App->PrintRawHTML("\n"); $App->PrintRawHTML("\n") if ($i % 7 == 6); } $App->PrintRawHTML("
" ."$link0<<$link1" ."$link0$prev_year/$prev_month$link1" ."$link0$prev_month$link1" ."$bold0$Year/$Month$bold1" .">>" ."$next_year/$next_month" ."$next_month
$bold0$wday[0]$bold1 $bold0$wday[1]$bold1 $bold0$wday[2]$bold1 $bold0$wday[3]$bold1 $bold0$wday[4]$bold1 $bold0$wday[5]$bold1 $bold0$wday[6]$bold1
"); # $App->PrintRawHTML("\n"); if($diffDay > 0) { $day = "$diffMon/$diffDay"; } else { $day = "--"; } my $daystr = sprintf($DateFormat, $diffDay); $App->PrintRawHTML(""); $App->PrintRawHTML("$daystr"); $App->PrintRawHTML(""); $App->PrintRawHTML("
\n"); } 1;