#!/usr/bin/perl

use lib '.';

open (STDERR,">>./_siteerrors.log");

use locale;
use POSIX qw(locale_h);
setlocale(LC_CTYPE,"ru_RU.UTF-8");
$url=$ENV{'HTTP_HOST'}.$ENV{'REQUEST_URI'};

#use lib '../ggm-lib';
#use Time::HiRes qw( gettimeofday tv_interval );
use Algorithm::Diff;
#$t09 = [gettimeofday];

use CGI; 
use DBI::DBD;
use warnings;
no warnings;

my $host=$ENV{'HTTP_HOST'};
if ($host=~/ru\.chuvash\./) {
  require "lang/russian.pm";
  }
elsif ($host=~/en\.chuvash\./) {
  require "lang/english.pm";
  }
elsif ($host=~/eo\.chuvash\./) {
  require "lang/esperanto.pm";
  }
else {
  require "lang/chuvash.pm";
  }
$prf="ch" if $prf eq "";


require "proc.pm";
#  print "Content-Type:text/html;charset='utf8'\n\n";
#  exit;

require "wiki2.pm";


my $in = new CGI; 

$a = $in->param("a");

$a="v" if $a eq "";
# $a="vv" if $a eq "sr";

#
$tenname=$prf."_encyc";
$tinname=$prf."_eindex";
$tbkname=$prf."_ebak";
$tshname=$prf."_etemp";

&db_con;

$cookie = $ENV{'HTTP_COOKIE'};
@cook=split(/\;/,$cookie);
foreach (@cook) {
  my $gm=(split(/\=/,$_))[0];
  $gm=~s/^\s+//g;
  if ($gm eq "User") {
    $user_c=(split(/\=/,$_))[1];} 
  }

$ck_=$dbh->quote($user_c);

if ($user_c ne '') {

  $qu=qq~SELECT l.name,group_,email,id,filter_ntag_$prf FROM all_login l,all_users u WHERE l.name=u.name AND code=$ck_~;
  my $myd= $dbh->prepare($qu);
  ($myd->execute) or &error("$DBI::errstr $qu");
  ($user,$group,$uemail,$user_id,$fhipartags)=$myd->fetchrow_array;
  }

$group=0 if $group eq "";

@ka_=('А','Б','В','Г','Д','Е','Ж','З','И','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Э','Ю','Я');
@kb_=('a','b','v','g','d','e','j','z','i','k','l','m','n','o','p','r','s','t','u','f','h','c','4','w','6','ee','yu','q',);
@rzn=($lng{"Undefined"},$lng{"Chuvashia"},$lng{"Peoples"}, $lng{"Articles"},$lng{"Culture"},$lng{"System_Messages"});
my $dac=1;

if ($a eq "v" || $a eq "pr") {
#  use utf8;
#  use Encode;

  $id = $in->param("id");
  $id=~s/"/&quot;/g;
  $id=~ s/'/&\#39;/g;
  $id="d0a2c49bd0bf20d181d182d180d0b0d0bdd0b8d186c483d0bdd0b0" if $id eq "";
  $vok=1;

  # wiki format valli
  $w = $in->param("w");
  if ($w eq "") {
    $tid=$id;
    $tid=~s/[a-f0-9]//g;
    if ($tid eq "" && $id ne "") {
      $id=~s/(..)/pack("C",hex($1))/eg;
      }
    }
  else {
    $w=Encode::decode_utf8($w);
    $w=ucfirst($w);
    $w=Encode::encode_utf8($w);
    $id=$w;
    }
  $id_=$dbh->quote($id);
  $end=0;
  my $cjump=0;
  my $tags;
  while ($end==0) { #  
    $cjump++;
    $qu=qq~SELECT text_,dracola,type_,edit,autor,id,view,a_group FROM $tenname WHERE name = $id_ ORDER BY id DESC~;
    $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
    ($myd->execute) or &error("$DBI::errstr");
    ($k_,$dr,$tp_,$ed,$au,$cid,$vw,$ac_)=$myd->fetchrow_array;
    $myd->finish;undef $myd;
    if ($k_=~/^:=(.+)/) { #  
      my $tmp=$1;
      if ($tmp=~/^\//) { # Перевод на функцию
        print "Location: $tmp\n\n";
        exit;
        }
      else {
        $id=$tmp;
        $id_=$dbh->quote($id);
        }
      } 
    else {
      $end=1;
      if ($cid ne "") {
        $vw++;
        $qu="UPDATE ".$tenname." SET `view` = $vw WHERE id = ".$cid;
        ($dbh->do($qu)) or &error("$DBI::errstr ".$qu);

        $qu="SELECT name from ".$tenname."_tags WHERE id = ".$cid;
        $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
        ($myd->execute) or &error("$DBI::errstr");
        my $tgs=$myd->fetchall_arrayref;
        foreach (@$tgs) {
          my $vv=$lng{"Category"}.":".@$_[0];
          # $vv=~s/(.)/unpack("H2",$1)/eg;

          $_=qq~<a href='/wiki/$vv'>@$_[0]</a>~;
          }
        $tags=join ", ",@$tgs;
        }
      }
    $end=1 if $cjump>20;
    }

  %langs_id=("cv"=>"http://chuvash.org",
    "ch"=>"http://chuvash.org",
    "en"=>"http://en.chuvash.org",
    "eo"=>"http://eo.chuvash.org",
    "ru"=>"http://ru.chuvash.org"
    );
  
  if ($k_ eq "" && $id!~/^$lng{"Category"}:.+/) { #проверка на другую кодировку
    $id=Encode::decode_utf8($id);
    my $idl=&persasp($id);

    if ($idl ne $id) { #Если кодировка разная
      my $idl_=$dbh->quote($idl);

      my $qu="SELECT count(*) FROM ".$tenname." WHERE name = ".$idl_;
      $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
      ($myd->execute) or &error("$DBI::errstr");
      my $cnt_idl=$myd->fetchrow_array;
      
      if ($cnt_idl>0) {
        print qq~Location: /wiki/$idl\n\n~;
        exit;
        }
      }
    $id=Encode::encode_utf8($id);
    }
  
  if ($a eq "v") {
    my ($olng);
    if ($cid ne "") {
      $qu="select lang,name from ".$prf."_lang_links where enc_id=".$cid;
      $myd=$dbh->prepare($qu) or &error("$DBI::errstr $qu");
      ($myd->execute) or &error($DBI::errstr." ".$qu);
      $ag_=$myd->fetchall_arrayref;
      $myd->finish;undef $myd;
      $qua=$qu;
      foreach (@$ag_) {
        my $vv=@$_[1];
        # $vv=~s/(.)/unpack("H2",$1)/eg;
        $olng->{@$_[0]}->{"Link"}=$langs_id{@$_[0]}."/wiki/".$vv;
        $olng->{@$_[0]}->{"Name"}=$lng{"Language_Out_".@$_[0]};
        $lang_out.="<br>\n<span style='padding-left:15px;'><a href='".$langs_id{@$_[0]}."/wiki/".$vv."'>".$lng{"Language_Out_".@$_[0]}."</a></span>";
        }
      }
    $shead->{"Other_Lang"}=$olng;
    $shead->{"NoRight"}=1;
    $shead->{"JavaScript"}=qq~<link rel="canonical" href="$langs_id{$prf}/wiki/$id" />~;
    &headprint($id,$shead);
    }
  else {
    &prhead;
    }

  if ($k_ ne "") {
    print "<div class='wstatya' style='text-align:justify;padding:0px 0px 0px 0px'>".$k_."</div><br>";
#    print "<span style='text-align:justify;padding:0px 0px 0px 0px'>".$k_."</span><br>";
    $lng{"Articles_Notice"}=~s/__AUTHOR__/$au/g;
    $lng{"Articles_Notice"}=~s/__TIME__/$ed/g;
    $lng{"Articles_Notice"}=~s/__COUNT__/$vw/g;
    $eout=$lng{"Articles_Notice"};
    $eout.=$lng{"Type"}.": <i>".$rzn[$tp_]."</i>." if $tp_>0 && $tp_<@rzn;
    $eout.=$lng{"Admin_Not_Proveril"} if $dr!=1;
    } 
  else {
    $ac_=1;
    if ($id!~/^$lng{"Category"}:(.+)/) {

      if ($group>0) {
        $lng{"Article_Not_Found"}=~s/__ID__/$id/gs;
        print $lng{"Article_Not_Found"};
        }
      else {
        $lng{"Yuor_Enter_Article"}=~s/__ID__/$id/gs;
        print $lng{"Yuor_Enter_Article"};
        }
      print "<br>";
      }
    }
  #Out articles
  if ($id=~/^$lng{"Category"}:(.+)/) {
    my $tag=$1;
    use utf8;
    use Encode;
      
    $tag_=$dbh->quote($tag);
    $qu="SELECT ee.name from ".$tenname."_tags t left join $tenname ee on t.id=ee.id WHERE t.name = ".$tag_." order by ee.name";
    $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
    ($myd->execute) or &error("$DBI::errstr");
    my $tgs=$myd->fetchall_arrayref;
    my $fl; my @tgcats;
    #$lng{"Category"}=Encode::decode_utf8($lng{"Category"});
    for (my $i=0;$i<@$tgs;$i++) {
      #$tgs->[$i]->[0]=Encode::decode_utf8($tgs->[$i]->[0]);

      my $fletter;
      if ($tgs->[$i]->[0]=~/^$lng{"Category"}:(.+)/) {
        my $tname=$1;
        $tname=Encode::decode_utf8($tname);
        $tname=~/^(.)/;
        $fletter=$1;
        my $vv=$tgs->[$i]->[0];
        $vv=Encode::decode_utf8($vv);
        # $vv=~s/(.)/unpack("H2",$1)/eg;
        my @ctmp=(qq~<a href='/wiki/$vv'>$tname</a>~,$fletter);
        push @tgcats,\@ctmp;
        splice @$tgs,$i,1;
        $i--;
        }
      else {
        my $sname=$tgs->[$i]->[0];
        $sname=Encode::decode_utf8($sname);
        $sname=~/^(.)/;
        $fletter=$1;
        #my $vv=$tgs->[$i]->[0];
        # $vv=~s/(.)/unpack("H2",$1)/eg;
        $tgs->[$i]->[0]=qq~<a href='/wiki/$sname'>$sname</a>~;
        $tgs->[$i]->[1]=$fletter;
        }
      }

    if (@tgcats>0) {
      print qq~<div class='clear'>&nbsp;</div>
      <div class='category_cat'>$lng{"Category_Category_Out"}</div>~;
      my $fl;
      foreach (@tgcats) {
        my $fletter=@$_[1];
        if ($fl ne $fletter) {
          $fl=$fletter;
          print qq~<div style='font-size:150%'><b>$fl</b></div>\n~;
          }
        print qq~<img src='/ball_whi.gif'> @$_[0]<br>\n~;
        }
      }
    if (@$tgs>0) {
      print qq~<div class='category_article'>$lng{"Category_Articles_Out"}</div>~;
      foreach (@$tgs) {
        my $fletter=@$_[1];
        if ($fl ne $fletter) {
          $fl=$fletter;
          print qq~<div style='font-size:150%'><b>$fl</b></div>\n~;
          }
        print qq~<img src='/ball_whi.gif'> @$_[0]<br>\n~;
        }
      }

    }
  
  if ($tags ne "") {
    print qq~<div class='clear'>&nbsp;</div>
    <div class='encyc_tags'><b>$lng{"Tags_Out"}</b>: $tags</div>~;
    }

#  my $vv=$id;
#  $vv=~s/(.)/unpack("H2",$1)/eg;
#  $vv=~s/1/\%31/g;
  if ($a eq "pr") {
    print "<br><img src='/ball_whi.gif'> <a href=\"/cgi-bin/ee.cgi?id=$id\">".$lng{"Full_Article"}."</a> :: <a href='/wiki/$id'>".$lng{"Article_Link"}."</a>";
  
    if ($prf eq "ch" || $prf eq "ru" || $prf eq "en") {
      print qq~<div style='text-align:center;padding:10px 0px 10px 0px;'><img src='/images/pline.png' width='500' height='1'></div>~;
      my %pdomen=("ch"=>"","cv"=>"","ru"=>"ru.","en"=>"en.");
      use LWP::Simple;
      use URI::Escape;
      print get("http://slinks.su/get_links.php?url=".uri_escape($ENV{REQUEST_URI})."&host=".$pdomen{$prf}."chuvash.org&charset=utf-8");
      }

    $vok=0;
    }
  else {
    $out_bottom_links=qq~<div class='clear'>&nbsp;</div><img src='/ball_whi.gif'> <a href='/wiki/$id'>$lng{"Article_Link"}</a> :: <a href='/cgi-bin/ee.cgi?a=pr&id=$id'>$lng{"Print_Version"}</a> ~;
    $out_bottom_links.=qq~:: <a href="/cgi-bin/ee.cgi?a=e&id=$id">$lng{"edit"}</a> ~ if $group>=$ac_;
    $out_bottom_links.=qq~:: <a href="/cgi-bin/ee.cgi?a=rn&id=$id">$lng{"Rename"}</a> :: <a href="/cgi-bin/ee.cgi?a=d&id=$id" onclick="return confirmLink(this, '$lng{"Del_Confirm"}')">$lng{"del"}</a>~ if $group>3;
    $out_bottom_links.= " :: <a href='/cgi-bin/ee.cgi?a=sl&id=$id'>".$lng{"Compare"}."</a> " if $group>=$ac_;

    if ($group>2) {
      $out_bottom_links.=" :: <a href='/cgi-bin/ee.cgi?a=pd&id=$id'>".$lng{"Congifm"}."</a> " if $dr!=1;
      }

    $out_bottom_links=Encode::decode_utf8($out_bottom_links);
    
    print $out_bottom_links;
    }
  } 
