#!/usr/bin/perl
#

### 以下は配色の設定 ###

$col_anm = "#000000"; # No.xx 〜 No.xx
$col_num = "#000000"; # No.
$col_ttl = ""; # タイトル
$col_gnr = "#000000"; # 分野
$col_day = "#000000"; # 日付
$col_url = "#000000"; # ＵＲＬ
$col_key = "#000000"; # キーワード
$col_pid = "#000000"; # ＩＤ

### （以下は表示に関するカスタマイズ）

# 表示単位（１ページに〜件ずつ）
$show_scale = 1; 
# 「登録順」を選んだとき何ページ分表示するか
$default_pages = 1; 
# 検索記録を取るか（1→とる、0→とらない）
$user_trace = 0;
# 「全表示」が選択された場合の表示限度数（0→無制限）
$show_max = 1; 
# 更新日から何日以内なら「New」「Up」を付けるか
$new_date = 7;
# "NEW" の画像
$image_new = "";
# "UP" の画像
$image_up = "";


### 変数設定部 （ここまで）###########################################

require './lib.pl';
require "./jcode.pl";

&main;

sub main{
	&init_variables;
	&check_input;
	&open_datafile;
	&process_data;
	&show_html;
}



########## 変数の初期化
sub init_variables{
	$basedir = $tblib'basedir;
	
	$datafile = "./list01/data.txt";
	$genrefile = "./list01/genre.txt";
	$tpfile = "./tb_detail_googlemap_2006.html";
	$ulogfile = "./userlog.txt";
}



########## 入力のチェック
sub check_input{
	&tblib'parseform;
	
	$s = $tblib'F{'s'}; # 検索文字列
	$m = $tblib'F{'m'}; # 検索モード
	$g = $tblib'F{'g'}; # 分野コード
	$a = $tblib'F{'a'}; # 沿線
	$b = $tblib'F{'b'}; # 取扱商品
	$p = $tblib'F{'p'}; # ページ
	$sdec = &tblib'decode($s);
	$adec = &tblib'decode($a);
	$bdec = &tblib'decode($b);
	
	### スイッチ
	($m =~ /i/) && ($sw_sid = 1); # ＩＤ表示
	($m =~ /k/) && ($sw_kwd = 1); # キーワード表示
	($m =~ /a/) && ($sw_all = 1); # 一気表示
}



########## データファイルのオープン
sub open_datafile{
	&tblib'openfile($datafile, *datas);
	&tblib'openfile($tpfile, *tps);
	&tblib'openfile($genrefile, *genres);
	
	&tblib'set_genre(*genres);
}



