#!/usr/bin/perl ############################################### # cal.cgi # V1.0 (2008.1.15) # Copyright(C) CGI-design ############################################### $script = 'cal.cgi'; $base = './caldata'; #データ格納ディレクトリ $opfile = "$base/option.txt"; @week = ('日','月','火','水','木','金','土'); @mdays = (31,28,31,30,31,30,31,31,30,31,30,31); open (IN,"$opfile") || &error("OPEN ERROR"); $opdata = ; close IN; if (!$opdata) { $pass = &crypt('cgi'); chmod(0666,$opfile); open(OUT,">$opfile") || &error("OPEN ERROR"); print OUT "$pass<>#ffffff,#6f6b64,#D6D6D6,#f0f8ff,#ffffdd,#F0C4C4,#ff0000,#0000ff,#6f6b64"; close OUT; } ### メイン処理 ### if ($ENV{'REQUEST_METHOD'} eq "POST") {read(STDIN, $in, $ENV{'CONTENT_LENGTH'});} else {$in = $ENV{'QUERY_STRING'};} %in = (); foreach (split(/&/,$in)) { ($n,$val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $val =~ s/&/&/g; $val =~ s//>/g; $val =~ s/"/"/g; $val =~ s/\r\n|\r|\n/
/g; if (defined($in{$n})) {$in{$n} .= "\0$val";} else {$in{$n} = $val;} } $mode = $in{'mode'}; open (IN,"$opfile") || &error("OPEN ERROR"); ($pass,$colors) = split(/<>/,); close IN; ($bg_color,$text_color,$frame_color,$week_color,$on_color,$off_color,$sun_color,$sat_color,$day_color) = split(/,/,$colors); @wcolor = ($sun_color,$day_color,$day_color,$day_color,$day_color,$day_color,$sat_color); ($sec,$min,$hour,$nowday,$nowmon,$nowyear) = localtime; $nowyear += 1900; $nowmon++; $logyear = $in{'year'}; $logmon = $in{'mon'}; if (!$logyear) {$logyear = $nowyear; $logmon = $nowmon;} $logfile = "$base/$logyear$logmon.txt"; $mdays = $mdays[$logmon - 1]; if ($logmon == 2 && $logyear % 4 == 0) {$mdays = 29;} if ($mode eq 'admin') {&admin;} else {&main;} print "\n"; exit; ### sub header { print "Content-type: text/html\n\n"; print "\n"; print "Calendar\n"; $head = 1; } ### sub main { &header; print "
\n"; $mon = $logmon - 1; if ($mon < 1) {$mon = 12; $year = $logyear - 1;} else {$year = $logyear;} print "\n"; print "\n"; $mon = $logmon + 1; if (12 < $mon) {$mon = 1; $year = $logyear + 1;} else {$year = $logyear;} print "
前月$logyear年$logmon月次月
\n"; &dsp; print "




\n"; print "\n"; print "ネットショップ構\築CGIパーツ\n"; } ### sub dsp { &log_read; print "\n"; print "\n"; for (0 .. 6) {print "\n";} print "\n"; &holi_set; &get_date($logyear,$logmon,1); $w = $n = 0; $k = 1; for (0 .. 41) { if (!$w) {print "";} if ($wday <= $_ && $k <= $mdays) { if ($w == 1) {$n++;} $wcolor = $wcolor[$w]; $holiday = ''; if (2007 <= $logyear) { &get_holiday($logmon,$k,$w); if ($holiday) {$wcolor = $wcolor[0];} } if ($off[$k] || ($off[$k] eq '' && (!$w || $w == 6 || $holiday))) {$color = $off_color; $chk = ' checked';} else {$color = $on_color; $chk = '';} print "\n"; $w++; if ($w == 7) { print "\n"; if ($mdays < $k) {last;} $w = 0; } } print "
$week[$_]
$k"; if ($mode eq 'admin') {print "
";} $k++; } else {print "
";} print "
\n"; print "\n"; print "
  営業  休業