elsif ($a eq "want") {
  $vok=1;
  $qu="select distinct name,where_,count(name) ct from ".$prf."_ewanted group by name order by ct desc";
  $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
  ($myd->execute) or &error("$DBI::errstr");
  my $k_=$myd->fetchall_arrayref;
  $myd->finish;undef $myd;
  &headprint($lng{"Wanted_Pages"});
  print $lng{"Wanted_Pages_Notice"};
  @rn= ( '_2_ страницă çинче _1_ сăмах çинчен каласа пама манса кайнă',
    '_1_ ,      _2_',
    '_1_,     _2_',
    '  _2_     _1_',
    ' _2_    _1_,     ',
    ' _2_      _1_',
    '    _1_   _2_');
  foreach (@$k_) {
    #my $mess=$rn[int(rand(7))];
    my $mess=$lng{"Wanted_String1"};
  
    my $where=@$_[1];
    #$where=~s/(.)/unpack("H2",$1)/eg;
    $where=qq~<a href='/wiki/$where'>@$_[1]</a>~;
    $mess=~s/_2_/'\<i\>$where\<\/i\>'/;
    $who=qq~@$_[0]~;
    #$who=~s/(.)/unpack("H2",$1)/eg;
    $who=qq~<a href='/wiki/$who'>@$_[0]</a>~;
    $mess=~s/_1_/'$who'/;
    print "(@$_[2]). ".$mess.".<br>";
    }
  }
elsif ($a eq "cr") {
  $file=$in->param("file");
  exit if $file eq "";
  exit if $group<5;
  &create($file);
  }
elsif ($a eq "jump") {
#  use utf8;
#  use Encode;
  $url=$in->param("url");
#  $url=Encode::decode_utf8($url);
  open (FLOG,">>_wloc.log");
  print FLOG $url."\n";
  close (FLOG);
  $url=~s/1/\%31/g;

  print qq~Content-Type:text/html;charset='utf8'

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<meta http-equiv="refresh" content="0; url=$url" window-location="_top">
</head>
<body bgcolor="white">&nbsp;</body>
</html>~;

  }
elsif ($a eq "e") {
  #if ($group<1) {
  #  print "Location:/\n\n";
  #  exit;
  #  }
  &edit;
  }
