#!/usr/bin/perl
=pod
=head1 NAME
register.cgi - a universal script for club regiter
=head1 SYNOPSIS
register.cgi?[I<options>]
=head1 DESCRIPTION
The script draws the hierarchy in the form suitable for WWW
=head1 AUTHOR
Boris Veytsman
=head1 DATE
$Date: 2011/05/09 02:22:01 $
=head1 REVISION
$Revision: 1.20 $
=cut
###################################################
# Starting up
###################################################
use strict;
use vars qw(%ENV);
use CGI qw(:standard);
use DBI;
use POSIX qw(locale_h);
use locale;
my $thislocale;
if ($^O =~ /win/i) {
$thislocale = "Russian_Russia.20866";
} else {
$thislocale = "ru_RU.KOI8-R";
}
POSIX::setlocale( &POSIX::LC_ALL, $thislocale );
$ENV{'LANG'}='ru_RU.KOI8-R';
my ($SENDMAIL) = "mail";
my $TO = 'borisv@lk.net';
my $FROM = 'borisv@lk.net';
my $date='$Date: 2011/05/09 02:22:01 $';
$date =~ s/[^ ]* ([^ ]*) .*/$1/;
my $dbh = DBI->connect("DBI:mysql:register", "piataev", "")
or do {
print h1("Временные проблемы") . "База данных временно не
работает. Заходите попозже.";
print &Include_virtual("../../dimrub/db/reklama.html");
print end_html;
die "Can't connect to DB chgk\n";
};
$dbh->do("set names koi8r");
print header(-charset=>'koi8-r');
##################################################
# Printing top
##################################################
print start_html(-"title"=>'Register of Clubs',
-author=>'borisv@lk.net',
-background=>"../../images/map.jpg");
print &Include_virtual("../../dimrub/db/reklama.html");
print <<END;
<table>
<tr>
<td background=../../images/compass.gif valign=top>
END
################################################
# NAVIGATION PANEL
################################################
my $self=url();
###############################################
# The navigation panel has three special lines
###############################################
print <<END;
<ul>
<li><a href="$self">Home</a></li>
<li><a href="$self?rid=1&level=1000&clubs=0">Все регионы</a></li>
<li><a href="$self?rid=1&level=1000&clubs=1">Все клубы</a></li>
<li><a href="$self?addclub=1">Добавить клуб</a></li>
<li><a href="$self?whoiswho=1">Кто есть кто</a></li>
END
#################################################
# And the navpanel itself
##################################################
print ListRegions(dbh=>$dbh,rid=>1,level=>1,tag=>'li',
self=>$self);
print <<END;
</ul>
END
print <<END;
</td>
<td width=100% valign=top>
END
######################################################
# MAIN PANEL
######################################################
#
# First, we introduce ourselves
#
print <<END;
<h1 align=center>
Журнал "Игра"<br>
и<br>
<a href="http://internet.chgk.info"><img
ismap border=0 src= "../../images/logo.gif"
alt="Интернет Клуб Что? Где? Когда?" width=319 height=27></a>
<br>ПРЕДСТАВЛЯЮТ<br>
Регистр Клубов Интеллектуальных Игр
</h1>
END
#
# Now check the parameters...
#
if (param('rid')) {
my $rid = param('rid');
$rid =~ s/(\d*)/$1/;
print ListRegions(dbh=>$dbh,rid=>$rid,
level=>param('level'),
clubs=>param('clubs'),
tag=>'h2',
self=>$self);
} elsif (param('cid')) {
my $cid = param('cid');
$cid =~ s/(\d*)/$1/;
print ClubInfo(dbh=>$dbh,cid=>$cid,
self=>$self);
} elsif (param('pid')) {
my $pid = param('pid');
$pid =~ s/(\d*)/$1/;
print ListPerson(dbh=>$dbh,pid=>$pid,
self=>$self,
positions=>1,
displayperson=>1);
} elsif (param('whoiswho')) {
print PrintWhoIsWho(dbh=>$dbh,
self=>$self);
} elsif (param('addclub')) {
print AddClub();
} elsif (param('Submit')) {
print SendLetter();
} else {
print <<END;
<dl>
<dt><a href="$self?rid=1&level=1000&clubs=0">Все регионы</a></dt>
<dt><a href="$self?rid=1&level=1000&clubs=1">Все клубы</a></dt>
<dt><a href="$self?addclub=1">Добавить клуб или изменить сведения
о клубе</a></dt>
<dt><a href="$self?whoiswho=1">Кто есть кто</a></dt>
</dl>
<p align=center>
END
print &Include_virtual("../../boris/register/regions.html");
print <<END;
</p>
END
}
####################################################################
# And the bottom of the page
###################################################################
my $sth=$dbh->prepare("select count(*) from Clubs");
$sth->execute;
my ($count) = $sth->fetchrow_array;
$sth->finish;
print "<p align=center>";
print "Всего клубов: $count</p>\n";
print <<END;
<hr>
<address>
<img width = 60 height = 80 src="../../images/owl.gif" alt = "owl">
<a href="http://users.lk.net/~borisv">
Boris Veytsman</a>
</address>
</body>
</html>
END
print <<END;
</td>
</tr>
</table>
END
print end_html;
exit 0;
###################################################
# Parsing included file
##################################################
sub Include_virtual {
my ($fn, $output) = (@_, '');
open F , $fn
or return; #die "Can't open the file $fn: $!\n";
while (<F>) {
if (/<!--#include/o) {
s/<!--#include virtual="\/(.*)" -->/&Include_virtual($1)/e;
}
if (/<!--#exec/o) {
s/<!--#exec.*cmd\s*=\s*"([^"]*)".*-->/`$1`/e;
}
$output .= $_;
}
return $output;
}
#############################################################
# Listing the given region and optionally its children
#############################################################
sub ListRegions {
my %args = @_;
my $sth = $args{'dbh'}->prepare("
SELECT Name FROM Regions WHERE RID=$args{'rid'}");
$sth->execute;
if (!$sth->rows) {
return "";
}
my ($name)=$sth->fetchrow_array;
$name="<a href=\"$self?rid=$args{'rid'}&level=100&clubs=1\">$name</a>";
my $result="<$args{'tag'}>$name</$args{'tag'}>\n";
if ($args{'level'}>0) { # Print children
# Frist, we print clubs
if ($args{'clubs'}) {
$result .= ListRegionURLs(%args);
$result .= ListClubs(%args);
}
$sth=$args{'dbh'}->prepare("
SELECT Child FROM RegionRegion WHERE Parent=$args{'rid'}");
$sth->execute;
if ($sth->rows) {
my @kids=();
while (my ($kid)=$sth->fetchrow_array) {
push @kids,"rid=$kid";
}
my $clause = join(' OR ', @kids);
$result .= "<ul>\n";
$sth=$args{'dbh'}->prepare("
SELECT rid FROM Regions WHERE $clause ORDER BY Name");
$sth->execute;
while (my ($kid)=$sth->fetchrow_array) {
$result .= ListRegions(
%args,'rid'=>$kid,
'level'=>$args{'level'}-1,
'tag'=>'li');
}
$result .= "</ul>\n";
}
}
return $result;
}
############################################################
# List the URLs of a given region
###########################################################
sub ListRegionURLs {
my %args = @_;
my $sth;
$sth = $args{'dbh'}->prepare("
SELECT URL FROM Regions WHERE rid=$args{'rid'} and NOT ISNULL(URL)");
$sth->execute;
if (!$sth->rows) {
return "";
}
my $result;
$result=<<END;
<dl><dt>Странички:</dt>
<dd><dl>\n
END
while (my ($string)=$sth->fetchrow_array) {
$string=htmlize($string);
$result .= p($string);
}
$result .= "</dl></dd></dl>\n";
return $result;
}
############################################################
# List the clubs of a given region or a given association
###########################################################
sub ListClubs {
my %args = @_;
my $sth;
if ($args{'cid'}) {
$sth = $args{'dbh'}->prepare("
SELECT Child, Status FROM ClubClub WHERE Parent=$args{'cid'}");
} else {
$sth = $args{'dbh'}->prepare("
SELECT cid FROM ClubRegion WHERE rid=$args{'rid'}");
}
$sth->execute;
if (!$sth->rows) {
return "";
}
my $result;
if ($args{'cid'}) {
$result=<<END;
<h3>Клубы:</h3>
<ul>\n
END
} else {
$result=<<END;
<ul>\n
END
}
my @clubs=();
my %stat=();
while (my ($club,$status)=$sth->fetchrow_array) {
push @clubs,"cid=$club";
if ($status) {
$stat{$club}=$status;
}
}
my $clause = join(' OR ', @clubs);
$sth=$args{'dbh'}->prepare("
SELECT cid, Name FROM Clubs WHERE $clause ORDER BY Name");
$sth->execute;
while (my ($cid,$Name)=$sth->fetchrow_array) {
my $res="<a href=\"$self?cid=$cid\">$Name</a>\n";
if (exists $stat{$cid}) {
$res .= " ($stat{$cid})\n";
}
$result .= li($res);
}
$result .= "</ul>\n";
}
############################################################
# List the association a given club belongs to
###########################################################
sub ListParents {
my %args = @_;
my $sth;
$sth = $args{'dbh'}->prepare("
SELECT Parent, Status FROM ClubClub WHERE Child=$args{'cid'}");
$sth->execute;
if (!$sth->rows) {
return "";
}
my $result;
$result=<<END;
<h3>Коллективный член ассоциаций:</h3>
<dl>\n
END
my @clubs=();
my %stat=();
while (my ($club,$status)=$sth->fetchrow_array) {
push @clubs,"cid=$club";
if ($status) {
$stat{$club}=$status;
}
}
my $clause = join(' OR ', @clubs);
$sth=$args{'dbh'}->prepare("
SELECT cid, Name FROM Clubs WHERE $clause ORDER BY Name");
$sth->execute;
while (my ($cid,$Name)=$sth->fetchrow_array) {
my $res = "<a href=\"$self?cid=$cid\">$Name</a>\n";
if (exists $stat{$cid}) {
$res .= " ($stat{$cid})\n";
}
$result .= dt($res);
}
$result .= "</dl></dd></dl>\n";
}
#############################################################
# The longest subroutine in the list...
#############################################################
sub ClubInfo {
my %args = @_;
my $sth = $args{'dbh'}->prepare("
SELECT * FROM Clubs WHERE cid=$args{'cid'}");
$sth->execute;
if (!$sth->rows) {
return "";
}
my $result="";
my $club=$sth->fetchrow_hashref;
$result .= h2($club->{'Name'});
if (my $string=$club->{'Address'}) {
$string =~ s/\n/<br>\n/g;
$result .= h3('Адрес')."\n".p($string);
}
if (my $string=$club->{'URL'}) {
$string = htmlize($string);
$result .= h3('Домашняя страничка')."\n".p($string);
}
if (my $string=$club->{'Phone'}) {
$result .= h3('Телефон')."\n".p($string);
}
if (my $string=$club->{'Fax'}) {
$result .= h3('Факс')."\n".p($string);
}
if (my $string=$club->{'Email'}) {
$string = htmlize($string,'mailto:');
$result .= h3('E-mail')."\n".p($string);
}
$result .= ListPeople(%args);
$result .= ListParents(%args);
$result .= ListClubs(%args);
if (my $string=$club->{'DoB'}) {
$result .= h3('История создания клуба')."\n".p($string);
}
if (my $string=$club->{'Sponsor'}) {
$result .= h3('Спонсор')."\n".p($string);
}
if (my $string=$club->{'Meetings'}) {
$result .= h3('Форма деятельности клуба')."\n".p($string);
}
if (my $string=$club->{'AdultTeams'}) {
$result .= h3('Взрослые команды')."\n".p($string);
}
if (my $string=$club->{'KidTeams'}) {
$result .= h3('Детские команды')."\n".p($string);
}
if (my $string=$club->{'ForeignFests'}) {
$result .= h3('Иногородние фестивали, традиционно посещаемые командами клуба')."\n".p($string);
}
if (my $string=$club->{'Braglist'}) {
$result .= h3('Высшие достижения команд клуба')."\n".p($string);
}
if (my $string=$club->{'OwnFests'}) {
$result .= h3('Фестивали, организуемые клубом')."\n".p($string);
}
return $result;
}
##############################################################
# Adding a href=... The second optional argument may be
# 'mailto:'
##############################################################
sub htmlize {
my($string,$proto)=@_;
$string =~ s/^\s+//;
$string =~ s/\s+$//;
my @entities = split /\s+/, $string;
my @hrefs=map {"<a href=\"$proto$_\">$_</a>"} @entities;
return join(", ",@hrefs);
}
##############################################################
# List the bosses....
##############################################################
sub ListPeople {
my %args = @_;
my $sth = $args{'dbh'}->prepare("
SELECT a.pid,a.Position FROM ClubPeople=a,People=b WHERE a.cid=$args{'cid'} and a.pid=b.pid ORDER BY a.Weight Desc, b.Name");
$sth->execute;
if (!$sth->rows) {
return "";
}
my $result=h3('Руководство');
while (my($pid,$Position)=$sth->fetchrow_array) {
$result .= h4($Position);
$result .= ListPerson(%args,pid=>$pid);
}
return $result;
}
##############################################################
# Listing one person
#############################################################
sub ListPerson {
my %args=@_;
my $sth = $args{'dbh'}->prepare("
SELECT * FROM People WHERE pid=$args{'pid'}");
$sth->execute;
if (!$sth->rows) {
return "";
}
my $result="";
my @entries=();
my $person=$sth->fetchrow_hashref;
if (my $string = $person->{'Name'}) {
if ($args{'displayperson'}) {
$result=h2($string);
} else {
push @entries,
"<a href=\"$args{'self'}?pid=$args{'pid'}\">$string</a>";
}
}
if (my $string=$person->{'Address'}) {
push @entries, "Адрес: $string";
}
if (my $string=$person->{'URL'}) {
$string = htmlize($string);
push @entries, "Домашняя страничка: $string";
}
if (my $string=$person->{'Phone'}) {
push @entries, "Телефон: $string";
}
if (my $string=$person->{'Fax'}) {
push @entries, "Факс: $string";
}
if (my $string=$person->{'Email'}) {
$string = htmlize($string,'mailto:');
push @entries, "E-mail: $string";
}
$result.=p(join('; ',@entries).".");
if ($args{'positions'}) {
my $sth=$dbh->prepare("SELECT cid,Position FROM ClubPeople
WHERE pid=$args{'pid'} ORDER by Weight");
$sth->execute;
$result .= "<dl>\n";
while (my ($cid,$Position)=$sth->fetchrow_array) {
my $sth1=$dbh->prepare("Select Name from Clubs where
cid=$cid");
$sth1->execute;
my ($Name)=$sth1->fetchrow_array;
$sth1->finish;
$result .= "<dd><strong>$Position,</strong> ";
$result .= "<a href=\"$args{self}?cid=$cid\">$Name</a></dd>\n";
}
$sth->finish;
$result .= "</dl>\n";
}
return $result;
}
#########################################################
# Adding club
#########################################################
sub AddClub {
my $result=h2("Добавить клуб или изменить информацию о клубе");
$result .= start_form;
$result .= h3("Контактная информация");
$result .= p("Адрес, телефон, email и т.д. ниже -- НЕ адреса руководства
клуба (их Вы введёте ниже),
а официальные адреса самого клуба. Если отдельного адреса,
телефона, и т.д. у клуба нет, просто оставьте
поля пустыми");
$result .= table(Tr(td(["Название клуба",
textfield(-name=>'Name',
-size=>60)])),
Tr(td(["Официальный адрес клуба",
textarea(-name=>'Address',
-rows=>5,
-columns=>60)])),
Tr(td(["Страничка клуба",
textfield(-name=>'URL',
-size=>60)])),
Tr(td(["Телефон клуба",
textfield(-name=>'Phone',
-size=>60)])),
Tr(td(["Факс клуба",
textfield(-name=>'Fax',
-size=>60)])),
Tr(td(["E-mail клуба",
textfield(-name=>'Email',
-size=>60)])),
);
$result .= h3("Руководство клуба");
$result .= p("Адреса и телефоны ниже будут опубликованы. Если Вы не хотите
афишировать чьи-то адреса и телефоны, просто оставьте соответствующие поля
пустыми");
$result .= "<ol>\n";
for(my $i=1;$i<=5;$i++) {
$result .=li;
$result .= table(
Tr(td(["Должность",
textfield(-name=>"Position$i",
-size=>50)])),
Tr(td(["ФИО",
textfield(-name=>"Name$i",
-size=>50)])),
Tr(td(["Адрес",
textarea(-name=>"Address$i",
-columns=>50,
-rows=>5)])),
Tr(td(["Телефон",
textfield(-name=>"Phone$i",
-size=>50)])),
Tr(td(["Факс",
textfield(-name=>"Fax$i",
-size=>50)])),
Tr(td(["Email",
textfield(-name=>"Email$i",
-size=>50)])),
Tr(td(["Домашняя страничка",
textfield(-name=>"URL$i",
-size=>50)])),
);
}
$result .= "</ol>\n";
$result .= h3("Ассоциации и объединения");
$result .= table(
Tr(td(["Ассоциации, членом котрых является клуб",
textarea(-name=>'Parents',
-rows=>5,
-columns=>60)])),
Tr(td(["Для ассоциаций: коллективные члены ассоциации",
textarea(-name=>'Members',
-rows=>5,
-columns=>60)])),
);
$result .= h3("Жизнь клуба");
$result .= table(
Tr(td(["История создания клуба",
textarea(-name=>'DoB',
-rows=>5,
-columns=>60)])),
Tr(td(["Основной спонсор клуба",
textarea(-name=>'Sponsor',
-rows=>5,
-columns=>60)])),
Tr(td(["Основные формы деятельности клуба",
textarea(-name=>'Meetings',
-rows=>5,
-columns=>60)])),
Tr(td(["Взрослые команды",
textarea(-name=>'AdultTeams',
-rows=>5,
-columns=>60)])),
Tr(td(["Детские команды",
textarea(-name=>'KidTeams',
-rows=>5,
-columns=>60)])),
Tr(td(["Иногородние фестивали, на которые ездят команды клуба",
textarea(-name=>'ForeignFests',
-rows=>5,
-columns=>60)])),
Tr(td(["Высшие достижения команд клуба",
textarea(-name=>'Braglist',
-rows=>5,
-columns=>60)])),
Tr(td(["Фестивали, которые организовывает клуб",
textarea(-name=>'OwnFests',
-rows=>5,
-columns=>60)])),
);
$result .= h3("География клуба (для будущей карты)");
$result .= table(
Tr(td(["Долгота",
textfield(-name=>"Longitude",
-size=> 60)])),
Tr(td(["Широта",
textfield(-name=>"Latitude",
-size=> 60)])),
);
# $result .= h3("Дополнительные вопросы");
# $result .= table(
# Tr(td(["Что вам больше всего нравится в журнале 'Игра'?",
# textarea(-name=>'IgraA',
# -rows=>5,
# -columns=>60)])),
# Tr(td(["Что вам больше всего не нравится в журнале 'Игра'?",
# textarea(-name=>'IgraB',
# -rows=>5,
# -columns=>60)])),
# Tr(td(["Что бы вы хотели увидеть в журнале 'Игра' - то
# чего нет в настоящее время?",
# textarea(-name=>'IgraC',
# -rows=>5,
# -columns=>60)])),
# );
$result .= h3("Кто регистрировал");
$result .= table(
Tr(td(["Имя",
textfield(-name=>'RegistrarName',
-size=>60)])),
Tr(td(["Email",
textfield(-name=>'RegistrarEmail',
-size=>60)])),
);
$result .= p("Нажав кнопку 'Submit', Вы отправите Вашу регистрационную
карточку службе поддержки регистра. Пожалуйста, подождите несколько дней, пока
Ваша информация будет обработана и попадёт в регистр");
$result .= submit(-name=>'Submit');
$result .= end_form;
return $result;
}
###################################################################
# Sending the letter with results
#####################################################################
sub SendLetter {
open(MAIL,"| $SENDMAIL -s 'Registracionnaya kartochka kluba' $TO");
print MAIL <<END;
MIME-Version: 1.0
Content-type: text/plain; charset=koi8-r
END
foreach my $key (param) {
my $value = param($key);
if ($value =~ /^\s*$/) {
next;
}
$value =~ s/'/\\'/g;
print MAIL "$key=\'$value\'\n\n";
}
close MAIL;
return p("Спасибо за регистрацию. Ваши данные приняты и после ".
"обработки будут внесены в базу данных");
}
###############################################################
# Printing Who is Who list
###############################################################
sub PrintWhoIsWho {
my %args =@_;
my $result = h2("Кто есть кто");
$result .= "\n<dl>\n";
my $sth = $dbh->prepare("SELECT pid,Name FROM People ORDER BY Name");
$sth->execute;
while (my($pid,$Name)=$sth->fetchrow_array) {
$result .= dd("<a href=\"$args{'self'}?pid=$pid\">$Name</a>");
$result .= "\n";
}
$sth->finish;
$result .= "</dl>\n";
return $result;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>