#!/usr/bin/perl

use strict;

use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, 'ru_RU.cp1251');

use CGI qw(:param);


#use utf8towin;
use menu;

#print $0;  exit;

my $patt    =   param("patt");
my $case  =     param("case");
my $order  =    param("order");
my $word  =     param("word");
my $pagesize =  param("pagesize");
my $page =      param("page");
my $areal =     param("areal");
my $regexp =    param("regexp");
my $lang  =     param("lang");

$areal    ||= "bible";
$pagesize ||= 20;
$page     ||= 1;            	

my ($lang) = split(/_/, $lang);
$lang||= "RU";
$lang eq "UC" and $lang = "CS";



my $select_lang;
my $QUERY = $ENV{QUERY_STRING} ;

$QUERY=~ s/\&lang=\w+//i;
$QUERY=~ s/lang=\w+//i;

if ($lang eq "RU")  {$select_lang=  qq! (<b>Рус.</b> / <a href="find.pl?$QUERY&lang=CS">Ц.С.</a>) !   }
else                {$select_lang=  qq! (<a href="find.pl?$QUERY&lang=RU">Рус.</a> / <b>Ц.С.</b>) !   }



$patt = utf2win($patt);


my $zapros = $patt;


$zapros=~ s/^\s+//;
$zapros=~ s/\s+$//;


my $title = "Поиск в Библии";
   $title = "$zapros - $title" if $zapros;


print <<HT1;
Content-Type: text/html

<html>
<head>
<title>$title</title>
<meta http-equiv="Content-type" content="text/html; charset=windows-1251">
</head>
<body>

<a href="read.pl">Библия</a> - $select_lang - Поиск - <a href="help.html">Справка</a>
<p>
HT1


(my $zvalue = $patt) =~ s/\"/\&quot;/g;

#print "$_  => $ENV{$_}<br>\n" for keys %ENV; 


print <<FORM;

<form method="get" action="find.pl#RES">

<input type="text" name="patt" value="$zvalue" size=60>

<input type="submit" value="Поиск"> <p>

<input type="checkbox" name="case"    value="1" @{[$case    ? "checked":""]}  >Различать регистр<br>
<input type="checkbox" name="order"   value="1" @{[$order   ? "checked":""]}  >Фраза<br>
<input type="checkbox" name="word"    value="1" @{[$word    ? "checked":""]}  >Только целые слова<br>

<select name="areal">
   <option value="bible" @{[ $areal eq "bible" ? "selected":"" ]}>Вся Библия
   <option value="vz"    @{[ $areal eq "vz"    ? "selected":"" ]}>Ветхий Завет
   <option value="nz"    @{[ $areal eq "nz"    ? "selected":"" ]}>Новый Завет
</select>

<select name="lang">
   <option value="RU"  @{[ $lang eq "RU" ? "selected":"" ]}>Рус.
   <option value="CS"  @{[ $lang eq "CS" ? "selected":"" ]}>Ц.С.
</select> 

</form>
FORM

#<input type="text" name="pagesize" value="$pagesize" size=4> Результатов на странице
#<input type="text" name="page"     value="$page"     size=4> Страница
#<input type="checkbox" name="regexp"  value="1" @{[$regexp  ? "checked":""]}  >Регулярные выражения<br>