elsif ($a eq "s") {
  use utf8;
  use Encode;
  $text=$in->param("comm");
  $tags=$in->param("tags");

#    print "Location:/cgi-bin/ee.cgi?a=jump&url=/wiki/$vv\n\n";
#    exit;
  
  $text=Encode::decode_utf8($text);# || &error ($!);
  $tags=Encode::decode_utf8($tags);# || &error ($!);

  foreach ('Category','Log_Encyc_create','Log_Encyc_create_link','Log_Encyc_edit','Log_Encyc_edit_link')  {
    $lng{$_}=Encode::decode_utf8($lng{$_});
    }
  
  $rz=$in->param("rz");
  $ag=$in->param("access");
  $rz=0 if $rz eq "" || $rz<0 || $rz>@rzn;

  $id=$in->param("id");
  $id=Encode::decode_utf8($id); #|| &error ($!);
  $id=~s/"/&quot;/g;
  $id=~ s/'/&\#39;/g;

  if ($id eq "") {
    $error=1;
    &edit;
    }
  elsif ($text eq ":=$id") {
    $error=2;
    &edit;
    }
  else {
    $id=~s/"/&quot;/g;
    $id=~ s/'/&\#39;/g;
    $id_=$dbh->quote($id);
    #print "Content-Type:text/html\n\n";
    #print $id_;
    
    $qu="select text_,dracola,a_group,view,id from $tenname where name = ".$id_." order by id desc";
    $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
    ($myd->execute) or &error("$DBI::errstr ".$qu);
    ($k_,$dr,$ag_,$vw_,$ee_id)=$myd->fetchrow_array;
    $myd->finish;undef $myd;
    
    if ($ag_>$group) {
      $vv=$id;
      #$vv=~s/(.)/unpack("H2",$1)/eg;
      print qq~Location: /wiki/$vv\n\n~;
      return;
      }

    #Output group_access;
    my $aout_group;
    if ($ag eq "" || $group<1 || $ag=~/\D/) {
      $ag=$ag_;
      }
    else {
      $ag=$group if $ag>$group;
      $ag=$ag_ if $ag<$ag_ && $group<4;
      }
    $ag=$dac if $ag eq "" || $ag_ eq "";

    
    $ip = $ENV{'HTTP_X_FORWARDED_FOR'} || $ENV{'REMOTE_ADDR'};
    ($ip) = $ip =~ /^(.+?)(,|$)/;

    $texts_=$text;

    my @tg;
    if ($tags ne "") {

      #Malti saspallie pisaklatat
      @tg=split(/[,\n]/,$tags);
      foreach my $key (@tg) {
        $key=~s/^[\s\.]+//s;
        $key=~s/[\s\.]+$//s;
        $key=ucfirst($key);
        next if $key eq "";
        }
      
      my @ttmp=@tg;
      
      foreach (@ttmp) {
        $_="__".$lng{"Category"}.":".$_."__";
        }
      $texts_.="\n";
      $texts_.=join "\n",@ttmp;
      }
    
    $ip=$dbh->quote($ip);
    $text=enc($text);

    $text=&persasp($text);
    
    $texts_=$dbh->quote($texts_);
    $txt=$dbh->quote($text);
    if ($user ne "") {
      $at_=$dbh->quote($user);
      }
    else {
      $at_=$ip;
      }

    $fg=0;
    $fg=1 if $group>2;

    #insert log
    $vv=$id;
    # $vv = Encode::decode_utf8($vv); 
    # $vv=~s/(.)/unpack("H2",$1)/eg;

    #if ($k_ eq "") { #  
    $vw_=0 if $vw_ eq "";

    #����塞 �� ��⥣�਩ ����� � �।��饩 �����
    if ($ee_id!=0 && $ee_id!~/\D/) {
      $qu="DELETE FROM ${prf}_encyc_tags WHERE id=".$ee_id;
      ($dbh->do($qu)) or &error("$DBI::errstr ".$qu);
      }

    $qu="INSERT INTO $tenname (name,text_,edit,ip,autor,dracola,type_,a_group,view,text_source) 
         values ($id_,$txt,now(),$ip,$at_,$fg,$rz,$ag,$vw_,$texts_)";
    ($dbh->do($qu)) or &error("$DBI::errstr ".$qu);

    $ee_id= $dbh -> {'mysql_insertid'}; 
    $ee_id=~s/0E0$//;
    
    foreach my $key (@tg) {
      next if $key eq "";
      $key_=$dbh->quote($key);
      $qu="INSERT INTO ${prf}_encyc_tags (id,name) values ($ee_id,$key_)";
      ($dbh->do($qu)) or &error("$DBI::errstr ".$qu);
      }
    
    &save_lang_links ($ee_id);

    my $log_;
    if ($k_ eq "") {
      $log_=$lng{"Log_Encyc_create"};
      $log_=$lng{"Log_Encyc_create_link"} if $text=~/^:=/;
      }
    else {
      $log_=$lng{"Log_Encyc_edit"};
      $log_=$lng{"Log_Encyc_edit_link"} if $text=~/^:=/;
      }
    $log_=~s/__ID__/$id/gs;

    &logs(1,'/wiki/'.$vv,$log_);

#    &index($id_,$text);

#    $qu="DELETE FROM ".$prf."_ewanted where name=".$id_;
#    ($dbh->do($qu)) or &error("$DBI::errstr");

#    &wanted($id_);
  open (FLOG,">>_wloc.log");
  print FLOG "LINK:url=/wiki/$vv\n";
  close (FLOG);

    print "Location:/cgi-bin/ee.cgi?a=jump&url=/wiki/$vv\n\n";
    }
  }
#p- 
#sr-
#id- 
#id name type subtype text edit ip autor
elsif ($a eq "sr") {
  &search;
  &bottomprint($shead);
  }
elsif ($a eq "vv") {
  $vok=1;
  $p=$in->param("p");
  $sr=$in->param("sr");
  $rz=$in->param("rz");

  &headprint($lng{"All_Articles"});
  
  print "<table width='100%'><form action='/cgi-bin/ee.cgi' method='POST'><tr><td style='padding-left:0px'>";

  $qu="select count(distinct name) from $tenname where text_ not like ':=\%'";
  $qu.=" and type_=".$rz if $rz>0 && $rz<@rzn;
  my @tmp;
  if ($sr ne "") {
    use utf8;
    use Encode;

    my $sr = Encode::decode_utf8($sr); 
    $sr=lc($sr);

    @tmp=$sr=~/(\w+)/gs;
    if (@tmp>1) {
      my $tt;
      foreach (@tmp) {
        $tt.=$dbh->quote($_).",";
        }
      $tt=~s/,$//;
      $qu="select count(*) from $tinname where word_ in(".$tt.")";
      }
    else {
      $sr_=$dbh->quote($sr);
      $qu="select count(*) from $tinname where word_=".$sr_;
      }
    }

  $myd=$dbh->prepare($qu) or &error("$DBI::errstr $qu");
  ($myd->execute) or &error("$DBI::errstr $qu");
  $k_=$myd->fetchrow_array;

  $myd->finish;undef $myd;

  print $lng{"All"};
  if ($sr ne "") {print $lng{"Searching"};$rz=0;}

  print $k_;

  $rzo="";
  $lng{"Search_type"}=~s/__TYPE__/$rzn[$rz]/g;
  print $lng{"Search_type"} if $rz>0 && $rz<@rzn;

  print <<HH5;
$lng{"Search_End"}:</td><td><div style='text-align:right'>
<input type='hidden' name='a' value='vv'>
$lng{"Search"}:<input type='text' name='sr' value='$sr'>
<input type='submit' value='$lng{"Search_Button"}'></div>
</td></tr></form></table><hr size='1'><table>
HH5

  $n=90;
  $pages=int($k_/$n);
  $pages++ if int($k_/$n)!=$k_/$n;
  $p=$pages if $p>$pages;
  $p=1 if $p<1;
  $st=$p*$n-$n;
  $st=0 if $start<0;

  $qu_="";
  $qu_="and type_=".$rz if $rz>0 && $rz<@rzn;

  if ($sr ne "") {
    my $tt;
    foreach (@tmp) {
      $tt.=$dbh->quote($_).",";
      }
    $tt=~s/,$//;
    #$qu="select count(*) from $tinname where word_ in(".$tt.")";
    $qu="select where_ from $tinname where word_ in(".$tt.") order by count_ desc";
    }
  else {
    $qu="select distinct name,dracola from ".$tenname." where to_days(now())-to_days(edit)<2 and text_ not like ':=\%'" .$qu_." order by name desc";
    $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
    ($myd->execute) or &error("$DBI::errstr ".$qu);
    $k_=$myd->fetchall_arrayref;
    $myd->finish;undef $myd;
    if (@$k_>0) {
      print "<tr><td style='border-bottom:1px solid #ff00ff;color:#ff00ff;padding-right:0px;' colspan=3>".$lng{"New_Articles"}."</td></tr>";
      $n_=@$k_; $nw=0;
      for ($i=0;$i<$n_;$i++) {
        if ($nw==0) {print "<tr><td style='padding-left:0px;'>";}
        else {print "</td><td>"}

        my $vv=@$k_[$i]->[0];
        ### $vv=~s/(.)/unpack("H2",$1)/eg;
        #return ("<a href='/e/".$vv."'>".$v."</a>");

        @$k_[$i]->[0]=Encode::decode_utf8(@$k_[$i]->[0]); 

        print "<a style='color:#ff00ff' href='/wiki/".$vv."'>".@$k_[$i]->[0]."</a>";

        print "<i style='color:#ff00ff;font-size:12px;'></i>" if @$k_[$i]->[1]==0;
        $nw++;
        if ($nw==3) {print "</td></tr>\n"; $nw=0;}
        }
      print "<tr><td style='border-bottom:1px solid ;' colspan=3><br>".$lng{"Other_Articles"}."</td></tr>";
      }
    $qu="select distinct name,dracola from ".$tenname." where to_days(now())-to_days(edit)>1 and text_ not like ':=\%'" .$qu_." order by name desc limit ".$st.",".$n;
    }

  $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
  ($myd->execute) or &error("$DBI::errstr ".$qu);
  $k_=$myd->fetchall_arrayref;
  $myd->finish;undef $myd;
  $n_=@$k_; $nw=0;
  for ($i=0;$i<$n_;$i++) {
    if ($nw==0) { print "<tr><td style='padding-left:0px;'>";}
    else {print "</td><td>"}

    @$k_[$i]->[0]=Encode::decode_utf8(@$k_[$i]->[0]); 
    #my $vv=@$k_[$i]->[0];
    #$vv=~s/(.)/unpack("H2",$1)/eg;

    print "<a href='/wiki/".@$k_[$i]->[0]."'>".@$k_[$i]->[0]."</a>";
    print "<i style='color:yellow;font-size:12px;'></i>" if @$k_[$i]->[1]==0;
    $nw++;
    if ($nw==3) {print "</td></tr>\n";$nw=0;}
    }
  print "<tr><td colspan=3>".$lng{"Administrators_Not_Confirm"}."<br>
                        <!--font style='color:yellow;'></font>   .<br-->
  </td></tr></table><hr size='1'><table width='100%'><form action='/cgi-bin/ee.cgi' method='POST'><tr><td>";

  if ($pages>1) {
    print $lng{"Pages"};
    $sn=$p-5;
    $sn=1 if $sn<1;
    $en=$p+5;
    $en=$pages if $en>$pages;
    print " <a href='/cgi-bin/ee.cgi?a=vv&p=1&rz=".$rz."&sr=".$sr."'>1</a>,\n" if $sn>1;
    print "... " if $sn>2;
    
    for (my $ii=$sn;$ii<$en+1;$ii++) {
      if ($ii!=$p) {
        print " <a href='/cgi-bin/ee.cgi?a=vv&p=".$ii."&rz=".$rz."&sr=".$sr."'>".$ii."</a>";
        }
      else {print " \[".$ii."\]"}
      print "," if $ii!=$pages;
      }
    print " ..." if $en<$pages-1;
    print " <a href='/cgi-bin/ee.cgi?a=vv&p=".$pages."&rz=".$rz."&sr=".$sr."'>".$pages."</a>" if $en<$pages;
    }

  print "</td><td><div style='text-align:right;padding-right:0px;'><input type='hidden' name='a' value='vv'>".$lng{"Group_Select"}.":<select name='rz'>";
  my $kr=@rzn;
  for(my $i=0;$i<$kr;$i++) {
    my $sel="";
    $sel=" selected" if $rz==$i;
    print "<option".$sel." value='".$i."'>".$rzn[$i]."</option>\n";
    }
  print "</select><input type='submit' value='".$lng{"OK"}."'></div></td></tr></form></table>";
  }
