#!/usr/bin/perl use CGI qw(:standard); use locale; use POSIX qw (locale_h); setlocale(LC_CTYPE, 'ru_RU.KOI8-R'); &GetDate; print "Pragma: no-cache\n"; print "Expires: $expString GMT\n"; print "Last-Modified: $dateString GMT\n"; print "Content-type: text/html\n\n"; $server_adress=$ENV{'HTTP_HOST'}; $pos=param("pos"); $search=param("search"); if ($search eq ""){ $status=param("status"); if ($status eq ""){ &ViewAll; } if ($status eq "add"){ &ViewAddForm; } if ($status eq "post"){ &AddItem; } }else{ &ViewSearch; } &PrintFooter; sub ViewAll{ &PrintHeader; $i=-1; open DATA, "../data/agencies.txt"; while (){ $i+=1; if ($i eq $pos+10){ goto L2; } else{ if ($i>=$pos){ ($login,$pwd,$caption,$body,$contact,$http,$mail,$date)=split(chr(9)); if ($http ne ""){ $http="
http://$http"; } if ($mail ne ""){ $mail="
E-mail:$mail"; } print "
",$i+1,".

$caption

$body
Контакт:$contact$http$mail

"; } } } L2: close DATA; $total=$i+1; &GetBaseNavBar; } sub ViewSearch{ &SearchPrepare; $title=" - Результаты поиска: $search"; &PrintHeader; $i=-1; open DATA, "../data/agencies.txt"; while (){ $wordcount=0; foreach $search_word (@words){ $sresult=0; if (length($search_word)>2){ $_=&CheckField($_); if ($saresult ne $sresult){ $wordcount+=1; } $saresult=$sresult; } } if ($sresult>0){ if ($_=~/^1\t/){ $sresult+=50; } $i+=1; ($login,$pwd,$caption,$body,$contact,$http,$mail,$date)=split(chr(9)); if ($http ne ""){ $http="
http://$http"; } if ($mail ne ""){ $mail="
E-mail:$mail"; } $ViewData[$i]=join("",$wordcount*100+$sresult,"\t
",$i+1,".

$caption

$body
Контакт:$contact$http$mail

"); } } close DATA; $total=$i+1; @ViewData=sort {$b <=> $a} @ViewData; print "

Найдено документов: $total

