Database server not responding.
Try later.
",Dumper(@_),"\\n"; } ###################################################################### sub error { # Показать сообщение об ошибке в режиме администрирования my $msg = shift; return ${$Response->TrapInclude("page_error.asp", $msg)}; } ####################################################################### sub logdata { # ($message) # Записать в лог-файл сообщение my $message = shift; open(LOG, ">>$log_file") || die "Can\'t write LOG ($log_file), $!\\n"; print LOG udate_to_string(time)." - $remoteaddr - $userinfo{username} - $SERVER->{\'SCRIPT_NAME\'} - $message\\n"; close(LOG); } ####################################################################### sub custom_log { # ($message) # Записать в отдельный лог-файл сообщение my $message = shift; open(LOG, ">>$site_path/datafiles/custom.log") || die "Can\'t write LOG (custom.log), $!\\n"; print LOG udate_to_string(time)." $remoteaddr $userinfo{username} - $message\\n"; close(LOG); } ###################################################################### sub udate_to_string { # ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени my $unixtime = shift; my $dchar = shift || ""; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; my $r = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%02d.%02d.%04d",$mday,$mon,$year); } if ($dchar eq "t") { $r = sprintf("%02d:%02d:%02d",$hour,$min,$sec); } return $r; } ###################################################################### sub udate_to_rus_string {# ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени с русскими названиями my $unixtime = shift; my $dchar = shift || ""; my @W = qw(воскресенье понедельник вторник среда четверг пятница суббота); my @M = qw(января февраля марта апреля мая июня июля августа сентября октября ноября декабря); my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($unixtime); $year += 1900; my $r = sprintf("%d %s %04d г. %s, %02d:%02d:%02d",$mday,$M[$mon],$year, $W[$wday], $hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%d %s %04d г. %s",$mday,$M[$mon],$year,$W[$wday]); } return $r; } ###################################################################### sub datetime2utime { # ($date) # in dd.mm.yyyy hh:mm:ss # преобразовать формат даты и времени в UNIXTIME my $xdate = shift; $xdate =~ s/(\\d+)\\.(\\d+)\\.(\\d+)\\s(\\d+):(\\d+):(\\d+)/$3-$2-$1 $4:$5:$6/; return str2time($xdate); } ###################################################################### sub my2date { # преобразовать формат даты MySQL в нормальную дату return sprintf("%02d.%02d.%04d", $3,$2,$1) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)/); return ""; } ###################################################################### sub my2datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время return sprintf("%02d.%02d.%04d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub date2my { # преобразовать нормальную дату формат даты MySQL return sprintf("%04d-%02d-%02d", $3,$2,$1) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)/); return ""; } ###################################################################### sub datetime2my { # преобразовать нормальную дату и время в формат даты и времени MySQL return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub utime2my { # преобразовать UNIXTIME в формат даты и времени MySQL my $unixtime = shift; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; return sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec); } ###################################################################### sub my2rus_datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время с русскими названиями my $mydt = shift; my $dchar = shift; return udate_to_rus_string(str2time($mydt), $dchar); } ###################################################################### sub exist_in_list { # ($value, @list) # проверить существование значения $val в списке @list my ($val, @list) = @_; foreach my $v (@list) { return 1 if ($val eq $v); } return 0; } ###################################################################### sub uri_remove_key { # ($query_string, $key) # удаляет из HTTP строки запроса указанный ключ со значением my $x_uri = shift; my $x_key = shift; my @r_uri = (); my @x_pairs = $x_uri =~ m!^([\\?\\/]*)(\\S+)$!; $x_uri = $x_pairs[1]; my @a_uri = split(/&/, $x_uri); foreach my $p (@a_uri) { my ($k, $v) = split(/=/, $p); push(@r_uri, $p) if (!(lc($k) eq lc($x_key))); } $x_uri = \'/\'; $x_uri = $x_pairs[0] . join(\'&\', @r_uri) if (@r_uri); return $x_uri; } ###################################################################### sub js_redirect { # (url, frame) # сделать редирект средствами javascript my ($url, $frame) = @_; my $location = qq{location.href="$url";}; $location = qq{window.parent.frames[\'$frame\'].location.href=\'$url\';} if ($frame); print "\\n\\n"; } ###################################################################### sub navigator { # отобразить навигатор (путь с корня до страницы) my @a = (\'Начало\'); # if $sid in internal section (#6) - don\'t show any information my $rootsec = @treewalk[$#treewalk]; if ( (!$localnet) && ($rootsec->[0] == 6) ) { # ... } else { foreach my $i (reverse @treewalk) { push(@a, qq{$i->[1]}) if ($i->[0] > 0); } } return join(\'
\', @a);
}
######################################################################
sub get_config_value {
my $varname = shift;
my ($varvalue) = getonerec("select varvalue from options where varname = \'$varname\'");
return $varvalue;
}
######################################################################
sub store_config_value {
my ($varname, $varvalue) = @_;
my $query = "update options set varvalue=? where varname=?";
my $st = $db->prepare($query) || print $db->errstr, ", query:[$query]
Page One\',
\'
Page Two\',
\'
Page Three\'
);
my $ctsh;
$ctsh = $FORM->{ctsh};
$ctsh = $QUERY->{ctsh} if ($ctsh eq \'\');
print tablist(-1, \'\', \'tabsheet\', \'fcs\', ($ctsh =~ m/[012]/)?$ctsh:0, @tabs);
%#>
=cut
my $css = qq[
];
my $javascript = qq[
\\n"; # stupid bug...
$out .= qq{\\n
$sid/$pid !
!i;
$str =~ s!
!
!i;
$str =~ s!
Database server not responding.
Try later.
",Dumper(@_),"\\n"; } ###################################################################### sub error { # Показать сообщение об ошибке в режиме администрирования my $msg = shift; return ${$Response->TrapInclude("page_error.asp", $msg)}; } ####################################################################### sub logdata { # ($message) # Записать в лог-файл сообщение my $message = shift; open(LOG, ">>$log_file") || die "Can\'t write LOG ($log_file), $!\\n"; print LOG udate_to_string(time)." - $remoteaddr - $userinfo{username} - $SERVER->{\'SCRIPT_NAME\'} - $message\\n"; close(LOG); } ####################################################################### sub custom_log { # ($message) # Записать в отдельный лог-файл сообщение my $message = shift; open(LOG, ">>$site_path/datafiles/custom.log") || die "Can\'t write LOG (custom.log), $!\\n"; print LOG udate_to_string(time)." $remoteaddr $userinfo{username} - $message\\n"; close(LOG); } ###################################################################### sub udate_to_string { # ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени my $unixtime = shift; my $dchar = shift || ""; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; my $r = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%02d.%02d.%04d",$mday,$mon,$year); } if ($dchar eq "t") { $r = sprintf("%02d:%02d:%02d",$hour,$min,$sec); } return $r; } ###################################################################### sub udate_to_rus_string {# ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени с русскими названиями my $unixtime = shift; my $dchar = shift || ""; my @W = qw(воскресенье понедельник вторник среда четверг пятница суббота); my @M = qw(января февраля марта апреля мая июня июля августа сентября октября ноября декабря); my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($unixtime); $year += 1900; my $r = sprintf("%d %s %04d г. %s, %02d:%02d:%02d",$mday,$M[$mon],$year, $W[$wday], $hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%d %s %04d г. %s",$mday,$M[$mon],$year,$W[$wday]); } return $r; } ###################################################################### sub datetime2utime { # ($date) # in dd.mm.yyyy hh:mm:ss # преобразовать формат даты и времени в UNIXTIME my $xdate = shift; $xdate =~ s/(\\d+)\\.(\\d+)\\.(\\d+)\\s(\\d+):(\\d+):(\\d+)/$3-$2-$1 $4:$5:$6/; return str2time($xdate); } ###################################################################### sub my2date { # преобразовать формат даты MySQL в нормальную дату return sprintf("%02d.%02d.%04d", $3,$2,$1) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)/); return ""; } ###################################################################### sub my2datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время return sprintf("%02d.%02d.%04d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub date2my { # преобразовать нормальную дату формат даты MySQL return sprintf("%04d-%02d-%02d", $3,$2,$1) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)/); return ""; } ###################################################################### sub datetime2my { # преобразовать нормальную дату и время в формат даты и времени MySQL return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub utime2my { # преобразовать UNIXTIME в формат даты и времени MySQL my $unixtime = shift; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; return sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec); } ###################################################################### sub my2rus_datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время с русскими названиями my $mydt = shift; my $dchar = shift; return udate_to_rus_string(str2time($mydt), $dchar); } ###################################################################### sub exist_in_list { # ($value, @list) # проверить существование значения $val в списке @list my ($val, @list) = @_; foreach my $v (@list) { return 1 if ($val eq $v); } return 0; } ###################################################################### sub uri_remove_key { # ($query_string, $key) # удаляет из HTTP строки запроса указанный ключ со значением my $x_uri = shift; my $x_key = shift; my @r_uri = (); my @x_pairs = $x_uri =~ m!^([\\?\\/]*)(\\S+)$!; $x_uri = $x_pairs[1]; my @a_uri = split(/&/, $x_uri); foreach my $p (@a_uri) { my ($k, $v) = split(/=/, $p); push(@r_uri, $p) if (!(lc($k) eq lc($x_key))); } $x_uri = \'/\'; $x_uri = $x_pairs[0] . join(\'&\', @r_uri) if (@r_uri); return $x_uri; } ###################################################################### sub js_redirect { # (url, frame) # сделать редирект средствами javascript my ($url, $frame) = @_; my $location = qq{location.href="$url";}; $location = qq{window.parent.frames[\'$frame\'].location.href=\'$url\';} if ($frame); print "\\n\\n"; } ###################################################################### sub navigator { # отобразить навигатор (путь с корня до страницы) my @a = (\'Начало\'); # if $sid in internal section (#6) - don\'t show any information my $rootsec = @treewalk[$#treewalk]; if ( (!$localnet) && ($rootsec->[0] == 6) ) { # ... } else { foreach my $i (reverse @treewalk) { push(@a, qq{$i->[1]}) if ($i->[0] > 0); } } return join(\'
\', @a);
}
######################################################################
sub get_config_value {
my $varname = shift;
my ($varvalue) = getonerec("select varvalue from options where varname = \'$varname\'");
return $varvalue;
}
######################################################################
sub store_config_value {
my ($varname, $varvalue) = @_;
my $query = "update options set varvalue=? where varname=?";
my $st = $db->prepare($query) || print $db->errstr, ", query:[$query]
Page One\',
\'
Page Two\',
\'
Page Three\'
);
my $ctsh;
$ctsh = $FORM->{ctsh};
$ctsh = $QUERY->{ctsh} if ($ctsh eq \'\');
print tablist(-1, \'\', \'tabsheet\', \'fcs\', ($ctsh =~ m/[012]/)?$ctsh:0, @tabs);
%#>
=cut
my $css = qq[
];
my $javascript = qq[
\\n"; # stupid bug...
$out .= qq{\\n
$sid/$pid !
!i;
$str =~ s!
!
!i;
$str =~ s!
Database server not responding.
Try later.
",Dumper(@_),"\\n"; } ###################################################################### sub error { # Показать сообщение об ошибке в режиме администрирования my $msg = shift; return ${$Response->TrapInclude("page_error.asp", $msg)}; } ####################################################################### sub logdata { # ($message) # Записать в лог-файл сообщение my $message = shift; open(LOG, ">>$log_file") || die "Can\'t write LOG ($log_file), $!\\n"; print LOG udate_to_string(time)." - $remoteaddr - $userinfo{username} - $SERVER->{\'SCRIPT_NAME\'} - $message\\n"; close(LOG); } ####################################################################### sub custom_log { # ($message) # Записать в отдельный лог-файл сообщение my $message = shift; open(LOG, ">>$site_path/datafiles/custom.log") || die "Can\'t write LOG (custom.log), $!\\n"; print LOG udate_to_string(time)." $remoteaddr $userinfo{username} - $message\\n"; close(LOG); } ###################################################################### sub udate_to_string { # ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени my $unixtime = shift; my $dchar = shift || ""; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; my $r = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%02d.%02d.%04d",$mday,$mon,$year); } if ($dchar eq "t") { $r = sprintf("%02d:%02d:%02d",$hour,$min,$sec); } return $r; } ###################################################################### sub udate_to_rus_string {# ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени с русскими названиями my $unixtime = shift; my $dchar = shift || ""; my @W = qw(воскресенье понедельник вторник среда четверг пятница суббота); my @M = qw(января февраля марта апреля мая июня июля августа сентября октября ноября декабря); my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($unixtime); $year += 1900; my $r = sprintf("%d %s %04d г. %s, %02d:%02d:%02d",$mday,$M[$mon],$year, $W[$wday], $hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%d %s %04d г. %s",$mday,$M[$mon],$year,$W[$wday]); } return $r; } ###################################################################### sub datetime2utime { # ($date) # in dd.mm.yyyy hh:mm:ss # преобразовать формат даты и времени в UNIXTIME my $xdate = shift; $xdate =~ s/(\\d+)\\.(\\d+)\\.(\\d+)\\s(\\d+):(\\d+):(\\d+)/$3-$2-$1 $4:$5:$6/; return str2time($xdate); } ###################################################################### sub my2date { # преобразовать формат даты MySQL в нормальную дату return sprintf("%02d.%02d.%04d", $3,$2,$1) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)/); return ""; } ###################################################################### sub my2datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время return sprintf("%02d.%02d.%04d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub date2my { # преобразовать нормальную дату формат даты MySQL return sprintf("%04d-%02d-%02d", $3,$2,$1) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)/); return ""; } ###################################################################### sub datetime2my { # преобразовать нормальную дату и время в формат даты и времени MySQL return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub utime2my { # преобразовать UNIXTIME в формат даты и времени MySQL my $unixtime = shift; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; return sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec); } ###################################################################### sub my2rus_datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время с русскими названиями my $mydt = shift; my $dchar = shift; return udate_to_rus_string(str2time($mydt), $dchar); } ###################################################################### sub exist_in_list { # ($value, @list) # проверить существование значения $val в списке @list my ($val, @list) = @_; foreach my $v (@list) { return 1 if ($val eq $v); } return 0; } ###################################################################### sub uri_remove_key { # ($query_string, $key) # удаляет из HTTP строки запроса указанный ключ со значением my $x_uri = shift; my $x_key = shift; my @r_uri = (); my @x_pairs = $x_uri =~ m!^([\\?\\/]*)(\\S+)$!; $x_uri = $x_pairs[1]; my @a_uri = split(/&/, $x_uri); foreach my $p (@a_uri) { my ($k, $v) = split(/=/, $p); push(@r_uri, $p) if (!(lc($k) eq lc($x_key))); } $x_uri = \'/\'; $x_uri = $x_pairs[0] . join(\'&\', @r_uri) if (@r_uri); return $x_uri; } ###################################################################### sub js_redirect { # (url, frame) # сделать редирект средствами javascript my ($url, $frame) = @_; my $location = qq{location.href="$url";}; $location = qq{window.parent.frames[\'$frame\'].location.href=\'$url\';} if ($frame); print "\\n\\n"; } ###################################################################### sub navigator { # отобразить навигатор (путь с корня до страницы) my @a = (\'Начало\'); # if $sid in internal section (#6) - don\'t show any information my $rootsec = @treewalk[$#treewalk]; if ( (!$localnet) && ($rootsec->[0] == 6) ) { # ... } else { foreach my $i (reverse @treewalk) { push(@a, qq{$i->[1]}) if ($i->[0] > 0); } } return join(\'
\', @a);
}
######################################################################
sub get_config_value {
my $varname = shift;
my ($varvalue) = getonerec("select varvalue from options where varname = \'$varname\'");
return $varvalue;
}
######################################################################
sub store_config_value {
my ($varname, $varvalue) = @_;
my $query = "update options set varvalue=? where varname=?";
my $st = $db->prepare($query) || print $db->errstr, ", query:[$query]
Page One\',
\'
Page Two\',
\'
Page Three\'
);
my $ctsh;
$ctsh = $FORM->{ctsh};
$ctsh = $QUERY->{ctsh} if ($ctsh eq \'\');
print tablist(-1, \'\', \'tabsheet\', \'fcs\', ($ctsh =~ m/[012]/)?$ctsh:0, @tabs);
%#>
=cut
my $css = qq[
];
my $javascript = qq[
\\n"; # stupid bug...
$out .= qq{\\n
$sid/$pid !
!i;
$str =~ s!
!
!i;
$str =~ s!
Database server not responding.
Try later.
",Dumper(@_),"\\n"; } ###################################################################### sub error { # Показать сообщение об ошибке в режиме администрирования my $msg = shift; return ${$Response->TrapInclude("page_error.asp", $msg)}; } ####################################################################### sub logdata { # ($message) # Записать в лог-файл сообщение my $message = shift; open(LOG, ">>$log_file") || die "Can\'t write LOG ($log_file), $!\\n"; print LOG udate_to_string(time)." - $remoteaddr - $userinfo{username} - $SERVER->{\'SCRIPT_NAME\'} - $message\\n"; close(LOG); } ####################################################################### sub custom_log { # ($message) # Записать в отдельный лог-файл сообщение my $message = shift; open(LOG, ">>$site_path/datafiles/custom.log") || die "Can\'t write LOG (custom.log), $!\\n"; print LOG udate_to_string(time)." $remoteaddr $userinfo{username} - $message\\n"; close(LOG); } ###################################################################### sub udate_to_string { # ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени my $unixtime = shift; my $dchar = shift || ""; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; my $r = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%02d.%02d.%04d",$mday,$mon,$year); } if ($dchar eq "t") { $r = sprintf("%02d:%02d:%02d",$hour,$min,$sec); } return $r; } ###################################################################### sub udate_to_rus_string {# ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени с русскими названиями my $unixtime = shift; my $dchar = shift || ""; my @W = qw(воскресенье понедельник вторник среда четверг пятница суббота); my @M = qw(января февраля марта апреля мая июня июля августа сентября октября ноября декабря); my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($unixtime); $year += 1900; my $r = sprintf("%d %s %04d г. %s, %02d:%02d:%02d",$mday,$M[$mon],$year, $W[$wday], $hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%d %s %04d г. %s",$mday,$M[$mon],$year,$W[$wday]); } return $r; } ###################################################################### sub datetime2utime { # ($date) # in dd.mm.yyyy hh:mm:ss # преобразовать формат даты и времени в UNIXTIME my $xdate = shift; $xdate =~ s/(\\d+)\\.(\\d+)\\.(\\d+)\\s(\\d+):(\\d+):(\\d+)/$3-$2-$1 $4:$5:$6/; return str2time($xdate); } ###################################################################### sub my2date { # преобразовать формат даты MySQL в нормальную дату return sprintf("%02d.%02d.%04d", $3,$2,$1) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)/); return ""; } ###################################################################### sub my2datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время return sprintf("%02d.%02d.%04d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub date2my { # преобразовать нормальную дату формат даты MySQL return sprintf("%04d-%02d-%02d", $3,$2,$1) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)/); return ""; } ###################################################################### sub datetime2my { # преобразовать нормальную дату и время в формат даты и времени MySQL return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub utime2my { # преобразовать UNIXTIME в формат даты и времени MySQL my $unixtime = shift; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; return sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec); } ###################################################################### sub my2rus_datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время с русскими названиями my $mydt = shift; my $dchar = shift; return udate_to_rus_string(str2time($mydt), $dchar); } ###################################################################### sub exist_in_list { # ($value, @list) # проверить существование значения $val в списке @list my ($val, @list) = @_; foreach my $v (@list) { return 1 if ($val eq $v); } return 0; } ###################################################################### sub uri_remove_key { # ($query_string, $key) # удаляет из HTTP строки запроса указанный ключ со значением my $x_uri = shift; my $x_key = shift; my @r_uri = (); my @x_pairs = $x_uri =~ m!^([\\?\\/]*)(\\S+)$!; $x_uri = $x_pairs[1]; my @a_uri = split(/&/, $x_uri); foreach my $p (@a_uri) { my ($k, $v) = split(/=/, $p); push(@r_uri, $p) if (!(lc($k) eq lc($x_key))); } $x_uri = \'/\'; $x_uri = $x_pairs[0] . join(\'&\', @r_uri) if (@r_uri); return $x_uri; } ###################################################################### sub js_redirect { # (url, frame) # сделать редирект средствами javascript my ($url, $frame) = @_; my $location = qq{location.href="$url";}; $location = qq{window.parent.frames[\'$frame\'].location.href=\'$url\';} if ($frame); print "\\n\\n"; } ###################################################################### sub navigator { # отобразить навигатор (путь с корня до страницы) my @a = (\'Начало\'); # if $sid in internal section (#6) - don\'t show any information my $rootsec = @treewalk[$#treewalk]; if ( (!$localnet) && ($rootsec->[0] == 6) ) { # ... } else { foreach my $i (reverse @treewalk) { push(@a, qq{$i->[1]}) if ($i->[0] > 0); } } return join(\'
\', @a);
}
######################################################################
sub get_config_value {
my $varname = shift;
my ($varvalue) = getonerec("select varvalue from options where varname = \'$varname\'");
return $varvalue;
}
######################################################################
sub store_config_value {
my ($varname, $varvalue) = @_;
my $query = "update options set varvalue=? where varname=?";
my $st = $db->prepare($query) || print $db->errstr, ", query:[$query]
Page One\',
\'
Page Two\',
\'
Page Three\'
);
my $ctsh;
$ctsh = $FORM->{ctsh};
$ctsh = $QUERY->{ctsh} if ($ctsh eq \'\');
print tablist(-1, \'\', \'tabsheet\', \'fcs\', ($ctsh =~ m/[012]/)?$ctsh:0, @tabs);
%#>
=cut
my $css = qq[
];
my $javascript = qq[
\\n"; # stupid bug...
$out .= qq{\\n
$sid/$pid !
!i;
$str =~ s!
!
!i;
$str =~ s!
Database server not responding.
Try later.
",Dumper(@_),"\\n"; } ###################################################################### sub error { # Показать сообщение об ошибке в режиме администрирования my $msg = shift; return ${$Response->TrapInclude("page_error.asp", $msg)}; } ####################################################################### sub logdata { # ($message) # Записать в лог-файл сообщение my $message = shift; open(LOG, ">>$log_file") || die "Can\'t write LOG ($log_file), $!\\n"; print LOG udate_to_string(time)." - $remoteaddr - $userinfo{username} - $SERVER->{\'SCRIPT_NAME\'} - $message\\n"; close(LOG); } ####################################################################### sub custom_log { # ($message) # Записать в отдельный лог-файл сообщение my $message = shift; open(LOG, ">>$site_path/datafiles/custom.log") || die "Can\'t write LOG (custom.log), $!\\n"; print LOG udate_to_string(time)." $remoteaddr $userinfo{username} - $message\\n"; close(LOG); } ###################################################################### sub udate_to_string { # ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени my $unixtime = shift; my $dchar = shift || ""; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; my $r = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%02d.%02d.%04d",$mday,$mon,$year); } if ($dchar eq "t") { $r = sprintf("%02d:%02d:%02d",$hour,$min,$sec); } return $r; } ###################################################################### sub udate_to_rus_string {# ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени с русскими названиями my $unixtime = shift; my $dchar = shift || ""; my @W = qw(воскресенье понедельник вторник среда четверг пятница суббота); my @M = qw(января февраля марта апреля мая июня июля августа сентября октября ноября декабря); my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($unixtime); $year += 1900; my $r = sprintf("%d %s %04d г. %s, %02d:%02d:%02d",$mday,$M[$mon],$year, $W[$wday], $hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%d %s %04d г. %s",$mday,$M[$mon],$year,$W[$wday]); } return $r; } ###################################################################### sub datetime2utime { # ($date) # in dd.mm.yyyy hh:mm:ss # преобразовать формат даты и времени в UNIXTIME my $xdate = shift; $xdate =~ s/(\\d+)\\.(\\d+)\\.(\\d+)\\s(\\d+):(\\d+):(\\d+)/$3-$2-$1 $4:$5:$6/; return str2time($xdate); } ###################################################################### sub my2date { # преобразовать формат даты MySQL в нормальную дату return sprintf("%02d.%02d.%04d", $3,$2,$1) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)/); return ""; } ###################################################################### sub my2datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время return sprintf("%02d.%02d.%04d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub date2my { # преобразовать нормальную дату формат даты MySQL return sprintf("%04d-%02d-%02d", $3,$2,$1) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)/); return ""; } ###################################################################### sub datetime2my { # преобразовать нормальную дату и время в формат даты и времени MySQL return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub utime2my { # преобразовать UNIXTIME в формат даты и времени MySQL my $unixtime = shift; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; return sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec); } ###################################################################### sub my2rus_datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время с русскими названиями my $mydt = shift; my $dchar = shift; return udate_to_rus_string(str2time($mydt), $dchar); } ###################################################################### sub exist_in_list { # ($value, @list) # проверить существование значения $val в списке @list my ($val, @list) = @_; foreach my $v (@list) { return 1 if ($val eq $v); } return 0; } ###################################################################### sub uri_remove_key { # ($query_string, $key) # удаляет из HTTP строки запроса указанный ключ со значением my $x_uri = shift; my $x_key = shift; my @r_uri = (); my @x_pairs = $x_uri =~ m!^([\\?\\/]*)(\\S+)$!; $x_uri = $x_pairs[1]; my @a_uri = split(/&/, $x_uri); foreach my $p (@a_uri) { my ($k, $v) = split(/=/, $p); push(@r_uri, $p) if (!(lc($k) eq lc($x_key))); } $x_uri = \'/\'; $x_uri = $x_pairs[0] . join(\'&\', @r_uri) if (@r_uri); return $x_uri; } ###################################################################### sub js_redirect { # (url, frame) # сделать редирект средствами javascript my ($url, $frame) = @_; my $location = qq{location.href="$url";}; $location = qq{window.parent.frames[\'$frame\'].location.href=\'$url\';} if ($frame); print "\\n\\n"; } ###################################################################### sub navigator { # отобразить навигатор (путь с корня до страницы) my @a = (\'Начало\'); # if $sid in internal section (#6) - don\'t show any information my $rootsec = @treewalk[$#treewalk]; if ( (!$localnet) && ($rootsec->[0] == 6) ) { # ... } else { foreach my $i (reverse @treewalk) { push(@a, qq{$i->[1]}) if ($i->[0] > 0); } } return join(\'
\', @a);
}
######################################################################
sub get_config_value {
my $varname = shift;
my ($varvalue) = getonerec("select varvalue from options where varname = \'$varname\'");
return $varvalue;
}
######################################################################
sub store_config_value {
my ($varname, $varvalue) = @_;
my $query = "update options set varvalue=? where varname=?";
my $st = $db->prepare($query) || print $db->errstr, ", query:[$query]
Page One\',
\'
Page Two\',
\'
Page Three\'
);
my $ctsh;
$ctsh = $FORM->{ctsh};
$ctsh = $QUERY->{ctsh} if ($ctsh eq \'\');
print tablist(-1, \'\', \'tabsheet\', \'fcs\', ($ctsh =~ m/[012]/)?$ctsh:0, @tabs);
%#>
=cut
my $css = qq[
];
my $javascript = qq[
\\n"; # stupid bug...
$out .= qq{\\n
$sid/$pid !
!i;
$str =~ s!
!
!i;
$str =~ s!
Database server not responding.
Try later.
",Dumper(@_),"\\n"; } ###################################################################### sub error { # Показать сообщение об ошибке в режиме администрирования my $msg = shift; return ${$Response->TrapInclude("page_error.asp", $msg)}; } ####################################################################### sub logdata { # ($message) # Записать в лог-файл сообщение my $message = shift; open(LOG, ">>$log_file") || die "Can\'t write LOG ($log_file), $!\\n"; print LOG udate_to_string(time)." - $remoteaddr - $userinfo{username} - $SERVER->{\'SCRIPT_NAME\'} - $message\\n"; close(LOG); } ####################################################################### sub custom_log { # ($message) # Записать в отдельный лог-файл сообщение my $message = shift; open(LOG, ">>$site_path/datafiles/custom.log") || die "Can\'t write LOG (custom.log), $!\\n"; print LOG udate_to_string(time)." $remoteaddr $userinfo{username} - $message\\n"; close(LOG); } ###################################################################### sub udate_to_string { # ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени my $unixtime = shift; my $dchar = shift || ""; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; my $r = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%02d.%02d.%04d",$mday,$mon,$year); } if ($dchar eq "t") { $r = sprintf("%02d:%02d:%02d",$hour,$min,$sec); } return $r; } ###################################################################### sub udate_to_rus_string {# ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени с русскими названиями my $unixtime = shift; my $dchar = shift || ""; my @W = qw(воскресенье понедельник вторник среда четверг пятница суббота); my @M = qw(января февраля марта апреля мая июня июля августа сентября октября ноября декабря); my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($unixtime); $year += 1900; my $r = sprintf("%d %s %04d г. %s, %02d:%02d:%02d",$mday,$M[$mon],$year, $W[$wday], $hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%d %s %04d г. %s",$mday,$M[$mon],$year,$W[$wday]); } return $r; } ###################################################################### sub datetime2utime { # ($date) # in dd.mm.yyyy hh:mm:ss # преобразовать формат даты и времени в UNIXTIME my $xdate = shift; $xdate =~ s/(\\d+)\\.(\\d+)\\.(\\d+)\\s(\\d+):(\\d+):(\\d+)/$3-$2-$1 $4:$5:$6/; return str2time($xdate); } ###################################################################### sub my2date { # преобразовать формат даты MySQL в нормальную дату return sprintf("%02d.%02d.%04d", $3,$2,$1) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)/); return ""; } ###################################################################### sub my2datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время return sprintf("%02d.%02d.%04d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub date2my { # преобразовать нормальную дату формат даты MySQL return sprintf("%04d-%02d-%02d", $3,$2,$1) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)/); return ""; } ###################################################################### sub datetime2my { # преобразовать нормальную дату и время в формат даты и времени MySQL return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub utime2my { # преобразовать UNIXTIME в формат даты и времени MySQL my $unixtime = shift; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; return sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec); } ###################################################################### sub my2rus_datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время с русскими названиями my $mydt = shift; my $dchar = shift; return udate_to_rus_string(str2time($mydt), $dchar); } ###################################################################### sub exist_in_list { # ($value, @list) # проверить существование значения $val в списке @list my ($val, @list) = @_; foreach my $v (@list) { return 1 if ($val eq $v); } return 0; } ###################################################################### sub uri_remove_key { # ($query_string, $key) # удаляет из HTTP строки запроса указанный ключ со значением my $x_uri = shift; my $x_key = shift; my @r_uri = (); my @x_pairs = $x_uri =~ m!^([\\?\\/]*)(\\S+)$!; $x_uri = $x_pairs[1]; my @a_uri = split(/&/, $x_uri); foreach my $p (@a_uri) { my ($k, $v) = split(/=/, $p); push(@r_uri, $p) if (!(lc($k) eq lc($x_key))); } $x_uri = \'/\'; $x_uri = $x_pairs[0] . join(\'&\', @r_uri) if (@r_uri); return $x_uri; } ###################################################################### sub js_redirect { # (url, frame) # сделать редирект средствами javascript my ($url, $frame) = @_; my $location = qq{location.href="$url";}; $location = qq{window.parent.frames[\'$frame\'].location.href=\'$url\';} if ($frame); print "\\n\\n"; } ###################################################################### sub navigator { # отобразить навигатор (путь с корня до страницы) my @a = (\'Начало\'); # if $sid in internal section (#6) - don\'t show any information my $rootsec = @treewalk[$#treewalk]; if ( (!$localnet) && ($rootsec->[0] == 6) ) { # ... } else { foreach my $i (reverse @treewalk) { push(@a, qq{$i->[1]}) if ($i->[0] > 0); } } return join(\'
\', @a);
}
######################################################################
sub get_config_value {
my $varname = shift;
my ($varvalue) = getonerec("select varvalue from options where varname = \'$varname\'");
return $varvalue;
}
######################################################################
sub store_config_value {
my ($varname, $varvalue) = @_;
my $query = "update options set varvalue=? where varname=?";
my $st = $db->prepare($query) || print $db->errstr, ", query:[$query]
Page One\',
\'
Page Two\',
\'
Page Three\'
);
my $ctsh;
$ctsh = $FORM->{ctsh};
$ctsh = $QUERY->{ctsh} if ($ctsh eq \'\');
print tablist(-1, \'\', \'tabsheet\', \'fcs\', ($ctsh =~ m/[012]/)?$ctsh:0, @tabs);
%#>
=cut
my $css = qq[
];
my $javascript = qq[
\\n"; # stupid bug...
$out .= qq{\\n
$sid/$pid !
!i;
$str =~ s!
!
!i;
$str =~ s!
Database server not responding.
Try later.
",Dumper(@_),"\\n"; } ###################################################################### sub error { # Показать сообщение об ошибке в режиме администрирования my $msg = shift; return ${$Response->TrapInclude("page_error.asp", $msg)}; } ####################################################################### sub logdata { # ($message) # Записать в лог-файл сообщение my $message = shift; open(LOG, ">>$log_file") || die "Can\'t write LOG ($log_file), $!\\n"; print LOG udate_to_string(time)." - $remoteaddr - $userinfo{username} - $SERVER->{\'SCRIPT_NAME\'} - $message\\n"; close(LOG); } ####################################################################### sub custom_log { # ($message) # Записать в отдельный лог-файл сообщение my $message = shift; open(LOG, ">>$site_path/datafiles/custom.log") || die "Can\'t write LOG (custom.log), $!\\n"; print LOG udate_to_string(time)." $remoteaddr $userinfo{username} - $message\\n"; close(LOG); } ###################################################################### sub udate_to_string { # ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени my $unixtime = shift; my $dchar = shift || ""; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; my $r = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%02d.%02d.%04d",$mday,$mon,$year); } if ($dchar eq "t") { $r = sprintf("%02d:%02d:%02d",$hour,$min,$sec); } return $r; } ###################################################################### sub udate_to_rus_string {# ($unixtime, $dchar) # преобразовать UNIXTIME в формат даты и/или времени с русскими названиями my $unixtime = shift; my $dchar = shift || ""; my @W = qw(воскресенье понедельник вторник среда четверг пятница суббота); my @M = qw(января февраля марта апреля мая июня июля августа сентября октября ноября декабря); my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($unixtime); $year += 1900; my $r = sprintf("%d %s %04d г. %s, %02d:%02d:%02d",$mday,$M[$mon],$year, $W[$wday], $hour,$min,$sec); if ($dchar eq "d") { $r = sprintf("%d %s %04d г. %s",$mday,$M[$mon],$year,$W[$wday]); } return $r; } ###################################################################### sub datetime2utime { # ($date) # in dd.mm.yyyy hh:mm:ss # преобразовать формат даты и времени в UNIXTIME my $xdate = shift; $xdate =~ s/(\\d+)\\.(\\d+)\\.(\\d+)\\s(\\d+):(\\d+):(\\d+)/$3-$2-$1 $4:$5:$6/; return str2time($xdate); } ###################################################################### sub my2date { # преобразовать формат даты MySQL в нормальную дату return sprintf("%02d.%02d.%04d", $3,$2,$1) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)/); return ""; } ###################################################################### sub my2datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время return sprintf("%02d.%02d.%04d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)-(\\d+)-(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub date2my { # преобразовать нормальную дату формат даты MySQL return sprintf("%04d-%02d-%02d", $3,$2,$1) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)/); return ""; } ###################################################################### sub datetime2my { # преобразовать нормальную дату и время в формат даты и времени MySQL return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\\d+)\\.(\\d+)\\.(\\d+)\\s+(\\d+):(\\d+):(\\d+)/); return ""; } ###################################################################### sub utime2my { # преобразовать UNIXTIME в формат даты и времени MySQL my $unixtime = shift; my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); $mon++; $year += 1900; return sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec); } ###################################################################### sub my2rus_datetime { # преобразовать формат даты и времени MySQL в нормальную дату и время с русскими названиями my $mydt = shift; my $dchar = shift; return udate_to_rus_string(str2time($mydt), $dchar); } ###################################################################### sub exist_in_list { # ($value, @list) # проверить существование значения $val в списке @list my ($val, @list) = @_; foreach my $v (@list) { return 1 if ($val eq $v); } return 0; } ###################################################################### sub uri_remove_key { # ($query_string, $key) # удаляет из HTTP строки запроса указанный ключ со значением my $x_uri = shift; my $x_key = shift; my @r_uri = (); my @x_pairs = $x_uri =~ m!^([\\?\\/]*)(\\S+)$!; $x_uri = $x_pairs[1]; my @a_uri = split(/&/, $x_uri); foreach my $p (@a_uri) { my ($k, $v) = split(/=/, $p); push(@r_uri, $p) if (!(lc($k) eq lc($x_key))); } $x_uri = \'/\'; $x_uri = $x_pairs[0] . join(\'&\', @r_uri) if (@r_uri); return $x_uri; } ###################################################################### sub js_redirect { # (url, frame) # сделать редирект средствами javascript my ($url, $frame) = @_; my $location = qq{location.href="$url";}; $location = qq{window.parent.frames[\'$frame\'].location.href=\'$url\';} if ($frame); print "\\n\\n"; } ###################################################################### sub navigator { # отобразить навигатор (путь с корня до страницы) my @a = (\'Начало\'); # if $sid in internal section (#6) - don\'t show any information my $rootsec = @treewalk[$#treewalk]; if ( (!$localnet) && ($rootsec->[0] == 6) ) { # ... } else { foreach my $i (reverse @treewalk) { push(@a, qq{$i->[1]}) if ($i->[0] > 0); } } return join(\'
\', @a);
}
######################################################################
sub get_config_value {
my $varname = shift;
my ($varvalue) = getonerec("select varvalue from options where varname = \'$varname\'");
return $varvalue;
}
######################################################################
sub store_config_value {
my ($varname, $varvalue) = @_;
my $query = "update options set varvalue=? where varname=?";
my $st = $db->prepare($query) || print $db->errstr, ", query:[$query]
Page One\',
\'
Page Two\',
\'
Page Three\'
);
my $ctsh;
$ctsh = $FORM->{ctsh};
$ctsh = $QUERY->{ctsh} if ($ctsh eq \'\');
print tablist(-1, \'\', \'tabsheet\', \'fcs\', ($ctsh =~ m/[012]/)?$ctsh:0, @tabs);
%#>
=cut
my $css = qq[
];
my $javascript = qq[
\\n"; # stupid bug...
$out .= qq{\\n
$sid/$pid !
!i;
$str =~ s!
!
!i;
$str =~ s!
Compiled Data with Error -: -: #line 1 /var/www/HDD2/mc.arhcity.ru/asa/global.asa 1: package Apache::ASP::Compiles::__ASP__var_www_HDD2_mc_arhcity_ru_asax; ;; use strict ;; use vars qw($Application $Session $Response $Server $Request); ;; use lib qw(/var/www/HDD2/mc.arhcity.ru/asa); ;; #!/usr/bin/perl 2: 3: use Time::HiRes qw(gettimeofday tv_interval); 4: use Apache::DBI; # automatic persistent database connections 5: use DBI; 6: use HTTP::Date; 7: use Digest::SHA1 qw(sha1_hex sha1_base64); 8: use Socket; 9: use URI::UTF8::Punycode; 10: use APR::UUID; 11: use Text::Iconv; 12: use Net::SMTP; 13: 14: # when PerlSetVar UseStrict setting on, need to declare 15: # global variables with "use vars" 16: ################################################################## 17: # declare global variables 18: use vars ('$db', # database interface 19: '$FORM', # form data, method POST 20: '$QUERY', # form data, method GET 21: '$POST', # unformat form data, method POST 22: '$SERVER', # server variables 23: '$localnet', # access from local network 24: '$have_inet', # access to internet 25: '$remoteaddr', # remote IP address 26: '$useragent', # UserAgent () 27: '$site_admin', # Enable extra functions for site admins 28: '$logged_in', # admin access by session 29: '$lc_logged_in', # private cabinet access by session 30: '$servername', # name of server 31: '$addrubrics', # additional menu "rubrics" 32: '$tpl_dir', # html template directory 33: '$godaccess', # GOD access 34: '$hires_time', # time generation of page 35: ############################# 36: '%userinfo', # entrie user data (hash) 37: '%section', # entrie section data (hash) 38: '%document', # entrie document data (hash) 39: ############################# 40: '@treewalk', # walking from leaf to root = ([$node, $secname, $sectpl]) 41: '%mod_params', # parameters for plugins 42: '$zx_counter', # counter for all unique repitable operations 43: '$site_url', # url to site 44: '$site_path', # path to site location 45: '$blindview', # blind vew mode 46: '%CSS_vars', # CSS variables 47: ); 48: 49: ################################################################## 50: my $host = 'localhost'; 51: my $db_name = 'ipcms3'; 52: my $dsn = "DBI:mysql:database=$db_name:host=$host"; 53: my $username = 'root'; 54: my $password = ''; 55: ################################################################## 56: 57: my $log_file; 58: my $uploaddir; 59: 60: my $admin_dir = "/admin/"; 61: my $lcab = "/lc/"; 62: 63: # list of datastore fields for separate '_ex' and non '_ex' fields 64: my @doc_fields = qw(sid pid userid url pagename pagebody pagedate pagemodify pageorder sh_hdr sh_dir sh_nav sh_tab docstatus rating1 rating2); 65: 66: # at the begining of the page execution 67: sub Script_OnStart { 68: $hires_time = [gettimeofday]; 69: 70: $Response->Include("site_setup.asp"); # get default values for current site 71: 72: $log_file = "$site_path/datafiles/ipcms3.log"; 73: $uploaddir = "$site_path/asp/data"; 74: 75: $Response->{'ContentType'} = "text/html"; 76: $Response->{'Charset'} = "Windows-1251"; 77: # $Response->{'Expires'} = 0; # page expired after NN seconds from download. 78: # $Response->{'Last-Modified:'} = time2str(time-1); 79: 80: $FORM = $Request->Form(); 81: $QUERY = $Request->QueryString(); 82: # $POST = $Request->BinaryRead($Request->ServerVariables('CONTENT_LENGTH')); # for debug 83: $SERVER = $Request->ServerVariables(); 84: 85: $remoteaddr = $SERVER->{'REMOTE_ADDR'}; 86: $servername = $SERVER->{'SERVER_NAME'}; 87: $tpl_dir = $SERVER->{'DOCUMENT_ROOT'}."/templates"; 88: 89: $blindview = get_cookie("blindview") || 0; 90: 91: %userinfo = (); 92: %section = (); 93: %document = (); 94: 95: $addrubrics = ''; 96: $site_admin = 0; 97: $logged_in = 0; 98: $godaccess = 0; 99: $localnet = 0; 100: $have_inet = 0; 101: @treewalk = (); 102: $zx_counter = 0; 103: 104: # Global Redirect Block... 105: if ($servername eq 'arhcity.ru') { $Response->Redirect("http://$site_url"); } 106: if ($servername eq 'arhirc.ru') { $Response->Redirect("http://$site_url/?page=2331/0"); } 107: if ($servername eq 'www.arhirc.ru') { $Response->Redirect("http://$site_url/?page=2331/0"); } 108: 109: # if ($SERVER->{HTTPS} ne 'on') { 110: # $Response->Redirect("https://www.arhcity.ru/?$SERVER->{QUERY_STRING}"); 111: # } 112: 113: my $ic = Text::Iconv->new("UTF-8", "WINDOWS-1251"); 114: my @r = (); 115: foreach my $i (split(/\./, $servername)) { 116: if ($i =~ m/^xn--/) { push(@r, puny_dec($i)); } else { push(@r, $i); } } 117: $servername = join('.', @r); 118: $servername = $ic->convert($servername); 119: 120: if ($SERVER->{HTTP_USER_AGENT} =~ m/edge/i) { $useragent = 'edge'; } 121: elsif ($SERVER->{HTTP_USER_AGENT} =~ m/chrome/i) { $useragent = 'chrome'; } 122: elsif ($SERVER->{HTTP_USER_AGENT} =~ m/webkit/i) { $useragent = 'safari'; } 123: elsif ($SERVER->{HTTP_USER_AGENT} =~ m/opera/i) { $useragent = 'opera'; } 124: elsif ($SERVER->{HTTP_USER_AGENT} =~ m/msie/i) { $useragent = 'msie'; } 125: elsif ($SERVER->{HTTP_USER_AGENT} =~ m/trident/i) { $useragent = 'msie'; } 126: elsif ($SERVER->{HTTP_USER_AGENT} =~ m/mozilla/i) { $useragent = 'mozilla' } 127: else { $useragent = 'unknown'; } 128: 129: if (($useragent eq 'msie') || ($useragent eq 'edge')) { 130: # read CSS color variables for replace in html code (MSIE/Edge not support CSS vars); 131: my $colors_css_fn = "$SERVER->{DOCUMENT_ROOT}/templates/colors.css"; 132: open(FC, "< $colors_css_fn") || die "Can't open $colors_css_fn, $!\n"; 133: while (my $l = <FC>) { $CSS_vars{$1} = $2 if ($l =~ m/(--.+?):\s*(.+);/); } 134: close(FC); 135: } 136: 137: if (($remoteaddr =~ m/^192\.168\./) 138: || ($remoteaddr eq '212.14.176.38') 139: || ($remoteaddr eq '212.14.176.39') 140: || ($remoteaddr eq '212.14.176.46') 141: || ($remoteaddr eq '212.14.176.40') 142: || ($remoteaddr eq '212.14.176.41') 143: || ($remoteaddr eq '212.14.176.44') 144: || ($remoteaddr eq '195.239.119.234') # Городской центр гражданской защиты 145: ) { $localnet = 1; } 146: 147: if (($localnet) && ( # Enable extra functions for site admins 148: ($remoteaddr eq '192.168.1.84') || # GaidukAV 149: ($remoteaddr eq '192.168.1.44' ) || # KorzhevDP 150: ($remoteaddr eq '192.168.1.45' ) || # KorzhevDP 151: ($remoteaddr eq '192.168.1.46' ) || # KorzhevDP 152: ($remoteaddr eq '192.168.51.144') || # VishnyakovNS 153: ($remoteaddr eq '192.168.1.102') || # EkimovKS v.1 154: ($remoteaddr eq '192.168.1.110') || # EkimovKS v.2 155: ($remoteaddr eq '192.168.51.42')) # EkimovKS v.3 156: ) { $site_admin = 1; } 157: 158: # connect to database 159: $db = DBI->connect($dsn, $username, $password); 160: 161: if (! $db) { 162: print "<p>Database server not responding.<br>Try later.</p>\n"; 163: $Response->End(); 164: } 165: 166: # ONLY FOR RUSSIAN for MySQL !!! 167: $db->do("set names cp1251"); 168: 169: if ($localnet) { # enable/disable outside scripts on site for local users without inet. 170: ($have_inet) = getonerec("select count(ip) from squid_list where ip = '$remoteaddr'"); 171: } else { 172: $have_inet = 1; 173: } 174: 175: # ------------------------------------------------------------ 176: # $have_inet = 0; # !!! disable external scripts on site !!! 177: # ------------------------------------------------------------ 178: 179: if ($SERVER->{'REQUEST_URI'} =~ m/$admin_dir/) { 180: 181: # !!! admin mode !!! 182: 183: $logged_in = 0; 184: my $uname = $Session->{Authentication}; 185: my $topframe = 0; 186: 187: if ($uname) { 188: # logged in 189: $logged_in = 1; 190: $Session->{top_frame} = 0; 191: my $adm_lib = $admin_dir . "lib/"; 192: if ($SERVER->{'REQUEST_URI'} =~ m/$adm_lib/) { 193: 194: # read user info 195: %userinfo = get_user_info($uname); 196: $godaccess = 1 if ($userinfo{god} eq 'Y'); 197: 198: if ($SERVER->{'REQUEST_URI'} =~ m/(ajax)|(requestor)\.asp/i) { 199: # no header 200: } else { 201: $Response->Include("page_admin_header.asp"); 202: print qq{\n<body>\n}; 203: } 204: 205: if ($SERVER->{'REQUEST_URI'} =~ m/(section.asp)|(page.asp)|(journal.asp)|(admin.asp)/i) { 206: $Response->Include("page_autologoff.asp"); 207: } 208: } 209: 210: } else { 211: # not logged in 212: $topframe = $Session->{top_frame}; 213: if (!$topframe) { 214: my $location = "top.location.href='/admin/?t=".time()."'"; 215: print qq{<script>$location</script>}; 216: $Session->{top_frame} = 1; 217: $Response->End(); 218: } 219: $Response->Include("page_admin_header.asp"); 220: print qq{\n<body>\n}; 221: $Response->Include("auth.asp", $admin_dir."index.asp"); 222: $Response->Include("page_autologoff.asp"); 223: 224: $Response->End() if (! $logged_in); 225: } 226: 227: } else { 228: # !!! default access mode !!! 229: } 230: } 231: 232: # after the end of the page execution 233: sub Script_OnEnd { 234: if ($SERVER->{'REQUEST_URI'} =~ m/$admin_dir/) { 235: # admin mode 236: if ($SERVER->{'REQUEST_URI'} =~ m/(ajax)|(requestor)\.asp/i) { 237: # no footer 238: } else { 239: print qq{\n</body>\n</html>\n}; 240: } 241: } else { 242: # user mode 243: } 244: 245: # 'closing' database connection (*) see 'Persistant Connection' 246: $db = undef; 247: } 248: 249: ###################################################################### 250: # before flushing buffer to the web client 251: sub Script_OnFlush { 252: # if data is 'text/html' ... 253: if ($Response->{ContentType} eq 'text/html') { 254: # if browser not support CSS Vars - (MSIE/Edge) 255: if (($useragent eq 'msie') || ($useragent eq 'edge')) { 256: my $ref = $Response->{BinaryRef}; 257: # using content as $$ref 258: # parsing html files with <style></style> definitions: insert CSS Vars into styles 259: $$ref =~ s/(var\((--.+?)\))/exists($CSS_vars{$2})?$CSS_vars{$2}:'none'/gsex; 260: } 261: } 262: } 263: 264: ###################################################################### 265: # User Subroutines ################################################### 266: ###################################################################### 267: 268: ###################################################################### 269: sub empty_page { 270: # Заполнить структуру для пустой страницы с пояснениями взамен НЕ найденой 271: my ($sid, $pid) = @_; 272: $section{sh_hdr} = 'Y'; 273: $document{sh_hdr} = 'Y'; 274: $document{sh_dir} = 'N'; 275: $document{sh_nav} = 'N'; 276: $document{pagedate} = utime2my(time()); 277: $document{pagebody} = ${$Response->TrapInclude("page_empty_page.asp", $sid, $pid)}; 278: } 279: 280: ###################################################################### 281: sub print_dump { 282: # Сделать дамп переменной 283: use Data::Dumper; 284: print "<pre>",Dumper(@_),"</pre>\n"; 285: } 286: 287: ###################################################################### 288: sub error { 289: # Показать сообщение об ошибке в режиме администрирования 290: my $msg = shift; 291: return ${$Response->TrapInclude("page_error.asp", $msg)}; 292: } 293: 294: ####################################################################### 295: sub logdata { # ($message) 296: # Записать в лог-файл сообщение 297: my $message = shift; 298: open(LOG, ">>$log_file") || die "Can't write LOG ($log_file), $!\n"; 299: print LOG udate_to_string(time)." - $remoteaddr - $userinfo{username} - $SERVER->{'SCRIPT_NAME'} - $message\n"; 300: close(LOG); 301: } 302: 303: ####################################################################### 304: sub custom_log { # ($message) 305: # Записать в отдельный лог-файл сообщение 306: my $message = shift; 307: open(LOG, ">>$site_path/datafiles/custom.log") || die "Can't write LOG (custom.log), $!\n"; 308: print LOG udate_to_string(time)." $remoteaddr $userinfo{username} - $message\n"; 309: close(LOG); 310: } 311: 312: ###################################################################### 313: sub udate_to_string { # ($unixtime, $dchar) 314: # преобразовать UNIXTIME в формат даты и/или времени 315: my $unixtime = shift; 316: my $dchar = shift || ""; 317: my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); 318: $mon++; 319: $year += 1900; 320: my $r = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec); 321: if ($dchar eq "d") { $r = sprintf("%02d.%02d.%04d",$mday,$mon,$year); } 322: if ($dchar eq "t") { $r = sprintf("%02d:%02d:%02d",$hour,$min,$sec); } 323: return $r; 324: } 325: 326: ###################################################################### 327: sub udate_to_rus_string {# ($unixtime, $dchar) 328: # преобразовать UNIXTIME в формат даты и/или времени с русскими названиями 329: my $unixtime = shift; 330: my $dchar = shift || ""; 331: my @W = qw(воскресенье понедельник вторник среда четверг пятница суббота); 332: my @M = qw(января февраля марта апреля мая июня июля августа сентября октября ноября декабря); 333: my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($unixtime); 334: $year += 1900; 335: my $r = sprintf("%d %s %04d г. %s, %02d:%02d:%02d",$mday,$M[$mon],$year, $W[$wday], $hour,$min,$sec); 336: if ($dchar eq "d") { $r = sprintf("%d %s %04d г. %s",$mday,$M[$mon],$year,$W[$wday]); } 337: return $r; 338: } 339: 340: ###################################################################### 341: sub datetime2utime { # ($date) # in dd.mm.yyyy hh:mm:ss 342: # преобразовать формат даты и времени в UNIXTIME 343: my $xdate = shift; 344: $xdate =~ s/(\d+)\.(\d+)\.(\d+)\s(\d+):(\d+):(\d+)/$3-$2-$1 $4:$5:$6/; 345: return str2time($xdate); 346: } 347: 348: ###################################################################### 349: sub my2date { 350: # преобразовать формат даты MySQL в нормальную дату 351: return sprintf("%02d.%02d.%04d", $3,$2,$1) if ($_[0] =~ m/(\d+)-(\d+)-(\d+)/); 352: return ""; 353: } 354: 355: ###################################################################### 356: sub my2datetime { 357: # преобразовать формат даты и времени MySQL в нормальную дату и время 358: return sprintf("%02d.%02d.%04d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+)/); 359: return ""; 360: } 361: 362: ###################################################################### 363: sub date2my { 364: # преобразовать нормальную дату формат даты MySQL 365: return sprintf("%04d-%02d-%02d", $3,$2,$1) if ($_[0] =~ m/(\d+)\.(\d+)\.(\d+)/); 366: return ""; 367: } 368: 369: ###################################################################### 370: sub datetime2my { 371: # преобразовать нормальную дату и время в формат даты и времени MySQL 372: return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $3,$2,$1,$4,$5,$6) if ($_[0] =~ m/(\d+)\.(\d+)\.(\d+)\s+(\d+):(\d+):(\d+)/); 373: return ""; 374: } 375: 376: ###################################################################### 377: sub utime2my { 378: # преобразовать UNIXTIME в формат даты и времени MySQL 379: my $unixtime = shift; 380: my ($sec,$min,$hour,$mday,$mon,$year) = localtime($unixtime); 381: $mon++; $year += 1900; 382: return sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec); 383: } 384: 385: ###################################################################### 386: sub my2rus_datetime { 387: # преобразовать формат даты и времени MySQL в нормальную дату и время с русскими названиями 388: my $mydt = shift; 389: my $dchar = shift; 390: return udate_to_rus_string(str2time($mydt), $dchar); 391: } 392: 393: ###################################################################### 394: sub exist_in_list { # ($value, @list) 395: # проверить существование значения $val в списке @list 396: my ($val, @list) = @_; 397: foreach my $v (@list) { 398: return 1 if ($val eq $v); 399: } 400: return 0; 401: } 402: 403: ###################################################################### 404: sub uri_remove_key { # ($query_string, $key) 405: # удаляет из HTTP строки запроса указанный ключ со значением 406: 407: my $x_uri = shift; 408: my $x_key = shift; 409: my @r_uri = (); 410: 411: my @x_pairs = $x_uri =~ m!^([\?\/]*)(\S+)$!; 412: $x_uri = $x_pairs[1]; 413: 414: my @a_uri = split(/&/, $x_uri); 415: 416: foreach my $p (@a_uri) { 417: my ($k, $v) = split(/=/, $p); 418: push(@r_uri, $p) if (!(lc($k) eq lc($x_key))); 419: } 420: 421: $x_uri = '/'; 422: $x_uri = $x_pairs[0] . join('&', @r_uri) if (@r_uri); 423: 424: return $x_uri; 425: } 426: 427: ###################################################################### 428: sub js_redirect { # (url, frame) 429: # сделать редирект средствами javascript 430: my ($url, $frame) = @_; 431: my $location = qq{location.href="$url";}; 432: $location = qq{window.parent.frames['$frame'].location.href='$url';} if ($frame); 433: print "\n<script>\n$location\n</script".">\n"; 434: } 435: 436: ###################################################################### 437: sub navigator { 438: # отобразить навигатор (путь с корня до страницы) 439: my @a = ('<a href="/">Начало</a>'); 440: 441: # if $sid in internal section (#6) - don't show any information 442: my $rootsec = @treewalk[$#treewalk]; 443: if ( (!$localnet) && ($rootsec->[0] == 6) ) { 444: # ... 445: } else { 446: foreach my $i (reverse @treewalk) { 447: push(@a, qq{<a href="/?page=$i->[0]/0">$i->[1]</a>}) if ($i->[0] > 0); 448: } 449: } 450: return join(' <span style="color:red"><img src="/pic/navar.gif" align="baseline"></span> ', @a); 451: } 452: 453: ###################################################################### 454: sub get_config_value { 455: my $varname = shift; 456: my ($varvalue) = getonerec("select varvalue from options where varname = '$varname'"); 457: return $varvalue; 458: } 459: 460: ###################################################################### 461: sub store_config_value { 462: my ($varname, $varvalue) = @_; 463: my $query = "update options set varvalue=? where varname=?"; 464: my $st = $db->prepare($query) || print $db->errstr, ", query:[$query]<br>\n"; 465: $st->execute($varvalue, $varname) || print $db->errstr, ", query:[$query]<br>\n"; 466: $st->finish; 467: } 468: 469: ###################################################################### 470: sub get_user_info { 471: # прочитать информацию о зарегистрированном пользователе (по логину) 472: # return hash 473: my $user = shift; 474: my (%ret, $query, $st, $row) = (); 475: $query = "select * from users where username = '$user'"; 476: $st = $db->prepare($query) || print $db->errstr, ", Q:[$query]\n"; 477: $st->execute() || print $db->errstr, ", Q:[$query]\n"; 478: $row = $st->fetchrow_hashref; 479: foreach my $i (keys %{$row}) { $ret{$i} = $row->{$i}; } 480: $st->finish; 481: return %ret; 482: } 483: 484: ###################################################################### 485: sub get_user_id_info { 486: # прочитать информацию о зарегистрированном пользователе (по id) 487: # return hash 488: my $user_id = shift; 489: my (%ret, $query, $st, $row) = (); 490: $query = "select * from users where id = $user_id"; 491: $st = $db->prepare($query) || print $db->errstr, ", Q:[$query]\n"; 492: $st->execute() || print $db->errstr, ", Q:[$query]\n"; 493: $row = $st->fetchrow_hashref; 494: foreach my $i (keys %{$row}) { $ret{$i} = $row->{$i}; } 495: $st->finish; 496: return %ret; 497: } 498: 499: ###################################################################### 500: sub make_pw_hash { # (password) 501: # Создание уникального хэша по паролю 502: my $password = shift; 503: my $letts = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'; 504: my $lettl = length($letts); 505: my $salt = ''; 506: $password = substr($password, 0, 32) if (length($password) > 32); # limit password length 507: for my $i (1 .. 5) { $salt .= substr($letts, int(rand() * $lettl), 1); } 508: return $salt.sha1_base64($salt.$password); 509: } 510: 511: ###################################################################### 512: sub check_pw_hash { # (password, pwd_hash) 513: # проверка на соответствие хэша и пароля 514: my $password = shift; 515: my $pw_hash = shift; 516: my $salt = substr($pw_hash, 0, 5); 517: $password = substr($password, 0, 32) if (length($password) > 32); # limit password length 518: return (substr($pw_hash, 5) eq sha1_base64($salt.$password)); 519: } 520: 521: ###################################################################### 522: sub check_auth { # (user, password) 523: # проверка авторизации 524: my ($u, $p) = @_; 525: $u =~ s/[\;\,\`\~\!\@\#\$\%\^\&\*\-\+\=\'\"\[\{\(\)\}\]\/\\]//g; 526: my ($ph) = getonerec("select passwd from users where lc = 'N' and enable='Y' and username = '$u'"); 527: return 1 if (check_pw_hash($p, $ph)); 528: return 0; 529: } 530: 531: ###################################################################### 532: sub check_auth_lc { # (user, password) 533: # проверка авторизации lcab 534: my ($u, $p) = @_; 535: $u =~ s/[\;\,\`\~\!\@\#\$\%\^\&\*\-\+\=\'\"\[\{\(\)\}\]\/\\]//g; 536: my ($ph) = getonerec("select passwd from users where lc = 'Y' and enable='Y' and username = '$u'"); 537: return 1 if (check_pw_hash($p, $ph)); 538: return 0; 539: } 540: 541: ###################################################################### 542: sub get_inherit_tpl { # (sid) 543: # найти имя наследуемого шаблона дизайна 544: my $tpn = "default"; 545: my $tpn2 = ''; 546: @treewalk = tree_walk(shift); 547: foreach my $i (reverse(@treewalk)) { 548: if ($i->[2] ne '') { 549: $tpn2 = $tpn; 550: $tpn = $i->[2]; 551: } 552: } 553: return ($tpn, $tpn2); 554: } 555: 556: ###################################################################### 557: sub get_tpl_list { 558: # пполучить список доступных шаблонов дизайна 559: my ($c, @ret) = 0; 560: opendir(D, $tpl_dir); 561: while (my $d = readdir(D)) { 562: if ($d =~ m/^(.+)\.asp$/) { push(@ret, $1); } 563: } 564: closedir(D); 565: return sort @ret; 566: } 567: 568: ###################################################################### 569: sub tree_walk { # ($sid) 570: # пройтись по дереву от указанного раздела до корня, записать в массив ($node, $secname, $sectpl) 571: my ($node, $pnode, $secname, $sectpl, @tw) = shift; 572: my $c = 0; 573: while ($node != 0) { 574: ($node, $pnode, $secname, $sectpl) = getonerec("select sid,secparent,secname,sectpl from section where sid=$node"); 575: push(@tw, ([$node, $secname, $sectpl])); 576: $node = $pnode; 577: $c++; 578: if ($c > 20) { # если очень большое количество итераций - значит в базе ошибка. 579: my $t = ''; 580: foreach (@tw) { $t .= ' '.$_->[0]; } 581: print error("В базе данных ошибка! Возможно зацикленная рекурсия. Срочно обратитесь к администратору.<br>tree_walk: [$t]"); 582: last; 583: } 584: } 585: return @tw; 586: } 587: 588: ###################################################################### 589: sub getonerec { # (query) 590: # прочитать одну запись из базы 591: my ($query, $st, @row) = shift; 592: $st = $db->prepare($query) || print $db->errstr, ", Q:[$query]<br>\n"; 593: $st->execute() || print $db->errstr, ", Q:[$query]<br>\n"; 594: @row = $st->fetchrow_array; 595: $st->finish; 596: return @row; 597: } 598: 599: ###################################################################### 600: sub get_sql_list { 601: # прочитать список из базы 602: # return @arr = ('a1','b1','c1'); 603: my $q = shift; 604: my ($s,@r,@ret); 605: 606: $s = $db->prepare($q) || print $db->errstr, ", query:[$q]<br>\n"; 607: $s->execute() || print $db->errstr, ", query:[$q]<br>\n"; 608: while ( @r = $s->fetchrow_array ) { 609: push(@ret, $r[0]); 610: } 611: $s->finish; 612: 613: return @ret; 614: } 615: 616: ###################################################################### 617: sub get_sql_arr { 618: # прочитать список списков (таблицу) из базы 619: # return @arr = ( ['a1','a2'], ['b1','b2'], ['c1','c2'] ); 620: my $q = shift; 621: my ($s,$rf,@r,@rt,@ret); 622: 623: $s = $db->prepare($q) || print $db->errstr, ", query:[$q]<br>\n"; 624: $s->execute() || print $db->errstr, ", query:[$q]<br>\n"; 625: while ( @r = $s->fetchrow_array ) { 626: @rt = (); 627: for my $i (0 .. scalar(@r)-1) { $rt[0][$i] = $r[$i]; } 628: push(@ret, @rt); 629: } 630: $s->finish; 631: 632: return @ret; 633: } 634: 635: ###################################################################### 636: sub get_sql_arhash { # (query) 637: # прочитать список хэшей (таблицу с именованными столбцами) из базы 638: # return array of hashes 639: my $q = shift; 640: my ($s,$rf,$r,@rt,@ret); 641: $s = $db->prepare($q) || print $db->errstr, ", query:[$q]<br>\n"; 642: $s->execute() || print $db->errstr, ", query:[$q]<br>\n"; 643: while ( $r = $s->fetchrow_hashref ) { push(@ret, $r); } 644: $s->finish; 645: return @ret; 646: } 647: 648: ###################################################################### 649: sub input_text { # ($name, $style, $value) 650: # создать текстовое поле ввода 651: my ($name, $style, $value) = @_; 652: $style .= qq{ id="id$name"} if ($name); 653: my $ret = qq{<input type="text" name="$name" value="$value" $style>}; 654: return $ret; 655: } 656: 657: ###################################################################### 658: sub input_checkbox_1Y { # ($name, $style, $value, $label) 659: # создать поле ввода чекбокс (одиночный) 660: my ($name, $style, $value, $label) = @_; 661: my $ret = ""; 662: my $checked = (($value eq "Y") || ($value eq "on")) ? "checked" : ""; 663: $zx_counter++; 664: $ret = qq{<input type="checkbox" name="$name" id="id$zx_counter$name" $checked $style> <label for="id$zx_counter$name">$label</label>}; 665: return $ret; 666: } 667: 668: ###################################################################### 669: sub input_radio { # ($name, $style, $js, $br, $checked, %values) 670: # создать поле ввода радиоботтон (группу) 671: my ($name, $style, $js, $br, $checked, %values) = @_; 672: my $ret; 673: my $j = ""; 674: foreach my $i (sort keys %values) { 675: if ($js ne '') { $j = qq{onclick="$js('$i');"}; } 676: my $checkstr = ($checked eq $i) ? "checked" : ""; 677: $ret .= qq{<input type="radio" name="$name" id="$i" value="$i" $checkstr $style $j>\n<label for="$i">$values{$i}</label>$br\n}; 678: } 679: return $ret; 680: } 681: 682: ###################################################################### 683: sub input_textarea { # ($name, $style, $value) 684: # создать поле тексареа 685: my ($name, $style, $value) = @_; 686: my $ret = qq{<textarea name="$name" $style>$value</textarea>}; 687: return $ret; 688: } 689: 690: ###################################################################### 691: sub input_texteditor { # ($name, $imgdir, $value) 692: # создать текстовый редактор на базе FCKeditor 693: my ($name, $imgdir, $value) = @_; 694: my $te = $Response->TrapInclude("page_fckeditor.asp", $name, $imgdir, $value); 695: return $$te; 696: } 697: 698: ###################################################################### 699: sub input_list_arr { # ($name, $style, $currvalue, @arr) 700: # создать поле список из 2d массива, с отключением отображения id 701: # @arr = ( [1,'a1'], [2,'a2'], [3,'a3'] ); 702: my ($name, $style, $currvalue, @arr) = @_; 703: my ($ret, $sel) = ('', ''); 704: my $nonum = 0; 705: my $size = qq{size="1"}; 706: $size = $1 if ($style =~ s/(size=["']*\d+["']*)//i); 707: $nonum = 1 if ($style =~ s/nonum//i); 708: $style .= qq{ id="id$name"} if ($name); 709: $ret = qq{<select name="$name" $size $style>\n}; 710: for my $i (0 .. scalar(@arr)-1) { 711: $sel = ''; 712: if ($currvalue =~ m/^\d+$/) { $sel = "selected" if ($arr[$i][0] == $currvalue); } 713: else { $sel = "selected" if ($arr[$i][0] eq $currvalue); } 714: if ($nonum) { $ret .= qq{<option $sel value="$arr[$i][0]">$arr[$i][1]</option>\n}; } 715: else { $ret .= qq{<option $sel value="$arr[$i][0]">[$arr[$i][0]] $arr[$i][1]</option>\n}; } 716: } 717: $ret .= "</select>"; 718: return $ret; 719: } 720: 721: ###################################################################### 722: sub input_list_arr_X1 { # ($name, $style, $currvalue, @arr) 723: # создать поле список из 1d массива 724: # @arr = ('a1','a2','a3'); 725: my ($name, $style, $currvalue, @arr) = @_; 726: my ($ret, $sel) = ('', ''); 727: 728: $style .= qq{ id="id$name"} if ($name); 729: $ret = "<select name=\"$name\" size=\"1\" $style>\n"; 730: foreach my $i (@arr) { 731: if ($i eq $currvalue) { $sel = "selected"; } else { $sel = ""; } 732: $ret .= qq{<option $sel value="$i">$i</option>\n}; 733: } 734: $ret .= "</select>"; 735: return $ret; 736: } 737: 738: ###################################################################### 739: sub check_acc { # ($sid, $acc_letters) 740: # проверка прав доступа к разделу 741: my ($sid, $acs) = @_; 742: return 1 if ($godaccess); 743: if ($sid =~ m/^\d+$/) { 744: #my @rghts = get_sql_list("select rights from usersacc where userid=$userinfo{id} and sid=$sid"); 745: my $query = "select usersacc.rights from users inner join usersacc on (users.id = usersacc.userid) 746: where users.enable = 'Y' and users.id = $userinfo{id} and usersacc.sid = $sid"; 747: my @rghts = get_sql_list($query); 748: my $rights = join('', @rghts); 749: foreach my $ac (split('', $acs)) { 750: return 1 if ($rights =~ m/$ac/); 751: } 752: return 0; 753: } 754: return 0; 755: } 756: 757: ###################################################################### 758: sub tablist { # $sid, $pid, 'tabsheet', 'focus', startN, (array of names) 759: # создание панели с закладками (используется в page.asp и section.asp) 760: my ($sid, $pid, $tabsheet_name, $focus_name, $start_page, @pages) = @_; 761: my $pagenum = scalar(@pages)-1; 762: my ($out,$focus1,$focus2); 763: 764: =pod 765: 766: =head1 Параметры вызова: 767: 768: tablist($sid, $pid, 'tabsheet', 'focus', startN, (array of names)); 769: 770: =item $sid, $pid 771: 772: Номера раздела и страницы 773: Если номер раздела < 0 - закладка со ссылкой на дерево объектов НЕ отображается. 774: 775: =item 'tabsheet' 776: 777: HTML Идентификатор панели с табами 778: 779: =item startN 780: 781: Номер закладки, которую нужно открыть при старте страницы 782: Для этого в запросе должен присутствовать параметр "ctsh=N" 783: где N - номер закладки 784: 785: =item 'focus' 786: 787: Идентификатор HTML объекта для установки фокуса при открытии 788: каждой из закладок 789: 790: =item (array of names) 791: 792: Список строк, являющихся текстом на закладках 793: 794: =head1 Пример реализации панели с табами: 795: 796: <style> 797: #tabsheet0 {display:none} /* в некоторых версяиях браузеров из за ошибки надо комментировать эту строку */ 798: #tabsheet1 {display:none} 799: #tabsheet2 {display:none} 800: .tabsheet { ... } 801: </style> 802: 803: <#% 804: my @tabs = ( 805: '<img src="/pic/page1.png"> Page One', 806: '<img src="/pic/page2.png"> Page Two', 807: '<img src="/pic/page3.png"> Page Three' 808: ); 809: my $ctsh; 810: $ctsh = $FORM->{ctsh}; 811: $ctsh = $QUERY->{ctsh} if ($ctsh eq ''); 812: print tablist(-1, '', 'tabsheet', 'fcs', ($ctsh =~ m/[012]/)?$ctsh:0, @tabs); 813: %#> 814: 815: <div class="tabarea"> 816: <table border="0" width="100%" cellpadding="8" cellspacing="0"><tr><td> 817: <div id="tabsheet0" class="tabsheet">Page 1<br><input type="text" id="fcs0"></div> 818: <div id="tabsheet1" class="tabsheet">Page 2<br><input type="text" id="fcs1"></div> 819: <div id="tabsheet2" class="tabsheet">Page 3<br><input type="text" id="fcs2"></div> 820: </td></tr></table> 821: </div> 822: 823: =cut 824: 825: my $css = qq[ 826: <style> 827: #tablist { 828: padding: 3px 0 3px 6px; 829: margin-left: 0; 830: font: 13px Tahoma; 831: /* line-height: 16px; */ 832: white-space: nowrap; 833: } 834: #tablist li { 835: list-style: none; 836: margin: 0; 837: display: inline; 838: white-space: nowrap; 839: } 840: #tablist li a { 841: color: #555; 842: padding: 3px 6px; 843: margin-left: 3px; 844: border: 1px solid #888; 845: border-bottom: none; 846: background: #ddd; 847: text-decoration: none; 848: font-weight: normal; 849: border-top-left-radius: 6px; 850: border-top-right-radius: 6px; 851: } 852: </style> 853: ]; 854: 855: my $javascript = qq[ 856: <script language="JavaScript"> 857: 858: window.onload = function(){ showTab($start_page); } 859: 860: function showTab(tabnum) { 861: for (i = 0; i <= $pagenum; i++) { 862: document.getElementById('$tabsheet_name'+i).style.display = 'none'; 863: tln = document.getElementById('xtl'+i); 864: tln.style.color = '#555'; 865: tln.style.background = '#ddd'; 866: tln.style.borderBottom = '1px solid #888'; 867: } 868: var tsheet = document.getElementById('$tabsheet_name'+tabnum); 869: var fcname = document.getElementById('$focus_name'+tabnum); 870: var tln = document.getElementById('xtl'+tabnum); 871: if (tsheet) { tsheet.style.display = 'block'; } 872: if (fcname) { fcname.focus(); } 873: if (tln) { 874: tln.style.color = '#000'; 875: tln.style.background = 'white'; 876: tln.style.borderBottom = '1px solid white'; 877: tln.style.backgroundImage = 'url(/admin/pic/tab_bg.gif)'; 878: } 879: } 880: </script]; 881: 882: # See ...Perl\site\lib\Apache\ASP\GlobalASA.pm, lines 91,92... 883: $out .= $css.$javascript.">\n"; # stupid bug... 884: $out .= qq{\n<ul id="tablist" style="margin-bottom:0px;">\n}; 885: 886: if ($sid > 0) { # отображение закладки со ссылкой на дерево объектов 887: $out .= qq{ <li><a href="treejx.asp?sid=$sid&pid=$pid" style="padding-left:0;margin-left:0;background-color:#20a020;color:#c0ffc0;text-decoration:none" target="treeframe"> <acronym title="Отобразить курсор на дереве объектов"><img src="/admin/pic/tree/node-tree.png" class="trico"> $sid/$pid </acronym></a></li>\n}; 888: } 889: 890: for(my $i=0; $i<=$pagenum; $i++) { 891: $pages[0] = qq{<span style="color:blue">$pages[0]</span>} if (($section{sectype} eq 'asp') || ($sid == 0)); 892: $out .= qq{ <li><a href="#$i" id="xtl$i" onclick="showTab($i)">$pages[$i]</a></li>\n}; 893: } 894: 895: $out .= qq{</ul>\n}; 896: 897: return $out; 898: } 899: 900: ####################################################################### 901: sub get_indexgroup_str { # (index_name) 902: # получить строку списка разделов по имени 903: my $index_name = shift; 904: my ($idx) = getonerec("select flist from srvindex where name='$index_name'"); 905: return $idx; 906: } 907: 908: ####################################################################### 909: sub get_indexgroup_lst { # (index_name) 910: # получить список разделов по имени 911: my $index_name = shift; 912: my ($idx) = getonerec("select flist from srvindex where name='$index_name'"); 913: return split(/,\s*/, $idx); 914: } 915: 916: ####################################################################### 917: sub exist_in_indexgroup { # ($index_name, $value) 918: # проверить наличие $value в списке разделов по имени 919: my ($index_name, $value) = @_; 920: my ($idx) = getonerec("select flist from srvindex where name='$index_name'"); 921: return exist_in_list($value, split(/,\s*/, $idx)); 922: } 923: 924: ###################################################################### 925: sub recalctree { # ($sid) 926: # получить список всех подчиненных разделов от указанного 927: my $sl = shift; 928: $sl =~ s/\D+/,/g; 929: my @srvindex = (); 930: my ($q, $s, $r); 931: $q = "select sid from section order by sid"; 932: $s = $db->prepare($q) || print $db->errstr, ", query:[$q]<br>\n"; 933: $s->execute() || print $db->errstr, ", query:[$q]<br>\n"; 934: while ( $r = $s->fetchrow_hashref ) { 935: my @tw = (); 936: @treewalk = &tree_walk($r->{sid}); 937: foreach my $item (reverse @treewalk) { push(@tw, $item->[0]); } 938: my %union = (); 939: my %isect = (); 940: # объединение и пересечение множеств @tw и "$sl", результат в %union и %isect 941: foreach my $e (@tw, split(',', $sl)) { $union{$e}++ && $isect{$e}++ } 942: push(@srvindex, $r->{sid}) if (scalar(keys %isect)); 943: } 944: $s->finish; 945: return @srvindex; 946: } 947: 948: ####################################################################### 949: sub autorecalctree { 950: # Обновление индексных групп при изменении иерархии разделов 951: my $visual = shift; 952: my ($q1, $s1, $r1); 953: my ($q2, $s2, $r2); 954: 955: print qq{<div id="autoupdate" style="padding-top:10px;">Обновление индексных групп : } if ($visual); 956: 957: $q1 = "select id,slist from srvindex order by id desc"; 958: $s1 = $db->prepare($q1) || print $db->errstr, ", query:[$q1]<br>\n"; 959: $s1->execute() || print $db->errstr, ", query:[$q1]<br>\n"; 960: while ( $r1 = $s1->fetchrow_hashref ) { 961: print qq{<span style="background-color:blue;color:white"> $r1->{id} </span> } if ($visual); 962: $Response->Flush() if ($visual); # anti timeout solution 963: my $flist = join(',', recalctree($r1->{slist})); 964: $q2 = "update srvindex set flist=? where id=$r1->{id}"; 965: $s2 = $db->prepare($q2) || print $db->errstr, ", query:[$q2]<br>\n"; 966: $s2->execute($flist) || print $db->errstr, ", query:[$q2]<br>\n"; 967: $s2->finish; 968: } 969: $s1->finish; 970: 971: print qq{\n</div>\n<style>#autoupdate {display:none} </style>\n} if ($visual); 972: } 973: 974: ####################################################################### 975: sub check_for_secdel { # (sid) 976: # проверка возможности удаления раздела 977: my ($sid) = @_; 978: my @cd_msg = (); 979: my ($cs, $cp, $cf) = (0, 0, 0); 980: my $filedir = "$uploaddir/$sid"; 981: 982: # считаем количество подразделов 983: ($cs) = getonerec("select count(sid) from section where secparent = $sid"); 984: push(@cd_msg, "Разделов: <span style='color:red'>$cs</span>") if ($cs); 985: 986: # считаем количество документов в разделе 987: ($cp) = getonerec("select count(pid) from documents where sid = $sid"); 988: push(@cd_msg, "Страниц: <span style='color:red'>$cp</span>") if ($cp); 989: 990: # считаем количество файлов в разделе 991: if (opendir(D, $filedir)) { 992: my @rm_dir = readdir(D); 993: closedir(D); 994: 995: $cf = scalar(@rm_dir); 996: 997: # уменьшаем $cf из за служебных папок: '.' и '..' 998: foreach my $d (@rm_dir) { $cf-- if ($d =~ m/^\.+$/); } 999: 1000: } 1001: push(@cd_msg, "Файлов: <span style='color:red'>$cf</span>") if ($cf); 1002: 1003: return @cd_msg; 1004: } 1005: 1006: ###################################################################### 1007: sub get_section { # (sid) 1008: # прочитать информацию о разделе 1009: # return hash 1010: my ($sid) = @_; 1011: my (%ret, $query, $st, $row) = (); 1012: if ($sid > 0) { 1013: $query = "select * from section where sid=?"; 1014: $st = $db->prepare($query) || print $db->errstr,", Q:[$query]\n"; 1015: $st->execute($sid) || print $db->errstr,", Q:[$query]\n"; 1016: $row = $st->fetchrow_hashref; 1017: foreach my $i (keys %{$row}) { $ret{$i} = $row->{$i}; } 1018: $st->finish; 1019: } 1020: return %ret; 1021: } 1022: 1023: ###################################################################### 1024: sub get_document { # (sid, pid) 1025: # прочитать документ 1026: # return hash 1027: my ($sid, $pid) = @_; 1028: my (%ret, $query, $st, $row) = (); 1029: $query = "select * from documents where sid=? and pid=?"; 1030: $st = $db->prepare($query) || print $db->errstr,", Q:[$query]\n"; 1031: $st->execute($sid, $pid) || print $db->errstr,", Q:[$query]\n"; 1032: $row = $st->fetchrow_hashref; 1033: $st->finish; 1034: foreach my $i (keys %{$row}) { $ret{$i} = $row->{$i}; } 1035: return %ret; 1036: } 1037: 1038: ###################################################################### 1039: sub get_document_ex { # (sid, pid) 1040: # прочитать документ с расширенными полями 1041: # return hash 1042: my ($sid, $pid) = @_; 1043: my (%ret, $query, $st, $row) = (); 1044: %ret = get_document($sid, $pid); 1045: $query = "select field,value from documents_ex where sid=? and pid=?"; 1046: $st = $db->prepare($query) || print $db->errstr,", Q:[$query]\n"; 1047: $st->execute($sid, $pid) || print $db->errstr,", Q:[$query]\n"; 1048: while ( $row = $st->fetchrow_hashref ) { $ret{$row->{field}} = $row->{value}; } 1049: $st->finish; 1050: return %ret; 1051: } 1052: 1053: ###################################################################### 1054: sub get_sec_documents { # (sid, 'body') 1055: # прочитать все документы раздела (с или без тела документа) 1056: # return array of hashes 1057: # body == [ 1,0 ] 1058: my ($sid, $body) = @_; 1059: my (@ret, $query, $st, $row, $b) = (); 1060: $b = 'pagebody,' if ($body); 1061: my $fields = "sid,pid,userid,url,pagename,".$b."pagedate,pagemodify,pageorder,sh_hdr,sh_dir,sh_nav,sh_tab,docstatus"; 1062: $query = "select $fields from documents where sid=? order by pid"; 1063: $st = $db->prepare($query) || print $db->errstr,", Q:[$query]\n"; 1064: $st->execute($sid) || print $db->errstr,", Q:[$query]\n"; 1065: while ( $row = $st->fetchrow_hashref ) { push(@ret, $row); } 1066: $st->finish; 1067: return @ret; 1068: } 1069: 1070: ###################################################################### 1071: sub get_sec_documents_ex { # (sid, body, x_where) 1072: # прочитать все документы раздела с расширенными полями (с или без тела документа) 1073: # return array of hashes 1074: # body == [ 1,0 ] 1075: my ($sid, $body, $x_where) = @_; 1076: my (@ret, @ret_ex, $query, $st, $row, $b) = (); 1077: 1078: $b = 'documents.pagebody,' if ($body); 1079: my $fields = " 1080: documents.sid, 1081: documents.pid, 1082: documents.userid, 1083: documents.url, 1084: documents.pagename, 1085: $b 1086: documents.pagedate, 1087: documents.pagemodify, 1088: documents.pageorder, 1089: documents.sh_hdr, 1090: documents.sh_dir, 1091: documents.sh_nav, 1092: documents.sh_tab, 1093: documents.docstatus, 1094: documents_ex.field, 1095: documents_ex.value"; 1096: $query = "select $fields from documents 1097: left outer join documents_ex on (documents_ex.sid = documents.sid) and (documents_ex.pid = documents.pid) 1098: where documents.sid = $sid"; 1099: $query = "$query and ($x_where)" if ($x_where); 1100: 1101: # open(F, ">>$site_path/asa/q.log"); 1102: # print F "get_sec_documents_ex: $query\n\n"; 1103: # close(F); 1104: 1105: $st = $db->prepare($query) || print $db->errstr,", Q:[$query]\n"; 1106: $st->execute() || print $db->errstr,", Q:[$query]\n"; 1107: while ( $row = $st->fetchrow_hashref ) { push(@ret, $row); } 1108: $st->finish; 1109: 1110: # получили массив @ret с дублями строк для полей из documents 1111: 1112: my %h = (); 1113: foreach my $i (@ret) { 1114: # чтобы избавится от дублей пихаем строки в хэш, где ключ = 'sid.pid' 1115: if (!defined($h{"$i->{sid}.$i->{pid}"})) { 1116: $h{"$i->{sid}.$i->{pid}"} = { 1117: 'sid' => $i->{'sid'}, 1118: 'pid' => $i->{'pid'}, 1119: 'userid' => $i->{'userid'}, 1120: 'url' => $i->{'url'}, 1121: 'pagename' => $i->{'pagename'}, 1122: 'pagedate' => $i->{'pagedate'}, 1123: 'pagemodify' => $i->{'pagemodify'}, 1124: 'pageorder' => $i->{'pageorder'}, 1125: 'sh_hdr' => $i->{'sh_hdr'}, 1126: 'sh_dir' => $i->{'sh_dir'}, 1127: 'sh_nav' => $i->{'sh_nav'}, 1128: 'sh_tab' => $i->{'sh_tab'}, 1129: 'docstatus' => $i->{'docstatus'}, 1130: $i->{'field'} => $i->{'value'}, 1131: }; 1132: } else { 1133: # в случае сущесвования такой же строки в хэше - добавляем очередное поле из documents_ex 1134: $h{"$i->{sid}.$i->{pid}"}->{$i->{'field'}} = $i->{'value'}; 1135: } 1136: } 1137: 1138: @ret = (); 1139: # перекидываем всё из хэша в массив 1140: foreach my $i (keys %h) { 1141: push(@ret, $h{$i}); 1142: } 1143: 1144: return @ret; 1145: } 1146: 1147: ###################################################################### 1148: sub create_document { # (sid, userid, hash_fields) 1149: # создать документ в указанном разделе 1150: my ($sid, $userid, %fields) = @_; 1151: my ($pid, $query, $st) = (); 1152: 1153: my $in_trn = 0; 1154: $in_trn = 1 if (!$db->{AutoCommit}); 1155: $db->{AutoCommit} = 0 if (!$in_trn); 1156: eval { 1157: # search new $pid for $sid 1158: my ($pid) = getonerec("select max(pid) from documents where sid=$sid"); 1159: $pid++; 1160: # set default values for new document 1161: $fields{pageorder} = $pid * 10; 1162: 1163: # insert new fields of document 1164: $query = "insert into documents (sid,pid,userid,url,pagename,pagebody,pagedate,pagemodify,pageorder,sh_hdr,sh_dir,sh_nav,sh_tab,docstatus) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; 1165: $st = $db->prepare($query) || print $db->errstr,", Q:[$query]\n"; 1166: $st->execute($sid, $pid, $userid, 1167: $fields{url}, 1168: $fields{pagename}, 1169: $fields{pagebody}, 1170: $fields{pagedate}, 1171: $fields{pagemodify}, 1172: $fields{pageorder}, 1173: $fields{sh_hdr}, 1174: $fields{sh_dir}, 1175: $fields{sh_nav}, 1176: $fields{sh_tab}, 1177: $fields{docstatus} 1178: ) || print $db->errstr,", Q:[$query]\n"; 1179: 1180: journaldata('create_document', $sid, $pid, $userid, %fields); 1181: logdata($query); 1182: 1183: $db->commit if (!$in_trn); 1184: }; 1185: $db->{AutoCommit} = 1 if (!$in_trn); 1186: 1187: return 0; 1188: } 1189: 1190: ###################################################################### 1191: sub create_document_ex { # (sid, userid, hash_fields) 1192: # создать документ с расширенными полями в указанном разделе 1193: my ($sid, $userid, %fields) = @_; 1194: my ($query, $st) = (); 1195: my (%fields_ex) = (); 1196: 1197: # separate fields to %fields and '_ex' to %fields_ex 1198: foreach my $i (keys %fields) { 1199: if (!exist_in_list($i, @doc_fields)) { 1200: $fields_ex{$i} = $fields{$i}; 1201: delete($fields{$i}); 1202: } 1203: } 1204: 1205: my $in_trn = 0; 1206: $in_trn = 1 if (!$db->{AutoCommit}); 1207: $db->{AutoCommit} = 0 if (!$in_trn); 1208: eval { 1209: 1210: create_document($sid, $userid, %fields); 1211: my ($pid) = getonerec("select max(pid) from documents where sid=$sid"); 1212: 1213: $fields{pagebody} = ''; 1214: 1215: # insert '_ex' fields to documents_ex 1216: $query = "insert into documents_ex (sid,pid,field,value) values (?,?,?,?)"; 1217: $st = $db->prepare($query) || print $db->errstr,", Q:[$query]\n"; 1218: foreach my $i (keys %fields_ex) { 1219: $st->execute($sid, $pid, $i, $fields_ex{$i}); 1220: $fields{pagebody} .= "EX:[$i]: $fields_ex{$i}<br>\n"; 1221: } 1222: 1223: journaldata('create_document_ex', $sid, $pid, $userid, %fields); 1224: logdata($query); 1225: 1226: $db->commit if (!$in_trn); 1227: }; 1228: $db->{AutoCommit} = 1 if (!$in_trn); 1229: 1230: return 0; 1231: } 1232: 1233: ###################################################################### 1234: sub delete_document { # ($sid, $pid, $userid) 1235: # удалить документ 1236: my ($sid, $pid, $userid) = @_; 1237: my ($query, $st) = (); 1238: 1239: my $in_trn = 0; 1240: $in_trn = 1 if (!$db->{AutoCommit}); 1241: $db->{AutoCommit} = 0 if (!$in_trn); 1242: eval { 1243: my %fields = get_document($sid, $pid); 1244: 1245: $query = "delete from documents where sid=$sid and pid=$pid"; 1246: $db->do($query) || print $db->errstr, ", query:[$query]<br>\n"; 1247: 1248: journaldata('delete_document', $sid, $pid, $userid, %fields); 1249: logdata($query); 1250: 1251: $db->commit if (!$in_trn); 1252: }; 1253: $db->{AutoCommit} = 1 if (!$in_trn); 1254: 1255: return 0; 1256: } 1257: 1258: ###################################################################### 1259: sub delete_document_ex { # ($sid, $pid, $userid) 1260: # удалить документ с расширенными полями 1261: my ($sid, $pid, $userid) = @_; 1262: my ($query, $st) = (); 1263: 1264: my $in_trn = 0; 1265: $in_trn = 1 if (!$db->{AutoCommit}); 1266: $db->{AutoCommit} = 0 if (!$in_trn); 1267: eval { 1268: my %fields = get_document($sid, $pid); 1269: 1270: $query = "delete from documents where sid=$sid and pid=$pid"; 1271: $db->do($query) || print $db->errstr, ", query:[$query]<br>\n"; 1272: 1273: journaldata('delete_document', $sid, $pid, $userid, %fields); 1274: logdata($query); 1275: 1276: my %fields_ex = get_document_ex($sid, $pid); 1277: 1278: $query = "delete from documents_ex where sid=$sid and pid=$pid"; 1279: $db->do($query) || print $db->errstr, ", query:[$query]<br>\n"; 1280: 1281: $fields{pagebody} = ''; 1282: foreach my $i (keys %fields_ex) { 1283: $fields{pagebody} .= "EX:[$i]: $fields_ex{$i}<br>\n"; 1284: } 1285: 1286: journaldata('delete_document_ex', $sid, $pid, $userid, %fields); 1287: logdata($query); 1288: 1289: $db->commit if (!$in_trn); 1290: }; 1291: $db->{AutoCommit} = 1 if (!$in_trn); 1292: 1293: return 0; 1294: } 1295: 1296: ###################################################################### 1297: sub delete_section { # (sid) 1298: # удалить раздел 1299: my ($sid) = @_; 1300: my ($st, $query); 1301: 1302: my $in_trn = 0; 1303: $in_trn = 1 if (!$db->{AutoCommit}); 1304: $db->{AutoCommit} = 0 if (!$in_trn); 1305: eval { 1306: 1307: $query = "delete from section where sid = $sid"; 1308: $db->do($query) || print $db->errstr, ", query:[$query]<br>\n"; 1309: 1310: logdata($query); 1311: 1312: # remove rights for deleted section 1313: $query = "delete from usersacc where sid = $sid"; 1314: $db->do($query) || print $db->errstr, ", query:[$query]<br>\n"; 1315: 1316: logdata($query); 1317: 1318: $db->commit if (!$in_trn); 1319: }; 1320: $db->{AutoCommit} = 1 if (!$in_trn); 1321: 1322: return 0; 1323: } 1324: 1325: ###################################################################### 1326: sub replace_document { # (sid, pid, userid, hash_fields) 1327: # заменить документ 1328: my ($sid, $pid, $userid, %fields) = @_; 1329: my ($query, $st) = (); 1330: 1331: my $in_trn = 0; 1332: $in_trn = 1 if (!$db->{AutoCommit}); 1333: $db->{AutoCommit} = 0 if (!$in_trn); 1334: eval { 1335: 1336: # update fields of document 1337: $query = "update documents set userid=?,url=?,pagename=?,pagebody=?,pagedate=?,pagemodify=?,pageorder=?,sh_hdr=?,sh_dir=?,sh_nav=?,sh_tab=?,docstatus=? where sid=$sid and pid=$pid"; 1338: $st = $db->prepare($query) || print $db->errstr,", Q:[$query]\n"; 1339: $st->execute($userid, 1340: $fields{url}, 1341: $fields{pagename}, 1342: $fields{pagebody}, 1343: $fields{pagedate}, 1344: $fields{pagemodify}, 1345: $fields{pageorder}, 1346: $fields{sh_hdr}, 1347: $fields{sh_dir}, 1348: $fields{sh_nav}, 1349: $fields{sh_tab}, 1350: $fields{docstatus} 1351: ) || print $db->errstr,", Q:[$query]\n"; 1352: 1353: journaldata('replace_document', $sid, $pid, $userid, %fields); 1354: logdata($query); 1355: 1356: $db->commit if (!$in_trn); 1357: }; 1358: $db->{AutoCommit} = 1 if (!$in_trn); 1359: 1360: return 0; 1361: } 1362: 1363: ###################################################################### 1364: sub replace_document_ex { # (sid, pid, userid, hash_fields) 1365: # заменить документ с расширенными полями 1366: my ($sid, $pid, $userid, %fields) = @_; 1367: my ($query, $st) = (); 1368: my (%fields_ex) = (); 1369: 1370: # separate fields to %fields and '_ex' to %fields_ex 1371: foreach my $i (keys %fields) { 1372: if (!exist_in_list($i, @doc_fields)) { 1373: $fields_ex{$i} = $fields{$i}; 1374: delete($fields{$i}); 1375: } 1376: } 1377: 1378: my $in_trn = 0; 1379: $in_trn = 1 if (!$db->{AutoCommit}); 1380: $db->{AutoCommit} = 0 if (!$in_trn); 1381: eval { 1382: 1383: replace_document($sid, $pid, $userid, %fields); 1384: 1385: $fields{pagebody} = ''; 1386: 1387: # delete '_ex' fields in documents_ex 1388: $query = "delete from documents_ex where sid = $sid and pid = $pid"; 1389: $db->do($query) || print $db->errstr, ", query:[$query]<br>\n"; 1390: 1391: # insert '_ex' fields to documents_ex 1392: $query = "insert into documents_ex (sid,pid,field,value) values (?,?,?,?)"; 1393: $st = $db->prepare($query) || print $db->errstr,", Q:[$query]\n"; 1394: foreach my $i (keys %fields_ex) { 1395: $st->execute($sid, $pid, $i, $fields_ex{$i}); 1396: $fields{pagebody} .= "EX:[$i]== $fields_ex{$i}\n"; 1397: } 1398: 1399: journaldata('replace_document_ex', $sid, $pid, $userid, %fields); 1400: logdata($query); 1401: 1402: $db->commit if (!$in_trn); 1403: }; 1404: $db->{AutoCommit} = 1 if (!$in_trn); 1405: 1406: return 0; 1407: } 1408: 1409: ###################################################################### 1410: sub create_section { # (hash_fields) 1411: # создать раздел 1412: my (%fields) = @_; 1413: my ($st, $sid, $query); 1414: 1415: return -1 if (!$fields{secname}); 1416: return -2 if ($fields{secparent} !~ m/^\d+$/); 1417: return -3 if ($fields{sectype} !~ m/table|asp/); 1418: return -4 if (($fields{sectype} eq 'asp') && ($fields{plug_view} eq '')); 1419: 1420: my $in_trn = 0; 1421: $in_trn = 1 if (!$db->{AutoCommit}); 1422: $db->{AutoCommit} = 0 if (!$in_trn); 1423: eval { 1424: 1425: my ($secorder) = getonerec("select max(secorder) from section where secparent=$FORM->{secparent}"); 1426: $secorder = $secorder + 10; 1427: 1428: $fields{sectype} = $fields{sectype} || 'table'; 1429: $fields{sorttype} = $fields{sorttype} || 'az'; 1430: 1431: # insert record of section 1432: $query = "insert into section (secparent,secname,secdescr,sectype,plug_view,plug_admn,plug_ico,startpage,sorttype,secorder,sh_nav,sh_dir,sh_hdr) values (?,?,?,?,?,?,?,?,?,?,?,?,?)"; 1433: $st = $db->prepare($query) || print $db->errstr, ", query:[$query]<br>\n"; 1434: $st->execute($fields{secparent}, 1435: $fields{secname}, 1436: ($fields{secdescr}) ? $fields{secdescr} : $fields{secname}, 1437: $fields{sectype}, 1438: $fields{plug_view}, 1439: $fields{plug_admn}, 1440: $fields{plug_ico}, 1441: ($fields{sectype} eq 'table') ? $fields{startpage} : 0, 1442: $fields{sorttype}, 1443: $secorder, 1444: ($fields{sh_nav} eq "on") ? "Y" : "N", 1445: ($fields{sh_dir} eq "on") ? "Y" : "N", 1446: ($fields{sh_hdr} eq "on") ? "Y" : "N", 1447: ) || print $db->errstr, ", query:[$query]<br>\n"; 1448: 1449: $sid = $db->{'mysql_insertid'}; 1450: 1451: logdata($query); 1452: 1453: # delete all rights for new section 1454: $query = "delete from usersacc where sid=$sid"; 1455: $db->do($query) || print $db->errstr, ", query:[$query]<br>\n"; 1456: 1457: # copy rights from parent to current section 1458: $query = "insert into usersacc (userid,sid,rights) select userid,$sid,rights from usersacc where sid=$FORM->{secparent}"; 1459: $db->do($query) || print $db->errstr, ", query:[$query]<br>\n"; 1460: 1461: $db->commit if (!$in_trn); 1462: }; 1463: $db->{AutoCommit} = 1 if (!$in_trn); 1464: 1465: return $sid; 1466: } 1467: 1468: ###################################################################### 1469: sub update_section { # (sid, hash_fields) 1470: # изменить раздел 1471: my ($sid, %fields) = @_; 1472: my ($st, $query); 1473: 1474: $fields{secparent} = 0 if (!defined($fields{secparent})); 1475: 1476: return -1 if (!$fields{secname}); 1477: return -2 if ($fields{secparent} !~ m/^\d+$/); 1478: return -3 if ($fields{sectype} !~ m/table|asp/); 1479: return -4 if (($fields{sectype} eq 'asp') && ($fields{plug_view} eq '')); 1480: return -5 if (($fields{sectype} eq 'table') && ($fields{startpage} !~ m/^\-*\d+$/)); 1481: return -6 if ($fields{secorder} !~ m/^\d+$/); 1482: 1483: $fields{sorttype} = $fields{sorttype} || 'az'; 1484: $fields{sh_nav} = ($fields{sh_nav} =~ m/on|Y/) ? 'Y' : 'N'; 1485: $fields{sh_dir} = ($fields{sh_dir} =~ m/on|Y/) ? 'Y' : 'N'; 1486: $fields{sh_hdr} = ($fields{sh_hdr} =~ m/on|Y/) ? 'Y' : 'N'; 1487: 1488: if ($fields{sectype} eq 'table') { 1489: $fields{plug_view} = ''; 1490: $fields{plug_admn} = ''; 1491: $fields{plug_ico} = ''; 1492: } elsif ($fields{sectype} eq 'asp') { 1493: $fields{startpage} = 0; 1494: } 1495: 1496: my $in_trn = 0; 1497: $in_trn = 1 if (!$db->{AutoCommit}); 1498: $db->{AutoCommit} = 0 if (!$in_trn); 1499: eval { 1500: 1501: if ($godaccess) { # only GODS may change fields: 'plug_view, plug_admn, plug_ico, sec_tpl' 1502: 1503: $query = "update section set secname=?, secdescr=?, secparent=?, sectype=?, plug_view=?, plug_admn=?, plug_ico=?, sectpl=?, startpage=?, sorttype=?, secorder=?, sh_nav=?, sh_dir=?, sh_hdr=? where sid=$sid"; 1504: $st = $db->prepare($query) || print $db->errstr, ", query:[$query]<br>\n"; 1505: $st->execute($fields{secname}, 1506: ($fields{secdescr}) ? $fields{secdescr} : $fields{secname}, 1507: $fields{secparent}, 1508: $fields{sectype}, 1509: $fields{plug_view}, 1510: $fields{plug_admn}, 1511: $fields{plug_ico}, 1512: $fields{template}, 1513: $fields{startpage}, 1514: $fields{sorttype}, 1515: $fields{secorder}, 1516: $fields{sh_nav}, 1517: $fields{sh_dir}, 1518: $fields{sh_hdr}) || print $db->errstr, ", query:[$query]<br>\n"; 1519: } else { 1520: 1521: $query = "update section set secname=?, secdescr=?, secparent=?, sectype=?, startpage=?, sorttype=?, secorder=?, sh_nav=?, sh_dir=?, sh_hdr=? where sid=$sid"; 1522: $st = $db->prepare($query) || print $db->errstr, ", query:[$query]<br>\n"; 1523: $st->execute($fields{secname}, 1524: ($fields{secdescr}) ? $fields{secdescr} : $fields{secname}, 1525: $fields{secparent}, 1526: $fields{sectype}, 1527: $fields{startpage}, 1528: $fields{sorttype}, 1529: $fields{secorder}, 1530: $fields{sh_nav}, 1531: $fields{sh_dir}, 1532: $fields{sh_hdr}) || print $db->errstr, ", query:[$query]<br>\n"; 1533: } 1534: 1535: logdata($query); 1536: 1537: $db->commit if (!$in_trn); 1538: }; 1539: $db->{AutoCommit} = 1 if (!$in_trn); 1540: 1541: return 0; 1542: } 1543: 1544: ###################################################################### 1545: sub move_document { # ($sid, $pid, $new_sid, $userid) 1546: # переместить документ в другой раздел 1547: my ($sid, $pid, $new_sid, $userid) = @_; 1548: my ($query, $st) = (); 1549: 1550: my $in_trn = 0; 1551: $in_trn = 1 if (!$db->{AutoCommit}); 1552: $db->{AutoCommit} = 0 if (!$in_trn); 1553: eval { 1554: my ($new_pid, $new_pageorder) = getonerec("select max(pid),max(pageorder) from documents where sid=$new_sid"); 1555: $new_pid++; 1556: $new_pageorder = $new_pageorder + 10; 1557: 1558: my %fields = get_document($sid, $pid); 1559: 1560: $query = "update documents set userid=?, sid=?, pid=?, pageorder=? where sid=$sid and pid=$pid"; 1561: $st = $db->prepare($query) || print $db->errstr, ", query:[$query]<br>\n"; 1562: $st->execute($userid, $new_sid, $new_pid, $new_pageorder) || print $db->errstr, ", query:[$query]<br>\n"; 1563: 1564: $fields{pagebody} = "Change: <b>$sid/$pid</b> to <b>$new_sid/$new_pid</b>"; 1565: 1566: journaldata('move_document', $new_sid, $new_pid, $userid, %fields); 1567: logdata($query); 1568: 1569: $db->commit if (!$in_trn); 1570: }; 1571: $db->{AutoCommit} = 1 if (!$in_trn); 1572: 1573: return 0; 1574: } 1575: 1576: ###################################################################### 1577: sub journaldata { # ($func, $sid, $pid, $userid, %fields) 1578: # записать в журнал документ/раздел/сообщение 1579: my ($func, $sid, $pid, $userid, %fields) = @_; 1580: my $query = "insert into journal (ipaddr,function,sid,pid,userid,url,pagename,pagebody,pagedate,docstatus) values (?,?,?,?,?,?,?,?,?,?)"; 1581: my $st = $db->prepare($query) || print $db->errstr,", Q:[$query]\n"; 1582: $st->execute($remoteaddr, $func, $sid, $pid, $userid, 1583: $fields{url}, 1584: $fields{pagename}, 1585: $fields{pagebody}, 1586: $fields{pagedate}, 1587: $fields{docstatus} 1588: ) || print $db->errstr,", Q:[$query]\n"; 1589: } 1590: 1591: ###################################################################### 1592: sub cutwords { # ($string, $numwords) 1593: # отрезать от новостного сообщения начало в $numwords слов 1594: my ($str, $nw) = @_; 1595: my $ret; 1596: 1597: $str =~ s!<p(.*?)>! <p$1>!i; 1598: $str =~ s!<br>! <br>!i; 1599: $str =~ s!<div(.*?)>! <div$1>!i; 1600: 1601: $str =~ s!<(/*strong)>!%%$1%%!gi; 1602: $str =~ s!<(/*)b>!%%$1strong%%!gi; 1603: $str =~ s!<img (.+?)>!%%img $1%%!i; 1604: 1605: $str =~ s/(<(?=!--)([^>]|\n)*--(?=>)>)//ig; 1606: $str =~ s/|(<\/?([^>]|\n)*>)//g; 1607: 1608: $str =~ s/ / /g; 1609: $str =~ s/\s+/ /g; 1610: 1611: $str =~ s!%%(/*strong)%%!<$1>!gi; 1612: $str =~ s!%%img (.+?)%%!<img $1>!i; 1613: 1614: my @a = split(/\s/, $str); 1615: if ($#a > $nw) { 1616: $ret = join(' ', splice(@a, 0, $nw)) . qq{<b> . . .</b>}; 1617: } else { 1618: $ret = $str; 1619: } 1620: 1621: if (($ret =~ m!<strong>!) && ($ret !~ m!</strong>!)) { $ret .= "</strong>"; } 1622: 1623: return $ret; 1624: } 1625: 1626: ###################################################################### 1627: sub round { 1628: # округлить значение 1629: my $i = shift; 1630: return $i - int($i) < 0.5 ? int($i) : int($i)+1; 1631: } 1632: 1633: ###################################################################### 1634: sub rss_expand_img_url { 1635: # разворачивает URL картинки для RSS 1636: my ($u1, $u2, $u3) = @_; 1637: return "<img $u1"."src=\"http://$servername"."$u2\"$u3>" if ($u2 !~ m!http://!); 1638: return ""; 1639: } 1640: 1641: ###################################################################### 1642: sub rss_expand_hrf_url { 1643: # разворачивает URL ссылки для RSS 1644: my ($u1, $u2, $u3) = @_; 1645: return "<a $u1"."href=\"https://$servername"."$u2\"$u3>" if ($u2 !~ m!http://!); 1646: return ""; 1647: } 1648: 1649: ###################################################################### 1650: sub rss_clear_html_to_xml { 1651: # причесывает страницу по правилам XML 1652: my $txt = shift; 1653: 1654: $txt =~ s/<img (.*?)src="(.+?)"(.*?)>/rss_expand_img_url($1,$2,$3)/ige; 1655: $txt =~ s/<a (.*?)href="(.+?)"(.*?)>/rss_expand_hrf_url($1,$2,$3)/ige; 1656: $txt =~ s/ / /g; 1657: $txt =~ s/\s+/ /g; 1658: $txt =~ s/&/&/g; 1659: $txt =~ s/</</gi; 1660: 1661: return $txt; 1662: } 1663: 1664: ###################################################################### 1665: sub get_root_category { 1666: # для текущего раздела (что в последнем элементе массива @treewalk) ищет предка, у которого родитель = 4 1667: if (@treewalk) { 1668: if (@treewalk[scalar(@treewalk)-1]->[0] == 4) { 1669: return @treewalk[scalar(@treewalk)-2]->[1]; 1670: } else { 1671: return @treewalk[scalar(@treewalk)-1]->[1]; 1672: } 1673: } else { 1674: return ""; 1675: } 1676: } 1677: 1678: ###################################################################### 1679: sub send_mail_smtp { # ($host, $from, $to, $body) 1680: my ($_host, $_from, $_to, $_xbody) = @_; 1681: $_xbody = "To: $_to\n$_xbody"; 1682: my $smtp = Net::SMTP->new($_host, Hello => 'mail.arhcity.ru', Timeout => 30); 1683: $smtp->mail($_from); 1684: $smtp->to($_to); 1685: $smtp->data(); 1686: $smtp->datasend($_xbody); 1687: $smtp->dataend(); 1688: $smtp->quit; 1689: } 1690: 1691: ###################################################################### 1692: sub get_cookie { 1693: # возвращает значение куки по ключу (см. \asp\admin\lib\adminlib.js) 1694: my $name = shift; 1695: my $cook = $SERVER->{HTTP_COOKIE}; 1696: my @arr = split(/;\s*/, $cook); 1697: my %ck = (); 1698: foreach my $c (@arr) { 1699: my ($k, $v) = split(/=/, $c); 1700: $ck{$k} = $v; 1701: } 1702: return $ck{$name}; 1703: } 1704: 1705: ###################################################################### 1706: sub random_str { 1707: # возвращает строку указанной длинны (или 5) из случайных символов 1708: my $len = shift || 5; 1709: my $c = '0123456789abcdefghijklmnopqrstuvwxyz'; 1710: my $l = length($c); 1711: my $s = ''; 1712: for (1 .. $len) { 1713: $s .= substr($c, int(rand()*$l), 1); 1714: } 1715: return $s; 1716: } 1717: 1718: ###################################################################### 1719: sub check_body_style { # ( body ) 1720: my $body = shift; 1721: my (@cb_arr, @ret_txt) = (); 1722: 1723: @cb_arr = (); @cb_arr = $body =~ m!<(img|a).* (src|href)="data:image/(gif|png|jpeg);base64,(\S+)"!sg; 1724: push(@ret_txt, "• Недопустимое применение ссылок формата \"data:image\" (".(scalar(@cb_arr)/4)." раз.)") if (@cb_arr > 0); 1725: 1726: @cb_arr = (); @cb_arr = $body =~ m/<w:LsdException/sg; 1727: push(@ret_txt, "• В тексте присутствует таблица стилей 'LsdException'") if (@cb_arr > 1); 1728: 1729: @cb_arr = (); @cb_arr = $body =~ m/<w:WordDocument>/sg; 1730: push(@ret_txt, "• В тексте присутствует таблица стилей 'WordDocument'") if (@cb_arr > 1); 1731: 1732: @cb_arr = (); @cb_arr = $body =~ m/text-indent:27\.0pt|class="MsoNormal"|tab-stops:list -9\.0pt|mso-layout-grid-align:/sg; 1733: push(@ret_txt, "• В тексте присутствуют инлайн-стили от Microsoft Word (".scalar(@cb_arr)." раз.)") if (@cb_arr > 4); 1734: 1735: @cb_arr = (); @cb_arr = $body =~ m/style="font-family: 'Times New Roman'/sg; 1736: push(@ret_txt, "• Слишком частое использование шрифта 'Times New Roman' (".scalar(@cb_arr)." раз.)") if (@cb_arr > 5); 1737: 1738: @cb_arr = (); @cb_arr = $body =~ m/<span style="color: .+?;">|<span style="background-color: rgb(255, 255, 255);">/sg; 1739: push(@ret_txt, "• Частое/неуместное использование цветового выделения (".scalar(@cb_arr)." раз.)") if (@cb_arr > 8); 1740: 1741: if (@ret_txt) { 1742: return join("<br>\n", @ret_txt); 1743: } else { 1744: return 0; 1745: } 1746: } 1747: 1748: ###################################################################### 1749: sub meta_og_tags { 1750: # возвращает "Open Graph" тэги для страницы 1751: my ($sid, $pid) = @_; 1752: 1753: my $pageheader = $section{secname}; 1754: $pageheader = "Городские новости" if ($sid == 0); 1755: 1756: # https://ruogp.me/ - Протокол Open Graph 1757: my $r = ''; 1758: $r .= qq{<meta property="og:site_name" content="Администрация города Архангельска" />\n}; 1759: $r .= qq{<meta property="og:url" content="http://arhcity.ru/?page=$sid/$pid" />\n}; 1760: $r .= qq{<meta property="og:title" content="$pageheader" />\n}; 1761: $r .= qq{<meta property="og:description" content="$document{pagename}" />\n}; 1762: $r .= qq{<meta property="og:image" content="http://arhcity.ru/pic/og-image-arhcity.jpg" />\n}; 1763: 1764: if ($section{sectype} eq 'table') { 1765: my $_r = ''; 1766: my $c = 0; 1767: my @og_image = $document{pagebody} =~ m!<img src="(.+?)" .+/>!g; 1768: foreach my $i (@og_image) { 1769: $i =~ s!http://.+?\.ru!!g; 1770: $_r .= qq{<meta property="og:image" content="http://arhcity.ru$i" />\n}; 1771: $c++; 1772: } 1773: if ($c > 5) { # если картинок на странице много ( >5 ) - показываем только первую 1774: my $i = @og_image[0]; 1775: $i =~ s!http://.+?\.ru!!g; 1776: $r .= qq{<meta property="og:image" content="http://arhcity.ru$i" />\n}; 1777: } else { 1778: $r = $_r; 1779: } 1780: } 1781: 1782: return $r; 1783: } 1784: 1785: ###################################################################### 1786: sub gen_int_EO { # (number) 1787: # возвращает случайное чётное/нечётное число в интервале 0..number в зависимости от чётности number 1788: my $n = shift; 1789: my $r = int(rand() * $n); 1790: 1791: if ($n % 2 == 0) { 1792: $r++ if ($r % 2 == 1); 1793: } else { 1794: $r++ if ($r % 2 == 0); 1795: } 1796: return $r; 1797: } 1798: ###################################################################### 1799: sub update_msie_css { 1800: # внедряем в default.css значения переменных из colors.css и создаём default-ie.css 1801: my $ret = 0; 1802: my %vars = (); 1803: 1804: my $default_css_fn = "$SERVER->{DOCUMENT_ROOT}/templates/default.css"; 1805: my $colors_css_fn = "$SERVER->{DOCUMENT_ROOT}/templates/colors.css"; 1806: my $default_ie_css_fn = "$SERVER->{DOCUMENT_ROOT}/templates/default-ie.css"; 1807: 1808: my ($t_default_css) = (stat($default_css_fn))[9]; 1809: my ($t_colors_css) = (stat($colors_css_fn))[9]; 1810: my ($t_default_ie_css) = (stat($default_ie_css_fn))[9]; 1811: 1812: if (($t_default_css > $t_default_ie_css) || ($t_colors_css > $t_default_ie_css)) { 1813: 1814: open(FC, "< $colors_css_fn") || die "Can't open $colors_css_fn, $!\n"; 1815: while (my $l = <FC>) { 1816: $vars{$1} = $2 if ($l =~ m/(--.+?):\s*(.+);/); 1817: } 1818: close(FC); 1819: 1820: open(FS, "< $default_css_fn") || die "Can't open $default_css_fn, $!\n"; 1821: open(FO, "> $default_ie_css_fn") || die "Can't open $default_ie_css_fn, $!\n"; 1822: while (my $l = <FS>) { 1823: next if ($l =~ m/colors.css/); 1824: $l =~ s/(var\((--.+?)\))/exists($vars{$2})?$vars{$2}:'none'/gsex; 1825: print FO $l; 1826: } 1827: close(FO); 1828: close(FS); 1829: } 1830: 1831: $ret = 1 if ((stat($default_ie_css_fn))[7] > 0); # if filesize $default_ie_css_fn > 0 - file OK. 1832: 1833: return $ret; 1834: } 1835: 1836: ###################################################################### 1837: ## XML subroutines ################################################### 1838: ###################################################################### 1839: # see http://www.arhcity.ru/1.asp 1840: # 1841: ###################################################################### 1842: sub ipcms::button { 1843: my ($args, $html) = @_; 1844: my ($ico, $spacer); 1845: 1846: if (( $args->{ico}) && ( $args->{txt})) { $spacer = ' '; } 1847: if ((!$args->{ico}) && ( $args->{txt})) { $spacer = '<img src="/pic/_t.gif" width="1" height="16">'; } 1848: if (( $args->{ico}) && (!$args->{txt})) { $spacer = ''; } 1849: if ((!$args->{ico}) && (!$args->{txt})) { $spacer = '<img src="/pic/_t.gif" width="16" height="16">'; } 1850: 1851: if ($args->{ico}) { $ico = qq{<img src="$args->{ico}" width="16" height="16">}; } 1852: print qq{<a href="$args->{url}"><div class="shbutton">}.$ico.$spacer.$args->{txt}.qq{</div></a>}; 1853: } 1854: 1855: ###################################################################### 1856: sub ipcms::panel { 1857: my ($args, $html) = @_; 1858: my ($o_style, $style); 1859: $o_style = $args->{style} if ($args->{style}); 1860: $style = qq{ style="$o_style"} if ($o_style); 1861: print qq{<div class="border_area"$style>$html<br>}; 1862: print_dump($args); 1863: print qq{</div>\n}; 1864: } 1865: 1866: ;; sub exit { $main::Response->End(); } ;; no lib qw(/var/www/HDD2/mc.arhcity.ru/asa); ;; 1;