elsif ($a eq "d") {
  if ($group<4) {
    print "Location:/main.shtml\n\n";
    exit;
    }
  $id=$in->param("id");
  $id=~s/"/&quot;/g;
  $id=~ s/'/&\#39;/g;
  $id="" if $id eq "";
  $id_=$dbh->quote($id);
  $qu="DELETE FROM $tenname where name =".$id_;
  ($dbh->do($qu)) or &error("$DBI::errstr");
  $qu="DELETE FROM $tinname where where_ =".$id_;
  ($dbh->do($qu)) or &error("$DBI::errstr");

  $vv=$id;
  #$vv=~s/(.)/unpack("H2",$1)/eg;
  $lng{"Log_Encyc_delete"}=~s/__ID__/$id/gs;
  &logs(1,'/wiki/'.$vv,$lng{"Log_Encyc_delete"});

  print "Location:/\n\n";
  }

elsif ($a eq "sl") { #... .
  $id = $in->param("id");
  $eid = $in->param("eid");
  $oid = $in->param("oid");
  $id=~s/"/&quot;/g;
  $id=~ s/'/&\#39;/g;
  $id="" if $id eq "";
  $vok=1;
  # 
  $tid=$id;
  $tid=~s/[a-f0-9]//g;
  if ($tid eq "" && $id ne "") {$id=~s/(..)/pack("C",hex($1))/eg;}
  $id_=$dbh->quote($id);
  $end=0;

  $qu="select id, text_, autor, edit, a_group, text_source from ".$prf."_encyc where name = ".$id_." order by id desc";
  $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
  ($myd->execute) or &error("$DBI::errstr");
  #($txt_,$au,$ed)
  my $ee=$myd->fetchall_hashref('id');
  $myd->finish;undef $myd;
  &headprint($id);

  my $last;
  foreach my $a (sort {$b<=>$a} keys %$ee) {
    $last=$a if $last eq "";
    if ($eid eq "") {
      $eid=$a;
      }
    elsif ($oid eq "") {
      $oid=$a; 
      }
    else {last}
    }
  my $y=keys %$ee;  
  if ($eid eq "" || $oid eq "") {
    print $lng{"Article_Not_Repaire"};
    }
  else {
    my ($txt_,$b_txt_);
    
    if ($ee->{$eid}->{"text_source"} eq "") {
      $txt_=&dnc($ee->{$eid}->{"text_"});
      }
    else {
      $txt_=$ee->{$eid}->{"text_source"};
      }
    
    if ($ee->{$oid}->{"text_source"} eq "") {
      $b_txt_=&dnc($ee->{$oid}->{"text_"});
      }
    else {
      $b_txt_=$ee->{$oid}->{"text_source"};
      }

    #my $b_txt_=&dnc($ee->{$oid}->{"text_"});
    my @aaa=split(/\n+/,$txt_);
    my @bbb=split(/\n+/,$b_txt_);
    $ccc = Algorithm::Diff::sdiff(\@aaa, \@bbb);
  
    my $maxx=@$ccc;
    my $cs=0;
    print "<table width='100%'>";

    # �뢮��� ���
    if ($y>2) {
      print qq~<form action='/cgi-bin/ee.cgi' >
      <input type='hidden' name='a' value='sl'>
      <input type='hidden' name='id' value='$id'>
      <tr><td><div style='text-align:right'><select name='oid'>~;
      foreach my $a (sort {$b<=>$a} keys %$ee) {
        my $sel_;
        $sel_ =" selected" if $a eq $oid;
        print "<option value='".$a."'".$sel_.">".$ee->{$a}->{"autor"}.",".$ee->{$a}->{"edit"}."</option>\n";
        }
      print "</select></div></td><td><div><select name='eid'>";
      foreach my $a (sort {$b<=>$a} keys %$ee) {
        my $sel_;
        $sel_ =" selected" if $a eq $eid;
        print "<option value='".$a."'".$sel_.">".$ee->{$a}->{"autor"}.",".$ee->{$a}->{"edit"}."</option>\n";
        }
      print "</select><input type='submit' class='btn' value='".$lng{"Compare"}."'></div></td></tr></form>";
      }

    print "<tr><td width='50%'><div><img src='/ball_whi.gif'> ".$ee->{$oid}->{"autor"}.", <i>".$ee->{$oid}->{"edit"}."</i> ";
    if ($group>=$ee->{$last}->{"a_group"}) {
      print "(<a href='/cgi-bin/ee.cgi?a=e&id=".$id."&sid=".$oid."'>".$lng{"edit"}."</a>)";
      }
    print "</div></td>
    <td width='50%'><div><img src='/ball_whi.gif'> ".$ee->{$eid}->{"autor"}.", <i>".$ee->{$eid}->{"edit"}."</i>";
    if ($group>=$ee->{$last}->{"a_group"}) {
      print " (<a href='/cgi-bin/ee.cgi?a=e&id=".$id."&sid=".$eid."'>".$lng{"edit"}."</a>)";
      }
    print "</div></td></tr>";

    my $cmp_yes;
    for (my $max=1;$max<$maxx+1;$max++) {
      my $color;
      if ($ccc->[$max-1]->[0] eq "c") {

        #��������� �ࠢ�����
        my @aaa=split(/ /,$ccc->[$max-1]->[1]);
        my @bbb=split(/ /,$ccc->[$max-1]->[2]);
        my $ccc1 = Algorithm::Diff::sdiff(\@aaa, \@bbb);
        my $maxx1=@$ccc1;
        my ($aaa1,$bbb1);
        for (my $max1=1;$max1<$maxx1+1;$max1++) {
          if ($ccc1->[$max1-1]->[0] eq "c") {
            $ccc1->[$max1-1]->[1]="<b><i style='color:purple'>".$ccc1->[$max1-1]->[1]."</i></b>";
            $ccc1->[$max1-1]->[2]="<b><i style='color:purple'>".$ccc1->[$max1-1]->[2]."</i></b>";
            }
          elsif ($ccc1->[$max1-1]->[0] eq "+") {
            $ccc1->[$max1-1]->[1]="";#<b><!--s style='color:black'>".$ccc1->[$max1-1]->[2]."</s--></b>";
            $ccc1->[$max1-1]->[2]="<b><s style='color:black'>".$ccc1->[$max1-1]->[2]."</s></b>";
            }
          elsif ($ccc1->[$max1-1]->[0] eq "-") {
            $ccc1->[$max1-1]->[1]="<b><u style='color:blue'>".$ccc1->[$max1-1]->[1]."</u></b>";
            }
          $aaa1.=$ccc1->[$max1-1]->[1]." ";
          $bbb1.=$ccc1->[$max1-1]->[2]." ";
          }

        $ccc->[$max-1]->[1]=$aaa1;#"<i style='color:green'>".$ccc->[$max-1]->[1]."</i>";
        $ccc->[$max-1]->[2]=$bbb1;#"<i style='color:green'>".$ccc->[$max-1]->[2]."</i>";
        $color='#C4F3C4';
        $cmp_yes++;
        }
      elsif ($ccc->[$max-1]->[0] eq "+") {
        #@$_[1]="<s style='color:black'>".@$_[2]."</s>";
        $ccc->[$max-1]->[1]="";
        $ccc->[$max-1]->[2]="<span style='color:red'>".$ccc->[$max-1]->[2]."</span>";
        $color='#FFDDDD';
        $cmp_yes++;
        }
      elsif ($ccc->[$max-1]->[0] eq "-") {
        #$ccc->[$max-1]->[1]=$ccc->[$max-1]->[1]."</u>";
        $color='#DDDDFF';
        $cmp_yes++;
        }
      else {
        #$eee4=$max-1;
        #print $eee4." / ".$max." / ".$ccc->[$max-1]->[0]." / ".$ccc->[$max-2]->[0]." / ".$ccc->[$max]->[0]."<!--br-->";
        if (($max-2<0 || $ccc->[$max-2]->[0] eq "u") && ($ccc->[$max]->[0] eq "u" || $max>=$maxx) ) {
          #print "==<br>";
          #$cs=$max+1;
          next;
          }
        #print "<br>";
        $color='#EDEDED';
        }
      if ($cs!=$max) {
        print "<tr><td style='border-bottom:1px dashed #666666;padding-top:10px;' colspan='2'><div><b>".$max." str:</b></div></td></tr>\n";
        }
      $cs=$max+1;
      print "<tr bgcolor='".$color."'><td><div>".$ccc->[$max-1]->[2]."</div></td><td><div>".$ccc->[$max-1]->[1]."</div></td></tr>";
      }
    if ($cmp_yes==0) {
      print "<tr><td style='border-bottom:1px dashed #666666;padding-top:10px;' colspan='2'><div><i>Distinctions have not found</i></div></td></tr>\n";
      }
    print qq~</table><hr size=1>$ee->{$eid}->{"text_"}~;
    }
  }