\n"; } ### sub log_read { @off = (); if (!-e $logfile) {return;} open (IN,"$logfile") || &error("OPEN ERROR"); while () { ($day,$off) = split(/<>/); $off[$day] = $off; } close IN; } ### sub holi_set { $def = 0.242194*($logyear-1980)-int(($logyear-1980)/4); $spr = int(20.8431+$def); $aut = int(23.2488+$def); %hod = ('0101','元日','0211','建国記念の日',"03$spr",'春分の日','0429','昭和の日','0503','憲法記念日','0504','みどりの日','0505','こどもの日',"09$aut",'秋分の日','1103','文化の日','1123','勤労感謝の日','1223','天皇誕生日'); %how = ('12','成人の日','73','海の日','93','敬老の日','102','体育の日'); } ### sub get_holiday { $sm = sprintf("%02d%02d",$_[0],$_[1]); $holiday = $hod{$sm}; if ($holiday && !$_[2]) {$hflag = 1;} if (!$holiday && $_[2] == 1) {$holiday = $how{"$_[0]$n"};} if (!$holiday && $hflag) {$holiday = '振替休日'; $hflag = 0;} if (($logyear eq '2009' || $logyear eq '2015') && $sm eq '0922') {$holiday = '休日';} } ### sub get_date { ($y,$m,$d) = @_; if ($m < 3) {$y--; $m+=12;} $wday = ($y+int($y/4)-int($y/100)+int($y/400)+int((13*$m+8)/5)+$d)%7; } ### sub admin { &header; print "
\n"; $inpass = $in{'pass'}; if ($inpass eq '') { print "



パスワードを入力して下さい

\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; exit; } $mat = &decrypt($inpass,$pass); if (!$mat) {&error("パスワードが違います");} print "\n"; print "
 ログアウト
\n"; print "\n"; print "\n"; print "\n"; print "

\n"; $wrt = $in{'wrt'}; if ($in{'set'}) {&setup;} else {&edt;} } ### sub edt { if ($wrt) { open (OUT,">$logfile") || &error("OPEN ERROR"); for (1 .. $mdays) { if ($in{"off$_"}) {$off = 1;} else {$off = 0;} print OUT "$_<>$off<>\n"; } close OUT; chmod(0666,$logfile); } print "休業日にチェックを入れ、「設定する」を押して下さい。

\n"; $mon = $logmon - 1; if ($mon < 1) {$mon = 12; $year = $logyear - 1;} else {$year = $logyear;} print "\n"; print "\n"; $mon = $logmon + 1; if (12 < $mon) {$mon = 1; $year = $logyear + 1;} else {$year = $logyear;} print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "$logyear年$logmon月
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; &dsp; print "
\n"; print "
\n"; } ### sub setup { if ($wrt) { if ($in{'newpass'} ne '') {$pass = &crypt($in{'newpass'});} $colors = $in{'colors'}; $colors =~ s/\0/,/g; open (OUT,">$opfile") || &error("OPEN ERROR"); print OUT "$pass<>$colors"; close OUT; } print "下記に入力後、「設定する」を押して下さい。

\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "

\n"; print "
\n"; print "\n"; @name = ('基本背景色','基本文字色','枠色','曜日背景色','営業日背景色','休業日背景色','日曜日、祝日','土曜日','平日'); @colors = split(/,/,$colors); for (0 .. $#name) { print "\n"; } print "\n"; print "
カラーコード
$name[$_]\n"; print "\n"; print "
パスワード変更 (英数8文字以内)
\n"; } ### sub crypt { @salt = ('a' .. 'z','A' .. 'Z','0' .. '9'); srand; $salt = "$salt[int(rand($#salt))]$salt[int(rand($#salt))]"; return crypt($_[0],$salt); } ### sub decrypt { $salt = $_[1] =~ /^\$1\$(.*)\$/ && $1 || substr($_[1],0,2); if (crypt($_[0],$salt) eq $_[1] || crypt($_[0],'$1$' . $salt) eq $_[1]) {return 1;} return 0; } ### sub error { if (!$head) {&header; print "
\n";} print "



ERROR !!

$_[0]\n"; print "
\n"; exit; }