"; for($i=$pos;$i<$pos+10;$i++){ ($find,$text)=split(/\t/,$ViewData[$i]); print $text; } &GetSearchBar; } sub PrintHeader{ open DATA, "../data/c_agencies.txt"; @header=; close DATA; $total=int("@header"); $header=""; open DATA, "header.inc"; @header=; close DATA; $header="@header"; $header=~s/MAINTITLE/МОДЕЛЬНЫЕ АГЕНТСТВА$title/; $header=~s/SEARCHTEXT/$search/; &Board; print <<__END__; MODELS ACTIVE LOOK - Модельные агентства$title
$header
Объявление
$board
добавить объявление
__END__ } sub GetBaseNavBar{ $navlength=10; $navpage=10; $pages=int($total/$navpage); if ($pages ne $total/$navpage){ $pages+=1; } $nav_index=int($pos/($navpage*$navlength)); $nav_page=$pos/$navpage; $start_index=$nav_index*$navlength; $final_index=$start_index+$navlength; if ($final_index>=$pages){ $final_index=$pages; $start_index=$final_index-$navlength; if ($start_index<0){ $start_index=0; } }else{ $next_nav=join(""," ...\n"); } if ($start_index>0){ $prev_nav=join(""," ...\n"); } for($i=$start_index;$i<$final_index;$i++){ if ($nav_page ne $i){$navbar=join("",$navbar," ",$i+1,"\n");} else{$navbar=join("",$navbar," [",$i+1,"]\n");} } if ($pages>1){ $PrevPage=$pos-$navpage; $NextPage=$pos+$navpage; if ($PrevPage>-1){$prev_line=" назад\n";} if ($total>$pos+$navpage){$next_line=" вперед\n";} $navbar=join("",$prev_line,$prev_nav,$navbar,$next_nav,$next_line); } else{ $navbar="назад"; } } sub GetSearchBar{ $navlength=10; $navpage=10; $pages=int($total/$navpage); if ($pages ne $total/$navpage){ $pages+=1; } $nav_index=int($pos/($navpage*$navlength)); $nav_page=$pos/$navpage; $start_index=$nav_index*$navlength; $final_index=$start_index+$navlength; if ($final_index>=$pages){ $final_index=$pages; $start_index=$final_index-$navlength; if ($start_index<0){ $start_index=0; } }else{ $next_nav=join(""," ...\n"); } if ($start_index>0){ $prev_nav=join(""," ...\n"); } for($i=$start_index;$i<$final_index;$i++){ if ($nav_page ne $i){$navbar=join("",$navbar," ",$i+1,"\n");} else{$navbar=join("",$navbar," [",$i+1,"]\n");} } if ($pages>1){ $PrevPage=$pos-$navpage; $NextPage=$pos+$navpage; if ($PrevPage>-1){$prev_line=" назад\n";} if ($total>$pos+$navpage){$next_line=" вперед\n";} $navbar=join("",$prev_line,$prev_nav,$navbar,$next_nav,$next_line); } else{ $navbar="назад"; } } sub CheckField{ my($item)=shift; while ($item=~/(\W|^)$search_word/ig){ $sresult+=1; } $item=~s/(\W|^)($search_word)([^\W]*)/$1$2$3<\/b><\/font>/ig; return $item; } sub SearchPrepare{ $search_tmp=$search; $search_tmp=~s/\"//g; $search=$search_tmp; $search_tmp=~s/\t+/ /g; $search_tmp=~s/\,/ /g; $search_tmp=~s/\./ /g; $search_tmp=~s/\s+/ /g; $search_tmp=~s/^ //g; $search_tmp=~s/ $//g; $tmp=$search_tmp; @words=split(/ /,$search_tmp); $filename = '../data/lex.txt'; open DATA, $filename or die "Невозможно открыть $filename: $!"; while (){ chomp; ($pref,$suf)=split(/::/); @words_suf=split(/ /,$suf); foreach $item (@words_suf){ foreach $word (@words){ if ($word eq "$pref$item"){ $word=$pref; } } } } close DATA; } sub Board{ open DATA, "../data/board.txt"; @header=; close DATA; $board=@header[rand(@header)]; } sub PrintFooter{ $header=""; open DATA, "footer.inc"; @header=; close DATA; $header="@header"; print <<__END__;
Перейти на страницу:  
$navbarзарегистрироваться
$header __END__ } sub ViewAddForm{ $title=" - Регистрация модельного агентства"; &PrintHeader; print <<__END__; $Error
Название агентства:
Описание:
Контакт:
http://
E-mail:
Логин*:
Пароль*:
* - поле не публикуется, необходимо для управления профайлом __END__ $navbar="назад"; } sub AddItem{ $caption=param("caption"); $caption=&DelTag($caption); if ($caption eq ""){ $Error="$Error

Ошибка: отсутствует название агентства

"; } $body=param("body"); $body=&DelTag($body); $contact=param("contact"); $contact=&DelTag($contact); if ($contact eq ""){ $Error="$Error

Ошибка: отсутствует контактная информация

"; } $http=param("http"); $http=~s/http:\/\///g; $http=&DelTag($http); $mail=param("mail"); $mail=&DelTag($mail); $login=param("login"); $login=&DelTag($login); if ($login eq ""){ $Error="$Error

Ошибка: отсутствует логин

"; } $pwd=param("pwd"); $pwd=&DelTag($pwd); if ($login eq ""){ $Error="$Error

Ошибка: отсутствует пароль

"; } if ($Error ne ""){ &ViewAddForm; }else{ $i=-1; open DATA, "+<../data/agencies.txt"; flock(DATA, LOCK_EX) if($^O !~ /Win/i); while (){ if ($_=~/^$login\t/){ $Error="

Указанный Вами логин уже существует! Выберите другой или воспользуйтесь предложенным.

"; $login="$login 2004"; goto LP; } $i+=1; $lines[$i]=$_; } seek(DATA,0,0); print DATA "$login\t$pwd\t$caption\t$body\t$contact\t$http\t$mail\t$date\n"; print DATA @lines; truncate(DATA,tell(DATA)); LP: close(DATA); if ($Error ne ""){ &ViewAddForm; }else{ &ViewAll; } } } sub DelTag{ my($st)=shift; $st=~s/\s+/ /g; $st =~s/\"/"/g; $st =~s//>/g; return $st; } sub GetDate{ $time = time() + ($time_zone * 3600); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime ($time); $year += ($year < 90) ? 2000 : 1900; my @RealDay = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); my @RealMonth = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); my $daweek = $RealDay[$wday]; my $month = $RealMonth[$mon]; $expString =sprintf("%s, %02d %s %04d %02d:%02d:%02d",$daweek,$mday,$month,$year,$hour-4,$min,$sec); $dateString =sprintf("%s, %02d %s %04d %02d:%02d:%02d",$daweek,$mday,$month,$year,$hour,$min,$sec); }