elsif ($a eq "pd") {
  $id = $in->param("id");
  $id=~s/"/&quot;/g;
  $id=~ s/'/&\#39;/g;
  $id="" if $id eq "";
  if ($group<3) {
    print "Location:/cgi-bin/ee.cgi?id=$id\n\n";
    exit;
    }
  $id_=$dbh->quote($id);

  $qu="UPDATE $tenname SET dracola=1 where name =".$id_;
  ($dbh->do($qu)) or &error("$DBI::errstr");
  $qu="DELETE FROM $tbkname where name =".$id_;
  ($dbh->do($qu)) or &error("$DBI::errstr");
  print "Location:/cgi-bin/ee.cgi?id=$id\n\n";
  }

elsif ($a eq "slv") {
  $id = $in->param("id");
  $id=~s/"/&quot;/g;
  $id=~ s/'/&\#39;/g;
  $id="" if $id eq "";
  if ($user !="") {
    print "Location:/cgi-bin/ee.cgi?id=$id\n\n";
    exit;
    }
  $id_=$dbh->quote($id);

  $qu="select text_ from ".$prf."_ebak where name = ".$id_;
  $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
  ($myd->execute) or &error("$DBI::errstr");
  $txt_=$myd->fetchrow_array;
  $myd->finish;undef $myd;
  $txt_=$dbh->quote($txt_);

  $qu="UPDATE $tenname SET text_=$txt_,autor='',edit=now(),dracola=1 where name =".$id_;
  ($dbh->do($qu)) or &error("$DBI::errstr");
  $qu="DELETE FROM $tbkname where name =".$id_;
  ($dbh->do($qu)) or &error("$DBI::errstr");
  print "Location:/cgi-bin/ee.cgi?id=$id\n\n";
  }
elsif ($a eq "she") {
  $id=$in->param("id");
  if ($group<4) {
    print "Location:/cgi-bin/ee.cgi?id=$nm_\n\n";
    exit;
    }
  &shed;
  }
elsif ($a eq "she") {
  &shed;
  }
elsif ($a eq "logs") {
  &logs_show;
  }

elsif ($a eq "rn") {
  &rename;
  }
elsif ($a eq "rns") {
  &renames;
  }
elsif ($a eq "stat") {
  &stat;
  }

elsif ($a eq "shs") {
  $name=$in->param("nm");
  $id=$in->param("id");
  $shb=$in->param("shb");
  $error=0;
  $error=1 if $name eq "" || $shb eq "";
  
  if ($error!=0) {
    &shed;
    }
  else {
    $name=$dbh->quote($name);
    $txt=$dbh->quote($shb);

    if ($id==0) { #  
      $qu="INSERT INTO $tshname (name,shablon) values ($name,$txt)";
      ($dbh->do($qu)) or &error("$DBI::errstr");
      }
    else {
      $qu="UPDATE $tshname SET name=$name, shablon=$txt where id =".$id;
      ($dbh->do($qu)) or &error("$DBI::errstr");
      }
    undef $name;
    undef $txt;
    print "Location:/cgi-bin/ee.cgi\n\n";
    }
  }


else {
  print "Content-Type:text/html\n\n";
  $vok=1;
  &headprint($lng{"Unknown_Action"});
  print $lng{"Unknown_Notice"};
  }

if ($vok==1) {
  print qq~<div style='font-size:12px;line-height:10px;text-align:right'><br>$eout</div>~;
  &bottomprint($shead);
  }
print $aa if $group==5 && $vok==1;

close (STDERR);


################################################################
####      #####################################
################################################################

sub search {
  use utf8;
  use Encode;

  $sr = $in->param("sr");
  $sr=Encode::decode_utf8($sr);
  $sr=&persasp($sr);
  $sr=Encode::encode_utf8($sr);
  
  if ($sr eq "") {
    print qq~Location: /cgi-bin/index.cgi\n\n~;
    exit;
    }
  
  $shead->{"Serach_CGI"}='ee';
  $shead->{"JavaScript"}=qq~<link rel="stylesheet" href="/style_index.css" type="text/css" media="screen" />~;
  &headprint($lng{"Encyclopedia"}.": ".$lng{"Search"},$shead);

  my $sr_=$dbh->quote($sr);

  $qu="SELECT DISTINCT e.name 
       FROM ".$prf."_encyc e 
       WHERE  MATCH (e.text_) AGAINST ($sr_ IN BOOLEAN MODE) AND e.text_ NOT LIKE ':=%'
       ORDER BY MATCH (e.text_) AGAINST ($sr_ IN BOOLEAN MODE) DESC limit 0,30";
  my $myd= $dbh->prepare($qu);
  ($myd->execute) or &error("$DBI::errstr $qu");
  $news_=$myd->fetchall_arrayref;

  my @sr_list=split(/\s+/,$sr);
  foreach (@sr_list) {$_=~s/\*$/\\S\+/gs if $_=~/\*$/;}

  my $sr_str=join "|",@sr_list;
  $sr_str=Encode::decode_utf8($sr_str);

  require "search.pm";
    
  &out_sr_form("ee",$sr,2); #script,word,tip
  if (@$news_>0)  {
    my $news_out; my @news_data;
    foreach (@$news_) {
      
      my $nm_=$dbh->quote(@$_[0]);
     
      $qu="select id,name,view,autor,text_,DATE_FORMAT(edit,'%Y.%m.%d %H:%i') FROM ".$prf."_encyc WHERE name LIKE ".$nm_." ORDER BY id DESC";
      $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
      ($myd->execute) or &error("$DBI::errstr $qu");
      my ($e_id,$e_name,$e_view,$e_author,$e_text,$e_edit)=$myd->fetchrow_array;

      next if $e_text=~/^:=/;

      my $text='';

      $e_text=~s/<.+?>//gs;
      $e_text=Encode::decode_utf8($e_text);
  
      #print qq~<p>(.{0,100})($sr_str)(.{0,100})</p><p>$e_text</p>~;
      
      if ($e_text=~/(.{0,100})($sr_str)(.{0,100})/s) {
        if (length($1)==100) {
          $text='...'.$1;
          } else {$text=$1}
        $text.='<b>'.$2.'</b>';
        if (length($3)==100) {
          $text.=$3.'...';
          } else {$text.=$3}
        $text=qq~<p class='blog_line_search'>$text</p>~;
        }
      else {
        print qq~<p><b>$sr_str</b>: $e_text</p>~.utf8::is_utf8($e_text)." ".utf8::is_utf8($sr_str);
        }
     
      $text=Encode::encode_utf8($text);
  
      push @news_data,qq~<p class='blog_line' style='height:auto'><span class='index_date_main index_date_right'>$e_edit</span><span 
      class='blog_line_avatar'><img src='/images/encyc_search.png' width='32' height='32'></span><span style='margin-left: 48px;display: block;'><a href='/wiki/$e_name'>$e_name</a></span></p>$text~;
      }
  
    $news_out=join "",@news_data;
    
    print $news_out;
    }
  else {
    print qq~<p>$lng{"No_Search"}</p>~;
    }
  &out_sr_help;
  }

