#!/usr/bin/perl

# Copyright (c) CGIROOM.                               http://cgiroom.nu
#======================================================================#
# [Ver  2.10s ] 簡易高機能検索専用データベース ソート版
#
# このプログラムによって起きた事にCGIROOMは責任を負いません。
# 利用契約に同意できない方のご利用は、遠慮下さい。

#======================================================================#
# 初期設定

	#◆ jcode.plまでのパス
$require = './jcode.pl';

	#◆ onlyone.plまでのパス
$onlyonepl= './onlyone.pl';

	#◆ データファイルまでのパス
$SEEK{'default'} = './database.csv';
$SEEK{'daimyou'} = './data_daimyou.csv';

	#◆ １ページ標準表示件数
$print_max = 50;

	#◆ １ページ最大表示件数
$max_max = 1000;

	#◆ 最大検索件数
	#    $foundmax件該当が出たら残りのデータは検索しない。
$foundmax = 1000;

	#◆ __LINKLIST__ で表示するページ件数
$linklist = 10;

	#◆ タブ区切りファイルの場合は先頭の「#$tab」の「#」を削除
	#  「<>」区切りのデータファイルなら、そのあと\tを<>に書き変え可能
#$tab = "\t";

	#◆ 改行コード付きCSVを読み込む yes=1 no=0 (注意)
$brcsv = 0;

#======================================================================#

# 新URLに引数(転送先URL)を連結
$agent = $ENV{'HTTP_USER_AGENT'};

$html{'default'} = 'templete.html';
$html{'pk'} = 'templete_pk.html';
$html{'d1'} = 'templete_d1.html';
$html{'d2'} = 'templete_d2.html';
$html{'d3'} = 'templete_d3.html';
$html{'daimyou'} = 'templete_daimyou.html';

#======================================================================#
$sep=" ";
require $onlyonepl if -e $onlyonepl || &error('onlyone.plが見つかりません。','onlyone0001');
$DAT{"start_time"} = (times)[0] ;&set_;
print"Content-type: text/html\n\n";