########## データの加工
sub process_data{
	local($us, $uw); # ユーザの行動記録用
	if($s){
		$us = "S"; $uw = $sdec;
		$stype = "キーワード検索結果 [$sdec]";
		if($b){$sdec = $sdec . " " . $bdec;}
		&search_by_word($sdec);
		$g = "";
	}
	elsif($a){
		$us = "S"; $uw = $adec;
		$stype = "沿線検索結果 [$adec]";
		&search_by_line($adec);
		$g = "";
	}
	elsif($b){
		$us = "S"; $uw = $bdec;
		$stype = "取扱商品検索結果 [$bdec取扱店]";
		&search_by_goods($bdec);
		$g = "";
	}
	elsif($g){
		$stype = "都道府県検索結果 [$tblib'G{$g}]";
		($tblib'G{$g}) && &search_by_genre($g);
		$s = "";
	}
	else{
		$stype = "新着順";
		$showno = ($sw_all) ? ($show_max || @datas) : $show_scale * $default_pages;
		&search_by_date($showno);
	}
	
	$hitno = @hits; # ヒット件数
	
	### 全表示の場合の表示単位セット
	($sw_all) && ($show_scale = $show_max || $hitno);
	
	### ユーザ行動の保存（トレースオン、検索、ページでない場合）
	($user_trace) && ($us) && (!$p) && &record_action($us, $uw, $hitno);
	
	### データを表示範囲でカット
	($hitno) && (&cut_data);
	
	$resultmsg .= "$stype：$hitno件";
	
}



############### 検索関数：ここから ###############
##### 単語検索
sub search_by_word{
	local($word) = @_;
	
	# 検索文字の処理
	$efind = $word;
	$efind =~ s/　/ /g;
	$efind =~ s/(\W)/\\$1/g;
	@efinds = split(/\\\s+/, $efind);
	if($efinds[0] eq "\\-"){
		shift(@efinds);
		$sw_or = 1;
	}
	
	local($match, $tmp, $001,$002,$003,$004,$005,$006,$007,$008,$009,$010,$011,$012);
	
	### 検索
	foreach(@datas){
		($id, $tmp, $tmp, $001,$002,$003,$004,$005,$006,$007,$008,$009,$010,$011,$012) = split("\t");
		$str = "$id";
		$match = 0;
		
		# マッチング
		foreach $pattern(@efinds){
			if($str =~ /$pattern/i){
				$match++;
			}
		}
		### and検索の場合、マッチ数が文字数に一致しなければダメ
		(!$sw_or) && ($match < @efinds) && ($match = 0);
		($match !=0) && unshift(@hits, $_);
	}
}

sub search_by_line{
	local($word) = @_;
	
	# 検索文字の処理
	$efind = $word;
	$efind =~ s/　/ /g;
	$efind =~ s/(\W)/\\$1/g;
	@efinds = split(/\\\s+/, $efind);
	if($efinds[0] eq "\\-"){
		shift(@efinds);
		$sw_or = 1;
	}
	
	local($match, $tmp, $001,$002,$003,$004,$005,$006,$007,$008,$009,$010,$011,$012);
	
	### 検索
	foreach(@datas){
		($tmp, $tmp, $tmp, $001,$002,$003,$004,$005,$006,$007,$008,$009,$010,$011,$012) = split("\t");
		$str = "$006";
		$match = 0;
		
		# マッチング
		foreach $pattern(@efinds){
			if($str =~ /$pattern/i){
				$match++;
			}
		}
		### and検索の場合、マッチ数が文字数に一致しなければダメ
		(!$sw_or) && ($match < @efinds) && ($match = 0);
		($match !=0) && unshift(@hits, $_);
	}
}

sub search_by_goods{
	local($word) = @_;
	
	# 検索文字の処理
	$efind = $word;
	$efind =~ s/　/ /g;
	$efind =~ s/(\W)/\\$1/g;
	@efinds = split(/\\\s+/, $efind);
	if($efinds[0] eq "\\-"){
		shift(@efinds);
		$sw_or = 1;
	}
	
	local($match, $tmp, $001,$002,$003,$004,$005,$006,$007,$008,$009,$010,$011,$012);
	
	### 検索
	foreach(@datas){
		($id, $tmp, $tmp, $001,$002,$003,$004,$005,$006,$007,$008,$009,$010,$011,$012) = split("\t");
		$str = "$id";
		$match = 0;
		
		# マッチング
		foreach $pattern(@efinds){
			if($str =~ /$pattern/i){
				$match++;
			}
		}
		### and検索の場合、マッチ数が文字数に一致しなければダメ
		(!$sw_or) && ($match < @efinds) && ($match = 0);
		($match !=0) && unshift(@hits, $_);
	}
}


########## 分野検索
sub search_by_genre{
	local($gcode) = @_;
	local($id, $gbuf);
	
	foreach (@datas){
		($id, $gbuf) = split("\t");
		($gbuf =~ /:$gcode:/) && unshift(@hits, $_);
	}
}



########## 日付順検索
sub search_by_date{
	local($amount) = @_;
	
	### 末尾が最新なのでひっくり返すだけ
	@hits = reverse(@datas);
	($amount) && (@hits = splice(@hits, 0, $amount));
}
############### 検索関数：ここまで ###############





########## ユーザ行動の記録
sub record_action{
	local($type, $word, $hitno) = @_;
	local($udate, $logline,);
	
	$udate = &tblib'get_time(0, 2);
	$logline[0] = "$udate\tTYPE:$type($word)\tHITS:$hitno\tHOST:$ENV{'REMOTE_HOST'}\t\n";
	
	&tblib'updatefile($ulogfile, *logline, 1);
}



########## データを表示単位で切り抜く
sub cut_data{
	$p = int($p);
	$allpage = int(($hitno-1) / $show_scale) + 1;
	($p > 0) && ($p <= $allpage) || ($p = 1);
	
	# 表示範囲の特定
	$t = $p * $show_scale;
	$f = $t - $show_scale + 1;
	($t < $hitno) ? ($next = $p + 1) : ($t = $hitno);
	($f > 1) && ($prev = $p - 1);
	
	# 前後を切り取る
	unshift(@hits, "dmy");
	@hits = splice(@hits, $f, $show_scale);
	
	# 前後へのリンク
	$pagelink = "<FONT SIZE=\"2\"><B><FONT COLOR=\"$col_anm\">（No.$f 〜 No.$t）</FONT> ／ ";
	$linkcgi = "search_2006.cgi?s=$s&a=$a&b=$b&g=$g&m=$m";
	($prev) && ($pagelink .= "<A HREF=\"$linkcgi&p=$prev\">前の$show_scale件</A> ／ ");
	for(1 .. $allpage){
		$pagelink .= ($_ == $p) ? "$_ " : "<A HREF=\"$linkcgi&p=$_\">$_</A> ";
	}
	($next) && ($pagelink .= "／ <A HREF=\"$linkcgi&p=$next\">次の$show_scale件</A>");
	$pagelink .= "</B></FONT>";
}



########## 表示
sub show_html{
	local($urllist, $genrebar);
	
	$urllist = ($hitno) ? &html_urllist : &html_nohit;
	$genrebar = &html_genrebar;
	$C{'keys'} = $sdec;
	
	### 表示用ハッシュ
	if($m){
		$C{'m'} = $m;
		($sw_sid) && ($C{'mode'} .= "[1");
		($sw_kwd) && ($C{'mode'} .= "[2]");
		($sw_all) && ($C{'mode'} .= "[3]");
	}
	
	$C{'allno'} = @datas; # 総登録件数
	
	($s || $m || $g) || ($tptype = "firstmsg");
	
	print "Content-type: text/html\n\n";
	
	$tpfrag = 1;
	foreach (@tps){
		(/^<TEMPLATE TYPE="(\w+)">/) && ($1 ne $tptype) && ($tpfrag = 0); 
		(/^<\/TEMPLATE>/) && ($tpfrag = 1);
		($tpfrag) || next;
		
		s/#RESULTMSG#/$resultmsg/;
		s/#URLLIST#/$urllist/;
		s/#PAGELINK#/$pagelink/;
		s/#GENRELIST#/$genrebar/;
		s/#BACKURL#/$tblib'backurl/;
		s/#TITLE#/$shopname/;
		s/#CHK:(\w+)#/$C{$1}/g;
		print;
	}
}



########## ヒットしたＵＲＬの表示
sub html_urllist{
	local($id, $gcode, $date, $001,$002,$003,$004,$005,$006,$007,$008,$009,$010,$011,$012,$013,$014);
	local($htmlbuf, @gs, $gbuf, $gdate, $isNew);
	
	if($new_date){
		$new_date = &tblib'get_time(time() - $new_date * 60 * 60 * 24);
		$new_date =~ s/\///g;
	}
	
	$gvalue = $tblib'G{$g};

	if($g){$htmlbuf = "<form action=search_2007.cgi method=get><table width=100% class=table_red_bis border=0 cellspacing=0 cellpadding=3><tr><td class=td_red_bis align=left valign=top>市区町村名で絞り込みができます。<input type=hidden value=\"$gvalue\" name=s><input type=hidden value=\" \" name=s><input type=text name=s size=20><input type=submit value=\"絞り込み検索\"></td></tr></table></form>"};
	
	foreach(@hits){
		($id, $gcode, $date, $001,$002,$003,$004,$005,$006,$007,$008,$009,$010,$011,$012,$013,$014) = split("\t");
		
		### キーワードの強調表示
		foreach(@efinds){
			$com =~ s/($_)/<B>$1<\/B>/ig;
			$com =~ s/\\(\w)/$1/ig;
		}
		
		### 分野の表示
		undef($gbuf);
		@gs = split(":", $gcode);
		foreach (@gs){
			($_) && ($gbuf .= " [$tblib'G{$_}]");
		}
		
		### new, up の表示
		if($new_date){
			undef($img);
			$isNew = ($com =~ /<UP\/>$/) ? 0 : 1;
			$gdate = $date;
			$gdate =~ s/\///g;
			if($gdate >= $new_date){
				$img = ($isNew) ? $image_new : $image_up;
			}
		}
		
		($sw_sid) && ($ibuf = "<FONT COLOR=\"$col_pid\"><B>[ID]</B> No.$id</FONT><BR>\n");
		($sw_kwd) && ($kbuf = "<FONT COLOR=\"$col_key\"><B>[Keys]</B> $keywords</FONT><BR>\n");
		
		### 検索結果表示部 ($htmlbuf) ############
		###
		### ※ 変更前に初期状態のものを必ず保存しておいて、
		###    いつでも元に戻せるようにしておいてください。
		##
		## [各変数の意味]
		##$001　URL
		##$002　店舗名
		##$003　取扱商品
		##$004　住所
		##$005　電話番号
		##$006　路線
		##$007　営業時間
		##$008　地図番号
		##$009　交通のご案内
		
		
if($015){
		$googlemap="<div id=\"map\" style=\"width:350px; height:350px\"></div>\n <script type=\"text/javascript\">\n\n     //<![CDATA[\n \n \n\n     var map = null;\n     var geocoder = null;\n \n \n     function load() {\nvar point = new GLatLng($015, $016);\n       if (GBrowserIsCompatible()) {\n         map = new GMap2(document.getElementById(\"map\"));\n         map.setCenter(point, 16);\n               var icon = new GIcon();\n               icon.image = \"http://www.meganestore.co.jp/googlemap_icon.png\";\n               icon.iconSize = new GSize(20,20);\n               icon.iconAnchor = new GPoint(20,20);\n               var marker = new GMarker(point,icon);\n               map.addOverlay(marker);\n               var offset = new GSize(0, -20);\n               map.openInfoWindowHtml(point,'$002',offset);\n map.addControl(new GSmallMapControl());\n       }\n    }\n \n \n     //]]>\n     </script>";
		}else{
				$googlemap="<div id=\"map\" style=\"width:350px; height:350px\"></div>\n <script type=\"text/javascript\">\n\n     //<![CDATA[\n \n \n\n     var map = null;\n     var geocoder = null;\n \n \n     function load() {\n var defaultaddress = '$003';\n       if (GBrowserIsCompatible()) {\n         map = new GMap2(document.getElementById(\"map\"));\n         map.setCenter(new GLatLng(35.544332, 139.451413), 3);\n map.addControl(new GSmallMapControl());\n         // GClientGeocoderを初期化\n         geocoder = new GClientGeocoder();\n       }\n  showAddress(defaultaddress);\n    }\n \n     function showAddress(address) {\n        if (geocoder) {\n         geocoder.getLatLng(\n           address,\n           function(point) {\n             if (!point) {\n               alert(address + \" not found\");\n             } else {\n               map.setCenter(point, 16);\n               var icon = new GIcon();\n               icon.image = \"googlemap_icon.png\";\n               icon.iconSize = new GSize(20,20);\n               icon.iconAnchor = new GPoint(20,20);\n               var marker = new GMarker(point,icon);\n               map.addOverlay(marker);\n               var offset = new GSize(0, -20);\n               map.openInfoWindowHtml(point,'$001',offset);\n     GEvent.addListener(marker, 'click', function(){map.openInfoWindowHtml(point,'$001', offset);});\n        }\n           }\n         );\n       }\n     }\n \n     //]]>\n     </script>";
				}
				$shopname = $001;

		$htmlbuf .= "$googlemap";
		
		##
		##
		### ここまで ##################
		$f++;
	}
	
	
	$htmlbuf .= "";
	$htmlbuf;
}



########## 分野リンク
sub html_genrebar{
	local($htmlbuf, $sgcode, $sgname, $sgcom);
	
	$htmlbuf = "--<A HREF=\"./search_2006.cgi?m=$m\">■ 新着順</A><BR><P>\n";
	foreach (@genres){
		(/^\w/) || next;
		($sgcode, $sgname, $sgcom) = split("\t");
		$htmlbuf .= "--<A HREF=\"./search_2006.cgi?g=$sgcode&m=$m\">■ $sgname</A><BR>\n";
	}
	
	$htmlbuf;
}



##### ノーヒットの表示
sub html_nohit{
	"<CENTER><FONT SIZE=\"4\">ヒットしませんでした。<BR>条件を変えて再度検索して下さい。</FONT></CENTER>";
}