sub index {
#  use utf8;
#  use Encode;
  my $id_=shift;
  my $text=shift;

  
  $qu="DELETE FROM ".$tinname." where where_ =".$id_;
  ($dbh->do($qu)) or &error("$DBI::errstr");
  
  my $it=$text;

  # my $it = Encode::decode_utf8($text); 

  $it=~s/<.+?>//gs;
  $it=lc($it);
  $it=~s/\&[a-z]+;//gs;
  my @m=$it=~/([\x{410}-\x{4F5}\x{103}\x{102}\x{114}\x{115}\x{E7}\x{C7}]+)/gs;
 
  #my @m=split(/( |,|\!|\?|\-||\*|\(|\)|"|'|:|>|<|\/|\\|=|_|\+)+/,$text);

  my %words_;
  foreach (@m) {
    if (length($_)<3) {next;}
    else {
      $words_{$_}++;
      }
    }

  my $ii_;
  foreach my $iii (keys %words_) {

    $ii_=$dbh->quote($iii);

    $qu="select `word` from ".$prf."_words where alias = ".$ii_;
    $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
    ($myd->execute) or &error("$DBI::errstr");
    my $word=$myd->fetchrow_array;
    
    $myd->finish;undef $myd;
    
    my $worda=$dbh->quote($word);
    
    if ($word ne "") {
      $qu="select count(*) from ".$tinname." where word_=".$worda." and where_=".$id_;
      $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
      ($myd->execute) or &error("$DBI::errstr");
      my $cnt=$myd->fetchrow_array;
      $myd->finish;undef $myd;
      
      if ($cnt>0) {
        $qu="UPDATE ".$tinname." SET count_=count_+".$words_{$iii}." where word_=".$worda." and where_=".$id_;
        ($dbh->do($qu)) or &error("$DBI::errstr $qu");
        }
      else {
        if ($words_{$word} ne "") {
          $words_{$word}=$words_{$word}+$words_{$iii};
          }
        else {
          $qu="INSERT INTO ".$tinname." (word_,where_,count_) values (".$worda.",".$id_.",".$words_{$iii}.")";
          ($dbh->do($qu)) or &error("$DBI::errstr $qu");
          }
        }

      }
    else {
      $qu="select count(*) from ".$tinname." where word_=".$ii_." and where_=".$id_;
      $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
      ($myd->execute) or &error("$DBI::errstr");
      my $cnt=$myd->fetchrow_array;
      $myd->finish;undef $myd;

      if ($cnt>0) {
        $qu="UPDATE ".$tinname." SET count_=count_+".$words_{$iii}." where word_=".$ii_." and where_=".$id_;
        ($dbh->do($qu)) or &error("$DBI::errstr $qu");
        }
      else {
        $qu="INSERT INTO ".$tinname." (word_,where_,count_) values (".$ii_.",".$id_.",".$words_{$iii}.")";
        ($dbh->do($qu)) or &error("$DBI::errstr $qu");
        }
      }
    delete $words_{$iii};
    }
  }

sub wanted {
  my $name_=shift;
  my $it=shift;
  #   
  #  
  #  - 
  $qu="DELETE FROM ".$prf."_ewanted where where_=".$name_;
  ($dbh->do($qu)) or &error("$DBI::errstr $qu");

  $it=~s/<a href='\/wiki\/(.+?)'>/&want($1)/ges;
  }

sub want { #...
  my $v1=shift;
  my $v=$v1;
  
#  $v=~s/(..)/pack("C",hex($1))/eg;
  
  my $v_=$dbh->quote($v);
  
  $qu="select name from ".$prf."_encyc where name = ".$v_;
  $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
  ($myd->execute) or &error("$DBI::errstr");
  my $a=$myd->fetchrow_array;
  
  $myd->finish;undef $myd;
  if ($a eq "") {
    $qu="INSERT INTO ".$prf."_ewanted (name,where_) values ($v_,$id_)";
    ($dbh->do($qu)) or &error("$DBI::errstr $qu");
    }
  return("<a href='/wiki/$v1'>");
  }

sub rename {
  my $id = $in->param("id");
  my $sid = $in->param("sid");
  my $id_=$dbh->quote($id);
  my $sel;
  if ($sid ne "" && $sid!~/\D/) {
    $sel=' and id='.$sid;
    }
  $qu="select text_,dracola,type_,a_group from $tenname where name = ".$id_.$sel." order by id desc";
  $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
  ($myd->execute) or &error("$DBI::errstr ".$qu);
  ($k_,$dr,$rz_,$ag_)=$myd->fetchrow_array;
  $myd->finish;undef $myd;
  $text=&dnc($k_) if $text eq "";
  $rz=$rz_ if $rz eq "";
  $rz=0 if $rz eq "" || $rz eq "NULL";
  $ag_=$dac if $ag_ eq "";
  if ($group<3) {
    my $vv=$id;
    $vv=~s/(.)/unpack("H2",$1)/eg;
    print qq~Location: /cgi-bin/ee.cgi?id=$vv\n\n~;
    return;
    }
  $vok=1;
  $lng{"Article_Rename"}=~s/__ID__/$id/gs;
  &headprint($lng{"Article_Rename"});

  #$new=$id if $new eq "";

  if (keys %error) {
    print "<span style='color:red'>".$lng{"error"}.": </span><ul>";
    foreach my $var (sort keys %error) {
      print "<li style='list-style:none inside none;'>".$var.": ".$error{$var}."\n";
      }
    print "</ul><br>";
    }

  print qq~
  <table>
  <form action='/cgi-bin/ee.cgi' method='POST'>
  <input type='hidden' name='a' value='rns'>
  <input type='hidden' name='id' value='$id'>
  <tr><td><div>$lng{"Rename"}:</div></td><td><div>$id</div></td></tr>
  <tr><td><div>$lng{"New_Name"}:</div></td><td><input type='text' name='new' value='$new'></td></tr>
  $del_article
  <tr><td></td><td><input type='submit' value='$lng{"Rename_Button"}'></td></tr>
  </table>
  ~;
  }

sub renames {
  my $id = $in->param("id");
  my $id_=$dbh->quote($id);
  $qu="select text_,dracola,type_,a_group from ".$tenname." where name = ".$id_." order by id desc";
  $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
  ($myd->execute) or &error("$DBI::errstr ".$qu);
  ($k_,$dr,$rz_,$ag_)=$myd->fetchrow_array;
  $myd->finish;undef $myd;
  $text=&dnc($k_) if $text eq "";
  $rz=$rz_ if $rz eq "";
  $rz=0 if $rz eq "" || $rz eq "NULL";
  $ag_=$dac if $ag_ eq "";
  if ($group<3) {
    my $vv=$id;
    $vv=~s/(.)/unpack("H2",$1)/eg;
    print qq~Location: /cgi-bin/ee.cgi?id=$vv\n\n~;
    return;
    }

  $new = $in->param("new");
  my $new_=$dbh->quote($new);
  $del_article;
  if ($new eq "") {
    $error{"1"}=$lng{"Error_Rename_Empty_New"};
    }
  else {
    $qu="select count(*) from ".$tenname." where name = ".$new_;
    $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
    ($myd->execute) or &error("$DBI::errstr ".$qu);
    my $k_=$myd->fetchrow_array;
    $myd->finish;undef $myd;
    $error{"2"}=$lng{"Error_Rename_Enable_Article"} if $k_>0;
    $del_article='<tr><td colspan=2><div><input type="checkbox" name=\'del\'> '.$lng{"Delete_Existing"}.'</div></td></tr>';
    }
  if ($new eq $id) {
    my $vv=$id;
    #$vv=~s/(.)/unpack("H2",$1)/eg;
    print qq~Location: /wiki/$vv\n\n~;
    }

  if (keys %error) {
    &rename;
    return;
    }

  $qu="UPDATE ".$tenname." SET name=".$new_." WHERE name=".$id_;
  ($dbh->do($qu)) or &error("$DBI::errstr ".$qu);


  $ip = $ENV{'HTTP_X_FORWARDED_FOR'} || $ENV{'REMOTE_ADDR'};
  ($ip) = $ip =~ /^(.+?)(,|$)/;

  $ip=$dbh->quote($ip);
  if ($user ne "") {
    $at_=$dbh->quote($user);
    }
  else {
    $at_=$ip;
    }
  
  $fg=0;
  $fg=1 if $group>2;

  my $news=":=".$new;
  my $news_=$dbh->quote($news);
  $qu="INSERT INTO $tenname (name,text_,edit,ip,autor,dracola,type_,a_group) 
       values ($id_,$news_,now(),$ip,$at_,$fg,$rz,$ag_)";
  ($dbh->do($qu)) or &error("$DBI::errstr ".$qu);

  my $log_=$lng{"Log_Encyc_rename"};

  my $vv=$id;
  # $vv=~s/(.)/unpack("H2",$1)/eg;
  
  $log_=~s/__ID__/$id/gs;
  $log_=~s/__NEW__/$new/gs;
  &logs(1,'/wiki/'.$vv,$log_);

  print qq~Location: /wiki/$vv\n\n~;

  }