if( $ENV{'REQUEST_METHOD'} eq "POST" ){
	read( STDIN, $QUERY, $ENV{'CONTENT_LENGTH'} );
}else{
	$QUERY = $ENV{'QUERY_STRING'}
}
require $require if -e $require;
foreach ( split(/&|;/,$QUERY) ){
	($n,$v) = split(/=/);
	$v=~ tr/+/ /;
	$v =~ s/%(..)/pack("C", hex($1))/eg;
	$n =~ s/%(..)/pack("C", hex($1))/eg;
	$v =~ s/\r|\n|\t/ /g;
	$v =~ s/\s+(""|"|,)\s+/ /g;
	$v =~ s/^(""|"|,)$//g;
	next if $n eq "" || $v eq "";
	&jcode::convert(\$v,'sjis') if $jcode::version;
	if(index($n,"IDn",0) >= 0){
		$ID{$n}=$v
	}elsif(index($n,"IDv",0) >= 0){
		$n=~ /^IDv(\d+)/;
		$IDv{$1}.=" " if $IDv{$1};
		$IDv{$1}.=$v;
	}elsif(index($n,"template",0) >= 0){
		push(@template,$v) if $v =~ /^\d+\-\d+$/
	}else{
		$s=$n=~ /^join/ ?"":" ";
		$FORM{$n}.=$s if $FORM{$n};
		$FORM{$n}.=$v
	}
	&tag($v);
	$PRINT{$n}=$v;
}

if( $FORM{'query'} ){
	foreach ( split(/&|;/,$FORM{'query'})){
		($n,$v)=split(/=/);
		next if $n eq "" || $v eq "";
		if($n=~ /^IDn/){
			$ID{$n}=$v
		}elsif($n=~ /^IDv(\d+)/){
			$IDv{$1}.=" " if $IDv{$1};
			$IDv{$1}.=$v
		}else{
			$s=$n=~ /^join/ ?"":" ";
			$FORM{$n}.=$s if $FORM{$n};
			$FORM{$n}.=$v
		}
	}
}

foreach(@template){
	($n,$v)=split(/\-/);
	$FORM{$ID{"IDn$n"}}.= $FORM{$ID{"IDn$n"}} ? " ".$IDv{$v} : $IDv{$v} ;
}

while(($n,$v)=each(%ID)){
	$n =~ /IDn(\d+)/;
	$FORM{$v} .= $FORM{$v} ? " ".$IDv{$1} : $IDv{$1};
}

if(index($QUERY,"join",0) >= 0){
	my @form;
	while(($n,$v)=each(%FORM)){
		$n=~ s/^join//;
		push(@form,"$n\t$v");
		delete $FORM{"join$n"};
	}
	foreach(@form){
		($n,$v)=split(/\t/);
		$FORM{$n} = $v if $n ne "" && $v ne "";
	}
}

if(index($QUERY,"select",0) >= 0){
	my @form;
	while(($n,$v)=each(%FORM)){
		if($n=~ s/^select// && $FORM{"$v$n"} eq ""){
			push(@form,"$v$n\t$FORM{\"value$n\"}");
			delete $FORM{"select$n"};
		}
	}
	foreach(@form){
		($n,$v)=split(/\t/);
		$FORM{$n} = $v if $n ne "" && $v ne "";
	}
}

#テンプレートファイルの読み込み
$FORM{'tid'} =~ s/\W//g;
$HTML = $html{$FORM{'tid'}} || $html{'default'};
open(HTML)||&error("テンプレートファイルを開けません。<br />[$FORM{'tid'}] $!");
read(HTML,$htmls,-s HTML);
close(HTML);
($h_html,$b_html,$f_html)=split("<!--LINE-->",$htmls,3);
&error('非対応のテンプレートファイルファイルが指定されました') unless  $b_html;

$print_max = int($FORM{'print'}) if int($FORM{'print'}) > 0;
$print_max = $max_max if $print_max > $max_max;
$print_max_dat = $print_max;

#======================================================================#
#◆ 類似文字検索機能

if($FORM{'word'} == 2){%W=(
'Ａ','(?:Ａ|ａ|A|a)','ａ','(?:Ａ|ａ|A|a)','A','(?:Ａ|ａ|A|a)','a','(?:Ａ|ａ|A|a)',
'Ｂ','(?:Ｂ|ｂ|B|b)','ｂ','(?:Ｂ|ｂ|B|b)','B','(?:Ｂ|ｂ|B|b)','b','(?:Ｂ|ｂ|B|b)',
'Ｃ','(?:Ｃ|ｃ|C|c)','ｃ','(?:Ｃ|ｃ|C|c)','C','(?:Ｃ|ｃ|C|c)','c','(?:Ｃ|ｃ|C|c)',
'Ｄ','(?:Ｄ|ｄ|D|d)','ｄ','(?:Ｄ|ｄ|D|d)','D','(?:Ｄ|ｄ|D|d)','d','(?:Ｄ|ｄ|D|d)',
'Ｅ','(?:Ｅ|ｅ|E|e)','ｅ','(?:Ｅ|ｅ|E|e)','E','(?:Ｅ|ｅ|E|e)','e','(?:Ｅ|ｅ|E|e)',
'Ｆ','(?:Ｆ|ｆ|F|f)','ｆ','(?:Ｆ|ｆ|F|f)','F','(?:Ｆ|ｆ|F|f)','f','(?:Ｆ|ｆ|F|f)',
'Ｇ','(?:Ｇ|ｇ|G|g)','ｇ','(?:Ｇ|ｇ|G|g)','G','(?:Ｇ|ｇ|G|g)','g','(?:Ｇ|ｇ|G|g)',
'Ｈ','(?:Ｈ|ｈ|H|h)','ｈ','(?:Ｈ|ｈ|H|h)','H','(?:Ｈ|ｈ|H|h)','h','(?:Ｈ|ｈ|H|h)',
'Ｉ','(?:Ｉ|ｉ|I|i)','ｉ','(?:Ｉ|ｉ|I|i)','I','(?:Ｉ|ｉ|I|i)','i','(?:Ｉ|ｉ|I|i)',
'Ｊ','(?:Ｊ|ｊ|J|j)','ｊ','(?:Ｊ|ｊ|J|j)','J','(?:Ｊ|ｊ|J|j)','j','(?:Ｊ|ｊ|J|j)',
'Ｋ','(?:Ｋ|ｋ|K|k)','ｋ','(?:Ｋ|ｋ|K|k)','K','(?:Ｋ|ｋ|K|k)','k','(?:Ｋ|ｋ|K|k)',
'Ｌ','(?:Ｌ|ｌ|L|l)','ｌ','(?:Ｌ|ｌ|L|l)','L','(?:Ｌ|ｌ|L|l)','l','(?:Ｌ|ｌ|L|l)',
'Ｍ','(?:Ｍ|ｍ|M|m)','ｍ','(?:Ｍ|ｍ|M|m)','M','(?:Ｍ|ｍ|M|m)','m','(?:Ｍ|ｍ|M|m)',
'Ｎ','(?:Ｎ|ｎ|N|n)','ｎ','(?:Ｎ|ｎ|N|n)','N','(?:Ｎ|ｎ|N|n)','n','(?:Ｎ|ｎ|N|n)',
'Ｏ','(?:Ｏ|ｏ|O|o)','ｏ','(?:Ｏ|ｏ|O|o)','O','(?:Ｏ|ｏ|O|o)','o','(?:Ｏ|ｏ|O|o)',
'Ｐ','(?:Ｐ|ｐ|P|p)','ｐ','(?:Ｐ|ｐ|P|p)','P','(?:Ｐ|ｐ|P|p)','p','(?:Ｐ|ｐ|P|p)',
'Ｑ','(?:Ｑ|ｑ|Q|q)','ｑ','(?:Ｑ|ｑ|Q|q)','Q','(?:Ｑ|ｑ|Q|q)','q','(?:Ｑ|ｑ|Q|q)',
'Ｒ','(?:Ｒ|ｒ|R|r)','ｒ','(?:Ｒ|ｒ|R|r)','R','(?:Ｒ|ｒ|R|r)','r','(?:Ｒ|ｒ|R|r)',
'Ｓ','(?:Ｓ|ｓ|S|s)','ｓ','(?:Ｓ|ｓ|S|s)','S','(?:Ｓ|ｓ|S|s)','s','(?:Ｓ|ｓ|S|s)',
'Ｔ','(?:Ｔ|ｔ|T|t)','ｔ','(?:Ｔ|ｔ|T|t)','T','(?:Ｔ|ｔ|T|t)','t','(?:Ｔ|ｔ|T|t)',
'Ｕ','(?:Ｕ|ｕ|U|u)','ｕ','(?:Ｕ|ｕ|U|u)','U','(?:Ｕ|ｕ|U|u)','u','(?:Ｕ|ｕ|U|u)',
'Ｖ','(?:Ｖ|ｖ|V|v)','ｖ','(?:Ｖ|ｖ|V|v)','V','(?:Ｖ|ｖ|V|v)','v','(?:Ｖ|ｖ|V|v)',
'Ｗ','(?:Ｗ|ｗ|W|w)','ｗ','(?:Ｗ|ｗ|W|w)','W','(?:Ｗ|ｗ|W|w)','w','(?:Ｗ|ｗ|W|w)',
'Ｘ','(?:Ｘ|ｘ|X|x)','ｘ','(?:Ｘ|ｘ|X|x)','X','(?:Ｘ|ｘ|X|x)','x','(?:Ｘ|ｘ|X|x)',
'Ｙ','(?:Ｙ|ｙ|Y|y)','ｙ','(?:Ｙ|ｙ|Y|y)','Y','(?:Ｙ|ｙ|Y|y)','y','(?:Ｙ|ｙ|Y|y)',
'Ｚ','(?:Ｚ|ｚ|Z|z)','ｚ','(?:Ｚ|ｚ|Z|z)','Z','(?:Ｚ|ｚ|Z|z)','z','(?:Ｚ|ｚ|Z|z)',
'１','(?:１|一|壱|1)','一','(?:１|一|壱|1)','壱','(?:１|一|壱|1)','1','(?:１|一|壱|1)',
'２','(?:２|二|弐|2)','二','(?:２|二|弐|2)','弐','(?:２|二|弐|2)','2','(?:２|二|弐|2)',
'３','(?:３|三|参|3)','三','(?:３|三|参|3)','参','(?:３|三|参|3)','3','(?:３|三|参|3)',
'４','(?:４|四|4)','四','(?:４|四|4)','4','(?:４|四|4)',
'５','(?:５|五|5)','五','(?:５|五|5)','5','(?:５|五|5)',
'６','(?:６|六|6)','六','(?:６|六|6)','6','(?:６|六|6)',
'７','(?:７|七|7)','七','(?:７|七|7)','7','(?:７|七|7)',
'８','(?:８|八|8)','八','(?:８|八|8)','8','(?:８|八|8)',
'９','(?:９|九|9)','九','(?:９|九|9)','9','(?:９|九|9|９)',
'０','(?:０|零|0)','零','(?:０|零|0)','0','(?:０|零|0|〇)',
'あ','(?:ぁ|あ)','ぁ','(?:あ|ぁ)','い','(?:ぃ|い)','ぃ','(?:ぃ|い)',
'う','(?:ぅ|う)','ぅ','(?:う|ぅ)','え','(?:ぇ|え)','ぇ','(?:ぇ|え)',
'お','(?:ぉ|お)','ぉ','(?:お|ぉ)','や','(?:ゃ|や)','ゃ','(?:ゃ|や)',
'ゆ','(?:ゅ|ゆ)','ゅ','(?:ゅ|ゆ)','よ','(?:ょ|よ)','ょ','(?:ょ|よ)',
'，','(?:、|，|,)','、','(?:、|，|,)',',','(?:、|，|,)',
'．','(?:．|。|\.)','。','(?:．|。|\.)','.','(?:．|。|\.)',
'＠','(?:＠|\@)','@','(?:＠|\@)',	'＃','(?:＃|\#)','#','(?:＃|\#)',
'＄','(?:＄|\$)','$','(?:＄|\$)',	'％','(?:％|\%)','%','(?:％|\%)',
'’','(?:’|\')','\'','(?:’|\')',	'（','(?:（|\()','(','(?:（|\()',
'）','(?:）|\))',')','(?:）|\))',	'；','(?:；|\;)',';','(?:；|\;)',
'：','(?:：|\:)',':','(?:：|\:)',	'＊','(?:＊|\*)','*','(?:＊|\*)',
'＝','(?:＝|\=)','=','(?:＝|\=)',	'＋','(?:＋|\+)','+','(?:＋|\+)',
'？','(?:？|\?)','?','(?:？|\?)',	'！','(?:！|\!)','!','(?:！|\!)',
'＾','(?:＾|\^)','^','(?:＾|\^)',	'｜','(?:｜|\|)','|','(?:｜|\|)',
'［','(?:［|\[)','[','(?:［|\[)',	'］','(?:］|\])',']','(?:］|\])',
'／','(?:／|\/)','/','(?:／|\/)','＼','(?:＼|\\)','\\','(?:＼|\\|￥)','￥','(?:￥|\\)',
'－','(?:－|\-|\x81\x5B|～)','-','(?:－|\-|\x81\x5B|～)',"\x81\x5B",'(?:－|\-|\x81\x5B|～)',
"～",'(?:－|\-|\x81\x5B|～)','＜','(?:＜|\&lt\;)','＞','(?:＞|\&gt;)');
if($mozicode ne "sjis"){
	$W{'－'} = '(?:－|\-|ー|～)';
	$W{'-'} = '(?:－|\-|ー|～)';
	$W{'ー'} = '(?:－|\-|ー|～)';
	$W{'～'} = '(?:－|\-|ー|～)';
}
}
$komozi = $FORM{'word'} ? "(?:)" : "(?i)";

#======================================================================#
#◆ 検索パラメータ整理処理

while(($n,$v)=each(%FORM)){
	$FORM{$n}=~ s/　/ /g if $n !~ /equal/;
}

$AND = $FORM{'and'} || $FORM{'AND'} || $FORM{'key'};
$OR  = $FORM{'or'}  || $FORM{'OR'};
$NOT = $FORM{'not'} || $FORM{'NOT'};
$INDEX = $FORM{'index'} || $FORM{'INDEX'};

#◆低速検索
$seekcheck = $mozicode eq "sjis" ? $sjis : $utf8;
#◆高速検索
#$seekcheck = '.';
@form=();
@unique=();
%wild=("*","${seekcheck}*","?","$seekcheck");
#while(($n,$v)=each(%FORM)){
foreach $n (sort keys %FORM){
	$v = $FORM{$n};
	next if $n =~ /^(?:join|select|query|template|ID|print|count|target|max)|^p$/o;#|sline|tid|did
	($nn,$vv)=($n,$v);
	$vv =~ s/(\W)/'%'. unpack("H*",$1)/oeg;
	$nn =~ s/(\W)/'%'. unpack("H*",$1)/oeg;
	$url .="$nn=$vv;" if $vv =~ /\S/;
	next if $n !~ /^(?:key|not|equal|and|or|up|down|wildor|wildkeys|wildnot|wildequal|keys|index|word|unique)/io;
	$q .= "$v " if $v =~ /\S/;
	if($n =~ /^(?:keys|or|not|and|wildor|wildkeys|wildnot|wildequal|equal)/){
		&word(\$v);
		@COLOR{split(/\s+/,$v)}=1;
		if(substr($n,0,1) eq "w"){
		#◆ワイルドカード
			$n=~ s/^wild//o;
			$v=~ s/\\(\*|\?)/$wild{$1}/go;
			if($n =~ s/^equal/and/){
				if($FORM{"word"}==2){
					$v=~ s/ /(?:　|\\s)/og;
				}else{
					$v=~ s/ /\\s/og;
				}
			}
			if($n =~ /^(?:or|not)/){
				$v =~ s/\s+/|/og;
				$v ="(" . $v .")";
			}
			if($n =~ s/^keys/and/){
				$v =~ s/^\s+|\s+$//g;
				$v =~ s/(\S+)\s*/(?=$1\$)/g;
				substr($v,0,0)="^" if $v;
			}else{
				$v = '^' . $v . '$';
			}
		}else{
		#◆その他
			if($n =~ /^equal/){
				if($FORM{"word"}==2){
					$v=~ s/ /(?:　|\s)/og;
				}
			}elsif($n =~ s/^keys/and/ || $n =~ /^and/){
				$v =~ s/^\s+|\s+$//g;
					$v =~ s/(\S+)\s*/(?=${seekcheck}*$1)/g;
				substr($v,0,0)="^" if $v =~ /\S/;
			}else{
				$v =~ s/\s+/|/g if $n =~ /^(?:or|not)/o;
				$v ="^${seekcheck}*(?:$v)";
			}
		}
	}
	if($n =~ /^(not|equal|and|or|up|down)(\d+)((?:,\d{1,3})*)$/o){
		my($keys,$cell,$cells)=($1,$2,$3);
		my(@list)=($cell,$keys,$v);
		push(@list,$cell,split(/,/,$cells)) if $cells ;
		$keys = "and" if $keys eq "or";
		push(@form,\@list) if $cell >= 0;
	}elsif($n eq "unique"){
		my(@list)=(int($v),$n);
		push(@unique,\@list) if $list[0] > 0;
	}
}
push(@form,@unique) if @unique;

$q =~ s/\s+$//;
&word(\$OR)  if $OR  =~ /\S/;
&word(\$NOT) if $NOT =~ /\S/;
&word(\$AND) if $AND =~ /\S/;
	
@COLOR{split(/\s+/,"$AND $OR $INDEX")}=1;
foreach(@data){
	undef $_ if /\D/
}
$OR =~ s/\s+/|/g;
$NOT=~ s/\s+/|/g;
$AND=~ s/(\S+)\s*/(?=$seekcheck*$1)/g;
substr($AND,0,0)="^" if $AND;
@INDEX=split(/\s+/,$INDEX);
$DAT{'keywords'} = $q;
&tag($DAT{'keywords'});
$c=$FORM{'count'}+0;
$DAT{"target"}= int($FORM{'target'});
$DAT{"max"}= int($FORM{'max'});
$sline = $FORM{'sline'} - 1 if $FORM{'sline'};
$eline=$FORM{'eline'} if $FORM{'eline'} && $FORM{'eline'} !~ /\D/;
$unique = int($FORM{'unique'});

#======================================================================#
#◆ 検索指定がなにもなければ・・・該当無しで終了

if($q !~ /\S/){
	$DAT{"time"} = (times)[0] - $DAT{"start_time"};
	&onlyone(\$h_html);
	&onlyone(\$f_html);
	print $h_html , $f_html;
	exit;
}


#======================================================================#
#◆ データファイル読み込み

sub open_csv{
	my $tmp = 0;
	if($SEEK eq ""){
		$SEEK = $SEEK{shift(@csvfile)} || $SEEK{'default'};
	}elsif($csvfile[0] ne ""){
		$tmp = $.;
		close(SEEK);
		$SEEK = $SEEK{shift(@csvfile)}
	}else{
		$SEEK="";
	}
	if($SEEK ne ""){
		open(SEEK) || &error('データファイルを開けません');
		$. = $tmp;
	}
}

$FORM{'did'} =~ s/[^\w,]//g;
@csvfile = split(/,/,$FORM{'did'});
$.=0;

&open_csv;
if($sline && $sline !~ /\D/ && $sline > $.){
	while(<SEEK>){
		&open_csv if eof(SEEK);
		last if $sline<=$.
	}
}
FI: while(<SEEK>){
	if($brcsv){
		$_ .= <SEEK> while (tr/"// % 2 and !eof(SEEK));
		#"参考 http://www.din.or.jp/~ohzaki/perl.htm
	}
	&open_csv if eof(SEEK);

	last if $eline && $eline <= $.;
	foreach $key (@INDEX){
		next FI if index($_,$key,0) < 0
	}

	next if $AND && ! /$komozi$AND/o;
#	next if $OR  && ! /$komozi$OR/o;
	next if $OR  && ! /$komozi^${seekcheck}*(?:$OR)/o;
#	next if $NOT &&   /$komozi$NOT/o;
	next if $NOT &&   /$komozi^${seekcheck}*(?:$NOT)/o;
	if(@form || $print_max > 0 ){
		chomp;
		if($tab){
			@data=split(/$tab/);
		}elsif(index($_,'"') >= 0){#'
			@data=();
			@line=split(/,/);
			while(@line){
				$dummy = shift @line;
				while($dummy=~ tr/"/"/ % 2){
					last unless @line;
					$dummy .=',' . shift @line;
				}
				if(index($dummy,'"') >= 0){
					chop $dummy;
					substr($dummy,0,1)="";
					$dummy=~ s/""/"/g;#"
				}
				push(@data,$dummy);
			}
		}else{
			@data=split(/,/)
		}
		unshift(@data,$.);
		foreach(@form){
			($keys,$n,$v,@keys)=@{$_};
			next FI if $data[$keys] eq "";
			next FI if &{$dcheck{$n}};
		}
	}
	last if $c++ >= $foundmax;
	push(@found,[@data]);

}
$DAT{"time"} = (times)[0] - $DAT{"start_time"};
$DAT{"end_time"} = (times)[0] ;
$DAT{"found_over"}=1 if $c == $foundmax + 1;
#======================================================================#
#◆ ソート

@SORT= split(/\s+/,$FORM{'sort'});
$i=0;
foreach (@SORT[0..9]){
	next unless $_;
	my($sort,$cmd,$r);
	$sort[$i][0] = $1 if ( /(\d+)/ && $1 > 0 || next) || next;
	$sort[$i][1] = /^d/i ? 1 : 0;
	$sort[$i][2] = /s$/i ? 1 : 0;
	$i++;
}

if(@sort){
	@found = sort { &sort_s } @found;
}
sub sort_s{
	my $i;
	foreach my $s (@sort){
		if($s->[2]){
			if($s->[1]){
				$i = $b->[$s->[0]] cmp $a->[$s->[0]]
			}else{
				$i = $a->[$s->[0]] cmp $b->[$s->[0]]
			}
		}else{
			if($s->[1]){
				$i = $b->[$s->[0]] <=> $a->[$s->[0]]
			}else{
				$i = $a->[$s->[0]] <=> $b->[$s->[0]]
			}
		}
		return $i if $i;
	}
	0
}
if($FORM{'unisort'} =~ /^d/i){
	@found = sort { $unique{$b->[$unique]} <=> $unique{$a->[$unique]} } @found;
}elsif($FORM{'unisort'} =~ /^u/i){
	@found = sort { $unique{$a->[$unique]} <=> $unique{$b->[$unique]} } @found;
}


if($FORM{'reverse'}){
	@found = reverse @found;
}elsif($FORM{'random'} || $FORM{'tane'}){
	$tane = int($FORM{'tane'}) || time ;
	srand($tane);
	rand(@found);
	my @temp;
	push( @temp , splice(@found,rand(@found),1)) while @found;
	@found = @temp;
	$url .="tane=$tane;" if $FORM{'tane'} eq "";
}

if(!$DAT{'target'}){
	while(<SEEK>){
		1;
	}
	$DAT{'target'} = @found;
	$DAT{'max'}=int($.);
}
$url .="target=$DAT{'target'};max=$DAT{'max'};print=$print_max_dat;";


$FORM{'p'} = int($FORM{'p'});
$start = $FORM{'p'} * $print_max_dat;


$DAT{"start_count"} = $start + 1;
if($start + $print_max_dat <= $#found){
	$DAT{"NEXT"}="${'url'}p=" . ($FORM{'p'} + 1);
	$DAT{"NEXTDATA"} = $DAT{'target'} - $start - $print_max_dat;
	$DAT{"NEXTDATA"} = $print_max_dat if $print_max_dat < $DAT{"NEXTDATA"};
}
$DAT{"BACK"}="${'url'}p=" . ($FORM{'p'} - 1) if $FORM{'p'} > 0;
$pagemax = int($DAT{'target'}  / $print_max_dat) + ($DAT{'target'} % $print_max_dat != 0);
$pagestart = 1;
if($pagemax > $linklist){
	if($FORM{'p'} > int($linklist / 2)){
		$pagestart = $FORM{'p'} + 1 - int($linklist  / 2);
		if($pagestart + $linklist  > $pagemax){
			$pagestart = $pagemax - $linklist + 1;
		}else{
			$pagemax = $pagestart + $linklist - 1;
		}
	}elsif($pagemax > $linklist){
		$pagemax = $linklist ;
	}
}
for($i=$pagestart ;$i <= $pagemax ;$i++){
	$s=$i - 1;
	if($FORM{'p'} eq $s){
		$DAT{"LINKLIST"} .=" $i |";
	}else{
		$DAT{"LINKLIST"} .=" <a href='database.cgi?${'url'}p=$s'>$i</a> |";
	}
}
chop $DAT{"LINKLIST"};
$DAT{'count'}= $#found + 1 if ($DAT{'count'} = $start + $print_max) > $#found + 1;
&onlyone(\$h_html);
print $h_html;
for(my $i=$start ; $i <= $start + $print_max - 1; $i++){
	@data = @{$found[$i]} ;
	last if ! @data ;
	undef %varlocal;
	($DAT{'no'},$DAT{'count'})=($data[0], $i + 1);
	$DAT{'line'}++;
	$Btmp = $b_html;
	&onlyone(\$Btmp);
	print $Btmp;
	@last = @data;
}

if(int($FORM{'line'}) >= 1){
	my $count = $DAT{'count'};
	$DAT{'null'} = 1;
	my @last_backup = @last;
	for(my $i = int($FORM{'line'}) - ($DAT{'line'} % int($FORM{'line'})); $i > 0; $i--){
		last if $i == int($FORM{'line'});
		$Btmp = $b_html;
		$DAT{'count'}++;
		$DAT{'line'}++;
		undef %varlocal;
		@data=();
		&onlyone(\$Btmp);
		print $Btmp;
		@last = ();
	}
	$DAT{'count'} = $count ;
	delete $DAT{'null'};
	@last = @last_backup;
}
$DAT{"end_time2"} = (times)[0] ;
$DAT{"time2"} = $DAT{"end_time2"} - $DAT{"end_time"};
&onlyone(\$f_html);
print $f_html;
exit;
#======================================================================#
#◆ 関数

sub tag{#タグ解除
	$_[0]=~ s/&/&amp;/g;
	$_[0]=~ s/</&lt;/g;
	$_[0]=~ s/>/&gt;/g;
	$_[0]=~ s/"/&quot;/g#"
}
sub word{#類似文字検索機能
	*word = shift ;
	$word =~ s/([^\w ])/\\$1/go && return 1 if  $FORM{'word'} < 2;
	my $mozi =  $mozicode eq "sjis" ? $sjis : $utf8;
	$word =~ s/($mozi)/&_word($1)/oeg
}
sub _word{
	$sw=$_[0];
	return $W{$sw} if $W{$sw};
	$sw =~ s/([^\w ])/\\$1/go;
	return $sw
}

sub set_{
	$formats_ = sub {
		return $_[0] =~ /\D/ ? $DAT{$_[0]} : $data[$_[0]];
	};

	$VAR{"last"}  = sub {return $last[$_[0]]   };
	$VAR{"form"}  = sub {return $PRINT{$_[0]}   };

	
	$If{"color"} = sub {#カラーカラーカラー
		my($if , $color) = @_;
		unless($colors){
			$colors = join("|",keys(%COLOR));
			$colors =~ s/^\||\|$//g;
		}
		if($colors){
			my $mozi =  $mozicode eq "sjis" ? $sjis : $utf8;
			$$if =~ s/\G(${mozi}*?)($colors)/$1<font color="$color">$2<\/font>/og;
		}
	};
	END{print "\n<!-- database Ver 2.10 / jcode.pl Ver $jcode::version -->"};

	$dcheck{"and"} = $dcheck{"keys"} = $dcheck{"or"} = sub {
		if(@keys){
			return 1 if join($sep,@data[@keys]) !~ /$komozi$v/
		}else{
			return 1 if $data[$keys] !~ /$komozi$v/
		}
	};
	$dcheck{"not"}= sub {
		if(@keys){
			return 1 if join($sep,@data[@keys]) =~ /$komozi$v/
		}else{
			return 1 if $data[$keys] =~ /$komozi$v/
		}
	};
	$dcheck{"up"} = sub {
		return 1 if $data[$keys] < $v
	};
	$dcheck{"down"}=sub {
		return 1 if $data[$keys] > $v
	};
	$dcheck{"equal"}=sub{
		return 1 if $data[$keys] !~ /^$v$/;
	};

	$dcheck{"unique"}=sub {
		return 1 if $unique{$data[$keys]}++;
	};
	$If{"unique"} = sub {
		my $if = shift;
		$$if = $unique{$$if};
	};
}
sub error{
	print "<html><h1>$_[0]</h1><a href='http://cgiroom.nu' target='_blank'>CGIROOM</a></html>";
	exit;
}
#================================================================================#
#【 履  歴 】：
#  1999/07/22 Ver  0.00
#  1999/08/06 Ver  1.00
#  1999/10/13 Ver  1.20 検索機能に 以上、以下、結合、選択 を追加
#  2000/01/03 Ver  1.30 タブ区切りファイルに対応、検索機能にNOT,ORを追加
#  2000/01/12 Ver  1.31 1.30のバグを修正
#  2000/01/20 Ver  1.32 1.31のバグを修正
#  2000/02/21 Ver  1.33 1.32のバグを修正 10以上の列検索が出来なかったバグ
#  2000/05/13 Ver  1.40 高度検索機能を追加
#  2000/05/23 Ver  1.41 1.40で発生したバグ修正(非公開)
#  2000/05/29 Ver  1.42 やっとこさ公開
#  2000/06/22 Ver  1.43 equalだけで検索すると該当しないバグを修正
#  2000/10/14 Ver  1.44 ワイルドカードに対応、以上以下検索のバグを修正
#  2000/11/18 Ver  2.00 βデザインをテンプレート式に変更
#  2000/12/03 Ver  b2   ちょこっとバグ修正
#  2001/02/20 Ver  2.01 :aバグの修正 onlyone機能の向上
#  2001/03/17 Ver  2.02 １列目検索バグを修正
#  2001/09/10 Ver  2.03 query検索の追加。
#  2001/09/17 Ver  2.03.1 wordバグ修正
#  2003/02/12 Ver  2.04 nullなど追加 02/13 :colorバグ修正
#  2004/01/23 Ver  2.04.2 database.cgi?unique=[列番号] と :unique に簡易対応
#  2004/02/27 Ver  2.05 database.cgi?line=[数値] と UTF-8対応(?)
#  2004/04/05 Ver  2.10 __*:date("phpのdate関数とほぼ同じ")__ と ソートに対応
#================================================================================#