if ($zapros)   {


#open P, ">>log.txt";
#print P qq!$zapros\n!;
#close P;


$_ = $zapros; 


s#\\\\#\x00b#g;
s#\\\*#\x00z#g;
s#\\\.#\x00t#g;
s#\\\^#\x00k#g;
s#\\{#\x001#g;
s#\\}#\x002#g;
s#\\_#\x00s#g;
s#\\@#\x00a#g;
s#\\%#\x00p#g;
s#\\\|#\x00d#g;


s#([\\.&"`?$()\[\]])#\\$1#g;

s#{#\(#g;
s#}#\)#g;
s#\*#\\S*#g;  # * => \S*
s#\+#\.*?#g;  # + => .*?
s#\^#\\W+#g;  # ^ => \W+
s#%#\\w*#g;   # % => \w*
s#@#\\w#g;    # @ => \w
s#_+#\\s+#g;  # _ => s+


s/\s+/\\W+/g  if $order;


s#\x00z#\\\*#g;
s#\x00b#\\\\#g;
s#\x00t#\\\.#g;
s#\x00k#\\\^#g;
s#\x001#{#g;
s#\x002#}#g;
s#\x00s#_#g;
s#\x00a#@#g;
s#\x00p#%#g;
s#\x00d#\\\|#g;


$zapros = $_; 

my @reg_Y  =  grep { !/^~/ and !/^\.\*\?$/  } split(/\s+/, $zapros);
my @reg_N  =  grep { s/^~//                 } split(/\s+/, $zapros);


if ( $word ) { $_ = qq!\\b$_\\b!  for (@reg_Y, @reg_N )  };


if ( $case ) { $_= qr/$_/  for( @reg_Y, @reg_N ) }
else         { $_= qr/$_/i for( @reg_Y, @reg_N ) }

#print qq!<p><b>@reg_Y</b><p>!;

my %SN = ();
my %FN = ();
open I, "$lang/index.txt";
while (<I>) {
  chomp;
  /^\w/ or next;
  my ($n, $sn, $fn) = split("\t");
  $SN{$n} = $sn; 
  $FN{$n} = $fn;
}
close I;



#my $TXT = "RU";


opendir D, $lang;
my @files = sort grep { /^\d\d\d\.txt$/i } readdir D; 

print "<p>\n";

undef $/;

my $count;

#my $RESULT = '';
my $TX;


my $res_page;

R: while (1) {

$count = 0;
$TX= '';


F: for my $f (@files) {

   open S, "$lang/$f";
   my $text= <S>;
   close S;

   $f=~ /^(\d\d\d)\.txt$/i;

   my $kn = $1;


   $areal eq "nz" and $kn=~ /^0/ and next F;
   $areal eq "vz" and $kn=~ /^1/ and next F;


   my @lines = split("\n", $text);

   my $gl=0;
   my $st=0;
   my $tx='';

L:  for (@lines) {

      if ( /^(?:Глава|Псалом)\s+(\d+)\s*$/ ) {

         $gl = $1;

      } elsif ( /^(\d+)\s+(.+)$/ ) {

         ($st, $tx)= ($1, $2);

         $tx=~ /$_/ or   next L  for @reg_Y;
         $tx=~ /$_/ and  next L  for @reg_N;         
         
         $count++;
         use integer;

         my $tek_page = ($count-1)/$pagesize + 1 ;

         if ($tek_page==$page) {
         
            $tx=~ s!($_)!<b>$1</b>!g for @reg_Y ;
            $tx=~ s!</b>(\s*)<b>!$1!g;
            $TX.= qq! <a href="read.pl?book=$kn&P=$gl.$st&lang=$lang#S">($SN{$kn}.$gl:$st)</a>\t$tx<p>\n! ;

         }         

      }
   }
} # F: for my $f (@files)


use integer;
$res_page =  ($count-1)/$pagesize + 1 ;


if ($page > $res_page) {   
   $page= $res_page;
   redo R;
} else {
   last R;
}

} # R: while (1)


print qq!\n<a name="RES"></a>Найдено стихов: $count. <br>!;

( my $QUERY = $ENV{QUERY_STRING} ) =~ s/\&page=\d+//gi;

print qq! <a href="find.pl?$QUERY&page=@{[$page-1]}#RES">&lt;&lt;</a> &nbsp;&nbsp; ! if $page>1;
print qq!Страница: $page из $res_page! if $count>0;
print qq! &nbsp;&nbsp; <a href="find.pl?$QUERY&page=@{[$page+1]}#RES">&gt;&gt;</a> ! if $page<$res_page;
print qq!<hr>!;
print qq!$TX\n<hr>\n! if $TX;


print <<FORM;

<form method="get" action="find.pl#RES">

<input type="hidden" name="patt"   value="$zvalue">
<input type="hidden" name="case"   value="$case" >
<input type="hidden" name="order"  value="$order">
<input type="hidden" name="word"   value="$word" >
<input type="hidden" name="areal"  value="$areal">
<input type="hidden" name="lang"   value="$lang">

FORM


print menu ( $page, $res_page,  qq! <input type="text" name="page" value="%s" size=3><input type="submit" value="*"> !,  
                                qq! <a href="find.pl?$QUERY&page=%s#RES">%s</a> !);


print qq!</form>!;

} # if ( $zapros )


print <<HT2;

</body>
</html>
HT2