sub edit {
  $id = $in->param("id");
  my $sid = $in->param("sid");
  $sh = $in->param("sh");
  $id_=$dbh->quote($id);
  my $sel;
  if ($sid ne "" && $sid!~/\D/) {
    $sel=' and id='.$sid;
    }
  $qu="select text_,dracola,type_,a_group,id,text_source from $tenname where name = ".$id_.$sel." order by id desc";
  $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
  ($myd->execute) or &error("$DBI::errstr ".$qu);
  ($k_,$dr,$rz_,$ag_,$cid,$texts)=$myd->fetchrow_array;
  $myd->finish;undef $myd;
  
  if ($text eq "") {
    if ($texts eq "") {$text=&dnc($k_)}
    else {$text=$texts;
      $text=~s/(__$lng{"Category"}:.+?__(\n|))+//gs;
      }
    }
  #$text=&dnc($k_) if $text eq "";
  
  $rz=$rz_ if $rz eq "";
  $rz=0 if $rz eq "" || $rz eq "NULL";
  $ag_=$dac if $ag_ eq "";
  if ($group<$ag_) {
    $vv=$id;
    $vv=~s/(.)/unpack("H2",$1)/eg;
    print qq~Location: /cgi-bin/ee.cgi?id=$vv\n\n~;
    #print "";
    return;
    }
  $vok=1;
  $shead->{"NoRight"}=1;
  &headprint($id,$shead);

  print "<span class='warn'>".$lng{"error"}."</span>: ".$lng{"Error_Article_Name"}."<br><br>" if $error==1;
  print "<span class='warn'>".$lng{"error"}."</span>: ".$lng{"Error_Article_Alias"}."<br><br>" if $error==2;

  $id=~s/"/&quot;/g;
  $id=~ s/'/&\#39;/g;
  $out_rzd="<select name='rz'>";
  my $kr=@rzn;
  for(my $i=0;$i<$kr;$i++) {
    my $sel="";
    $sel=" selected" if $rz==$i;
    $out_rzd.="<option".$sel." value='".$i."'>".$rzn[$i]."</option>\n";
    }
  $out_rzd.="</select>";
  $text=~s/\n$//s;

  $qu="select id,name,shablon from $tshname ";
  $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
  ($myd->execute) or &error("$DBI::errstr");
  $shi=$myd->fetchall_arrayref;
  $myd->finish;undef $myd;
  $sh_out="";
  if ($text eq "" && @$shi>0) {
    $sh_out="<tr><td style='padding-left:0px;'>Шаблоны:</td><td>";
    foreach (@$shi) {
      $sh_out.=qq~ <a href="/cgi-bin/ee.cgi?a=e&id=$id&sh=@$_[0]">@$_[1]</a>~;
      $text=@$_[2] if @$_[0]==$sh && $sh!=0;
      }
    $sh_out.="</td></tr>";
    }

  my $tags;
  #
  if ($cid ne "" && $cid!~/\D/) {
    $qu="select name from ${prf}_encyc_tags where id = ".$cid;
    $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
    ($myd->execute) or &error("$DBI::errstr ".$qu);
    $tg_=$myd->fetchall_arrayref;
    foreach (@$tg_) {$_=@$_[0]}
    $tags=join ", ",@$tg_;
    }
  
  #Output group_access;.
  my $aout_group;
  if ($group>2 && $group>$ag_) {
    my $max=$group+1;
    my $min=0;
    $min=$ag_ if $group<4;
    if ($min<$max+1) {
      $aout_group= $lng{"Access_Groups"}.': <select name="access">';
      for (my $i=$min;$i<$max;$i++) {
        my $sel="";
        $sel=" selected" if $i==$ag_;
        $aout_group.='<option value="'.$i.'"'.$sel.'>'.$i.'</option>\n';
        }
      $aout_group.="</select>";
      }
    }

  my $help_link=$lng{"Help_Link"};
  $help_link=~s/(.)/unpack("H2",$1)/eg;

  $lng{"Text_Encyc_Notice"}=~s/__HELP__/<a href='\/e\/$help_link'>$lng{"Help_Link"}<\/a>/gs;

#	s = ':IMG:'+url+':'+alt+':';
  
  
  print <<HHH5;
<script>
var addImgWin

function addImgCallback(url, width, height, alt, zoom) {
	var s, t = document.getElementById('text');
	s = url;
	t.value += s;
	addImgWin.close();
	t.focus();
}

function addImg() {
	addImgWin = window.open("/cgi-bin/upload.cgi", "UPL", "width=400, height=500");
	return false;
}

</script>

<table border='0' cellpadding='0' cellspacing='0'>
<form id="editform" name="editform" action="/cgi-bin/ee.cgi" method="POST">
<input type='hidden' name='a' value='s'>
<input type='hidden' name='id' value='$id'>
$sh_out
<tr><td style='padding-left:0px;'>$lng{"Article_Name"}:</td><td><i>$id</i></td></tr>
<tr style='height:32px;'><td style='padding-left:0px;'>$lng{"Type"}:</td><td>$out_rzd $aout_group <a class='btn' href="#" onclick="addImg()">$lng{"Add_Image"}</a></td></tr>
<tr><td style='padding-left:0px;' valign='top'>$lng{"Opisanie"}:<br><br>
<span id="my-buttons" style='padding-bottom:5px;'>
$lng{"Spec_Bottoms"}
</span><br>
</td><td>
<span id="my-buttons" style='margin-bottom:5px;'>
<A href="javascript:insertTags('**','**','');" class='btn' title="$lng{"Bold_Font"}"><b>B</b></a>
<A href="javascript:insertTags('~~','~~','');" class='btn' title="$lng{"Italic_Font"}"><i>i</i></a>
<A href="javascript:insertTags('_','_','');" class='btn' title="$lng{"Underline_Font"}"><u>U</u></a>
<A href="javascript:insertTags('() **','**','');" class='btn' title="$lng{"Head_1"}">$lng{"Head"}1</a>
<A href="javascript:insertTags('() ','','');" class='btn' title="$lng{"Head_2"}">$lng{"Head"}2</a>
<A href="javascript:insertTags('\\n=====\\n','\\n=====\\n','');" class='btn' title="$lng{"Formating_Text"}">#</a>
<A href="javascript:insertTags(':IMG:','::','');" class='btn' title="$lng{"Add_Image"}">$lng{"Image"}</a>
<A href="javascript:insertTags('__','__','');" class='btn' title="Link"><span style='border-bottom:2px solid blue;'>Ab</span></a>
<A href="javascript:insertTags('>>','>>','');" class='btn' title="Align Right">&gt;T&gt;</a>
<A href="javascript:insertTags('>>','<<','');" class='btn' title="Align Center">&gt;T&lt;</a>
<A href="javascript:insertTags('<<','<<','');" class='btn' title="Align Left">&lt;T&lt;</a>
</span><br><br>
<textarea name='comm' id='text' style='height:566px;width:640px;'>$text</textarea>
</td></tr>
<tr><td valign='top'>$lng{"Content_Tags"}:</td><td><textarea name='tags' style='height:50px;width:700px;'>$tags</textarea></td></tr>
<tr><td> </td><td><input type="submit"  class='formbutton' value='$lng{"Send_Button"}'></td></tr>
</table>
$lng{"Text_Encyc_Notice"}
HHH5
  }

sub create {
  local $/ = undef;
  my $vv=shift;
  open (ff, $vv) || &error( "Error open $vv...");
  @sql = split /\;\n/, <ff>;
  close (ff);

  foreach (@sql) {
    next if /^\s+$/;
    my $myd = $dbh->prepare($_);
    ($myd->execute) or &error("$DBI::errstr $_");
    }
  print "Location: /main.shtml\n\n";
  }

sub prhead {
  print "Content-Type:text/html;charset='utf8'\n\n";
  print <<HH5;
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
<meta name="GENERATOR" content="FAR 1.70.5">
<meta http-equiv="cache-control" content="no-cache">
<link rel="stylesheet" href="/style.css" type="text/css">
</head>
<title>  ::$id</title>
<body style='font-size:12px;background-color:white' bgcolor="white" text=#654A41 link="#FAEADA" vlink="#FAEADA">
<img src='/ball_whi.gif'> <b>Chuvash.Org :: $lng{"Print_Version"}</b> :: $id<br><br>
HH5

  #banner
  $g_name=$prf."_banners.txt";
  $u_name=$prf."_banneru.txt";

  $b_name=$g_name;
  
  open (ff,$b_name);
  @rstr=<ff>;
  close (ff);
  $by=0;$byn=0;
  while ($by==0) {
    $lstrrs=@rstr;
    $rrrs=int(rand($lstrrs));
    @tb_=split(/\|/,$rstr[$rrrs]);
    $byn++;
    if ($tb_[1]<$tb_[2] || $byn>10) {
      $by=1;
      $banner=$tb_[3];
      $banner=~s/:n/\n/g;
      }
    }

  print qq~<div class='blog'>$banner</div><br>~;
  #end banner
  
  
  #require "rban.pm";
  print <<HH5;
</center>
HH5
}

sub shed {
  $id = $in->param("id");
  if ($id ne "" && $id!~/\D/) {
    $qu="select shablon,name from $tshname where id = ".$id;
    $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
    ($myd->execute) or &error("$DBI::errstr ".$qu);
    ($sh,$nm)=$myd->fetchrow_array;
    $myd->finish;undef $myd;
    $id=0 if $nm eq "";
    }
  $sh=$shb if $shb ne "";
  $nm=$name if $name ne "";
  &headprint($lng{"Template"}." ".$nm);
  $vok=1;
  print "<font color=red>".$lng{"error"}."</font>: ".$lng{"Error_Template_Empty"}."<br><br>" if $error==1;
  print <<HHH5;
<table border='0' cellpadding='0' cellspacing='0'>
<form action="/cgi-bin/ee.cgi" method="POST">
<input type='hidden' name='a' value='shs'>
<input type='hidden' name='id' value='$id'>
<tr><td>$lng{"Article_Name"}:</td><td><input type='text' name='nm' value='$nm'></td></tr> 
<tr><td valign='top'>$lng{"Template"}:</td><td><textarea style='height:366px;width:490px;' name='shb'>$sh</textarea></td></tr> 
<tr><td></td><td><input type='submit' class='formbutton' value='$lng{"Template_Buttom"}'></td></tr> 
</form></table>
HHH5
  }

sub logs_show {
  my $id = $in->param("id");
  my $p = $in->param("p");
  my $type = $in->param("type");
  my $name = $in->param("name");
  my @mnn=split(/,/,$lng{"Short_Month_Name"});

  $vok=1;
  &headprint($lng{"Show_Logs"}." ".$nm);
  
  my %sh;
  $sh{'0'}="link=".$dbh->quote($id) if $id ne "";
  $sh{'1'}="type=".$type if $type ne "" && $type !~/\D/;
  $sh{'2'}="link=".$dbh->quote($name) if $name ne "";
  my $search;
  foreach my $i (keys %sh) {
    $search.=" ".$sh{$i};
    }
  $search=" where".$search if $search ne "";

  $qu="select count(*) from ".$prf."_logs".$search;
  $myd=$dbh->prepare($qu) or &error("$DBI::errstr");
  ($myd->execute) or &error("$DBI::errstr ".$qu);
  my ($count)=$myd->fetchrow_array;
  $myd->finish;undef $myd;
  $n=50;
  $pages=int($count/$n);
  $pages++ if int($count/$n)!=$count/$n;
  $p=$pages if $p>$pages;
  $p=1 if $p<1;
  $st=$p*$n-$n;
  $st=0 if $st<0;

  $qu="select id,link,opis,DATE_FORMAT(`date`,'\%d.\%m.\%Y \%H:\%i'),`name` from ".$prf."_logs".$search." order by date desc limit ".$st.",".$n;
  my $myd= $dbh->prepare($qu);
  ($myd->execute) or &error("$DBI::errstr");
  my $rm_=$myd->fetchall_arrayref;
  $myd->finish;undef $myd;

  print qq~<table>~;
  my $li;
  my $dayn;
  
  foreach (@$rm_) {
    $li++; my $lis=$st+$li;
    my $curdn;
    if (@$_[3]=~/^(\d+)\.(\d+)/) {
      $curdn=qq~$mnn[$2], $1~;
      }
    if ($curdn ne $dayn) {
      print qq~<tr><td colspan='3'><h3 class='ch2'>$curdn</h3></td></tr>~;
      $dayn=$curdn;
      }
    @$_[4]=Encode::decode_utf8(@$_[4]);
#    @$_[2]=Encode::decode_utf8(@$_[2]);
    print qq~<tr><td><div>$lis.</div></td><td><div><a href='@$_[1]'>@$_[2]</a></div></td><td><div style='padding-left:20px;'>@$_[4] (<i>@$_[3]</i>)</div></td>~;
    }
  print qq~</table>~;
    if ($pages>1) {
    print "<div>".$lng{"Pages"}.": ";
    $sn=$p-10;
    $sn=1 if $sn<1;
    $en=$p+10;
    $en=$pages if $en>$pages;
    print " <a href='/cgi-bin/ee.cgi?a=logs&p=1&name=$name&link=$link&type=$type'>1</a> " if $sn>1;

    print " ... " if $sn>2;
    
    for (my $ii=$sn;$ii<$en+1;$ii++) {
      if ($ii!=$p) {
        print "<a href='/cgi-bin/ee.cgi?a=logs&p=$ii&name=$name&link=$link&type=$type'>".$ii."</a>";
        }
      else {print " <b>\[".$ii."\]</b>"}
      print ", " if $ii!=$pages;
      }
    print " ..." if $en<$pages-1;

    print "<a href='/cgi-bin/ee.cgi?a=logs&p=$pages&name=$name&link=$link&type=$type'>".$pages."</a>" if $en<$pages;
    print "</div>\n";
    }

  }

##=========================================================================================================================
sub stat {
  $vok=1;
  &headprint($lng{"Show_Stats"});
  $qu="select count(*) from all_users";
  my $myd= $dbh->prepare($qu);
  ($myd->execute) or &error("$DBI::errstr");
  my $user_count=$myd->fetchrow_array;
  $myd->finish;undef $myd;
  $qu="select count(distinct name) from ".$prf."_encyc";
  my $myd= $dbh->prepare($qu);
  ($myd->execute) or &error("$DBI::errstr");
  my $cont_count=$myd->fetchrow_array;
  $myd->finish;undef $myd;
  $qu="select word_, sum(count_) cd from ".$prf."_eindex group by word_ order by cd desc limit 0,20 ";
  my $myd= $dbh->prepare($qu);
  ($myd->execute) or &error("$DBI::errstr <br>".$qu);
  my $w_count=$myd->fetchall_arrayref;
  $myd->finish;undef $myd;
  print "<img src='/ball_whi.gif'> <b>".$lng{"Show_User_Count"}.": <i><u>".$user_count."</u></i></b><br><img src='/ball_whi.gif'>
  <b>".$lng{"Show_Content_Count"}.": <i><u>".$cont_count."</u></i></b><br><img src='/ball_whi.gif'> <b>".$lng{"Show_Max_Use_Words"}."</b>:
  <table style='padding-left:50px;'>";

  foreach (@$w_count) {
    print "<tr><td><div><a href='/cgi-bin/ee.cgi?a=vv&sr=".@$_[0]."'>".@$_[0]."</a>:</div></td><td><div>".@$_[1]."</div></td></tr>\n";
    }
  print "</table><br><img src='/ball_whi.gif'> <b>".$lng{"Show_Max_Edit"}."</b>:
  <table style='padding-left:50px;'>";

  $qu="select name, count(name) cd from ".$prf."_encyc group by name order by cd desc limit 0,20 ";
  my $myd= $dbh->prepare($qu);
  ($myd->execute) or &error("$DBI::errstr <br>".$qu);
  my $w_count=$myd->fetchall_arrayref;
  $myd->finish;undef $myd;
  foreach (@$w_count) {
    my $vv=@$_[0];
    #$vv=~s/(.)/unpack("H2",$1)/eg;
    $vv=~s/1/\%31/g;

    print "<tr><td><div><a href='/wiki/".$vv."'>".@$_[0]."</a>:</div></td><td><div>".@$_[1]."</div></td></tr>\n";
    }

  print "</table><br><img src='/ball_whi.gif'> <b>".$lng{"Show_Max_Views"}."</b>:
  <table style='padding-left:50px;'>";

  $qu="select distinct name, view cd from ".$prf."_encyc group by name order by cd desc limit 0,20 ";
  my $myd= $dbh->prepare($qu);
  ($myd->execute) or &error("$DBI::errstr <br>".$qu);
  my $w_count=$myd->fetchall_arrayref;
  $myd->finish;undef $myd;
  foreach (@$w_count) {
    my $vv=@$_[0];
    #$vv=~s/(.)/unpack("H2",$1)/eg;
    $vv=~s/1/\%31/g;

    print "<tr><td><div><a href='/wiki/".$vv."'>".@$_[0]."</a>:</div></td><td><div>".@$_[1]."</div></td></tr>\n";
    }
  
  print "</table><br><img src='/ball_whi.gif'> <b>".$lng{"Show_Max_Edit_Users"}."</b>:
  <table style='padding-left:50px;'>";

  $qu="select autor, count(autor) cd from ".$prf."_encyc group by autor order by cd desc limit 0,20 ";
  my $myd= $dbh->prepare($qu);
  ($myd->execute) or &error("$DBI::errstr <br>".$qu);
  my $w_count=$myd->fetchall_arrayref;
  $myd->finish;undef $myd;
  foreach (@$w_count) {
    print "<tr><td><div><a href='/cgi-bin/user.cgi?a=vv&anketa=".@$_[0]."'>".@$_[0]."</a>:</div></td><td><div>".@$_[1]."</div></td></tr>\n";
    }
  print "</table>";
  
  }

sub save_query {
  my $vv2=shift;

  my ($day,$month,$year,$hour,$minute)=(localtime)[3,4,5,2,1];
  my $dataedit=sprintf "%02d.%02d.%04d %02d:%02d",$day,$month+1,$year+1900,$hour,$minute;

  open (FF2,">>_query_out.log");
  print FF2 $dataedit.": ".$vv2."\n";
  close (FF2);

  }

