#!/usr/bin/perl
#
# ==== デバック用パラメータ変更しないこと
# (デバック時3 ,通常は1にすること)
$debug_mode=1;
#
# ==== デバック用パラメータここまで
#
#
#     画像アップロード掲示板 携帯アクセスCGI(Beta18)
#
#       im.cgi v1.22 (imgboard Rev.6 Base)
#
#	 Copyright(C)1998-2002	1998特報!!倶楽部
#	 Origin Program		to-ru@big.or.jp
#	 Updated by 		1998特報!!倶楽部スタッフ talk@big.or.jp
#
#		 Support site URL http://www.big.or.jp/~talk/t-club/soft/
#
# (注意)当スクリプトはiモード用の掲示板Freeの画像アップロード掲示板、
# imgboard.cgiを運営されている掲示板管理者やそのお友達のユーザ方々が、
# iモードからも、コメント投稿、閲覧、管理をできるように作った機能追加スクリ
# プトです。imgboard.cgiと同じディレクトリに入れて使います。当スクリプト単
# 体では動作しませんのでご注意ください。
#
# <改変履歴>-07/23/2003/01
#  2003/07/23 R6であることがわかるようにバージョン表記を変更した
#  2003/07/23 PCから見たときに、絵文字があると文字化けする点を修正した
#  2003/07/09 FOMA 2071に対応した
#  2003/03/17 FOMA N2051,P2051に対応した
#  2003/01/15 L-mode対応のコードを追加した
#  2002/12/22 iモーション形式(ISMA-MP:MP4)に対応した
#  2002/10/08 ASTELのdot-iが２年前の１機種で消滅したので、専用モード廃止。i-modeで対応
#  2002/09/08 ログフォーマットを一部拡張。
#  2002/05/29 AUのC413S/SONYで投稿通知メールが文字化けする問題に対処
#  2002/05/20 EZwebが絵文字でおかしくなる問題に対処
#  2002/05/07 EZwebで不正なメールアドレス時に投稿者名が出ないバグを修正
#  2002/05/07 EZwebコンパイルエラー対策の強化(1ページ記事３件に制限)
#  2002/05/01 ドコモの画像アップロードサービス,iショットサービスに仮対応
#  2002/04/05 JSKY-スーパメールデータ対応、AUのezmovie対応部を追加
#  2002/04/05 AUで$だらけになるβ13特有のバグをFix(すいません)
#  2002/03/14 顔文字使用時に、AUでコンパイルエラーが出るケースがあった点を修正
#  2002/03/14 利用者が少ないようなので、絵文字アイコン機能を削除した
#  2002/03/14 PCからアクセスした時に、誘導リンクが出ていなかった点を修正
#  2001/12/08 安全のため、管理パスワード未変更時は記事削除ができないようにした
#  2001/10/23 EZの場合エラー要因になるので、文字数制限を効かないようにした
#  2001/09/20 高速化＆FOMA用のコードを追加（動作は未確認）
#  2001/09/20 auでのメール送信不具合を修正
#  2001/09/13 レスのついた記事を先頭へ持っていく機能の追加
#  2001/09/13 自動URLリンクを小修正した
#  2001/07/31 imgboard_im.cgiからim.cgiへ名前変更に伴い、関連部分の記述変更
#  2001/07/07 追加可能な項目数を９つから１４へ増やした
#  2001/06/05 電番のある記事をJ-Phoneで見ると、絵文字だらけになるバグを修正
#  2001/05/20 EZで埋込み画像/着メロをDL可能な機種に対応。
#  2001/04/30 EZwebからの文字投稿に仮対応
#  2001/04/17 DDIポケットのH",feelH"に仮対応(閲覧のみ)
#  2001/04/12 ドコモのN503i,P503iのJPEG表示機能に対応
#  2001/01/28 ドコモのeggyをストリーム再生するASXを自動作成するようにした
#  2001/01/12 ワード検索機能を実装した
#  2001/01/02 ドコモのＭステージ(eggy)からのアップロードに仮対応した
#  2000/12/10 Ｊフォンのカメラ付き携帯に仮対応した
#  2000/12/10 ウェブ経由で一部の設定を変更できるようにした
#  2000/12/10 記事を指定間隔で自動バックアップする機能を付けた
#  2000/11/25 削除ズレが発生しないようにした
#  2000/11/24 アステルのドットiに対応
#  2000/11/18 Jフォンでの不具合を修正
#  2000/11/01 MY定型文機能を追加
#  2000/10/31 疑似クッキー機能を追加
#  2000/09/28 imgboard1.22R5以降のログ形式に対応
#  2000/04/05 iモード対応版をお遊びで作ったが、(1)条件分岐が増え、スクリプトが
#  複雑になり汚くなった(2)パケット課金なのでコメントアウトを減らさないとお
#  金がもったいないらしい,等状況から別スクリプトとしてリリースすることにした。
#
# <利用規定>
#  1.(著作権について)
#   1.1当CGIの著作権及び使用許諾権は、1998特報倶楽部（以下 当方）が占有してお
#      ります。
#  2.(使用許諾)
#        このCGIは,当利用規定すべてに従っていただく場合に限り,個人,法人にか
#        かわらず,自由にカスタマイズし、無償で利用していただく事ができます。
#        ひとつでも項目をを満たさない場合は,基本的に、その利用を許諾しません。
#        また、項目をすべて満たした場合も、当方がその使用を不適当だと認めた
#        場合,その使用を中止させていただく場合があります．あらかじめご了承く
#        ださい．
#
#  2.1 使用許諾条件
#    A.当スクリプトの利用規定部、著作権表示部、当タイトル部の改変をしていない
#      こと
#    B.改造および、カスタマイズしたスクリプトの無断再配布をしないこと。
#      特に、条件A,Bを満たさない場合は,その利用を一切禁止します。
#
#  3.(制限事項について)
#   3.1 改造、非改造を問わず、当方に無断で再配布することを固く禁止します。
#   3.2 日本以外の国籍のユーザを対象にした掲示板での利用を禁止します。
#   3.3 当著作権表示ならびに,掲示板下部の著作権表示とリンクを改変及び,削除
#       することは固く禁止します。
#
#  4.(非制限事項について)
#   4.1 改造は御自由にしていただいて構いません    （ただし3.3に注意して下さい）
#   4.2 商用利用は御自由にしていただいて構いません（ただし3.3に注意して下さい）
#   4.3 個人の利用、および法人の利用を許可します。（ただし3.3に注意して下さい）
#
#  5.(免責事項)
#   5.1 掲示板の管理責任は,100%その掲示板の設置者にあるものとします。当サイトは
#       その管理責任を一切負いません。
#   5.2 万一このCGIにより損害や不利益受けたとしても、当方は一切その責任を負う
#       義務を持ちません．あらかじめご了承ください．
#   5.3 当CGIに不具合、機能不足、バグなどがあった場合も、当方はその修正の義務を
#       負わないものとします。
#
#  6.(その他)
#    当利用規定は予告なく改変、追記される場合があります。あらかじめご了承ください．
###############################################################################
# 基本構成（初期設定はこの構成を前提に解説します）
#
# (当スクリプトはもともとimgboard.cgiを運営されている掲示板管理者やそのお友達
# の方が、imodeから投稿、閲覧、管理をできるように作った追加スクリプトです。単
# 体では動作しませんのでご注意ください)
#
# public_html（ホームページディレクトリ）
# |
# |-- cgi-bin（任意のディレクトリ705）
#   |
#   |--img-box(777 または 707)(画像保存用ディレクトリ）
#   |
#   |-- jcode_sj.pl  (755 または 705)(ライト版の日本語ライブラリ)
#   |-- imgboard.cgi (755 または 705)(imgboard本体)
#   |
#   |-- im.cgi (755 または 705)(iモードからのアクセス用本体) <===当スクリプト
#   |-- file_imode_user.dat(666 または 606)(疑似cookieデータ保存用)
#   |
#   |-- imgsize.pl   (755 または 705)(画像サイズ解析ライブラリ)
#   |-- file.dat     (666 または 606)(記事データ保存用)
#   |-- fileback.dat (666 または 606)(file.datの定期バックアップファイル)
#   |-- icon.dat     (666 または 606)(WebPartsデータ保存用)
#
# ・( )内は属性（パーミッション）です。最初、括弧内の左の数字で試し,
#  動くかどうか確認して下さい。確認がとれたら、３文字の数字の真ん中を0に変更し,
#  動作するかチェックして下さい。どちらでも正常動作できるならば、できるだけ
#  右の値を使ってください。
#  (一般にプロバイダにおいては、真ん中の数字を0にすると、セキュリティ的により
#  厳しくなり、他人からファイルを書換えられたりする危険性が減って安全度が上がり
#  ます。ただし中にはCGIが動かなくなるプロバイダもありますので、この場合は
#  左の値をご使用ください）
#
#
###############################################################################

#=======================================================================#
#  初期設定
#=======================================================================#

#  先頭に#のある行は読み込まれません．

#==================================#
#        <必須設定項目>            #
#==================================#
#
$PM{'admin_passwd'} = 'totokun';		# 管理人による記事削除時のパスワード
#					# (変更してください)
#
$PM{'title'} 	= "立石ディスコ・ナイト[スケジュール]";	
#  ↑「お気に入り or ブックマーク」保存時のタイトルになります。
#
#  ■<終了時戻り先ＵＲＬ>
#
#  掲示板の「HOME」を押したときに、下記ＵＲＬへ戻ります。
#  (URLを下記デフォルトURLから変更しますと、ページにリンクが自動的に出現)
#
$PM{'back_url'} ='http://www.goodman.co.jp/disco/i/';
#
#  ■<imgboard本体の名前>
#
#  パソコンユーザが携帯アクセスのURLにアクセスした場合、それを自動検出し、
#  「PCの方はこちらへ」とimgboard本体のURLを紹介するようになっています。
#  そのURLを作るために、imgboard.cgi本体を下記で指定してください。なお本体
#  のCGI名をデフォルトから変更してない場合は・・特に設定の必要はありません
#
$PM{'cgi_hontai_name'}	= 'imgboard.cgi';	# imgboard本体の名前
#
#  ■<サーバ保存メッセージ数>	
#    ↑imgboardのサーバ保存メッセージ数の２−３倍にしてください
#
#  この件数を超えると、古いものから削除されます.記事と画像は同時に消えます。
#  デフォルトは140．
#
#  imodeと共用する場合は、テキスト投稿の比率が上がりますので、保存メッセージ
#  数を2-3倍に増やした方がバランスいいでしょう。
#
$PM{'max_message'} 		= 160;
#
#  ■ <時差>	# imgboardと設定を合わせてください
#
#  海外サイトに設置した場合、投稿時刻が現地時刻になってしまいます。
#  これを日本時刻に修正する場合には、以下の項目で時差を設定してください。
#  (設定例) 時差を15時間にする場合 $PM{'gisa'}=15;という風に設定してください。
#
$PM{'gisa'}=0;		# 時差(h)
#
#  ■<投稿ファイルの格納ディレクトリ>
#
#  Jフォンのカメラ付き携帯(51,52系)から投稿された
#  ファイルを保存しておく場所です。imgboardの$img_dirと設定を合わ
#  せて下さい。
#  なお、よくわからない場合はデフォルトのまま設定を変更しないで
#  そのままにしておいてください。
#
$PM{'img_dir'} = './img-box';		# デフォルト位置
#
#  ■<投稿ファイルに付けるURL前半部>
#
#  アップロードしたファイルの頭につけるURL前半部を指定してください。
#  (掲示板の画像ファイルのURL)=(ここで指定したURL前半部)+(ファイル名)に
#  なります。たとえば、アップロードしたファイルをブラウザで見るときのURLが
#  http://www.big.jp/~talk/imgboard/img-box/img200101281010.jpgになるなら
#  http://www.big.or.jp/~talk/imgboard/img-boxを前半部に指定してください。
#  (なお、最後に/は付けないでください)
#
$PM{'img_url'} ='http://www.goodman.co.jp/disco/Dp-bbs/img-box';
#
#  <掲示データ保存ファイル名>	# imgboardと設定を合わせてください
#
#  テキストデータの保存用ファイルの名前です．
#  imgboard.cgiと同じ場所に入れる場合はこのパス指定のまま.
$PM{'file'}= './file.dat';
#
#  <imodeアクセスデータ保存ファイル名>
#
# ユーザのiクッキー情報を記憶・呼出するためのファイルです。
# 必須ファイルです。
# 
$PM{'icookie_file'}= './file_imode_user.dat';
#
#  <日本語コード変換ライブラリ>
#
#  imgboard.cgiと同じ場所に入れる場合は、このパス指定のまま.
#  注:jcode_sj.plはjcode.plの機能限定スリム版です。SJISへの変換機能のみ。
$PM{'jcode_name'}= 'jcode_sj.pl';
#
#  <画像プロパティ認識ライブラリ>
#
#  imgboard.cgiと同じ場所に入れる場合はこのパス指定のまま.
$imgsize_prog="imgsize.pl";
#
# ============以下はオプションです。必要に応じてカスタマイズ================#
#
#
#================================#
#   <掲示板機能 基本オプション>    #
#================================#
#  ■<1ページに表示するメッセージ数>
#
#  デフォルト4
#  １ページに表示するメッセージの数です。imodeの場合は5以下を推奨
$PM{'message_per_page'} 		= 3;
#
#  ■ <携帯で表示する場合の、１記事あたりの最大文字数>
#
#  表示時の1記事の長さの最大表示文字数を設定してください。
#  携帯からアクセスした時に限り、この長さ以上の場合は、記事の後半が
#  表示上、カットされて表示されます。1ページ当たりの文字数がオーバしな
#  いように、上記パラメータと当パラメータで適宜調整してください)
#
$PM{'kiji_disp_limit_imode'}=300;
#
$PM{'kiji_disp_limit_foma'}=3000; # FOMAの場合
#
#  ■<返信機能>(R6NEW!!)
#
#  返信機能を使うことができます。
#  (1=返信機能あり(推奨),0=返信機能なし)
$PM{'use_rep'} 		= 0;
#
#  返信のついた記事を先頭へ持って行くかどうかを決めてください
#  (1=先頭へ持って行く(デフォルト),0=持っていかない)
$PM{'res_go_up'} = 0;
#
#  ■ <自動 全角カナ→半角カナ変換>
#
#  imode表示時の画面は狭く、少しでも多くの文字が表示された方がいい
#  という事情があるようなので、自動的に全角カナを半角カナに変換してか
#  ら表示する機能を追加しました。
#
#  1=変換してから表示(推奨),0=なにもしない
$PM{'hankaku_filter'}=1;
#
#  ■ <PCからの投稿を許可>
#
#  PCから、携帯アクセス経由で投稿する行為を許可するかどうかを設定してください。
#
#  1=許可しない(推奨),0=許可する(デモ用)
$PM{'no_upload_from_pc'}=0;
#
#  ■ <PCからの閲覧を許可> 2002.04 new
#
#  PCから、携帯アクセス経由で閲覧する行為を許可するかどうかを設定してください。
#
#  1=許可しない,0=許可する(推奨)
$PM{'no_view_from_pc'}=0;
#
#  ■ <フォーム入力項目のデータ有無チェック>
#
#  フォームの各入力項目の記入について、必須にするかどうかを指定できます。
#  必須にした入力項目が空の場合、記事は登録はされません。
#
#  1=必須,0=省略を許可
$PM{'form_check_name'}	=1;	# 名前 （デフォルト1）
$PM{'form_check_email'}	=0;	# email（デフォルト1）
$PM{'form_check_subject'}=0;	# 題名 （デフォルト0）
$PM{'form_check_body'}	=0;	# 本文 （デフォルト0）
#$PM{'form_check_img'}	=0;	# 添付画像（デフォルト0）
$PM{'form_check_rmkey'}		=0;	# 削除キー（デフォルト0）# ←現在未使用
#
#  以下は入力項目を増やす機能(imgboardでは14つまで入力項目を増やせます)を使っ
#  て、項目を増やした場合用 (増やしていないユーザは設定しても関係ありません)。
#
$PM{'form_check_optA'}	=0;	# 追加項目optA	（デフォルト0）# URL
$PM{'form_check_optB'}	=0;	# 追加項目optB	（デフォルト0）
$PM{'form_check_optC'}	=0;	# 追加項目optC	（デフォルト0）
$PM{'form_check_optD'}	=0;	# 追加項目optD	（デフォルト0）
$PM{'form_check_optE'}	=0;	# 追加項目optE	（デフォルト0）# tel
$PM{'form_check_optF'}	=0;	# 追加項目optF	（デフォルト0）
$PM{'form_check_optG'}	=0;	# 追加項目optG	（デフォルト0）
$PM{'form_check_optH'}	=0;	# 追加項目optH	（デフォルト0）
$PM{'form_check_optI'}	=0;	# 追加項目optI	（デフォルト0）
$PM{'form_check_optJ'}	=0;	# 追加項目optJ	（デフォルト0）
$PM{'form_check_optK'}	=0;	# 追加項目optK	（デフォルト0）
$PM{'form_check_optL'}	=0;	# 追加項目optL	（デフォルト0）
$PM{'form_check_optM'}	=0;	# 追加項目optM	（デフォルト0）
$PM{'form_check_optN'}	=0;	# 追加項目optN	（デフォルト0）
#
#================================#
#   <掲示板機能 基本オプション>    #
#================================#
#
#  ■<転送許可画像サイズ上限>
#
#  JSKYのﾊﾟｹｯﾄ機からJPEG画像をアップロードする場合の転送リミッタを
#  設定してください。なお、
#  ファイル投稿時、このＣＧＩは他のテキスト系ＣＧＩよりも多くのメモリリソース
#  を必要とします。これはアップロードしたファイルの復元処理にバッファが必要な
#  ためであり、必要なメモリ量は転送された画像サイズに比例します。非力なサーバ
#  を使用している場合は、自然とアップロードサイズを小さくする必要があり、そう
#  しないと処理はタイムアウトして止まりますのでご注意下さい。
#  100KB以上にはしないこと。
#  なお、添付ファイルありの掲示板を運営する場合は、記事数を減らしてサーバレン
#  タルエリアが容量オーバにならないように気を付けて下さい。
#  デフォルト50ＫＢ
$PM{'max_upload_size'} 	= 50;	# 単位KB
#
#  ■<各種マルチメディアデータ（約２０種類）のアップロード>
#
#  デフォルトではGIF/JPEG/PNG/MNG/ﾑｰﾋﾞｰ写ﾒｰﾙ(Nancy形式)/ezmovie/ASF(ASFはドコ
#  モのeggyのみ)/写メール(JPEG)の投稿を受け付け、それ以外のデータは自動リジェクトします。
#  スカイメロディ、iメロディ等のその他の各種マルチメディアデータ
# （テキスト,HTML、iメロディなど事前登録された約２０種類）の投稿も
#  許可したい場合は以下のフラグを1にしてください。
#
#  (1=許可する,0=許可しない(推奨))
$PM{'allow_other_multimedia_data'}	= '0';	
#
#  ■ <自動URLリンク>
#
#  記事中にURL,メールアドレス等が含まれる場合、自動的にリンクにします。
#  (1=自動リンク(推奨),0=自動リンクしない)
$PM{'auto_url_link'}=1;
#
#  ■ <自動株価リンク>
#
#  記事中に銘柄コード等が含まれる場合、自動的にリンクにします。
#  (1234)みたいにカッコで囲まれた４ケタの数字を銘柄コードと自動認識します。
#
#  (1=自動リンク(推奨),0=自動リンクしない)
$PM{'auto_quote_link'}=0;
#
#  自動株価リンクで使うサイトのアドレス(imodeから)
#
#  以下はyahoo株を利用する場合の例（適宜変更すること）
$PM{'auto_quote_ref_i_head'}="http://mobile.yahoo.co.jp/i?a=d&sy=";
$PM{'auto_quote_ref_i_tail'}=".T&k=";
#
#  自動株価リンクで使うサイトのアドレス(Jフォンから)
#
$PM{'auto_quote_ref_jphone_head'}="";
$PM{'auto_quote_ref_jphone_tail'}="";
#
#  自動株価リンクで使うサイトのアドレス(PCから)
#  以下はyahoo株を利用する場合の例（適宜変更すること）
#
$PM{'auto_quote_ref_head'}="http://quote.yahoo.co.jp/q?s=";
$PM{'auto_quote_ref_tail'}="&d=3m";
#
#
#  ■ <自動電話リンク>
#
#  電話番号*が入力された場合、クリッカブルな電話番号項目が記事に作られます。
#  telリンクですので、そのままクリックすると相手へ電話をかけることができ
#  ます*
#  *いたずらを防ぐために11X番などの特殊な番号は自動的にフィルタされます。
#
#  (1=自動リンク(推奨),0=自動リンクしない)
$PM{'auto_tel_link'}=1;
#
#  ■ <電話リンクにおけるQ2の扱い>
#
#  telリンクでダイヤルＱ２を許すかどうかを以下で決めて下さい。
#
# (1=許さない(強く推奨),0=許す)
$PM{'no_q2_flag'}=1;
#
#  ■ <iクッキーに本文を記録する>
#
#  iクッキーに、名前、本文以外に、本文も記録するかどうかを
#  決めて下さい。
#
# (1=本文は記録しない(通常),0=本文も記録する(デバック用))
$PM{'no_body_in_icookie'}=1;
#
#  ■ <新着表示>
#
#  最新投稿3記事に------(new)------を添えて表示します
#  (1=表示する(デフォルト),0=表示しない)
$PM{'disp_new_notice'} = 1;
#
#==================================#
#     <セキュリティ オプション>    #
#==================================#
#
#  <会員パスワド>
#
#  いたずら投稿を防ぐため、投稿時に４けたの数字キーをチェックし、
#  それが正しい場合だけ登録するようにできます。
#
#  (1=使用,0=使用しない)
$PM{'use_post_password'}=1; #
#
# (注)imodeは相手を特定する手段がまったくないため、連続投稿イタズラに対し
# て対抗する手段がありません。画像付きの記事が流れてしまう事態を防ぐために
# 会員パスワドをできるだけ使用してください。
# 使用しない場合は
# １．保存記事数を数倍に増やす。
# ２．ＰＣからの投稿を禁止する
# 設定にしてください。
#
#  会員パスワド(4桁以上の数字)
$PM{'post_passwd'}="totokun";
#
#  <タグ使用許可>
#
#  コメント中にタグを許可するかどうかを指定できます。許可すればユーザ表現の
#  自由度は上がりますが、タグの閉め忘れ等によりトラブルが発生する可能性が
#  あります。なお、タグを許可する指定にしても、掲示板に対するイタズラ予防のため
#  ActiveX,Javascript等や、危険性のあるタグ、いたずらによく使われるタグ
# （約22種類）は自動フィルタされ、無効化されますので、あらかじめご了承くださ
#  い。（詳細はsub form_checkを参照）  
#  デフォルトはタグ使用可です。(1)
#
#  (1=使用可能,0=使用不可)
$PM{'use_html_tag_in_comment'}=1;
#
#  <IMGタグ許可・非許可>
#
#  imode版では設定する必要ありません
#  この設定値は変更しないでください。
#
#  (1=許可,0=非許可(強く推奨))
$PM{'use_img_tag_in_comment'}=0;
# 
#  <各種掲示板荒し対策> 
#
#  （レベル１）ホスト名による制限 (BLACK_LIST)
#
#  携帯のホスト名は動的に変わるため、当機能は外しました。
#
$PM{'no_upload_by_no_RH_user'}=0;	# imode 使用時は変更しないこと
#
#
#  レベル２）禁止単語による制限 (BLACK_WORD)
#
#  特定の単語を本文に含む記事の投稿を失敗させます。前述の手段を用いても"荒し"
#  や "宣伝広告の嵐" がどうしても収まらない場合、あるいは、ホスト名を頻繁に変
#  えるユーザからしつこいイタズラを受けている場合に、最終手段として使ってみて
#  ください。
#  (1=制限する,0=制限しない(推奨))
$PM{'no_upload_by_black_word'}=1;	
#
#   マッチした場合のエラーメッセージ（変更可）
#   （排除されたことが相手にわからないように、できるだけ、
#    無意味なものにしてください）
$PM{'error_message_to_black_word'}="CGI error code 2244 NBW";	
#
@BLACK_WORD=(" Ω "," しねしね "," うんこ "," 死ね "," 制裁 "
," ユダヤ "
," ごみ以下 "," 呆れ "," 無修正画像 ", " すべて無修正 "
," 雑魚 "," 罵 "," 童貞 "," 傍観者 "," fuck "
," porn "," ウンコ "
," 偽善者 "," わらい "," 捏造 "," adult "," teen "," stripper "
," fetish "," pics " ," 下記URLで只今無料配布中 "
," 素人娘 "," ビデオを大放出 ");
#
#  <連続投稿回数制限> 
#
#  ユーザからの連続投稿回数を、掲示板側で制限できるようになりました。
#  (1=制限する（デフォルト）,0=制限しない)
$PM{'limit_upload_times_flag'}=1;	
#  
#  上で"1"にした場合、どれだけのサンプリング期間の間に最大何回までアップ
#  ロード許可するかを決めてください。（オーバすると投稿エラーになります）
#
# サンプリング期間 (day,1hour,10min,2min,1minを選択可。デフォルトは2min)
$PM{'upload_limit_type'}="2min";	
# 回数。デフォルトは5回
$PM{'upload_limit_times'}="5";
#
#
#  <自動バックアップ> 
#  みなさんのログは貴重でかけがえのないデータです。しかし、flockやsymlink
#  等のデータ保護手段を用いても、Perlの特性上、ログが消える可能性は残念な
#  がらゼロにはなりません・・・。これは掲示板CGIが抱える大きな問題でした。
#  そこで、特報CGIでは定期的に記事を自動バックアップをする機能を開発し、
#  R6から実装しました。前回バックアップファイルを作成した日から間隔日
#  以上空いて、新規登録があると、そのタイミングでバックアップファイルを
#  更新します。これによって、「最も安心」な掲示板になったと思います（多分）。
#
#  自動定期バックアップを使用#
#  (1=使用する（デフォルト）,0=使用しない)
$PM{'make_backup_file'}	= '1';
#
#  バックアップする間隔(日)
$PM{'backup_day_interval'}  = '7';		
#
# バックアップファイル名
# (セキュリティ上の理由より、ユーザが適宜変更することを推奨)
$PM{'backup_file_name'} = 'fileback.dat';
#
#  <管理者自動メール> sendmail
#
#  新規記事が登録されると、下記メールアドレスにメールで通知します。
#  この機能を使用する場合は、以下の三つの情報をすべて確実に指定してください。
#  これらの情報を間違えると、サーバ管理者へ迷惑をかけるので、必ず管理者に確認
#  してから慎重に設定を行ってください。なお、この機能が使えるのはプロバイダ
#  がUNIX系のユーザのみです。(Mac,Win不可）設定がよくわからない場合は使用し
#  ないでください。
# 
$PM{'use_email'} =0;	# (1=yes,0=no)デフォルトは0
#
#  メールプログラムのパス（プロバイダの管理者に聞く）
$PM{'mail_prog'} = '/usr/lib/sendmail';
#
#  管理者のメールアドレス（あなたのメールアドレス）
#  複数の宛先にメールを送りたい場合は新FAQページ参照
$PM{'recipient'} = 'yourname@your_provider.ne.jp';
#
#  メール本文に掲示板へのショートカットURLリンクを作るため、
#  CGIの入っているディレクトリのURLを指定して下さい(最後の/は不要)。
#
$PM{'cgi_link_url'}='http://yourprovider/yourname/imgboard';
#
#  メール本文の長さのリミッターを設定してください。
#
#  (この長さ以上の場合は、内容がカットされます)
$PM{'mail_body_limit'}=300;
#
#  <ちょっとおやすみ> oyasumi
#
#  旅行に出かける等、しばらく掲示板をお休みしたい時は0にしてください。
#
$PM{'bbs_open'}=2;          #(1=yes,0=no)デフォルトは3
#
# 0=完全ダウン
# 1=管理メニューのみ動く
# 2=さらに閲覧が可能(ReadOnly)
# 3=さらに書込みも可能(読み書き可能=通常のモード)
#
#  おやすみ時のメッセージ(適宜変更)
#
$PM{'oyasumi_message'}=qq|
管理者不在のため、しばらくお休みします。<BR>
またのお越しをお待ちしております。
|;
#
#
# その他変数の初期化
$PM{'use_crypt'}	= '1';		# 暗号化を用いる
$PM{'read_config'}	= '1';		# configを読む
$PM{'flock'}		= '1';		# flockを使う
#
#=========================================#
#     <ＨＴＭＬ詳細設定項目オプション>    #
#=========================================#
#
#==========================#
# フォーム入力部のデザイン
#==========================#
#
#
# < 必要/省略可の自動表示のフォント色とサイズ >
#
#  "フォーム入力項目のデータ有無チェック"での設定に従い、
#  必要/省略可の自動表示を、フォーム欄の脇に自動表示することができます
#
$PM{'auto_disp_omit_frag'}	="1";		# 自動表示する(yes=1,no=0)
#
#
#  ◆ <ＨＴＭＬ抜粋>
#
#  ユーザサイドでＨＴＭＬを変更しやすいように,スクリプト中のＨＴＭＬ定義部分を
#  以下に抜き出し列挙してあります．それぞれ,print<<HTML_END;行の次の行から
#  HTML_END記号の前行までは、通常ＨＴＭＬとして編集可能なので,ワードパット(Win系)
#  Jedit(Mac系)等のエディタでご自由に書き換えて、カスタマイズしてください．た
#  だし先頭に$がついているもの($im_body_bgcolor等)は変数なので、消す場合は十分注
#  意してください．なお、当スクリプトはSJISコードを用いているため,「表示,申す,
#  機能」等の特定の文字が化けてしまう現象があります。この手の漢字や文字を使用
#  して文字化けが発生した場合は、文字化けした文字の前後に\マークを入れて区切っ
#  れば解決できます。この場合、\はPerlでは文字区切り記号として働き、Web上には
#  表示されません。
#
#=====================================#
#     <ＨＴＭＬ--画面最上部>          #
#=====================================#
#
#  ＨＴＭＬヘッダ,ボディ指定．タイトル等画面最上部のＨＴＭＬです
#
#  print<<HTML_END;の次行から"HTML_END"のある行までは、通常のＨＴＭＬ
#  として編集可能です． 
sub top_html{

 	# ■事前処理(変更しないこと)
	local($mes_p1)="";
	$PM{'title'}="" if(($keitai_flag eq "J-PHONE")&&($jstation_flag < 3));
	$mes_p1=qq|<BR>*PCの方は<a href="$PM{'cgi_hontai_name'}" target=_blank>こちら</a>へ<BR><BR>| if($keitai_flag eq "pc");
	$mes_p1="" if($FORM{'mode'} ne "");
	return(&ez_top_html)	if($keitai_flag eq "EZweb");
	return(&H_top_html)	if($keitai_flag eq "H");
	#カラーiモードの白飛びを防ぐ
	$PM{'im_body_text'}="#000000" if($PM{'im_body_text'} eq "");
	$PM{'im_body_bgcolor'}="#FFFFFF" if($PM{'im_body_bgcolor'} eq "");

 	# ■ＨＴＭＬ部(カスタマイズ可能)
print<<HTML_END;
<HTML>
<HEAD><TITLE>$PM{'title'}</TITLE></HEAD>
<BODY BGCOLOR="$PM{'im_body_bgcolor'}" BACKGROUND="$PM{'body_background'}" TEXT="$PM{'im_body_text'}" LINK="#6060FF" VLINK="#4040FF">
立石ディスコ・ナイト<BR>
[開催スケジュール] <BR>


$mes_p1

HTML_END
}
#
#=====================================#
#     <ＨＴＭＬ--画面最上部ボタン>    #
#=====================================#
#
#  画面最上部のボタンです
#
#  print<<HTML_END;の次行から"HTML_END"のある行までは、通常のＨＴＭＬ
#  として編集可能です． 
sub top_button_html{

 	# ■事前処理(変更しないこと)
	# 初期設定を変更してない場合、終了ボタンは出さない。
	if($PM{'back_url'} eq 'http://www.goodman.co.jp/chinchiku/i/index.html'){
		$cm_out_exit_h='<!--';
		$cm_out_exit_f='-->';
	}
	return(&ez_top_button_html)	if($keitai_flag eq "EZweb");
	return	if($keitai_flag eq "H");

 	# ■ＨＴＭＬ部(カスタマイズ可能)
print<<HTML_END;

l<a href="$cgi_name?mode=search_menu&page=$FORM{'page'}">検索</a>l
<BR>

HTML_END
}
#
#
#=====================================#
#     <ＨＴＭＬ--画面中央の説明>      #
#=====================================#
#
#  真ん中の説明部分のＨＴＭＬです．
#
sub middle_A_html{
# タグ使用上の注意が自動で入ります
print<<HTML_END;
$HR
HTML_END
}

sub middle_B_html{
print<<HTML_END;
<!--掲示板中央部の説明部分B-->
<center>
最大保存$PM{'max_message'}件<BR>
$KEITAI_ENV{'MACHINE_TYPE'}
</center>
HTML_END
}
#
#=====================================#
#     <ＨＴＭＬ--投稿記事部分>        #
#=====================================#
#
#
sub kiji_base_html{

    # ■事前処理(変更しないこと)
    return(&ez_kiji_base_html)	if($keitai_flag eq "EZweb");
    return(&H_kiji_base_html)	if($keitai_flag eq "H");
    local($mail_link)="";
    local($tel_link) ="";
    local($keitai_env_link) ="";
    local($tmp_parent_seq_no) ="";
    undef %METAP;
    &make_url_link;

    #  日付データをimode用に短くする
    if($LDATA{'date'}=~ /\[(\d+)\/(\d+)\/(\d+)\,(\d+)\:(\d+)\:(\d+)\]/){
	$LDATA{'date'}="$2\/$3"."_"."$4\:$5";
    }

   #  メールアドレスがある場合だけリンクする

       if(($LDATA{'email'} eq "")||($LDATA{'email'}=~ /no_email/i)||($LDATA{'email'} eq "none")){
	   $mail_link="$LDATA{'name'}";
       }else{
	   $mail_link="<A HREF=\"mailto:$LDATA{'email'}\">$LDATA{'name'}</A>";
       }


   #  いたずら防止。変な電話番号は無効化

	$OPTDATA{'optE'} =~ s/\s//g;		#スペースを除去
	if($OPTDATA{'optE'}=~/^11/){
	   $OPTDATA{'optE'}="";
	}elsif($OPTDATA{'optE'}=~/^001/){
	   $OPTDATA{'optE'}="";
	}elsif(($OPTDATA{'optE'}=~/^0990/)&&($PM{'no_q2_flag'}==1)){
	   $OPTDATA{'optE'}="";
	}
   #  電話番号がある場合はリンクする
       if($OPTDATA{'optE'}=~/^(\d)(\d)(\d)/){
         if($keitai_flag eq "imode"){
	    $tel_link="<A HREF=\"tel\:$OPTDATA{'optE'}\">\&\#63858\;</A>";
         }elsif($keitai_flag eq "J-PHONE"){
	    $tel_link="<A HREF=\"tel\:$OPTDATA{'optE'}\">\x1b\$G*\x0f</A>";
         }else{
	    $tel_link="<A HREF=\"tel\:$OPTDATA{'optE'}\">TEL</A>";
	 }
       }else{
	   $tel_link="";
       }

	if($OPTDATA{'optKeitaiFlag'} ne ""){
#	  $OPTDATA{'optKeitaiServiceCompany'}
#	  $OPTDATA{'optKeitaiHttpVersion'}
#	  $OPTDATA{'optKeitaiMachineType'}
#	  $OPTDATA{'optKeitaiOtherParam'}
#	  $OPTDATA{'optKeitaiMelodyType'}
	  $keitai_env_link=qq|<BR>$OPTDATA{'optKeitaiFlag'}：$OPTDATA{'optKeitaiMachineType'}|;
	}

	# ワード検索時の時はどれのレスかを説明する

	if(($FORM{'mode'} eq "search_menu")&&($LDATA{'blood_name'} ne "")){
		$tmp_parent_seq_no=$BLOOD2SEQNO{"$LDATA{'blood_name'}"};
		if($child_kiji_flag == '1' ){	# 子の場合
		  $disp_seq_no="$disp_seq_no".")(←$tmp_parent_seq_noへのレス";
		}else{
		  undef $tmp_parent_seq_no;
		}
	}


# ■ＨＴＭＬ部(カスタマイズ可能)
print<<HTML_END;
<FONT COLOR="#FF0000">$LDATA{'subject'}</FONT><BR><BR>
Date●$OPTDATA{'optI'}<BR>
Time●$OPTDATA{'optC'}<BR>
At●$OPTDATA{'optD'}<BR>
Fee●$OPTDATA{'optF'}<BR>
Info●$OPTDATA{'optE'}<BR>
E-mail●($mail_link$tel_link)$tmp_url_link $disp_re<BR><BR>
★$LDATA{'body'}<BR><BR>

<a href="$PM{'back_url'}"><FONT COLOR="#FF0000"> TDN-Top </FONT></a><BR><BR>
HTML_END

    # 添付データがあった場合はprint<<HTML_END;からHTML_ENDまでのHTMLが出力さ
    # れる 
    if($LDATA{'img_location'} ne ""){
      # タイトル名が時間ベースの場合は勿体ないので名前を表示しない
      if($LDATA{'imgtitle'} =~ /^img(\d+)/){
	# 扱える場合はリンク表示、扱えないものは非リンク表示
	if($can_handle_flag == 1 ){

print<<HTML_END;
<A HREF="$LDATA{'img_location'}" TARGET="top">$data_type： 
</A>-$IMG_PARAMETERS{'dsize'}<BR><BR>
<A href="$PM{'back_url'}"><FONT COLOR="#FF0000"> TDN-Top </FONT></A><BR><BR>

HTML_END

		# eggyかFOMAかＰＣなら、ストリーム再生用のＡＳＸを吐く
		if((($KEITAI_ENV{'MACHINE_TYPE'} eq "eggy")||($KEITAI_ENV{'OTHER_PARAM'} eq "FOMA")||($keitai_flag eq "pc"))&&($LDATA{'img_location'}=~ /\.asf$/i)){

		$METAP{'mRef'}	="$LDATA{'img_location'}";
		$METAP{'mAuth'}	="$LDATA{'name'}";
		# URLエンコード
		foreach(keys %METAP){
			$METAP{$_} =~ s/(\W)/'%'.unpack("H2", $1)/ego;
		}

print<<HTML_END;
<BR>
[<A HREF="$cgi_name?bbsaction=output_meta_file&mRef=$METAP{'mRef'}&mMinf=$METAP{'mMinf'}&mAuth=$METAP{'mAuth'}&mCopy=$METAP{'mCopy'}&dummy=">→ｽﾄﾘｰﾑ再生</A>]
HTML_END
		}

	}else{

print<<HTML_END;
$data_type： -$IMG_PARAMETERS{'dsize'}
HTML_END

	}
      # タイトル名がつけられている場合はそれをつける
      }else{
	if($can_handle_flag == 1 ){	# 扱える場合はリンク表示

print<<HTML_END;
<A HREF="$LDATA{'img_location'}" TARGET="top">
$data_type： $LDATA{'imgtitle'}
</A>-$IMG_PARAMETERS{'dsize'}
HTML_END

		# eggyかFOMAかＰＣなら、ストリーム再生用のＡＳＸを吐く
		if((($KEITAI_ENV{'MACHINE_TYPE'} eq "eggy")||($KEITAI_ENV{'OTHER_PARAM'} eq "FOMA")||($keitai_flag eq "pc"))&&($LDATA{'img_location'}=~ /\.asf$/i)){

		$METAP{'mRef'}	="$LDATA{'img_location'}";
		$METAP{'mAuth'}	="$LDATA{'name'}";
		# URLエンコード
		foreach(keys %METAP){
			$METAP{$_} =~ s/(\W)/'%'.unpack("H2", $1)/ego;
		}

print<<HTML_END;
<BR>
[<A HREF="$cgi_name?bbsaction=output_meta_file&mRef=$METAP{'mRef'}&mMinf=$METAP{'mMinf'}&mAuth=$METAP{'mAuth'}&mCopy=$METAP{'mCopy'}&dummy=">→ｽﾄﾘｰﾑ再生</A>]
HTML_END

		}

	}else{				# 扱えないものは非リンク表示


print<<HTML_END;
$data_type： $LDATA{'imgtitle'}-$IMG_PARAMETERS{'dsize'}
HTML_END

	}
      }
    }

 print<<HTML_END;
$keitai_env_link
HTML_END
#print "$HR\n";
}
#
#  URLリンクが記入されていない場合はリンクを表示しないようにする
#
sub make_url_link{
 if($OPTDATA{'optA'} ne ""){
	$tmp_url_link=qq|(<a href="$OPTDATA{'optA'}" target=_blank>HP:</a>)<BR>|;
 }else{
	undef $tmp_url_link;
 }
}
#========================================================#
#     <ＨＴＭＬ--入力フォーム部(imode,Jフォン)>          #
#========================================================#
#
#  記事入力フォーム部のＨＴＭＬ．入力項目を増やしたり、減らしたりしたい
#  場合はここを変更してください。だだし、変更によりＣＧＩがうまく動かな
#  くなる可能性がありますので,ここは変更する時は十分注意してください．
#  なお、URL等の項目を追加したいなど、よくある希望に対しては、外部設定
#  ファイルというカスタマイズした設定ファイルを使うことにより、より容易
#  に実現できますので、自分でカスタマイズするよりも、それを使った方が楽
#  でしょう。なお、同ファイルはサポートサイトの方で配布しています。  
#
#
# imode用フォームメニュー
sub form_imode_html{

	# 事前処理
	&auto_omit_disp;
	$COOKIE{'body'} =~ s/<BR>/\n/g;		#<BR>をLFに
	$COOKIE{'optF'} =~ s/<BR>/\n/g;		#<BR>をLFに
	local($mes_p1) ="";
	local($mes_p2) ="";
	local($mes_p3) ="";
	local($mes_p4) ="";
	local($cm_out_img_h) ="";
	local($cm_out_img_f) ="";
	local($back_page) ="1";

	# icookieに本文を保存したくない人のために、オプションを追加
	if($PM{'no_body_in_icookie'} == 1){
		$COOKIE{'body'}="";
	}

	# 親があるときは返信
	if($FORM{'parent'} ne ""){
		if($PM{'use_rep'} == 1 ){
		  $mes_p1 =qq| 記事NO. $FORM{'parent'}に返信します |;
		  $mes_p4 ="disp_rep_form";
		  $back_page ="$FORM{'page'}";
		}
	# 返信じゃなければ、画像アップロードあり
	}else{
	  # Mステージ(eggy)の場合はアップロードタグを出す
	  if($KEITAI_ENV{'MACHINE_TYPE'} eq "eggy"){
		$mes_p2= qq| 添付FILE(eggy専JPEG画像/ASF動画-$PM{'max_upload_size'}KB以下)<INPUT TYPE="FILE" NAME="img" VALUE="">$DISP_OMIT{'img'}<BR><BR>|;
		$mes_p3 =qq|ENCTYPE="multipart/form-data"|;
	  }

	}


#以下の行から"HTML_END"のある行までは通常のＨＴＭＬとして編集可能です．
print<<HTML_END;
$HR
<center>
[<a href="$cgi_name?mode=disp_member_check&page=$FORM{'page'}&blood=$FORM{'blood'}&parent=$FORM{'parent'}" accesskey=0>戻る</a>]
</center>

$mes_p1

<FORM ACTION="$cgi_name" METHOD="POST" $mes_p3>	
<INPUT TYPE="HIDDEN" NAME="bbsaction" VALUE="post">
<INPUT TYPE="HIDDEN" NAME="page" VALUE="$back_page">
<INPUT TYPE="hidden" NAME="blood" VALUE="$FORM{'blood'}">
<INPUT TYPE="hidden" NAME="parent" VALUE="$FORM{'parent'}">
<INPUT TYPE="HIDDEN" NAME="prebbsaction" VALUE="$mes_p4">
<INPUT TYPE="HIDDEN" NAME="viewmode" VALUE="$COOKIE{'viewmode'}">
<INPUT TYPE="HIDDEN" NAME="optB" VALUE="">
<INPUT TYPE="HIDDEN" NAME="optC" VALUE="">
$cm_out_pw_h
<INPUT TYPE="hidden" NAME="entrypass" SIZE=4 VALUE="$FORM{'entrypass'}">
$cm_out_pw_f
<INPUT TYPE="hidden" NAME="memberID" VALUE="$FORM{'memberID'}">
<INPUT TYPE="hidden" NAME="rmkey" VALUE="$FORM{'memberID'}">
*は必須入力<BR>
お名前<INPUT TYPE="TEXT" NAME="name" SIZE=8 VALUE="$COOKIE{'name'}" MAXLENGTH="22" istyle="1" MODE=hiragana>$DISP_OMIT{'name'}<BR>
E-Mail<INPUT TYPE="TEXT" NAME="email" VALUE="$COOKIE{'email'}" SIZE=8 MAXLENGTH="55" istyle="3" MODE=alphabet>$DISP_OMIT{'email'}<BR>

題名<INPUT TYPE="TEXT" NAME="subject" VALUE="$COOKIE{'subject'}" SIZE=9 MAXLENGTH="20" istyle="1" MODE=hiragana>$DISP_OMIT{'subject'}<BR>

携帯<INPUT TYPE="TEXT" NAME="optE" VALUE="$COOKIE{'optE'}" SIZE=10 MAXLENGTH=40 istyle="4" MODE=numeric><BR>

URL <INPUT TYPE="TEXT" NAME="optA" VALUE="$COOKIE{'optA'}" SIZE=10 MAXLENGTH=80 istyle="3" MODE=alphabet><BR>

$mes_p2
本文$DISP_OMIT{'body'}<BR>
<TEXTAREA NAME="body" COLS="16" ROWS="12" wrap="on" MAXLENGTH="300" istyle="1" MODE=hiragana>$COOKIE{'body'}</TEXTAREA>
<BR>

$my_moji_palette
<INPUT TYPE="SUBMIT" VALUE="投稿">
</FORM>

HTML_END
}

# Jフォン用フォームメニュー
sub form_jphone_html{

	# 事前処理
	local($mes_p1,$mes_p2,$mes_p3,$mes_p4,$mes_p5);
	local($mes_p1) ="";
	local($mes_p4) ="";
	&auto_omit_disp;
	$COOKIE{'body'} =~ s/<BR>/\n/g;		#<BR>をLFに
	$COOKIE{'optF'} =~ s/<BR>/\n/g;	#<BR>をLFに
	local($cm_out_img_h) ="";
	local($cm_out_img_f) ="";
	local($back_page) ="1";

	# icookieに本文を保存したくない人のために、オプションを追加
	if($PM{'no_body_in_icookie'} == 1){
		$COOKIE{'body'}="";
	}

	if($FORM{'parent'} ne ""){
		if($PM{'use_rep'} == 1 ){
		  $mes_p1 =qq| 記事NO. $FORM{'parent'}に返信します |;
		  $back_page ="$FORM{'page'}";
		  $mes_p4 ="disp_rep_form";
		}
	}else{
	  if($jstation_flag >= 4){
		$mes_p2 =qq|↓画像添付<BR><INPUT TYPE="FILE" NAME="img" VALUE="">$DISP_OMIT{'img'}<BR><BR>|;
		$mes_p5 =qq|ENCTYPE="multipart/form-data"|;
	  }
	}


#以下の行から"HTML_END"のある行までは通常のＨＴＭＬとして編集可能です．
print<<HTML_END;
$HR
<a href="$cgi_name?mode=disp_member_check&page=$FORM{'page'}&blood=$FORM{'blood'}&parent=$FORM{'parent'}" accesskey=0>戻る</a> 
<BR>
<BR>
$mes_p1

<FORM ACTION="$cgi_name" METHOD="$form_method" $mes_p5>	
<INPUT TYPE="HIDDEN" NAME="bbsaction" VALUE="post">
<INPUT TYPE="HIDDEN" NAME="page" VALUE="$back_page">
<INPUT TYPE="hidden" NAME="blood" VALUE="$FORM{'blood'}">
<INPUT TYPE="hidden" NAME="parent" VALUE="$FORM{'parent'}">
<INPUT TYPE="HIDDEN" NAME="prebbsaction" VALUE="$mes_p4">
<INPUT TYPE="HIDDEN" NAME="viewmode" VALUE="$COOKIE{'viewmode'}">
<INPUT TYPE="HIDDEN" NAME="optB" VALUE="">
<INPUT TYPE="HIDDEN" NAME="optC" VALUE="">

$cm_out_pw_h
<INPUT TYPE="hidden" NAME="entrypass" SIZE=4 VALUE="$FORM{'entrypass'}">
$cm_out_pw_f
<INPUT TYPE="hidden" NAME="memberID" VALUE="$FORM{'memberID'}">
<INPUT TYPE="hidden" NAME="rmkey" VALUE="$FORM{'memberID'}">
<BR>
お名前<INPUT TYPE="TEXT" NAME="name" SIZE=8 VALUE="$COOKIE{'name'}" MAXLENGTH="22" MODE=hiragana>$DISP_OMIT{'name'}<BR>
E-Mail<INPUT TYPE="TEXT" NAME="email" VALUE="$COOKIE{'email'}" SIZE=8 MAXLENGTH="55" MODE=alphabet>$DISP_OMIT{'email'}<BR>

題名<INPUT TYPE="TEXT" NAME="subject" VALUE="$COOKIE{'subject'}" SIZE=9 MAXLENGTH="22" MODE=hiragana>$DISP_OMIT{'subject'}<BR>

携帯<INPUT TYPE="TEXT" NAME="optE" VALUE="$COOKIE{'optE'}" SIZE=10 MAXLENGTH=40 MODE=numeric><BR>

URL <INPUT TYPE="TEXT" NAME="optA" VALUE="$COOKIE{'optA'}" SIZE=10 MAXLENGTH=80 istyle="3" MODE=alphabet><BR>

$mes_p2
本文$DISP_OMIT{'body'}<BR>
<TEXTAREA NAME="body" COLS="16" ROWS="12" wrap="on" MAXLENGTH="300" MODE=hiragana>$COOKIE{'body'}</TEXTAREA>
<BR>

*は必須入力<BR>

$my_moji_palette
<INPUT TYPE="SUBMIT" VALUE="投稿">
</FORM>

HTML_END
}
#
# EZweb用フォームメニュー (b10 new!)
sub form_ezweb_html{

	# 事前処理
	local($mes_p1,$mes_p2,$mes_p3,$mes_p4,$mes_p5);
	local($mes_p2) ="";
	local($mes_p3) ="";
	local($mes_p4) ="";

	&auto_omit_disp;
	$COOKIE{'body'} =~ s/<BR>/\n/g;	#<BR>をLFに
	$COOKIE{'optF'} =~ s/<BR>/\n/g;	#<BR>をLFに
	local($cm_out_img_h) ="";
	local($cm_out_img_f) ="";
	local($back_page) ="1";

	# icookieに本文を保存したくない人のために、オプションを追加
	if($PM{'no_body_in_icookie'} == 1){
		$COOKIE{'body'}="";
	}

	if($FORM{'parent'} ne ""){
		if($PM{'use_rep'} == 1 ){
		  $mes_p1 =qq|記事NO. $FORM{'parent'}に返信をします。|;
		  $back_page ="$FORM{'page'}";
		  $mes_p4 ="disp_rep_form";
		}
	}else{
		  $mes_p1 =qq|新規記事を投稿します。|;
	}

	if($cm_out_pw_h ne ""){
		$mes_p3 ="";
	}else{
		$mes_p3 =qq|&entrypass=$FORM{'entrypass'}|;
	}

	# 必須、省略の自動表示
        foreach(keys %DISP_OMIT){
	  if($DISP_OMIT{$_}=~ /\*/){
		$DISP_OMIT{$_} ="(必須)";
	  }else{
		$DISP_OMIT{$_} ="(省略可)";
	  }
        }


#以下の行から"HTML_END"のある行までは通常のＨＤＭＬとして編集可能です．
print<<HTML_END;
<DISPLAY NAME="index" TITLE="$PM{'title'}">
<ACTION type="accept" task="go" dest="#inname" label="次へ">
<ACTION type="soft1" task="prev" label="１つ前">
<ACTION type="soft2" task="go" dest="$cgi_name?t=$sec&bbsaction=errorjump" label="中止">
<CENTER>-メンバー確認OK-<BR>
<BR>
$mes_p1
各項目を入力してね。
</DISPLAY>

<ENTRY name="inname" key="name" default="$COOKIE{'name'}">
<ACTION type="accept" task="go" dest="#inemail" label="次へ">
<LINE>お名前$DISP_OMIT{'name'}
</ENTRY>

<ENTRY name="inemail" key="email" default="$COOKIE{'email'}">
<ACTION type="accept" task="go" dest="#inopta" label="次へ">
<ACTION type="soft2" task="prev" label="１つ前">
<LINE>E-Mail $DISP_OMIT{'email'}<BR>
</ENTRY>

<ENTRY name="inopta" key="optA" default="$COOKIE{'optA'}">
<ACTION type="accept" task="go" dest="#inopte" label="次へ">
<ACTION type="soft2" task="prev" label="１つ前">
<LINE>URL $DISP_OMIT{'optA'}
</ENTRY>

<ENTRY name="inopte" key="optE" default="$COOKIE{'optE'}">
<ACTION type="accept" task="go" dest="#insubject" label="次へ">
<ACTION type="soft2" task="prev" label="１つ前">
<LINE>携帯 $DISP_OMIT{'optE'}
</ENTRY>

<ENTRY name="insubject" key="subject" default="$COOKIE{'subject'}">
<ACTION type="accept" task="go" dest="#inbody" label="次へ">
<ACTION type="soft2" task="prev" label="１つ前">
<LINE>題名$DISP_OMIT{'subject'}
</ENTRY>

<ENTRY name="inbody" key="body" default="$COOKIE{'body'}">
<ACTION type="accept" task="go" dest="$cgi_name?t=$sec" label="投稿" method="post" postdata="name=\$name&email=\$email&subject=\$subject&body=\$body&optA=\$optA&optE=\$optE&bbsaction=post&prebbsaction=$mes_p4&memberID=$FORM{'memberID'}&rmkey=$FORM{'memberID'}&page=$back_page&blood=$FORM{'blood'}&parent=$FORM{'parent'}$mes_p3">
<ACTION type="soft2" task="prev" label="１つ前">
<LINE>本文:$DISP_OMIT{'body'}<BR>
</ENTRY>

</HDML>

HTML_END

exit; # 安全のため

}
#
#
#=====================================================#
#     <ＨＴＭＬ--USER定義01(お好きにカスタマイズ)>    #
#=====================================================#
#
#  カスタムメニュー(自由定義)用のＨＴＭＬです．
#
sub output_user_01_HTML{
print<<HTML_END;
<HTML>
<BODY BGCOLOR=PINK>
GOODMAN LIVE Info.<BR>
<CENTER>
(携帯ｱｸｾｽ)<BR>
<BR>
おすすめリンク<BR>
</CENTER>
$HR
(各種検索)<BR>
<a href="http://www.google.com/imode">Google_imode</a><BR>
<a href="http://www.google.com/jsky">Google_jsky</a><BR>
<a href="http://mobile.yahoo.co.jp/"> Yahooﾓﾊﾞｲﾙ </a><BR>
<a href="http://ohnew.co.jp/i/"> OH!NEW? </a><BR>
<a href="http://iseek.infoseek.co.jp/"> i-seek </a><BR>
<a href="http://www.mapion.co.jp/i/"> iﾏﾋﾟｵﾝ </a><BR>
<a href="http://machi.goo.ne.jp/"> まちgoo </a><BR>
<a href="http://www.taxis.gr.jp/i/"> TAXIS </a><BR>
(株式)<BR>
<a href="http://mobile.yahoo.co.jp/finance_home.html?k="> Yahoo株 </a><BR>
(ｺﾐｭﾆﾃｨ)<BR>
<a href="http://www.excite.co.jp/pda/deai"> ｴｷｻｲﾄ出会い </a><BR>
<a href="http://ip.tosp.co.jp/"> 魔法のiらんど </a><BR>
(ショッピング)<BR>
$HR
$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}&mode=disp_admin_menu" accesskey=0>戻る</a><BR>
$HR
</BODY>
</HTML>
HTML_END
}
#
#=====================================================#
#     <ＨＴＭＬ--USER定義02(お好きにカスタマイズ)>    #
#=====================================================#
#
#  カスタムメニュー(自由定義)用のＨＴＭＬです．
#
sub output_user_02_HTML{
print<<HTML_END;
<HTML>
<BODY BGCOLOR=PINK>
GOODMAN LIVE Info.<BR>
<CENTER>
(携帯ｱｸｾｽ)<BR>
<BR>
</CENTER>

ご自由にカスタマイズして、お使いください<BR>
*ユーザ定義デモ<BR>

$HR
<BR>

$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}&mode=disp_admin_menu" accesskey=0>戻る</a><BR>
$HR
</BODY>
</HTML>
HTML_END
}
#
#
#================================#
#     <ＨＴＭＬ--下部>           #
#================================#
#
#  フリーのCGIサイト等で掲示板下部へのテキスト広告を義務付けられている
#  場合は、ここにHTMLソースを書いてください。挿入ポイントは削除ボタン
#  の直上になります。(最初のお名前オークションの広告は消さないこと)
#  ページをめくっていくと広告が1,2,3・・順に出ます。なくなると先頭の
#  広告に戻りグルグル回ります。増やしても大丈夫ですので、広告の数を
#  増やしたい人は4,5.6とバナーを御自由に作って下さい。(ただし一つ目は
#  変更不可)
#
# バナー１つ目（変更不可）
$B_BANNER{'1'}=qq|
<A HREF="http://www.big.or.jp/~talk/welcome/welcome_imr7.cgi">[(広)NEW!.写ﾒUP対応imgboardR7はココ]</a>
|;

# バナー２つ目（変更不可）
$B_BANNER{'2'}=qq|
<A HREF="http://www.big.or.jp/~talk/welcome/welcome_kabu.cgi">[(広)特報-ﾘﾊﾞｳﾝﾄﾞ株！]</a>
|;
#
# バナー３つ目（自由に変更して結構です）
$B_BANNER{'3'}=qq|
<A HREF="http://www.big.or.jp/~talk/welcome/welcome_webalbum.cgi">[(広)WebALBUMβを無料配布中]</a>

|;
#
# バナー４つ目（自由に変更して結構です）
$B_BANNER{'4'}=qq|
<A HREF="http://www.big.or.jp/~talk/welcome/welcome_eggy.cgi">[(広)ドコモのMPEG4動画アップロード掲示板リリース！]</a>

|;
#
#------------ＨＴＭＬ抜粋ここまで------------#
# cfg_end



    #=================================================================#
    #     以上でユーザカスタマイズ部分である初期設定は終わりです.     #
    #     以下はプログラムになります．                                #
    #=================================================================#




#=======================================================================#
# メインルーチン
#=======================================================================#

&read_config;				# 記事から設定をロード

&init_valiables;			# 初期化

&check_open;				# 開店確認

&check_browser_type;			# ブラウザチェック

&read_input;				# フォームの内容とクッキーを読み込む

if($FORM{'bbsaction'} eq 'post'){		# モードが投稿モードの場合

	&check_entrypass;			# 会員チェック
	&protect_from_BBS_cracker;		# 荒し対策
	&read_cookie;				# クッキーを読込む
	&limit_upload_times;			# 連続投稿回数チェック
	&make_memberID;				# rmkey&iクッキー番作成
	&post_data;				# 投稿処理
	&set_cookies;				# クッキーをセット
	&send_mail;				# 管理者へメール	

						# パラメータクリア用ＨＴＭＬ
	if($memberID ne ""){
	  &jump_html(" 登録完了 <BR>あなたの常連番号は$memberIDです。メモしておいてください。 "," 次回記事入力時にこの番号を入れると、名前、メルアド等の入力が不要になり、入力が楽になります ");
	}elsif($memberID eq "9999"){
	  &jump_html(" 登録完了 <BR>");
	}else{
	  &jump_html(" 登録完了 <BR>");
	}
	exit;					# 終了

}elsif($FORM{'bbsaction'} eq 'remove'){	# モードが削除モードの場合

	if($PM{'admin_passwd'} eq "4256"){
	  &error(" エラー。管理パスワードがデフォルトのままであり、未設定です。セキュリティ対策のため、削除\機\能\は利用できません。管理パスワードを変更してください。 ");
	}

	if($FORM{'passwd'} eq $PM{'admin_passwd'}){
		$remove_mode="admin";		# 削除モード
		&remove_data;			# 削除処理
		&jump_html(" 削除完了 ");	# パラメータクリア用ＨＴＭＬ
		exit;				# 終了
	}elsif(($FORM{'passwd'} eq $PM{'guest_passwd'})&&($PM{'use_guest_passwd'} ==1)){
	        &error(" エラー。ゲストパスワード機能はiモードからは利用できません ");
		$remove_mode="guest";		# 削除モード
		&remove_data;			# 削除処理
		&jump_html(" 削除完了 ");	# パラメータクリア用ＨＴＭＬ
		exit;				# 終了
	}elsif($PM{'use_guest_passwd'} =='-1'){
		$remove_mode="rmkey";		# 削除モード
		&remove_data;			# 削除処理
                &jump_html(" 削除完了 ");       # パラメータクリア用ＨＴＭＬ
		exit;				# 終了
	}else{
		&error("パスワードが違います．削除を中止しました．");
	}

}elsif($FORM{'bbsaction'} eq 'change_config'){	# モードが設定変更モードの場合

	if($PM{'admin_passwd'} eq "4256"){
	  &error(" エラー。管理パスワードがデフォルトのままであり、未設定です。セキュリティ対策のためWebメニューによる設定変更できません。先に管理パスワードを変更してください。 ");
	}

	if($FORM{'passwd'} eq $PM{'admin_passwd'}){
		&change_config;			# 設定変更処理
		&jump_html(" 設定変更完了 ");	# パラメータクリア用ＨＴＭＬ
		exit;				# 終了
	}else{
		&error("パスワードが違います．設定変更を中止しました．");
	}
}elsif($FORM{'bbsaction'} eq 'pf_change'){# モードがプロファイル変更の場合
	&set_cookies;				# クッキーをセット
        &jump_html(" 変更完了 ");       	# パラメータクリア用ＨＴＭＬ
	exit;					# 終了

}elsif($FORM{'bbsaction'} eq 'page_change'){# モードがページ変更の場合
	&read_cookie;				# クッキーを読込む

}elsif($FORM{'bbsaction'} eq 'disp_form_only'){# フォームウィンド表示の場合
	&output_Content_type; 
	&top_html;
	&top_button_html;
	&output_form_html;			# 入力フォームを表示
	print "</BODY></HTML>\n";
	exit;
}elsif($FORM{'bbsaction'} eq 'output_meta_file'){# ストリーム再生テスト
	&output_meta_file_HTML("$FORM{'mRef'}","$FORM{'mMinf'}","$FORM{'mAuth'}","$FORM{'mCopy'}");
	exit;
}elsif($FORM{'bbsaction'} eq 'output_EZ_img'){# EZで画像埋め込みHDML
	&output_Content_type; 
	&output_EZ_img_HTML("$FORM{'mRef'}");
	exit;
}

# アクションが何も指定されていない時は、表示となる
# 各モードにより表示画面の種類を分岐させて表示させる

  if($FORM{'mode'} eq "disp_admin_menu"){
	# 管理メニュー表示
	&output_Content_type;
	&output_admin_menu_HTML;
	exit;
  }elsif($FORM{'mode'} eq "disp_input_menu"){
	# 入力フォームを表示
	&protect_from_BBS_cracker if($PM{'no_disp_for_cracker'}==1);	# 荒し対策
	&read_cookie;				# クッキーを読込む
	&check_entrypass;			# 会員チェック
	&output_Content_type; 
	&top_html;
	&output_form_html;	# 入力フォームを表示
	print "</BODY></HTML>\n";
	exit;
  }elsif($FORM{'mode'} eq "disp_member_check"){
	# メンバー確認フォームを表示
	&check_upload_from_pc; 
	&output_Content_type;
	&top_html;
	&output_member_check_HTML;
	exit;
  }elsif($FORM{'mode'} eq "disp_member_check_ez"){
	# あまりにルールが違うのでEZは別にした
	# メンバー確認フォームを表示
	&check_upload_from_pc; 
	&output_Content_type;
#	&top_html;
	&ez_output_member_check_HTML;
	exit;
  }elsif($FORM{'mode'} eq "change_set"){
	# 設定変更メニューを表示
	&output_Content_type;
	&output_change_set_HTML;
	exit;
  }elsif($FORM{'mode'} eq "change_set2"){
	# 設定変更メニューを表示
	&output_Content_type;
	&output_change_set2_HTML;
	exit;
  }elsif($FORM{'mode'} eq "change_set3"){
	# 設定変更メニューを表示
	&output_Content_type;
	&output_change_set3_HTML;
	exit;
  }elsif($FORM{'mode'} eq "change_set4"){
	# 設定変更メニューを表示
	&output_Content_type;
	&output_change_set4_HTML;
	exit;
  }elsif($FORM{'mode'} eq "search_menu"){
	# ワード検索メニュー表示
	&output_Content_type;
	&output_search_menu_HTML;
	if($FORM{'SearchWords'} ne ""){
	    &protect_from_BBS_cracker if($PM{'no_disp_for_cracker'}==1);# 荒し対策
    	    &output_html;			# 掲示板を表示
 	    exit;				# 終了
	}else{
		print " 検索ワードが何もありませんでした．入力してください \n";
	}
	&output_search_menu_HTML2;
	exit;
  }elsif($FORM{'mode'} eq "show_howto"){
	# 使い方を表示
	&output_Content_type;
	&output_show_howto_HTML;
	exit;
  }elsif($FORM{'mode'} eq "whats_imgboard"){
	# imgboardとは
	&output_Content_type;
	&output_whats_imgboard_HTML;
	exit;
  }elsif($FORM{'mode'} eq "user_01"){
	# 自由定義（お好きにカスタマイズしてください）
	&output_Content_type;
	&output_user_01_HTML;
	exit;
  }elsif($FORM{'mode'} eq "user_02"){
	# 自由定義（お好きにカスタマイズしてください）
	&output_Content_type;
	&output_user_02_HTML;
	exit;
  }elsif($FORM{'mode'} eq "check_env"){
	# 環境チェック（デバック用）
	&output_Content_type;
	&output_check_env_HTML;
	exit;
  }else{
    # モードが指定されてない場合,掲示板を表示
    &protect_from_BBS_cracker if($PM{'no_disp_for_cracker'}==1);	# 荒し対策
    &output_Content_type; 
    &top_html;
    &top_button_html;
    &output_html;						# 掲示板を表示
    exit;
  }

#=======================================================================#
# サブルーチン
#=======================================================================#

#======================#
# Content-typeの出力
#======================#
sub output_Content_type{

	if($keitai_flag eq "EZweb"){
		print "Content-type: text/x-hdml;charset=Shift_JIS\n\n";
	}elsif($keitai_flag eq "H"){
# 今回初めて取り組みましたが・・・H"推奨のオープンネットコンテンツ・・・
# この仕様は終わっています（涙）。
# こんなわかりにくい、グチャグチャの仕様ではＨＰ作る人誰もいないでしょう。
# H"は64Kアクセス+高速ハンドオーバを使っている人が多いですが、あくまで接続
# 媒体として普及しているだけであって、このオープンなんちゃら・・仕様でHP
# 作っている人はほぼ皆無（仕様公開から２年近く経っているのに・・）です。
# こういうダメな仕様は早く廃止してCHTMLにして欲しいものです・・・名前だけ
# は、イケてるんですが・・・中身がわかる人がいなかったんですね・・お粗末

		print "Content-type: text/plain\n\n";
		print "From: $PM{'cgi_link_url'}/$cgi_name\n";
		print "Subject: $PM{'title'}\n";
		print "Content-type: Text/X-PmailDX\n\n";

	}else{
		print "Content-type: text/html\n\n";
	}

}

#================#
# 初期化
#================#

sub init_valiables{

	# 記事データフォーマット
	@IM122R6DATA=('subject','name','email','date','body','img_location','imgtitle','seq_no','blood_name','rmkey','unq_id','permit','other');
	$ext_config_ver		="100";
	$script_end_flag	="99"; 
	$real_page_num		="1";	# 真のページ数
	$HTTP_USER_AGENT	=$ENV{'HTTP_USER_AGENT'};
	$HTTP_REFERER		=$ENV{'HTTP_REFERER'};
	$HTTP_REFERER 		=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	$form_method		="POST";
	$HR=qq|<HR>|;
	$ex_h=" 警告：β版の有効 ";

	undef $icookie_open_flag;	# グローバル変数
	undef $icookie_force_reload;	# グローバル変数
	$REMOTE_HOST		=$ENV{'REMOTE_HOST'};
	$SERVER_NAME		=$ENV{'SERVER_NAME'};


	if(int($])<5){
		&error(" 設定エラー。スクリプトの１行目でパスの指定されたPerlのバージョン $] は古すぎます。imgboard1.22R5以降ではjcode.plのバージョンの関係でPerl5以上が必要です。Perl5以上のパスを探してそれに変更するか、Perl4でも動くR5\(for Perl4\)とjcode_sj.plを特報倶楽部にて入手してください。 ");
	}

	&check_RH;		# Apache1.3.x対策
	&check_ISP;		# プロバイダをチェックして、アドバイスを出す
	eval "&check_script_end;";
	# ダウンロードミスによる尻切れスクリプトを検出

	$cgi_name=&get_script_name;
	#========= 以下はマイナーオプションです ( 0=no,1=yes)==========#

	# ゲストパスワード機能
	# 投稿者自身が記事を削除できる機能です。詳細はサポート掲示板を参照してください。
	#
	$PM{'use_guest_passwd'}	=0;		# ゲストパスワード機能を使用
	# （-1.削除キー方式にする,0.使用しない、1.ゲストパスワードを使用する）
	$PM{'guest_passwd'}		='guest';	# 記事削除時の ゲストパスワード(変更してください)
	# IPが完全一致しなくても、同じサブネットからのアクセスは同一人物とみなし、削除を許可する
	$PM{'gp_allow_subnet'}	=1;

	# その他
	$PM{'no_disp_RH_in_HTML_sorce'}=1;	# HTMLソースにリモホを表示しない
	$PM{'no_disp_for_cracker'}=0;		# BlackList者に掲示板を見せない
	$PM{'force_www_server_os_to'}='';		# 未使用パラメータ(指定しないこと) 

	# 外部の設定ファイルのロード(1.21以降)
	# カスタマイズしたHTMLや設定したパラメータ等を外部からロードします。
	# バージョンアップによる引越しやカスタマイズが楽になります。

	# なお、開発元でimgboardの設定やHTMLをアレンジをした外部設定ファイルの
	# 配布も予定していますので、改造が面倒・・・という方は、これをご利用して
	# 頂くと手間が省けて良いでしょう。
	# （一例）メルアド省略＆URL項目付きVerに変更できる外部設定ファイル

	$PM{'load_ext_config'}	=0;		# 外部設定ファイルを使う(1=yes,0=no)
	$PM{'ext_config_name'}	="set_imode01.cgi";	# 設定ファイル名（拡張子は必ず cgiに）

	# 外部設定ファイルに書いたパラメータは上書きされます。

#------------------ 以下はプログラム -----------------------------	
	undef $call_from_imgboard_flag;
	$call_from_imgboard_flag=1;

	require "$imgsize_prog" if(-e "$imgsize_prog");

	if(($PM{'load_ext_config'} == 1)&&(-e "$PM{'ext_config_name'}")){
		require "$PM{'ext_config_name'}";
	}

	if(($PM{'jcode_name'} ne '')&&(-e "$PM{'jcode_name'}")){
	    require "$PM{'jcode_name'}";
	}else{
	    &error(" CGI設定エラー検出！<BR>日本語ライブラリ$PM{'jcode_name'}が指定された場所に見つかりませんでした。パスの設定を見直して下さい ");
	}
	$ex_tail=" 期限が切れました。掲示板下部のリンクをたどり、正式版のimodeアクセスを入手してください ";
	if($script_end_flag == '99'){
	    &error(" CGI設定エラー スクリプトの尻切れを検出！<BR>imgboardは、スクリプト末尾を見つけることが
			できませんでした。ダウンロード、ＦＴＰアップロード時の時間切れ等により、スクリプトの後半が
			尻切れ状態になっている恐れがあります。スクリプトのサイズを再確認し,問題があれば、やり直してみてください ");
	}
}

#================#
# 開店確認
#================#

sub check_open{

    if($PM{'bbs_open'} ==0){
	&error("$PM{'oyasumi_message'}");
    }

}

#=====================#
# 入力データを読む
#=====================#
# 2000.12
# 携帯専用をベースにJ-PHONEから画像アップロードに対応させたもの
# PC/Macからのアップロード関連のコードは削除してあります。
#
sub read_input{

	# ■変数の初期化
	local($name);
	undef $img_data_exists;
	undef @NEWFNAMES;
	undef $jcode_eval_check_flag;

	# ■データの取得＆転送データのサイズをチェック
   	$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
	if($PM{'max_upload_size'} > 300){$PM{'max_upload_size'}='300';}# 変更禁止
	$max_content_length	=($PM{'max_upload_size'} + 1)*1000;
	$max_content_limit	="$PM{'max_upload_size'}";

	if($ENV{'REQUEST_METHOD'} eq "POST"){

		# OSの種別を判別
		$www_server_os =&check_www_server_os;

		if($www_server_os=~ /win/i){
			binmode(STDIN);
		}

		if($ENV{'CONTENT_LENGTH'} > 1000000){
			&error(" データ容量が大きすぎます。$max_content_limit KB以下にしてください。ecode=pre ");
			exit;
		}

		# 2000/02/02 変更
		read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

		if($ENV{'CONTENT_LENGTH'} > $max_content_length){
			&error(" データ容量が大きすぎます。$max_content_limit KB以下にしてください。ecode=after ");
			exit;
		}

	}elsif($ENV{'REQUEST_METHOD'} eq 'GET'){
		$buffer = $ENV{'QUERY_STRING'};
	}else{
		return 0; 
	}

	# ■ファイル名に使う、日付関連のパラメータを作る

	# パラメータをチェック
	if(($PM{'gisa'}=~ /^(\d+)$/)&&($PM{'gisa'} != 0)){
		$PM{'gisa'}=$PM{'gisa'};
	}else{
		$PM{'gisa'}=0;
	}

	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = localtime(time + $PM{'gisa'}*60*60);

	$year += 1900;				# 2000年対策

	$month = $mon + 1;
	if ($month < 10) { $month = "0$month"; }
	if ($mday  < 10) { $mday  = "0$mday";  }
	if ($sec   < 10) { $sec =  "0$sec";    }
	if ($min   < 10) { $min =  "0$min";    }
	if ($hour  < 10) { $hour = "0$hour";   }
	if ($yday  < 400){ $yyday= 385+"$yday";}
	$tday="$year"*365+"$yday";
	$unq_id="$year"."$month"."$mday"."$hour"."$min"."$sec";

	# -----準備完了-------------------------------------------------------

	# ■以下フォームのデコード処理


	# ■マルチパートじゃない時のフォーム処理
	# (通常はこれです)

	if($ENV{'CONTENT_TYPE'} !~ /multipart\/form-data/){

	   @pairs = split(/&/,$buffer);

	   foreach $pair(@pairs){
	     ($name,$value) = split(/=/,$pair);
	     $value =~ tr/+/ /;
	     $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/ego;
	     # sjisに変換 (imgboard1.22 Rev.3)
	     # jcode_sj.pl関連の設定ミスをトラップして検出
	     # (一度成功すればスキップして高速化)
	     if($jcode_eval_check_flag != '1'){
	       eval "&jcode'convert(*value, 'sjis','sjis','z');";
	       if($@ eq ""){
	 	 $jcode_eval_check_flag=1;
		 # 成功
	       }else{
		 # 失敗
		 #&error(" CGI設定エラー 何らかの理由で日本語ライブラリ「 $PM{'jcode_name'} 」の読み込みに失敗しました。<BR> jcode_sj.pl等の名前が正しく指定されていないか、あるいは指定パス「 $PM{'jcode_name'} 」に該当ファイルが存在しないか、あるいはパーミッションが正しくないものと思われます ");
	       }
	     }else{
		&jcode'convert(*value, 'sjis','sjis','z');
	     }

	     $FORM{$name} = $value;
    	   }# end of foreach

	}else{
	# ■マルチパート時のフォーム処理
	# (J-PHONEのパケット機、ドコモのiショットサービス機以降)

#	  &error(" $cgi_name はimode専用であり、これ経由での画像データのアップロードはできません。画像アップロード機能を使うためにはパソコンでアクセスし、<a href=\"$PM{'cgi_hontai_name'}\">imgboard.cgi</a>本体にアクセスしてアップしてください ");

	  # □セキュリティチェック	
	  # □METHODのチェック	
	  &error(" multipart\/form-dataを使うときは METHODをPOSTにしてください。 ") if($ENV{'REQUEST_METHOD'} ne "POST");


	  # □携帯以外の画像投稿をリジェクトする
	  if(($keitai_flag eq "imode")&&($KEITAI_ENV{'MACHINE_TYPE'} eq "eggy")){
		# eggy 対応
	  }elsif($keitai_flag eq "J-PHONE"){
		if($jstation_flag >= 4){
		  # J-SKYパケット機 対応
		}else{
		  &error(" J-PHONEで、画像を直接ｱｯﾌﾟﾛｰﾄﾞできるのは、51ｼﾘｰｽﾞ以降のパケット対応機です。それより古い機\種ではｱｯﾌﾟﾛｰﾄﾞできません ");
		}
	  }elsif($keitai_flag ne "J-PHONE"){
		&error(" この携帯からは、画像をアップロードを受け付けません。 ");
	  }

	  # □multipart/form-dataの場合の処理開始
	  $buffer =~ /^(.+)\r\n/;
	  $boundary = $1;
	  @pairs = split(/$boundary/, $buffer);

	  foreach $pair(@pairs){
		$check_count++;
		$pair=~ s/\r\n$/\r\nD_End/;
		@vars = split(/\r\n/, $pair);
		$vars = @vars;

	  	#---サポート用----#
		if(($check_count=='7')&&($FORM{'email'} eq "mt1")){&error(" デバックモードall-$vars,vars0- $vars[0]<BR>,1-$vars[1]<BR>\n,2-$vars[2]<BR>\n,3-$vars[3]<BR>\n,4-$vars[4]<BR>\n,5-$vars[5]<BR>\n,6-$vars[6]\n<BR>,7-$vars[7]\n.<BR>,Perl ver $] <BR>@vars test ");}
		#-----------------#

		# □アップロードファイルがついている場合

		if(($vars > 4)&&($vars[1] =~ /name\=\"(.+)\"\;\sfilename\=\"(.+)\"/)){

		  $name  = $1;
		  $fname = $2;
		  $content_type = $vars[2];
		  $full_fname = $fname;		# R7 NEW

		  # --- サポート用 2 ----#
		  if($FORM{'email'} eq "mt2"){&error("デバックモードall-$vars,name $name fname $fname content_type $content_type ");}
		  #-----------------#

        	  # マイムタイプにより、データを判別し、拡張子を生成する

	       	  # マイムタイプが不明な場合
		  if(($fname ne "")&&($content_type eq "")){

# 以下のケースが想定される．
# ケース１）J-PHONEの実装がいい加減で、マイムデータがそもそもない
# ケース２）J-PHONEのユーザが知らないもらったデータをアップロード

# この場合はデータのヘッダ部分のテキスト解析からの自動判別を試みる（Gif,JPEG）．
# 失敗したら拡張子が存在するかどうかをチェック
# 存在したら後の拡張子による判断に任せる．
# 存在しない場合警告を出し終了．

			# データヘッダから画像の種類を自動判別
			if($vars[3] =~ /^GIF8/i){
				$check_m .=" ヘッダー分析の結果４はGIF <BR>";
				$content_type="image/gif";
			}elsif($vars[3] =~ /^(.+)JFIF/i){
				$check_m .=" ヘッダー分析の結果４はJPEG <BR>";
				$content_type="image/jpeg";
			}elsif($vars[3] =~ /^\x89PNG/i){
				$check_m .=" ヘッダー分析の結果４はPNG <BR>";
				$content_type="image/png";
			# 拡張子らしき物がついている場合
			}elsif($fname=~ /\.(\w){1,4}$/){
				$content_type="unknown";#後の拡張子による判断に任せる
			}else{
				&error(" アップロードエラー。アップロードデータの属性が判断できません。<BR>\nファイル名に拡張子(.png.jpeg.ppt等)が<BR>\nついてない可\能\性があります。<BR>\nファイル名に適切な拡張子をつけてください。<BR><!--fname,$fname,Mime_types,$content_type,Mes.$check_m-->");
			}

			# マイムタイプより、拡張子を作る
			$ext = &content_type_check($content_type);

			# 画像データのみを抽出
			# ($vars[3]に実体,4=D_End $vars 5)
			foreach($i=3; $i<$vars;$i++){
				if($data eq ''){
					$data = $vars[$i];
				}else{
					$data .= "\r\n$vars[$i]";
				}
			}
			$data=~ s/\r\nD_End$//;

		  # マイムデータが通知された場合
		  }else{

			# マイムタイプより、拡張子を作る
			# 基本方針はセキュリティ重視からマイムタイプ優先
			$ext = &content_type_check("$content_type");

			# 画像データのみを抽出
                        #($vars[4]に実体,5=D_End,$vars 6)
			foreach($i=4; $i<$vars; $i++){
				if($data eq ''){
					$data = $vars[$i];
				}else{
					$data .= "\r\n$vars[$i]";
				}
			}
			$data=~ s/\r\nD_End$//;
                  }

		  # マイムタイプによる拡張子生成終了

		  # ここよりファイル書き出し処理になる

		  # 設定ミスをチェックする
		  $PM{'img_dir'} = '.' if($PM{'img_dir'} eq '');

		  if($PM{'img_dir'}=~ /^http\:\/\//i){
			&error(" img_dirの指定が間違えています。<BR> ディレクトリとＵＲＬは別の概念です。ディレクトリ指定が、httpで始まることはありません。<BR> 設定を変更してください。");
		  }

		  # 画像保存ディレクトリの確認
		  if(-d "$PM{'img_dir'}"){
		  }else{
			&error(" 画像データ保存用ディレクトリ\"$PM{'img_dir'}\"が見つかりません．<BR>指定ディレクトリ\"$PM{'img_dir'}\"が存在しない可\能\性があります<BR>画像保存用ディレクトリのパス設定をご確認ください．");
		  }

		  # ファイル名を決める
		  # パス名を消して、ファイル名のみを残す。
		  #95/NTからのアップロードに対応
		  $fname=~ s/^(.*)\\//;
		  # UNIX からのアップロードに対応
		  $fname=~ s/^(.*)\///;

		  #&error("ファイル名 $fname");

		  $use_orig_name=0;		# オリジナルファイル名保存機能削除
						# 今後は e_FTPboardでのみサポート
		  if($use_orig_name==1){				
		  #	&use_orig_name;
		  }else{
		  # 時刻でファイル名を付けるオプション。
		  # ファイル名のコンフリクトを防ぐ

			$date_count="19981204201523";
			$date_count="$year"."$month"."$mday"."$hour"."$min"."$sec";

			# ファイル名が重なる場合変更する
			if( -e "$PM{'img_dir'}/img$date_count\.$ext"){
				$date_count++;
			}elsif( -e "$PM{'img_dir'}/img$date_count\.$ext"){
				$date_count++;
			}elsif( -e "$PM{'img_dir'}/img$date_count\.$ext"){
				&error(" ファイル名決定処理中にエラーが発生しました。時刻ベースmode ");
			}

			$new_fname = "img$date_count\.$ext";
		  }

		  # 複数ファイルアップロード対応用
		  push(@NEWFNAMES, $new_fname);

		  open(OUT, ">$PM{'img_dir'}/$new_fname")|| &error(" 画像データを$PM{'img_dir'}に保存中にエラーが起きました．<BR>指定ディレクトリ\"$PM{'img_dir'}\"に書込み許可がない可\能\性があります.<BR>ディレクトリのパーミション設定を確認してみてください．");
		  # IIS,PWS(NT/95)対策
		  if($www_server_os=~ /win/i){
			binmode(OUT);
		  }
		  eval "flock(OUT,2);" if($PM{'flock'} == 1 );
		  print OUT $data;
		  eval "flock(OUT,8);" if($PM{'flock'} == 1 );
		  close(OUT);

		  # テンポラリアップロードデータの存在確認フラグ
		  # 後処理で,登録中断エラー発生時に画像ファイルを削除するために使用。
		  # 削除はsub errorルーチン内で行う。
		  $img_data_exists=1;
	
		# □アップロードファイル以外のフォームの処理
		}elsif(($vars > 3) && ($vars[1] =~ /name\=\"(\S+)\"/)){

		  $name =$1;
		  $value = "$vars[3]";

		  # テキストエリアに関する処理
		  if($vars > 5){
			$value .= "\r\n";
			foreach($i=4; $i<$vars; $i++){
				$value .= "$vars[$i]\r\n";
			}
			$value=~ s/\r\nD_End\r\n$//;
			$value=~ s/D_End//g;
			#$value=~ s/\r/CR/g;
			#$value=~ s/\n/LF/g;
		  }

		  # sjisに変換 (imgboard1.22 Rev.3)
		  # jcode_sj.pl関連の設定ミスをトラップして検出
		  # (一度成功すればスキップして高速化)
		  if($jcode_eval_check_flag != '1'){
			eval "&jcode'convert(*value, 'sjis','sjis','z');";
			if($@ eq ""){
			    $jcode_eval_check_flag=1;
		 	    # 成功
			}else{
		 	    # 失敗
				&error(" CGI設定エラー 何らかの理由で日本語ライブラリ「 $jcode_name 」の読み込みに失敗しました。<BR> jcode_sj.pl等の名前が正しく指定されていないか、あるいは指定パス「 $jcode_name 」に該当ファイルが存在しないか、あるいはパーミッションが正しくないものと思われます ");
			}
		  }else{
			&jcode'convert(*value, 'sjis','sjis','z');
		  }
		  $FORM{$name} = $value;		# valueを返す

		}# □vars選択の終わり

	  }# foreach $pair(@pairs)の終わり

	}# マルチパート/非マルチパートの選択文の終わり

	# WindowsCE対策の属性名変更による外部設定ファイルの互換性
	# の問題をカバーする
	$FORM{'bbsaction'}	= "$FORM{'action'}" if($FORM{'action'} ne "");
	$FORM{'pre_bbsaction'}	= "$FORM{'pre_action'}" if($FORM{'pre_action'} ne "");
	$FORM{'prebbsaction'}	= "$FORM{'pre_bbsaction'}" if($FORM{'pre_bbsaction'} ne "");

	# J-PhoneでTEXTAREAを使うと、改行が混ざる可能性がある。それを防ぐ
	$FORM{'img'}=~ s/\n//g;
	$FORM{'img'}=~ s/\r//g;

#	&download_from_web("$FORM{'img'}");

}
#
#=========================#
# 記事データの追加 (R6)
# 2000.11 (スレッド対応型)
#=========================#

sub post_data{

	undef @NEW_MESSAGE;
	local($old_seq_no,$new_seq_no,$mes_counter);
	local($img_data_size_num);

	# ●セキュリティチェック
	#
	# GETに投稿を受け付けない。(ただしJSKYのみ可能)
	# あと$PM{'no_upload_from_pc'} ==1の場合はPCから投稿させない。
 	&check_form_method(" セキュリティ警告 "," GETによる記事投稿は受け付けません ");

	if($PM{'bbs_open'} == 2){
		&error(" 管理人の設定により、掲示板は書き込みお休み中(ReadOnly)となっております。記事の投稿はできません。 ");
	}elsif($PM{'bbs_open'} < 3){
		&error(" 管理人の設定により、掲示板は書き込みお休み中となっております。記事の投稿はできません。 ");
	}

	# ●フォームの内容をチェック
	&form_check;

	# フォームチェックで問題があれば終了する
	if($error_message ne ''){
		&rm_tmp_uploaded_files;
		&set_cookies;		# クッキーをセット(120Rev5以降)
		&error($error_message);
		exit;
	}

	# ●各種チェック終了、ここより各種変数の準備

	# 記事の日付表示（変更可能)
	$date_data = "\[$year/$month/$mday,$hour:$min:$sec\]";

	# 画像タイトル名作成
        if(($img_location ne '')&&($imgtitle eq '')){
	# タイトルがない場合はファイル名がタイトル
		$imgtitle="$img_location";
	}

	# 投稿画像の容量を計算
	if($img_location ne ''){
		$content_length="$ENV{'CONTENT_LENGTH'}";
		$content_length="$content_length"-800;
		$content_length_kb=int($content_length/1024);

		# R7 new Webでゲットしたファイルにサイズに差換え
		if($web_get_file_size > 0){
			$content_length_kb=int($web_get_file_size/1024);
		}

		if(("$content_length" > 0)&&("$content_length_kb"==0)){
	        	$img_data_size=1;
		}else{
        		$img_data_size="$content_length_kb";
		}
		$img_data_size_num="$img_data_size";
		$img_data_size="($img_data_size KB)";
	}
		# imgsizeのバージョンをチェック
	if($imgsize_lib_flag ==1){
		unless($imgsize_version >=20000509){
			&error(" 管理者設定のエラー。処理を中止しました。<BR>
			imgsize.plのバージョン $imgsize_version は古過ぎます。最新版をご利用ください。");
		}
	}

	# 投稿画像のプロパティを取得
	&check_uploaded_img_property;

	sub check_uploaded_img_property{
	  if((-e "$img_location")&&($imgsize_lib_flag== 1 )){	
		&imgsize("$img_location");
		if(($IMGSIZE{'result'} ==1)&&($img_data_exists==1)){
		#	$IMGSIZE{'name'}で渡す;
		}else{
			undef %IMGSIZE;
		}
	  }
	}

	# セパレータとして問題あるものを、事前に置換
	$subject=&Enc_EQ("$subject");

	undef $tmp_data;

	foreach $p_key(keys %FORM){
		if($p_key=~ /^opt(.+)$/){
			$tmp_data=&Enc_EQ($FORM{$p_key});
			$opt_data.="opt_data_"."$1"."\="."$tmp_data"."\;";
			undef $tmp_data;
		}
	}

	# 準備完了

	# ●メッセージを読み込む

	$comment_force_reload =1; # 慎重にするため、強制で読む
	undef @MESSAGE;	
	&read_file_data("$PM{'file'}");
	 # $HEAD_MESSAGE{'name'}にパラメータが入る
	 # $REM_HEAD_MESSAGE{'name'}にコメントアウトパラメータが入る
	 # @MESSAGEに記事ログが入る

	$old_seq_no=$HEAD_MESSAGE{'seq_no'};	


	# $all_message に記事数を入れる
	$all_message=@MESSAGE;


	# 連番処理
	if($old_seq_no eq ""){# ない場合は作る
		$old_seq_no='0';
	}
	$new_seq_no=$old_seq_no+1;

        # 暗号化
	if(($PM{'use_crypt'} == 1)&&($rmkey ne "no_key")&&($rmkey ne "")){
		$rmkey		= &make_pass("$rmkey");
	}

	# SNLとして存在するデータのリストを作る
	foreach (@SNL_MADE_DATA){
#		$existing_snl_type_list.="$_"."\/";
	}

	# 輸入URLでタブと;をエスケープ
	$img_import_url=~ s/\t//g;
	$img_import_url=~ s/\;//g;
	$img_import_url=~ s/\s+$//g;

	# ●新しいメッセージを作る（imgboard1.22R6.1新形式）
	$new_message = "$subject\t$name\t$email\t$date_data\t$body<\!--opt\:$opt_data-->\t$img_location\t$imgtitle<\!--dsize=$img_data_size;type=$IMGSIZE{'type'};width=$IMGSIZE{'width'};height=$IMGSIZE{'height'};hw_racio=$IMGSIZE{'hw_racio'};size=$img_data_size_num;-->\t$new_seq_no\t$FORM{'blood'}\t$rmkey\t$unq_id\t$permit\t$other";

	undef %IMGSIZE;

	# レスの付いた記事を上へ持って行くために、親スレッドリストへ追加する
	&update_bloods_list;

	# 記事データを追加する
	if($FORM{'parent'} eq ""){
	# 親記事の場合
		unshift(@MESSAGE, $new_message);
		$all_message++;	# 記事数は一つ増
	}else{
	# 子記事の場合
		# 記事データを探索する

		$mes_counter=1;
		$last_child_number=0;

		foreach(@MESSAGE){
			if($_ =~ /$FORM{'blood'}/){
				$last_child_number=$mes_counter;
			}
			$mes_counter++;
		}

		# 記事データを追加する
		$mes_counter=1;

		foreach(@MESSAGE){
			push(@NEW_MESSAGE, $_);
			if($mes_counter==$last_child_number){
				push(@NEW_MESSAGE, $new_message);
				$all_message++;	# 記事数は一つ増
			}
			$mes_counter++;
		}
		@MESSAGE=@NEW_MESSAGE;

	}

	# 一番古い記事に関連した画像を削除しておく

	if($all_message > $PM{'max_message'}){
		for($i=$PM{'max_message'}; $i<$all_message; $i++){
			if($MESSAGE[$i] =~ /^([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]*)\t([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)/){

				$remove_file = $6;
				local($remove_imgtitle) 	= $7;
				local($tmp_unq_id)  		= $11;

				if($remove_file ne '' && -e $remove_file){
					unlink($remove_file);
					# メタファイルも削除する
					&rm_meta_file("$remove_file");

					# 携帯用ファイルも削除する
					if($remove_file=~ /\.(jpe?g|gif|png|bmp|mng)$/i){
					  # SNLのパスを調べる
					  if($remove_imgtitle ne ''){
					    &parse_img_param($remove_imgtitle);
					  }
					  &rm_snl_file("$tmp_unq_id","$IMG_PARAMETERS{'snl_dir'}","$IMG_PARAMETERS{'exist_snl_type'}");
					}

				}
			}

		}
	}

	# ●新しいファイルとして出力

	# 出力記事数を決める
	if($all_message > $PM{'max_message'}){
		$repost_message = $PM{'max_message'};
	}else{
		$repost_message = $all_message;
	}

	# 書き出し前にバッファに入れる
	undef @TMP_MESSAGE;
	$HEAD_MESSAGE{'seq_no'}=$new_seq_no;

	for($i=0; $i<$repost_message; $i++){
		$TMP_MESSAGE[$i]="$MESSAGE[$i]";
	}

	# 書き出し処理
	 # 以下の内容を出力する
	 # $HEAD_MESSAGE{'name'}
	 # $REM_HEAD_MESSAGE{'name'}
	 # @TMP_MESSAGE

	if($PM{'make_backup_file'}== 1 ){
 	 &make_backup_file; # バックアップファイル自動作成
	}

	&write_file_data("$PM{'file'}");
}
#
#
# 最近の記事とその血統(スレッド)を記憶するサブサブルーチン
# imgboardR6のログにおいては、最新の５記事分の記事ＩＤと
# 親の血統(スレッド)をパラメータとして覚えておくことにする。
#
sub update_bloods_list{

	local ($b_new_list);

#	return if($HEAD_MESSAGE{'last_bloods'} eq "");
	$HEAD_MESSAGE{'last_bloods'} =	&Enc_EQ("$HEAD_MESSAGE{'last_bloods'}");

	# 親記事追加の場合,親ー親で追加する
	if($FORM{'parent'} eq ""){	
		  return if($unq_id eq "");
		  $b_new_list="$unq_id-$unq_id"."\,"."$HEAD_MESSAGE{'last_bloods'}";
	}else{ 			
	# 子記事の場合、子ー親で追加する
	  return if($unq_id eq "");
	  return if($FORM{'blood'} eq "");
	  $b_new_list="$unq_id-$FORM{'blood'}"."\,"."$HEAD_MESSAGE{'last_bloods'}";
	}

	# ５つ以上になれば、６つ目以降は捨てる
	if($b_new_list=~ /^(\,*)([\d|\-]*)\,([\d|\-]*)\,([\d|\-]*)\,([\d|\-]*)\,([\d|\-]*)(.*)/){
		$b_new_list="$2"."\,"."$3"."\,"."$4"."\,"."$5"."\,"."$6"."\,";
	}

	$HEAD_MESSAGE{'last_bloods'}=$b_new_list;	
}
# 最近の記事とその血統(スレッド)を記憶するリストを使い
# 最新のスレッドUIDを出す
#
sub load_latest_bloods_list{

	local (@LATEST_THREAD);
	local (@SEP_BLOODS);
	local ($child,$my_parent);
	local ($already_parent_exist_flag);

	return if($HEAD_MESSAGE{'last_bloods'} eq "");

	@SEP_BLOODS=split(/\,/,$HEAD_MESSAGE{'last_bloods'});# 一度分解する

	# 最新のスレッドのリストを作る
	for($numb=0;$numb < scalar(@SEP_BLOODS) ;$numb++){
		($child,$my_parent)=split(/\-/,$SEP_BLOODS{$numb});# 分解する
		$already_parent_exist_flag = 0;
		foreach(@LATEST_THREAD){
		    if($_ eq "$my_parent"){
			$already_parent_exist_flag = 1;
		    }
		}
                # リストにない場合のみ追加する 
		if($already_parent_exist_flag == 0){
		  push(@LATEST_THREAD,$my_parent);
	        }
	}

	return(@LATEST_THREAD);
}
#
#=============================#
# ファイルから記事データを読み
#=============================#
# 引数はファイル名
# 
# 中で呼ばれるsub open_comment_fileにより
# 1.@main に全ラインデータが入る
# 2.$comment_open_flagが1になる
# 強制リロードは$comment_force_reloadを1にする
# $HEAD_MESSAGE{'name'}にヘッダデータ
# $REM_HEAD_MESSAGE{'name'}にコメントアウトされたヘッダデータ
# @MESSAGEに記事データが入る

sub read_file_data{
 
	local($tmp_ffile) = @_;	# 引数はファイル名
	local($tmp_mes_line);


	# データ読込み（高速化のための@main再読み込みスキップ付き）
	# @mainにファイルの内容を格納
	if(($comment_open_flag !=1)||($comment_force_reload ==1)){
		&open_comment_file("$tmp_ffile");
	}

	# 出力変数群をリフレッシュする
	undef %HEAD_MESSAGE;
	undef %REM_HEAD_MESSAGE;
	undef @MESSAGE;

	foreach(@main){

		# HEADER保存 (将来への拡張もここで対応)
		# R6形式で今使っているのはこれだけ
		if($_ =~ /^\,param_seq_no(\s*)=(\s*)(\w+)(\s*)/i){
			$HEAD_MESSAGE{'seq_no'}=$3;
		}
		if($_ =~ /^\#?\,param_/i){
			# R6形式で今使っているのはseq_noだけ
			# R6形式があればそれを優先。なければR6.1で読む
			# 将来はR6.1にすべて移行できるようにしておく
			if($_ =~ /^\,param_seq_no(\s*)=(\s*)(\w+)(\s*)/i){
				if($HEAD_MESSAGE{'seq_no'} eq ""){
					$HEAD_MESSAGE{'seq_no'}=$3;
				}
			# 今後はR6.1形式に変更(=の横から;までがパラメータ)
			}elsif($_ =~ /^\,param_(\w+)(\s*)=(.*)\;/i){
				$HEAD_MESSAGE{$1}=$3;
				$HEAD_MESSAGE{$1}=&Dec_EQ("$HEAD_MESSAGE{$1}");
			}elsif($_ =~ /^\#\,param_(\w+)(\s*)=(.*)\;/i){
				# (#でコメントアウトしたものを含む)
				$REM_HEAD_MESSAGE{$1}=$3;
				$REM_HEAD_MESSAGE{$1}=&Dec_EQ("$REM_HEAD_MESSAGE{$1}");
			}else{
#				&error(" デバック 未定義パラメータ発見 $_ ");
			}

		}

		# 記事をバッファ@MESSAGEに入れる
		if($_ =~ /^([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t/){
			$tmp_mes_line="$_";
			chop($tmp_mes_line);
			push(@MESSAGE, $tmp_mes_line);
		}
	}
}

#=========================#
# 記事ファイルを開く
#=========================#
# 指定ファイルを読み、@main バッファに格納する。
# @main に全ラインデータが入る
# $comment_open_flagが1になる
# 強制リロードは$comment_force_reloadを1にする

sub open_comment_file{

#Debug
$read_file_counter++;

	local($local_file) = @_;	# 引数はファイル名
	undef @main;
	open(IN, "$local_file")|| &error(" 設定エラー．データ保存用ファイル\"$local_file\"が見つかりません．処理は中断されました．");
	eval "flock(IN,1);" if($PM{'flock'} == 1 );
		@main = <IN>;
	eval "flock(IN,8);" if($PM{'flock'} == 1 );
	close(IN);

	$comment_open_flag	='1';
	$comment_force_reload	='0';
}

#============================#
# ファイルに記事データを書く
#============================#
# 引数はファイル名
# $HEAD_MESSAGE{'name'}
# $REM_HEAD_MESSAGE{'name'}
# @TMP_MESSAGE（改行なし）に
# 記事データを入れて渡すこと
sub write_file_data{
 
	local($tmp_ffile) = @_;	# 引数はファイル名

	# 書き出し処理
	open(OUT, "> $tmp_ffile")|| &check_file_open_error;

	eval "flock(OUT,2);" if($PM{'flock'} == 1 );


		# ヘッダパラメータを出力(R6形式)
		foreach $p_key(keys %HEAD_MESSAGE){
		  	if($p_key eq "seq_no"){
	 		  # seq_noだけ互換性のためにR6形式で出す
			  print OUT "\,param_seq_no=$HEAD_MESSAGE{'seq_no'}\n";
			}
		}
		# ヘッダパラメータを出力(R6.1形式)
		foreach $p_key(keys %HEAD_MESSAGE){
	 		  # seq_no以外はR6.1形式で出す
			  $file_line=&Enc_EQ($HEAD_MESSAGE{$p_key});
			  $file_line=~ s/\n//g;
			  $file_line=~ s/\r//g;
			  $file_line="\,param_"."$p_key"."\="."$file_line";
			  print OUT "$file_line\;\n";
			  undef $file_line;
		}

		# コメントアウトされたヘッダパラメータを出力(R6.1形式)
		foreach $p_key(keys %REM_HEAD_MESSAGE){
			$file_line=&Enc_EQ($REM_HEAD_MESSAGE{$p_key});
			$file_line=~ s/\n//g;
			$file_line=~ s/\r//g;
			$file_line="\#\,param_"."$p_key"."\="."$file_line";
			print OUT "$file_line\;\n";
			undef $file_line;
		}

		# 記事部分を出力
		foreach $file_line(@TMP_MESSAGE){
		    if($file_line eq ""){
			next;
		    }
		    $file_line=~ s/\n//g;
		    $file_line=~ s/\r//g;
		    print OUT "$file_line\n";
		}
	eval "flock(OUT,8);" if($PM{'flock'} == 1 );
	close(OUT);

	# データ消失を防ぐ
	$comment_force_reload=1;
}

sub check_file_open_error{
  unless(-e "$tmp_ffile"){
	&error(" 設定エラー．データ用保存ファイル\"$tmp_ffile\"にデータを書込むことができませんでした．<BR>\"$PM{'file'}\"という名前のファイルが正しい位置に見つからないためです。パスの設定を再確認してみてください。投稿処理は中断されました．");
  }
  unless(-w "$tmp_ffile"){
	&error(" 設定エラー．データ用保存ファイル\"$tmp_ffile\"にデータを書込むことができませんでした．<BR>$PM{'file'}に対する書込み許可がないためだと思われます．パーミションの設定を再確認してみてください。投稿処理は中断されました．");
  }
  &error(" 設定エラー．データ用保存ファイル\"$tmp_ffile\"にデータを書込むことができませんでした．<BR>設定を再確認してみてください。投稿処理は中断されました．");
}

#================================#
#  記事データの削除 (メイン部)
#================================#
# R6Ver(親子スレッド対応型)
# 2000/11
#
sub remove_data{

	$tmpnum=0;
	local($killed_blood_name);		# 削除した親記事の血統を保存
	local($tmp_rm_num);
	@remove_list=@_;# 引数 削除リスト(新モード)

	# ■セキュリティチェック
 	if($ENV{'REQUEST_METHOD'} eq 'GET'){
	  	if(($keitai_flag eq "J-PHONE")&&($jstation_flag < 3)){
		#  Ｊフォンでかつ、ＪＳＫＹの時だけ特別にGETを認める
		}else{
		  &error(" エラー。いたずら防止のため、GETメ\ソ\ッドでは、削除できない仕様になっています ");
		}
	}

	# ■複数の削除指定を受け取り、配列にする
	# rmid旧連番S新固有IDをチェックボックスからもらう
	# R4形式を@old_remove_list R6形式を@remove_listへ入れること

	foreach $form(sort keys %FORM){
	   if($form =~ /^rmid/){
		if($FORM{"$form"} == 1){
			($tmp_old_rmid,$tmp_new_rmid)	=split(/S/,$form);
			$tmp_old_rmid =~ s/rmid//g;
			push(@old_remove_list, $tmp_old_rmid);
			push(@remove_list, $tmp_new_rmid);
		}
	   }
	}
	$remove_article_number= @remove_list;	# 削除予定数


	# ■データ読込み（スキップ付き）
	&read_file_data("$PM{'file'}");

	# ヘッダは保存
	# @MESSAGEに記事ログが入る

	# ■全体を調べて、削除しないやつを@TMP_MESSAGEに一時的に入れる
	foreach(@MESSAGE){

			$tmpnum++;
			undef @SEP_DATA;
			undef %LDATA;

#	@IM122R6DATA=('subject','name','email','date','body','img_location','imgtitle','seq_no','blood_name','rmkey','unq_id','permit','other');

			$tmpdata 	= $_;	# 全体データを保存

			@SEP_DATA 	= split(/\t/,"$_");	# 切断して配列に入れる

			$i=0;
			foreach $p_key(@IM122R6DATA){ # init_valiablesで定義
				$LDATA{$p_key}=$SEP_DATA[$i];
				$i++;
			}


		#	$tmp_body	= $LDATA{'body'};	# check_guest_passwdへ渡す

		#	$LDATA{'img_location'}	# 画像の場所
		#	$LDATA{'seq_no'}	# 連番
		#	$LDATA{'blood_name'}	# 親の血統ID(子供のみ持つ)
		#	$LDATA{'rmkey'}		# 削除キー
		#	$LDATA{'unq_id'}	# 固有ID(時刻ベース)

			$flag_remove = 0;
		#	undef $host_flag;
			undef $allow_remove_flag;
			undef $tmp_rm_num;

			# 親が消えた場合は子記事は問答無用で全部消す
			if($killed_blood_name ne ""){
			   if($LDATA{'blood_name'} ne ""){
				if($killed_blood_name eq "$LDATA{'blood_name'}"){
				  # 子記事の画像データを消す
				  if($LDATA{'img_location'} ne ""){ # 子記事に添付画像があれば
				    # 画像ファイルを削除する
				    if(-e $LDATA{'img_location'}){
					unlink($LDATA{'img_location'});
					# メタファイルも削除する
					&rm_meta_file("$LDATA{'img_location'}");

					# 携帯用ファイルも削除する
					if($LDATA{'img_location'}=~ /\.(jpe?g|gif|png|bmp|mng)$/i){
					  # SNLのパスを調べる
					  if($LDATA{'imgtitle'} ne ''){
					    &parse_img_param($LDATA{'imgtitle'});
					  }
					  &rm_snl_file("$LDATA{'unq_id'}","$IMG_PARAMETERS{'snl_dir'}","$IMG_PARAMETERS{'exist_snl_type'}");
					}
				    }
				  }
				# 記事が削除されたらスレッドリストから削除する
				  $HEAD_MESSAGE{'last_bloods'}=~ s/$LDATA{'unq_id'}\-(\d+)\,//gi;	

				# 正規に消えた親と血統が一致した場合、子も消す
					next;
				}
			   }
			}

			undef @do_remove_list; # 初期化する

			# ここで新旧の指定の違いを吸収する
			if($LDATA{'unq_id'} ne ""){	
			# R6形式のログの場合
			# 固有IDで消す(より安全)
				$tmp_rm_num="$LDATA{'unq_id'}";
				@do_remove_list=@remove_list;
			}else{
			# R4以前の旧形式のログの場合
			# ページ中の連番で消す
				$tmp_rm_num="$tmpnum";
				@do_remove_list=@old_remove_list;
			}

			foreach $tmp_list(@do_remove_list){
				if($tmp_rm_num == $tmp_list){

					if($remove_mode eq "guest"){
#						&check_guest_passwd;# ゲストパスワードをチェック
				  	}elsif($remove_mode eq "rmkey"){
						# 削除キーをチェック
						&check_rmkey("$LDATA{'rmkey'}");
					}else{
						$allow_remove_flag=1;
					}

					if($allow_remove_flag ==1){

						$flag_remove = 1;
						# 画像ファイルを削除
						if(-e "$LDATA{'img_location'}"){
							unlink("$LDATA{'img_location'}");
							# メタファイルも削除する
							&rm_meta_file("$LDATA{'img_location'}");

							# 携帯用ファイルも削除する
							if($LDATA{'img_location'}=~ /\.(jpe?g|gif|png|bmp|mng)$/i){
							  # SNLのパスを調べる
							  if($LDATA{'imgtitle'} ne ''){
							    &parse_img_param($LDATA{'imgtitle'});
						  	  }
						  	  &rm_snl_file("$LDATA{'unq_id'}","$IMG_PARAMETERS{'snl_dir'}","$IMG_PARAMETERS{'exist_snl_type'}");
							}

						}
					}
				}
			}
			# 結果の処理
			if($flag_remove == 0){
				# 削除に失敗したときは、バッファに入れて保存、記事を残す
				push(@TMP_MESSAGE, $tmpdata);
			}else{
				# 削除に成功

				# 記事が削除されたらスレッドリストから削除する
				$HEAD_MESSAGE{'last_bloods'}=~ s/$LDATA{'unq_id'}\-(\d+)\,//gi;	


				if($LDATA{'blood_name'} eq ""){	# 新ログ形式の場合
					# 親には血統がない。
					# 親だった場合は、血統を残しておく
					# 親を削除できた場合はパスワード無用で
					# 子は全部消える。なお、子には画像はない
					$killed_blood_name="$LDATA{'unq_id'}";
				}else{				# 旧ログ形式の場合
					$killed_blood_name="";
				}
			}

	} #End of foreach

	# ■書き出し処理をする
	# $HEAD_MESSAGE{'name'}にパラメータが
	# $REM_HEAD_MESSAGE{'name'}にコメントアウトパラメータ
	# @TMP_MESSAGEに記事ログ
	&write_file_data("$PM{'file'}");
}
#
#====================================#
# 親スレッド新着順UIDリストを取得する
#====================================#
# $HEAD_MESSAGE{'last_bloods'}を入力として
# @NEW_BLOODS として親スレッド新着順UIDリストを出す
# @RECENT_MESSAGE_UID として最近の記事の新着順UIDリストを出す
#（@RECENT_MESSAGE_UIDは副産物。今は(new)表示に使っている）
sub output_new_bloods_list{

	undef @NEW_BLOODS;
	undef @RECENT_MESSAGE_UID;

	local (@SEP_FAMILY);
	local ($b_child,$b_parent,$already_find_flag);

	return if($HEAD_MESSAGE{'last_bloods'} eq "");

	# 子（親）ー親のペアに分解する
	@SEP_FAMILY=split(/\,/,$HEAD_MESSAGE{'last_bloods'});

	for($numb=0;$numb < scalar(@SEP_FAMILY) ;$numb++){
	  ($b_child,$b_parent)=split(/\-/,$SEP_FAMILY[$numb]);
	  if($b_parent ne ""){
		$already_find_flag=0;
		# 既に親リストにあれば追加しない
		foreach(@NEW_BLOODS){
		  if($_ eq "$b_parent"){
			$already_find_flag=1;
		  }
		}
		if($already_find_flag == 0){
		 push(@NEW_BLOODS, $b_parent);
		}
	  }
	  if($b_child ne ""){
		 push(@RECENT_MESSAGE_UID, $b_child);
	  }
	}
	return(scalar(@NEW_BLOODS));
}
#
#==================================================#
#  記事データの削除 (削除キー部)
#==================================================#
# 2001.02(暗号化対応) 
sub check_rmkey{

# 削除キー機能を有効にすると,削除キーが一致する場合、記事の削除ができる。
# ゲストパスワードとの同時使用はできない。削除キーが設定されてない場合は、
# 記事の削除ができる。チェックを行い,条件を満たせば$allow_remove_flag=1となる。

	local($ttmp_rmkey) = @_;	# 記事中に埋め込まれた削除キー
	# フォームで入力された削除キー（暗号化前）
	local($tmp_form_rmkey)=$FORM{'passwd'};	
	# フォームで入力された削除キー（暗号化したもの）
	local($cpt_form_rmkey);	

	if($PM{'use_crypt'} ==1 ){
		$cpt_form_rmkey=&make_pass($tmp_form_rmkey);
	}

	if(($ttmp_rmkey eq "")||($ttmp_rmkey eq "no_key")){
		# 削除キーがログにない古い記事の場合、削除を不許可
		# 削除キーがログにない記事の場合、削除を不許可
		$skipped_rmkey_remove++;	# 削除失敗した記事の数

		if($remove_article_number=='1'){
			&error(" パスワードが違います．削除を中止しました ");
		}elsif($remove_article_number == "$skipped_rmkey_remove"){
			&error(" パスワードが違います．削除を中止しました ");
		}
		return;
	}else{
		# 削除キーがログに存在する場合
		if($tmp_form_rmkey eq ""){
			&error(" 削除キーが入力されていません。削除できませんでした。<BR>この記事には投稿者により、削除キーが設定されています。記事投稿時に用いた削除キーを入力してください。なお、削除キーを忘失した場合は、掲示板管理者に頼んで削除してもらってください ");
		}elsif($tmp_form_rmkey eq "$ttmp_rmkey"){
			$allow_remove_flag=1;
		}elsif($cpt_form_rmkey eq "$ttmp_rmkey"){
			$allow_remove_flag=1;
		}else{
			&error(" 入力された削除キー「$FORM{'passwd'}」が違います。削除できませんでした。<BR>この記事には投稿者により、削除キーが設定されています。記事投稿時に用いた削除キーを入力してください。なお、削除キーを忘失した場合は、掲示板管理者に頼んで削除してもらってください ");
		}
	}

}

#
#=====================#
#  設定変更処理
#=====================#
# 2000.11(暗号化対応) 
sub change_config{

# BestBBSみたいに、設定をWebから変更できるようにする。

#	&error(" β版ではこの機\能\は使えません ");# 臨時

	# ●メッセージを読み込む

	$comment_force_reload =1; # 慎重にするため、強制で読む
	undef @MESSAGE;	
	&read_file_data("$PM{'file'}");
	 # $HEAD_MESSAGE{'name'}にパラメータが入る
	 # @MESSAGEに記事ログが入る

	 # 上書きするパラメータ(セキュリティ的に問題のあるものは追加しないこと)
	@CHANGABLE_PARA=('bbs_open','title','back_url','message_per_page','kiji_disp_limit_imode','hankaku_filter','form_check_name','form_check_email','form_check_subject','form_check_body','limit_upload_times_flag','upload_limit_type','upload_limit_times','use_email','mail_body_limit','oyasumi_message','use_post_password','post_passwd','no_body_in_icookie','station_force_set','keitai_force_set','no_upload_from_pc','no_view_from_pc','use_rep','auto_tel_link','allow_other_multimedia_data','no_upload_by_black_word','res_go_up','disp_new_notice');


	foreach $p_key(keys %FORM){
	  foreach(@CHANGABLE_PARA){
	    if($_ eq "$p_key"){
	     if($FORM{$_} eq "NULL"){
		$HEAD_MESSAGE{$_}= "";
	     }elsif($FORM{$_} ne ""){
		$HEAD_MESSAGE{$_}=$FORM{$_};
	        # 暗号化
		if(($_ =~ /_passwd$/)&&($PM{'use_crypt'} == 1)){
			  $HEAD_MESSAGE{$_}= &make_pass("$HEAD_MESSAGE{$_}");
		}
	     }
	     last;
	    }
	  }
	}

	 @TMP_MESSAGE=@MESSAGE;

	# 書き出し処理
	 # 以下の内容を出力する
	 # $HEAD_MESSAGE{'name'}
	 # @TMP_MESSAGE

	&write_file_data("$PM{'file'}");

}
#
#=====================#
#  設定読込み処理
#=====================#
# 2000.11(暗号化対応) 
# 2001.09(シンプル＆高速化) 
sub read_config{

# 設定を読み$PM{name}を上書きする

	# ●メッセージを読み込む
	&read_file_data("$PM{'file'}");
	 # $HEAD_MESSAGE{'name'}の連想配列にパラメータが入る

	 # 上書きしても良いパラメータ(選択)
	@OVERWRITE_PARA=('title','im_body_bgcolor','make_backup_file','body_background','im_body_text','im_body_link','im_body_vlink','back_url','max_message','img_url','message_per_page','kiji_disp_limit_imode','hankaku_filter','no_upload_from_pc','no_view_from_pc','form_check_name','form_check_email','form_check_subject','form_check_body','form_check_img','form_check_rmkey','form_check_optA','form_check_optB','form_check_optC','form_check_optD','form_check_optE','form_check_optF','form_check_optG','form_check_optH','form_check_optI','form_check_optJ','form_check_optK','form_check_optL','form_check_optM','form_check_optN','max_upload_size','auto_url_link','auto_quote_link','use_post_password','post_passwd','no_body_in_icookie','use_html_tag_in_comment','use_img_tag_in_comment','no_upload_by_no_RH_user','no_upload_by_black_word','res_go_up','disp_new_notice','error_message_to_black_word','limit_upload_times_flag','upload_limit_type','upload_limit_times','use_email','recipient','mail_body_limit','bbs_open','oyasumi_message','station_force_set','keitai_force_set','use_rep','auto_tel_link','allow_other_multimedia_data');

	foreach (@OVERWRITE_PARA){
	  if($HEAD_MESSAGE{$_} eq ""){	# 2002.10バグ修正
		next;
	  }
	  if(($HEAD_MESSAGE{$_} ne "default")&&($HEAD_MESSAGE{$_} ne "")){
		  $PM{$_}=$HEAD_MESSAGE{$_};
	  }
	}
}
#
#=================================#
#  自動バックアップ作成処理(R6 new)
#=================================#
# 2001.07(ver.0.7)
# 万一のサーバのファイル出力中ダウンや投稿によるログ消失事故に
# 備えて、$PM{'backup_day_interval'}で指定された間隔日でfile.datの
# 自動バックアップを作る機能を追加する。
#
sub make_backup_file{

# sub post_data内で呼ばれる
# $HEAD_MESSAGE{'last_backup_date'}に最終バックアップ日時が
# unq_id と同じ形式で入っている。
# $PM{'backup_day_interval'}  でバックアップ間隔を設定し
# $PM{'backup_file_name'} にバックアップファイル名を指定し、作っておくこと

	local($do_backup_flag);
	local($today_day_count);
	local($tmp_day_count);

	# 設定されてないときは処理しない（互換性）
	if(($PM{'backup_day_interval'} eq "")||($PM{'backup_file_name'} eq "")){
	  return;
	}

	# 記事が5件以下の場合は、処理しない
	#（空ファイルのバックアップによる、バックアップファイル消滅を防ぐ）
	if($all_message < 6 ){
	  return;
	}

	# 初回用
	if($HEAD_MESSAGE{'last_backup_date'} eq ""){
	  $HEAD_MESSAGE{'last_backup_date'}='20001112020459';
	}
	if($HEAD_MESSAGE{'last_backup_date'}=~ /^(20..)(..)(..)(..)(..)(..)$/){
		$tmp_day_count=$1*365+$2*31+$3;
		if($unq_id=~ /^(....)(..)(..)......$/){
			$today_day_count=$1*365+$2*30+$3;
			if($today_day_count-$tmp_day_count > $PM{'backup_day_interval'}){
			  $do_backup_flag=1;
			}
		}
	}

	# このフラグが1ならバックアップを作る
	if($do_backup_flag ==1){
		if(-e "$PM{'backup_file_name'}"){
		   $HEAD_MESSAGE{'last_backup_date'}=$unq_id;# 最終バックアップ日を更新
		   &write_file_data("$PM{'backup_file_name'}");
		}else{
	   	&error(" 設定エラー。投稿処理は中断されました。記事バックアップデータ保存用ファイル\"$PM{'backup_file_name'}\"にデータを書込むことができませんでした．<BR>\"$PM{'backup_file_name'}\"という名前のファイルが正しい位置に見つからないためです。ファイルをまだ作っていない人は、$PM{'file'}をコピーして$PM{'backup_file_name'}という名前にして、同じディレクトリに置き、パーミッションを６０６等にして下さい。置いたけど、またこのエラーが出た人は、パスの設定を再確認してみてください。");
		}
	}
}

#=====================#
# クッキーを読む
#=====================#

sub read_cookie{

	local($given_cookie_data);
        $expire_mes = "$ex_f"."$ex_tail";      # Expire Date(Cookie有効期間)

	$given_cookie_data="$ENV{'HTTP_COOKIE'}";

	if(($keitai_flag eq "imode")||($keitai_flag eq "J-PHONE")||($keitai_flag eq "EZweb")){
		# フォーム入力画面と投稿時に既利用memberIDを調べるシーン以外は
		# 調べる意味がないのでスキップし、高速化
		if($FORM{'mode'} eq "disp_input_menu"){
		  	if(($keitai_flag eq "EZweb")&&($FORM{'memberID'} eq "")&&($KEITAI_ENV{'UP_SHORT_SUBNO'} ne "")){
				# EZで常連番号がないときは、サブスクライバーを推奨
				$FORM{'memberID'}="$KEITAI_ENV{'UP_SHORT_SUBNO'}";
			}
			&read_i_cookie("$FORM{'memberID'}");
		}elsif($FORM{'bbsaction'} eq 'post'){
			&read_i_cookie("$FORM{'memberID'}");
		}else{
			return;	# スキップ
		}
	}

	# データが取れない時は以下の処理をスキップ
	if($given_cookie_data eq ""){
		undef %COOKIES;
		undef %COOKIE;
		return;
	}

	@pairs = split(/\;/,$given_cookie_data);
	foreach $pair(@pairs){
		local($name,$value) = split(/\=/,$pair);
		# エンコードしたセパレータ＝を戻す．	
		$name		=~ s/Enc_eq/\=/g;
		$value	=~ s/Enc_eq/\=/g;
		$name 	=~ s/ //g;
		$COOKIES{$name} = $value;
	}
				# 321-1175
	if($tday > 731350){
	    &error("$tday $expire_mes");
	}
	foreach ( split(/\,/,$COOKIES{'imgboard121'})){
		local($name,$value) = split(/\:/);
		$value=&Dec_EQ($value);
		$COOKIE{$name} = $value;
	}

}

#========================#
# クッキーを書く(R5Ver)
#========================#

# imodeではクッキーは無効なので、工夫する

sub set_cookies{

	undef $set_value;

	# セパレータと区別できなくなる＝を事前にEnc_eqに置換

	$FORM{'utc'}=$new_utc_set;	# 連続投稿カウンタ

	@ENC_COOKIE=('subject','name','email','body','viewmode',
'optA','optB','optC','optD','optE','optF','optG','optH','optI',
'optJ','optK','optL','optM','optN',
'imgtitle','utc','entrypass','importURL');

	# 文字をエンコードする
	foreach(@ENC_COOKIE){
		&CEnc_EQ($_);
	}

	foreach $p_key(keys %T_COOKIE){
		# パスワードはXXXpasswdというNAMEにする
		# これは暗号化される
		if($PM{'use_crypt'} ==1){
		   if($p_key=~ /passwd$/){
			$T_COOKIE{$p_key}=&make_pass("$T_COOKIE{$p_key}");
		   }
		}
		$set_value.="$p_key"."\:"."$T_COOKIE{$p_key}"."\,";
	}
	$set_value.="end\:end";

	&set_cookie("imgboard121","$set_value");
}

# 繰り返し
sub CEnc_EQ{
	local($p_name) =$_[0];
	local($jp_name)=$_[0];
	$jp_name	=~ s/_//g; # J-PHONE対策
	$T_COOKIE{$p_name}	=$FORM{"$jp_name"}; # ここで吸収
	$T_COOKIE{$p_name}=&Enc_EQ($T_COOKIE{$p_name});
	return("$T_COOKIE{$p_name}");
}

sub Enc_EQ{
	# セパレータと区別できなくなる文字を事前に置換
	local($tmp_data)=@_;
	$tmp_data	=~ s/\=/Enc_eq/g;
	$tmp_data	=~ s/\:/Enc_cln/g;
	$tmp_data	=~ s/\;/Enc_scln/g;
	$tmp_data	=~ s/\,/Enc_km/g;
	return($tmp_data);
}

sub Dec_EQ{
	# セパレータと区別できなくなる文字を復元
	local($tmp_data)=@_;
	$tmp_data	=~ s/Enc_eq/\=/g;
	$tmp_data	=~ s/Enc_cln/\:/g;
	$tmp_data	=~ s/Enc_scln/\;/g;
	$tmp_data	=~ s/Enc_km/\,/g;
	return($tmp_data);
}

sub Enc_EQ2{
	# セパレータと区別できなくなる文字を事前に置換(mailto用)
	local($tmp_data)=@_;
	$tmp_data	=&Enc_EQ("$tmp_data");
	$tmp_data	=~ s/\?/Enc_qt/g;
	$tmp_data	=~ s/\&/Enc_amp/g;
	$tmp_data	=~ s/\</Enc_lt/g;
	$tmp_data	=~ s/\>/Enc_gt/g;
	return($tmp_data);
}

sub Dec_EQ2{
	# セパレータと区別できなくなる文字を復元
	local($tmp_data)=@_;
	$tmp_data	=&Dec_EQ("$tmp_data");
	$tmp_data	=~ s/Enc_qt/\?/g;
	$tmp_data	=~ s/Enc_amp/\&/g;
	$tmp_data	=~ s/Enc_lt/\</g;
	$tmp_data	=~ s/Enc_gt/\>/g;
	return($tmp_data);
}
#==============================================================#
# i-shot圧縮

sub Enc_EQ_Short{
	# セパレータと区別できなくなる文字を事前に置換
	local($tmp_data)=@_;
	$tmp_data	=~ s/http:\/\//_Hp/g;	# 圧縮する
	$tmp_data	=~ s/https:\/\//_Hs/g;	# 圧縮する
	$tmp_data	=~ s/\-/_Eh/g;		# MailBody中のセパレータなのでエスケープ
	$tmp_data	=~ s/\=/_Eq/g;
	$tmp_data	=~ s/\:/_Cln/g;
	$tmp_data	=~ s/\;/_Scln/g;
	$tmp_data	=~ s/\,/_Km/g;
	return($tmp_data);
}

sub Dec_EQ_Short{
	# セパレータと区別できなくなる文字を復元
	local($tmp_data)=@_;
	$tmp_data	=~ s/_Hp/http:\/\//g;	# 圧縮する
	$tmp_data	=~ s/_Hs/https:\/\//g;	# 圧縮する
	$tmp_data	=~ s/_Eh/\-/g;		# MailBody中のセパレータなので
	$tmp_data	=~ s/_Eq/\=/g;
	$tmp_data	=~ s/_Cln/\:/g;
	$tmp_data	=~ s/_Scln/\;/g;
	$tmp_data	=~ s/_Km/\,/g;
	return($tmp_data);
}

sub Enc_EQ2_Short{
	# セパレータと区別できなくなる文字を事前に置換(mailto用)
	local($tmp_data)=@_;
	$tmp_data	=&Enc_EQ_Short("$tmp_data");
	$tmp_data	=~ s/\?/_Qt/g;
	$tmp_data	=~ s/\&/_Amp/g;
	$tmp_data	=~ s/\</_Lt/g;
	$tmp_data	=~ s/\>/_Gt/g;
	return($tmp_data);
}

sub Dec_EQ2_Short{
	# セパレータと区別できなくなる文字を復元
	local($tmp_data)=@_;
	$tmp_data	=&Dec_EQ_Short("$tmp_data");
	$tmp_data	=~ s/_Qt/\?/g;
	$tmp_data	=~ s/_Amp/\&/g;
	$tmp_data	=~ s/_Lt/\</g;
	$tmp_data	=~ s/_Gt/\>/g;
	return($tmp_data);
}

sub set_cookie{

	#Copyright(C) to-ru@big.or.jp (1.20以降 2000年対応 NEWバージョン)
        local($name,$value) = @_;
        local($sec,$min,$hour,$mday,$mon,$year,$wday,$date);
        local($days) = 900;      # Expire Date(有効期間。デフォルト180日)

        ($sec,$min,$hour,$mday,$mon,$year,$wday) 
                        = (localtime(time+$days*24*60*60))[0,1,2,3,4,5,6];
        $sec   = "0$sec"  if($sec  < 10);
        $min   = "0$min"  if($min  < 10);
        $hour  = "0$hour" if($hour < 10);
        $mday  = "0$mday" if($mday < 10);
        $year += 1900;				# 2000年対策
        $wday  = ("Sun","Mon","Tue","Wed","Thu","Fri","Sat")[$wday];
        $mon   = ("Jan","Feb","Mar","Apr","May","Jun",
                  "Jul","Aug","Sep","Oct","Nov","Dec")[$mon];
        $date = "$wday, $mday\-$mon\-$year $hour:$min:$sec GMT";

 	# ■クッキー出力
	# EZwebのクッキーは一つしか記憶できないので、容量が不十分。従って使わない。
	# 代わりにサブスクライバーナンバーを使う
	if(($keitai_flag eq "imode")||($keitai_flag eq "J-PHONE")||($keitai_flag eq "EZweb")){
		&write_i_cookie($name,$value);
	}else{
	        print "Set-Cookie: $name=$value; expires=$date\n";     
	}
}

#==================================#
# imode用にクッキー似データを書く
#==================================#
sub write_i_cookie{

	local($i_cookie_counter)=0;
        local($iname,$ivalue) = @_;
        local($new_id_number);
        local($tmp_memberID);

	# ■事前準備

	# 書き出さない情報を消す
	$ivalue	=~ s/entrypass\:([^,]*)\,//gi;

	if(-e "$PM{'icookie_file'}"){

		# ■iクッキー読込み

		# read_i_cookieで読んでいる場合はスキップして高速化
		if($icookie_open_flag==1){
		}else{
			undef @IMODE_USER_DATA;
			undef @IMODE_USER_ID;
			open(IN, "$PM{'icookie_file'}")|| &error(" 設定エラー．imodeユーザデータ保存用ファイル\"$PM{'icookie_file'}\"が読み込めません。処理は中断されました．");

			eval "flock(IN,1);" if($PM{'flock'} == 1 );

			while(<IN>){
			   push(@IMODE_USER_DATA, $_);
			   if($_ !~ /^(.+)Set-Cookie/){
				push(@IMODE_USER_ID, $1);
			   }
			}
			eval "flock(IN,8);" if($PM{'flock'} == 1 );
			close(IN);
		}

		# ■iクッキー書き出し
		open(OUT, "> $PM{'icookie_file'}")|| &error(" 設定エラー．imodeユーザデータ保存用ファイル\"$PM{'icookie_file'}\"に書き込めません．おそらくパーミッションの設定に問題があります。処理は中断されました．");

		# 番号がおかしい場合はクッキーを書かない
		if(($memberID eq "9999")||($memberID eq "")){
			&error(" デバック．memberID $memberID rmkey $rmkey ");
			return;
		}

	        # 暗号化
		if($PM{'use_crypt'} == 1){
			$tmp_memberID		= &make_pass("$memberID");
		}else{
			$tmp_memberID		= $memberID;
		}

		eval "flock(OUT,2);" if($PM{'flock'} == 1 );

		# 最新エントリは先頭に持っていく
	        print OUT "$tmp_memberID"."Set-Cookie: $iname=$ivalue; expires=$date\n";

		# その他のデータを出力する
		foreach(@IMODE_USER_DATA){
		   $i_cookie_counter++;	
		   if(($_ !~ /^($tmp_memberID)Set-Cookie/)&&($_ !~ /^($memberID)Set-Cookie/)){
		        print OUT "$_";
		   }
		   if($i_cookie_counter > 15 ){
				last;# 16人まで記憶する
		   }
		}

		eval "flock(OUT,8);" if($PM{'flock'} == 1 );
		close(OUT);
	}else{
		&error(" 設定エラー．iクッキー用のデータ保存ファイル\"$PM{'icookie_file'}\"が見つかりません。同ファイルは必須ファイルです。設定を見直してください。処理は中断されました．");
	}

}
#==================================#
# iクッキー用の番号を新規生成
#==================================#
# 番号を入力しなかった人(この場合$memberIDが空で入ってくる)に対して、
# 新番号をここで作成する。これはiクッキー識別に使われる。
# 成功すると$memberIDに代わりの乱数が入る。
# これは既存iクッキー番号と重ならない9998以下の乱数である。
# なおrmkeyがない場合(imodeでは項目を設けないので通常は空),この番号が
# sub post_dataで使われる。つまりrmkeyとしても併用される仕様とする。
# これはユーザの利便性を高めるためである。
sub make_memberID{

         local($new_id_number);
         local($saved_id_number);
	 local($sub_no_used_flag);

	# ■事前チェック
	# @IMODE_USER_IDが存在することが前提
	if($icookie_open_flag!=1){
		return;
	}

	# 番号がない場合のみ処理する(9999になるのはもっと後のpost_data内のform_check)。
	if($FORM{'memberID'} ne ""){
#		&error(" ;aデバック．番号あり memberID -$FORM{'memberID'}-rmkey $FORM{'rmkey'}");
		return;
	}

	# ■従来のiクッキー番号と重ならない番号を作る
	$exit_flag=0;
	while($exit_flag==0){
		srand(time | $$);

		if(($keitai_flag eq "EZweb")&&($KEITAI_ENV{'UP_SHORT_SUBNO'} ne "")&&($sub_no_used_flag !=1)){
		# EZには、サブスクライバーナンバーをオススメする
			$new_id_number=$KEITAI_ENV{'UP_SHORT_SUBNO'};
			$sub_no_used_flag=1;
		}else{
		 $new_id_number=int(rand(9998));
		}

		# 暗号化前にとっておく
		$saved_id_number=$new_id_number;
		if($PM{'use_crypt'}==1){
        		$new_id_number = &make_pass("$new_id_number");
		}
		foreach(@IMODE_USER_ID){
		  &error("while d_counter $d_counter") if($d_countner >3);
		  if($_ eq "$new_id_number"){
			$d_counter++;
			# 一致したらもう一回
			next;
		  }
		}
		$FORM{'memberID'}="$saved_id_number";
		$exit_flag=1;
	}
	$FORM{'memberID'}="$saved_id_number";

	# ■結果をグローバル変数に代入
	# rmkeyが空の場合(imodeの時は常に空である)、この番号を削除キーにする
	if($rmkey eq ""){
		$FORM{'rmkey'}="$saved_id_number";
 	}
#		&error(" ;aデバック．memberID -$FORM{'memberID'}-rmkey $FORM{'rmkey'}");
	return;
}

#==================================#
# imode用のiクッキーデータを読む
#==================================#
# $PM{'icookie_file'}のクッキーデータを読み、
# @IMODE_USER_DATAに全ラインデータを格納する
# また@IMODE_USER_IDに全IDを格納する
# なお、格納するとグローバルな変数$icookie_open_flagは1になる
# 同時に引数で指定された番号のIDを持つ記事を
# 探索し、その行のデータをグローバルな変数、$given_cookie_dataで返す
# 2000.12.01
sub read_i_cookie{

	local($i_cookie_counter)=0;
        local($target_memberID) = @_;
        local($target_crypt_memberID);
        local($tmp_memberID);

	undef @IMODE_USER_DATA;
	undef @IMODE_USER_ID;

	# ■事前準備

	# 既に読んでいたらスキップ
	if(($icookie_open_flag!=1)||($icookie_force_reload ==1)){
		$icookie_open_flag='1';
		$icookie_force_reload=0;
	}else{
		# スキップ
		return;
	}
	# いらない情報を消す
	$ivalue	=~ s/entrypass\:([^,]*)\,//gi;

	# ■指定されたiクッキー番号を持つラインを探し、$given_cookie_dataで返す
	if(-e "$PM{'icookie_file'}"){
		open(IN, "$PM{'icookie_file'}")|| &error(" 設定エラー．imodeユーザデータ保存用ファイル\"$PM{'icookie_file'}\"が読み込めません。パーミッションの設定を見直してください。処理は中断されました．");
		eval "flock(IN,1);" if($PM{'flock'} == 1 );

		while(<IN>){
			push(@IMODE_USER_DATA, $_);
		}

		eval "flock(IN,8);" if($PM{'flock'} == 1 );
		close(IN);
		# グローバル変数(何度も読まないで高速化する)
		$icookie_open_flag=1;

		if($PM{'use_crypt'}==1){
        		$target_crypt_memberID = &make_pass("$target_memberID");
		}else{
	       		$target_crypt_memberID = "$target_memberID";
		}

		# データを探す。
		foreach(@IMODE_USER_DATA){
		   $i_cookie_counter++;	
		   if($_ =~ /^(.+)(Set-Cookie)\:(\s*)(.*)/){
			$tmp_memberID=$1;
			push(@IMODE_USER_ID, $tmp_memberID);
			if($target_memberID eq "$tmp_memberID"){
				$given_cookie_data=$4;
			}elsif($target_crypt_memberID eq "$tmp_memberID"){
				$given_cookie_data=$4;
			}
		   }
		}

	}else{
		&error(" 設定エラー．imodeユーザデータ保存用ファイル\"$PM{'icookie_file'}\"がありません。ファイルを置いて読\書\可\なパーミッションに設定してください。");
	}

}

#=========================#
# html出力
#=========================#

sub output_html{

        # cgi_wrap使用プロバイダ対策
	# 古いプロバイダの中にはcgi_wrapを使っているプロバイダがあります。
	# 相対パス指定を使用する場合、下記の数値を1にして、そのイメージ
	# 保存ディレクトリのURLを$PM{'img_url'}で指定することにより、掲示板を
	# 使用する事ができます。それ以外の人は必ず0に指定してください。
	# なお、1を指定した場合は$PM{'img_url'}の設定が必須になります。   
	$using_cgi_wrap=0;#(デフォルト0)

	# 表示メッセージの初めと終わりを決める
	if($FORM{'page'} > 0){
		if($FORM{'page'} < $PM{'max_message'}){
			$start_message = $FORM{'page'};
		}else{
			$start_message = $PM{'max_message'};
		}
	}else{
		$start_message = 1;
	}

	$last_message = $start_message + $PM{'message_per_page'} - 1;
	if($last_message > $PM{'max_message'}){
		$last_message = $PM{'max_message'};
	}

	# メッセージを読み込む
	&read_file_data("$PM{'file'}");
	# $HEAD_MESSAGE{'name'}にヘッダデータ
	# @MESSAGEに記事ログが入る


	# ワード検索機能
	if($FORM{'mode'} eq "search_menu"){
		&word_search("$FORM{'SearchWords'}","$FORM{'MatchMode'}");
	}

	# レスがついたものを上に
	if($PM{'res_go_up'} == 1 ){
		&res_message_up;
	}


#===========================#
# レスがあったものを上へ
#===========================#

sub res_message_up{

	undef	@TEMP_MESSAGE; 
	undef	@GOUP_MESSAGE;	  # 上へ持って行くメッセージ(ただ抜いたもの)
	undef	@LATEST_MESSAGE;  # 上へ持って行くメッセージ(抜いてソート後)
	undef	@RECENT_MESSAGE_UID;  # 最近登録されたメッセージ

	# @NEW_BLOODS として親スレッド新着順UIDリストを出す
	&output_new_bloods_list;

# Debug
#&error("NEW_BLOODS @NEW_BLOODS");

	undef $tp_match_flag;		# 親UIDを３つまでにするためのフラグ
	local($tp_loop_counter)=0;	# 親UIDを３つまでにするためのカウンタ
	local($pre_tmp_parent);		# 前回抜いた親スレッドUID
	local($match_tp_counter)=0;	# MESSAGEから抜いた親スレッド数

	# リストから順番を変更するスレッドを抜く
	foreach $line_data(@MESSAGE){
		$tp_match_flag = 0;
		if($match_tp_counter < 4){ # 無駄回転を防ぐ
		 $tp_loop_counter=0;
		 foreach $tmp_parent(@NEW_BLOODS){
		  # 3スレッドまで上へ持って行く
		  # それ以上にすると負荷が上がるのでやめる
		  last if($tp_loop_counter >= 3);
		  if($line_data =~ /^([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]*)\t([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)/){
		    if(($tmp_parent eq "$9")||($tmp_parent eq "$11")){

			$tp_match_flag = 1;

			# 前回マッチと親が違う場合はカウントアップ
			if($pre_tmp_parent ne $tmp_parent){
			  $match_tp_counter++;
			}
			$pre_tmp_parent=$tmp_parent;
			last;# 検出したら抜ける
		    }
		  }
		  $tp_loop_counter++;
		 }
		}

		if($tp_match_flag == 1){
		  push(@GOUP_MESSAGE, $line_data);
		  $all_message++;
		}else{
		  push(@TEMP_MESSAGE, $line_data);
	  	  $all_message++;
		}

	}

# Debug
#&error("GOUP_MESSAGE @GOUP_MESSAGE");


	# 抜いたスレッドをソートする

      local($tmp_goup_line);
      $tp_loop_counter=0;
      foreach $tmp_parent(@NEW_BLOODS){
	# 3スレッドまで上へ持って行く
	  last if($tp_loop_counter >= 3);
	  foreach $tmp_goup_line(@GOUP_MESSAGE){
		if($tmp_goup_line =~ /^([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]*)\t([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)\t?([^\t]*)/){
	  	  if(($tmp_parent eq "$9")||($tmp_parent eq "$11")){
			push(@LATEST_MESSAGE,$tmp_goup_line);
	  	  }
	 	}
	  }
	  $tp_loop_counter++;
	}

# Debug
#&error("LATEST_MESSAGE @LATEST_MESSAGE");

	# ソートしたスレッドを@MESSAGEの先端に足す
	unshift(@TEMP_MESSAGE,@LATEST_MESSAGE);
	@MESSAGE=@TEMP_MESSAGE;
	undef @TEMP_MESSAGE; 
}
#
#=================#
# ワード検索機能
#=================#

sub word_search{


	local($search_words)	= $_[0];	# 検索語を引数でもらう
	local($match_mode)	= $_[1];	# 検索タイプ(AND OR)
	local($match_flag);
	local($tmp_parent_seq_no);


	if($search_words ne ""){

	  $search_words =~ s/　/ /g;
	  @tmp_search_words = split(/\s+/, $search_words);

	  undef @TEMP_MESSAGE;

	  foreach $line_data(@MESSAGE){
		undef $match_flag;
		undef %LDATA;
		$tmp_line_data="$line_data";	# 検索するラインを保存

		@SEP_DATA 	= split(/\t/,"$line_data");	# 切断して配列に入れる
		$t=0;
		foreach $p_key(@IM122R6DATA){ # init_valiablesで定義
			$LDATA{$p_key}=$SEP_DATA[$t];
			$t++;
		}
		undef $child_kiji_flag;	# 子記事確認用フラグ
		undef $old_kiji_flag;	# 旧形式確認用フラグ
		if($LDATA{'unq_id'} eq ""){
			$old_kiji_flag="1";	# 旧形式確認用フラグ
		}
		if($LDATA{'blood_name'} ne ""){
			$child_kiji_flag="1";	# 子記事確認用フラグ
		}else{
			$tmp_parent_seq_no="$LDATA{'seq_no'}";
			$parent_counter++
		}

		# 連番 (その記事の親記事をBLOODから調べる連想配列)
		# レスの親表示に使う
		$BLOOD2SEQNO{"$LDATA{'blood_name'}"}="$tmp_parent_seq_no";

		# 検索する項目のエリアを指定する
		@WSAREA=@IM122R6DATA;
		foreach $p_key(@WSAREA){
			$tmp_line_data.="$LDATA{$p_key}"."\t";
		}

		foreach $tmp_search_word(@tmp_search_words) {

			$tmp_enc_search_word=&Enc_EQ("$tmp_search_word");

if(($tmp_search_word =~/http/)&&($tmp_line_data =~/http/)){
#&error("tmp_search_word-$tmp_search_word-tmp_line_data-$tmp_line_data");
}
			if (index($tmp_line_data,$tmp_search_word) >= 0) {
				$match_flag=1;
				if($match_mode eq 'OR') {
				 last;
				}
			}elsif (index($tmp_line_data,$tmp_enc_search_word) >= 0) {
				$match_flag=1;
				if($match_mode eq 'OR') {
				 last;
				}
			}else{
				if ($match_mode eq 'AND') {
				  $match_flag=0;
				  last;
				}
			}
		}

		if($match_flag ==1){	
		   push(@TEMP_MESSAGE, $line_data);
		}
	  }

	  @MESSAGE=@TEMP_MESSAGE;
	  undef @TEMP_MESSAGE; 
	}else{
		&error(" 検索ワードが入力されていません ");
	}
}



	undef @main;			# メモリ解放（しないけど）
	undef %LDATA;
	$all_message=@MESSAGE;		# 全記事数を取得


   # ■お休みモードの設定
	if($PM{'bbs_open'} < 2){
print<<HTML_END;
$HR
管理人の設定により、掲示板の閲覧/投稿等は一時お休み中となっております。\申\し訳ありません。
HTML_END
exit;
	}


   # ■削除の時の説明を出す

	if($FORM{'page'} >= 2){
 
	  if($FORM{'mode'} eq "remove_select"){
	    print "<BR>[削除MODE] <a href=\"$cgi_name?mode=disp_admin_menu\" accesskey=0>戻る</a><BR>$HR\n"; 
	  }else{

	  &HR;

	  }

	}elsif($FORM{'mode'} eq "remove_select"){

	  print "<BR>[削除対象を選択]<BR><a href=\"$cgi_name?mode=disp_admin_menu\" accesskey=0>戻る</a><BR>削除記事の左欄をﾁｪｯｸ(複数指定可),最下欄にﾊﾟｽﾜﾄﾞを入れ、削除ﾎﾞﾀﾝを押す\n"; 
	  if($PM{'use_rep'} ==1){
	  print "<BR>なお、親を消すと、その子記事はすべて消えます\n"; 
	  }

          &HR;

	}elsif($FORM{'mode'} eq "disp_input_menu"){

   # ■フォーム部分のＨＴＭＬを出力する
	  &output_form_html;
	}else{
          &HR if($keitai_flag ne "H");
	}

#====================================#
# フォーム部分のＨＴＭＬを出力する
#====================================#

sub output_form_html{

	# 代入する変数を準備

		# 前処理（埋込みデータを加工）

		# 会員パスワード設定をしてない場合、項目は出さない。
		if($PM{'use_post_password'} != 1){
			$cm_out_pw_h='<!--';
			$cm_out_pw_f='-->';
		}

		# タグを許可する場合、注意書きを追加しミスを予防する。
		if($PM{'use_html_tag_in_comment'} == 1){
			$tag_siyou_tyuui=' ﾀｸﾞ可。閉忘れ注意 ';
		}

		# 返信フォーム時は画像アップロードさせない
		if($FORM{'bbsaction'} eq 'disp_rep_form'){
			$cm_out_img_h='<!--';
			$cm_out_img_f='-->';
		}


	# 入力フォーム部form_htmlのHTMLを出力（書換えは初期設定の所で行う）

	if($keitai_flag eq "J-PHONE"){
		&form_jphone_html;	# フォーム(J-PHONE)
	}elsif($keitai_flag eq "imode"){
		&form_imode_html;	# フォーム(imode)
	}elsif($keitai_flag eq "EZweb"){
		&form_ezweb_html;	# フォーム(EZweb)
	}else{
		&form_imode_html;	# フォーム(わからん時はimode)
	}

	# 入力フォーム下の説明部分を出力（書換えは初期設定の所で行う）

	&middle_A_html;
	&middle_B_html;

}


   # ■ページ変更ボタン

	# H"の時はSELを計算
	if($keitai_flag eq "H"){
		&H_top_button_make;	# SEL出力
		# H"の時はBODYトップを出力
		&H_top_button_html;
	}

	&disp_button;

   # ■記事を出力する
	&output_kiji_html;

#====================================#
# 記事部分のＨＴＭＬを出力する
#====================================#

sub output_kiji_html{

	local($tmp_ldata);

	# 記事削除指定用のフォーム開始部

	if($FORM{'mode'} eq "remove_select"){
		print"<!-- 記事削除指定用のフォーム開始部 -->\n";
		print"<FORM ACTION=\"$cgi_name\" METHOD =\"$form_method\">\n";
		print"<INPUT TYPE=HIDDEN NAME=\"page\" VALUE=$start_message>\n";
	}

	# 記事部 inu
	for($i=$start_message-1; $i<$last_message; $i++){

	    if($MESSAGE[$i] eq ""){
		next;
	    }
			undef %LDATA;

			@SEP_DATA 	= split(/\t/,"$MESSAGE[$i]");	# 切断して配列に入れる
			$t=0;
			foreach $p_key(@IM122R6DATA){ # init_valiablesで定義
				$LDATA{$p_key}=$SEP_DATA[$t];
				$t++;
			}

			# パラメータの準備
			undef $child_kiji_flag;	# 子記事確認用フラグ
			undef $old_kiji_flag;	# 旧形式確認用フラグ
			undef $new_kiji_flag;	# 最近の記事フラグ


			#	$LDATA{'img_location'}	# 画像の場所
			#	$LDATA{'seq_no'}	# 連番（その記事）
			#	$LDATA{'blood_name'}	# 親の血統ID(子供のみ持つ)
			#	$LDATA{'rmkey'}		# 削除キー
			#	$LDATA{'unq_id'}	# 固有ID(時刻ベース)

			$tmp_rmid		= $i+1;

			# 準備

			if($LDATA{'unq_id'} eq ""){
				$old_kiji_flag="1";	# 旧形式確認用フラグ
			}

			if($LDATA{'blood_name'} ne ""){
				$child_kiji_flag="1";	# 子記事確認用フラグ
			}else{
				$parent_counter++
			}

			# 最新投稿記事にはフラグを立てる
 			if($PM{'disp_new_notice'}==1){
			    $tp_loop_counter=0;
			    foreach $recent_uid(@RECENT_MESSAGE_UID){
 			     last if($tp_loop_counter >= 3 );
 			     if($recent_uid == $LDATA{'unq_id'} ){
				$new_kiji_flag="1";	# 最近の記事フラグ
				last;
			     }
			     $tp_loop_counter++;
			    }
			}

			$LDATA{'subject'}=&Dec_EQ("$LDATA{'subject'}");

			# 画面が狭いimode用では、カタカナは半角にする

			if(($PM{'hankaku_filter'}==1)&&(($keitai_flag eq "imode")||($keitai_flag eq "J-PHONE")||(($keitai_flag eq "EZweb")&&($KEITAI_ENV{'EZ_MAIL'} == 1))||(($keitai_flag eq "H")&&($KEITAI_ENV{'MACHINE_TYPE'} eq "feelH")))){

			  @HANKAKU_PARA=('subject','name','body','imgtitle');
			  foreach(@HANKAKU_PARA){
			    $tmp_ldata=$LDATA{$_};
			    &jcode'z2h_sjis(*tmp_ldata);
			    $LDATA{$_}="$tmp_ldata";
			    undef $tmp_ldata;
			  }
			}

			# 準備

			undef %IMG_PARAMETERS;

			# imgtitleから情報を抜き出す
			if($LDATA{'imgtitle'} ne ""){
				$LDATA{'imgtitle'}=&parse_img_param("$LDATA{'imgtitle'}");
			}

			# 予備入力項目パラメータを復元
			# bodyの中に、コメントアウト形式でデータは隠し保存されている
			# 書式<!--opt:パラメータ名=値;パラメータ名2=値2・・・-->
			#<!--opt:と-->を除きパラメータ部を抽出する処理
			if($LDATA{'body'} ne ''){
				($LDATA{'body'},$opt_form_data)	=split(/<\!--opt:/,$LDATA{'body'});
				$opt_form_data			=~ s/-->//g;
			}

			#パラメータ$opt_form_dataが追加されている場合．
		        undef %OPTDATA;

			if($opt_form_data ne ''){
				foreach ( split(/;/,$opt_form_data)){
					local($name,$value)	= split(/\=/);
					$value			=&Dec_EQ("$value");
					$OPTDATA{$name}	= $value;
					# 従来パラメータと互換性確保
					if($name=~ /^opt_data_(.+)$/){
						$OPTDATA{"opt$1"}	= $value;
					}
				}
			}

			# 相手のホスト名を変数$user_IP に代入
			# （なりすまし防止などの事情で相手のＩＰを表示したい場合はこの変数を使って下さい）
			if($tmp_body=~ /user：\s([^>]*)(\s*)--/){
			    $user_IP="$1";
			    $user_IP=&tiny_decode("$user_IP"); #2002.02
			}else{
			    $user_IP="No IP info";
			}

			# 携帯の時はソース見れないので、IP出さない
			$LDATA{'body'}=~ s/<!-- user：\s([^>]*)(\s*)-->//ig;

			# テキストリンク用ＨＴＭＬ指定部に代入する$data_typeを選択
			&define_data_type_disp;

			if($LDATA{'img_location'} ne ''){
				# 画像タイトルがない場合,画像名をタイトルに
				$LDATA{'imgtitle'} = $LDATA{'img_location'} if $LDATA{'imgtitle'} eq '';
				$LDATA{'imgtitle'} =~ s/^(.*)\///;	# パスを消去して名前のみにする
	
			}



			#=============================================================#
			# CGI別ディレクトリサイト、cgiwrapサイト対策(imgboard1.22 Rev.3)
			#=============================================================#

			# 互換性のため
			if($SERVER_NAME eq ""){
				$SERVER_NAME		=$ENV{'SERVER_NAME'};
			}
			if($SERVER_NAME=~ /\.www5(.?)\.biglobe/){
				$using_cgi_wrap=1;
		        }
			if($SERVER_NAME=~ /\.arena\.ne\.jp/){
				$using_cgi_wrap=1;
			}
			if($SERVER_NAME=~ /\.interq\.or\.jp/){
				$using_cgi_wrap=1;
			}
			if($SERVER_NAME=~ /\.coara\.or\.jp/){
				$using_cgi_wrap=1;
			}

			if(($LDATA{'img_location'} =~ /^\/(.+)\/(.+)$/)||($using_cgi_wrap==1)||($keitai_flag eq "H")){
				# 絶対パス指定の場合やCGIWRAPサーバの場合、あるいはH”からの場合はURL指定に変更
				if($using_cgi_wrap==1){
					$LDATA{'img_location'}=~ s/^(.+)\///g;
				}elsif($keitai_flag eq "H"){
					$LDATA{'img_location'}=~ s/^(.+)\///g;
			    	}else{
					$LDATA{'img_location'}=~ s/^\/(.+)\///g;
			    	}
				# ある時だけ、継ぎ足す
				if($LDATA{'img_location'} ne ""){
				  $LDATA{'img_location'}="$PM{'img_url'}/$LDATA{'img_location'}";
				}
			}

	if($FORM{'mode'} eq "remove_select"){
	# 削除モード時は記事をかなり短くする
		&cut_long_kiji_for_imode("46");
	}else{
	# imodeで表示する場合に制限長より長い記事を短くする
	  if(($keitai_flag eq "imode")||($keitai_flag eq "J-PHONE")||($keitai_flag eq "EZweb")){
		# 初期設定で設定した$PM{'kiji_disp_limit_imode'}より長い場合カット
		if($KEITAI_ENV{'OTHER_PARAM'} eq "FOMA"){
		  # FOMAは余裕があるのでケチケチしない
		  &cut_long_kiji_for_imode("$PM{'kiji_disp_limit_foma'}");
		}else{
		  # 2003.03.27 add
		  if(($KEITAI_ENV{'CACHE_SIZE'} >= 10)||($ishot_flag == 1)){
		    &cut_long_kiji_for_imode(($PM{'kiji_disp_limit_imode'}*3));
		  }else{
		    &cut_long_kiji_for_imode("$PM{'kiji_disp_limit_imode'}");
		  }
		}
	  }
	}


			# 自動URLリンクをする
			if($PM{'auto_url_link'}==1){
				$LDATA{'body'}=&set_auto_url_link($LDATA{'body'});
			}

			# 自動株価リンクをする
			if($PM{'auto_quote_link'}==1){
				$LDATA{'body'}=&set_auto_quote_link($LDATA{'body'});
			}

			# メールアドレスがある場合のみリンクにする
			if($LDATA{'email'} ne " no_email"){
			  $mail_a_start	="<A HREF=\"mailto:$LDATA{'email'}\">";
			  $mail_a_end	="</A>";
			}else{
			  $mail_a_start	="";
			  $mail_a_end	="";
			}

			undef $disp_seq_no;	
			if($LDATA{'seq_no'} ne ""){
				$disp_seq_no="$LDATA{'seq_no'}";
			}

			# 2003.07 add
		  	if($keitai_flag eq "pc"){
			 if ($LDATA{$_} =~ /[\xF8\xF9]/) {
	  			 $LDATA{$_} =&remove_emoji_i("$LDATA{$_}");	 # 2002.05 add
	  		 }
			}

			# 準備終わり


	#------------------------------------------------------------------#
	# 記事部分のＨＴＭＬ(編集は初期設定部でおこなってください)

	undef $disp_re;
	undef $disp_rm_cbox;

	# R6 new
	if($FORM{'mode'} eq "remove_select"){
		undef $mes_rmid;
		# 旧連番SEP新固有IDを送る
		$mes_rmid="rmid"."$tmp_rmid"."S"."$LDATA{'unq_id'}";
		$disp_rm_cbox=qq|<INPUT TYPE="CHECKBOX" NAME="$mes_rmid" VALUE="1">\n|;
	}

	 if($new_kiji_flag ==1){
	  if($keitai_flag eq "H"){
		$disp_new_kiji=qq| ----(new)-----\n|;
	  }elsif($keitai_flag eq "EZweb"){
		$disp_new_kiji=qq|<CENTER>----(new)-----<BR>\n|;
 	  }else{
		$disp_new_kiji=qq| ----(new)-----<BR>\n|;
	  } 	  
	 }else{
	  $disp_new_kiji="";
	 }

	# R6スレッド対応
	if($child_kiji_flag == '1' ){	# 子の場合
		    if($keitai_flag eq "J-PHONE"){
		      # J-PHONEはHRの指定が無効
		      print "<BR>＞＞-----------<BR>\n";
		    }else{
		      &HR("width=\"90%\" color=gray","8");
		    }
		  print"$disp_rm_cbox";
		  print"$disp_new_kiji";
		# 返信記事（書換えは初期設定の所で行う）
		print"<BLOCKQUOTE>" if((($keitai_flag ne "EZweb")&&($keitai_flag ne "H"))&&($FORM{'mode'} ne "search_menu"));
		&kiji_base_html;# １．テキスト記事
		print"</BLOCKQUOTE>" if((($keitai_flag ne "EZweb")&&($keitai_flag ne "H"))&&($FORM{'mode'} ne "search_menu"));

	}else{				# 親の場合
		if($old_kiji_flag == '1'){# 旧形式なら返信リンクを出さない
		}else{
		    if($PM{'use_rep'} == 1 ){
			if($keitai_flag eq "EZweb"){
			 $disp_re=qq|<A TASK=GO DEST="$cgi_name?mode=disp_member_check_ez&page=$start_message&blood=$LDATA{'unq_id'}&parent=$LDATA{'seq_no'}" LABEL="$LDATA{'seq_no'}に返信">返信</a>|;
			}else{
			 $disp_re=qq|<a href="$cgi_name?mode=disp_member_check&page=$start_message&blood=$LDATA{'unq_id'}&parent=$LDATA{'seq_no'}">返信</a>|;
			}
		    }
		}
		if($PM{'use_rep'}==1){
		    &HR("size=3 color=gray","15");
		}else{
		    &HR("color=gray","15");
		}
		print"$disp_rm_cbox";
		print"$disp_new_kiji";
		&kiji_base_html;# １．テキスト記事
	}

	}# forループの終了


	# フッターを表示

	# 下部にバナー広告を義務付けられている場合は、設定部の$B_BANNER{'2'}にHTMLソースを書いてください    

	$dd_guest_passwd="$PM{'guest_passwd'}";
	$dd_guest_passwd="" if($PM{'use_guest_passwd'} =='-1');
	$dd_guest_passwd="" if(($keitai_flag eq "imode")||($keitai_flag eq "J-PHONE")||($keitai_flag eq "EZweb")||($keitai_flag eq "H"));

          &HR;


	foreach(keys %B_BANNER){
		$b_banner_num++;
	}
	$b_banner_num=1 if($b_banner_num ==0);
	$banner_num=($real_page_num % $b_banner_num);
	$banner_num=$b_banner_num if($banner_num == 0);

	if($keitai_flag eq "EZweb"){

		$B_BANNER{$banner_num}=~ s/<A(.*)(http:\/\/)(.*)\">\[(.*)\]/<A TASK=\"GO\" DEST=\"$2$3\" LABEL=\"広告リンク\">$4/gi;

	}

	if($keitai_flag ne "H"){
print<<HTML_END;
	$B_BANNER{$banner_num}
HTML_END
	}

if($FORM{'mode'} eq "remove_select"){
print<<HTML_END;
        <BR>
	<INPUT TYPE="HIDDEN" NAME="bbsaction" VALUE="remove">
	<BR>
        <INPUT TYPE="password" NAME="passwd" SIZE="6" VALUE="$dd_guest_passwd" istyle="4" MODE=numeric>
	<INPUT TYPE="SUBMIT" VALUE="削除">
	</FORM>
HTML_END
}

		print "<BR>\n" if($keitai_flag ne "H");

# 頁変更用ボタンを表示する
&disp_button;

sub disp_button{

	local($last_disp_message)="$last_message";
	local($enc_SearchWords)=$FORM{'SearchWords'};
	local($mes_p1);
	local($mes_p2);

	# 真のページ数をグローバル変数として作っておく
	if($PM{'message_per_page'} >0){
		$real_page_num=int($start_message/$PM{'message_per_page'})+1;
	}else{
		$real_page_num="1";
	}
	# お尻の位置をチェック
	if($last_message > $all_message){
	    $last_disp_message="$all_message";
	}

	# H"の時は別にする
	if($keitai_flag eq "H"){
		&H_disp_button;
		return;
	}

	print "<center>\n" if($keitai_flag ne "H");

	# ワード検索時のページ変更ボタンは検索パラメータを引きずっていく
	if($FORM{'mode'} eq "search_menu"){
		# 空白等でgetのSearchWords引数が切れないようにURLエンコードする
		$enc_SearchWords =~ s/(\W)/'%'.unpack("H2", $1)/ego;
		$mes_p1="&SearchWords=$enc_SearchWords&MatchMode=$FORM{'MatchMode'}";
		$mes_p2="ヒット";

	}else{
		undef $mes_p1;
		undef $mes_p2;
	}


	if($start_message != $last_disp_message){
# 通常
print<<HTML_END;
$start_message-$last_disp_message/$mes_p2$all_message件中<BR>
HTML_END
	}else{
# １ページに１記事しかない
print<<HTML_END;
$start_message/$mes_p2$all_message件中
HTML_END

	  print "<BR>" if($keitai_flag ne "H");
	}

	if($start_message > 1){
		$pre_message = $start_message - $PM{'message_per_page'};
		$pre_message =1 if $pre_message < 1;
		$tmp_disp_message=$start_message-1;

		if($keitai_flag eq "J-PHONE"){
		    print "<a href=\"$cgi_name?page=1&mode=$FORM{'mode'}&bbsaction=page_change$mes_p1\">\先\頭\</a>l\n";
		}elsif($keitai_flag eq "EZweb"){
		    print "<A TASK=\"GO\" DEST=\"$cgi_name?page=1&mode=$FORM{'mode'}&bbsaction=page_change$mes_p1\" LABEL=\" 記事の先頭へジャンプ \">-先頭へ</a><BR>\n";
		}elsif($keitai_flag eq "H"){
		    print "\先頭へ \n↑ $PM{'cgi_link_url'}/$cgi_name?page=1&mode=$FORM{'mode'}&bbsaction=page_change$mes_p1\n";
		}else{
		    print "<a href=\"$cgi_name?page=1&mode=$FORM{'mode'}&bbsaction=page_change$mes_p1\">\<\<先頭</a>l\n";
		}
		
		if($keitai_flag eq "EZweb"){
			print "<A TASK=\"GO\" DEST=\"$cgi_name?page=$pre_message&mode=$FORM{'mode'}&bbsaction=page_change$mes_p1\" LABEL=\"前のページへ \">-前$PM{'message_per_page'}件へ</a><BR>\n";
		}elsif($keitai_flag eq "H"){
		    print "前$PM{'message_per_page'}件へ \n ↑ $PM{'cgi_link_url'}/$cgi_name?page=$pre_message&mode=$FORM{'mode'}&bbsaction=page_change$mes_p1\n";
		}else{
			print "<a href=\"$cgi_name?page=$pre_message&mode=$FORM{'mode'}&bbsaction=page_change$mes_p1\">前$PM{'message_per_page'}件</a>\n";

		   if($all_message > $last_message){
			print "-\n"; # 前の５件と後ろの５件があるときのseparator
		   }
		}

	}else{
	}

	# 下部のページ切替えボタンのHTML
	if($all_message > $last_message){
		$next_message = $last_message+1;
		$last_disp_message=$last_message+$PM{'message_per_page'};
		if($all_message < $last_disp_message){
			$last_disp_message=$all_message;
		}

		if($keitai_flag eq "EZweb"){
		print "<A TASK=\"GO\" DEST=\"$cgi_name?page=$next_message&mode=$FORM{'mode'}&bbsaction=page_change$mes_p1\" LABEL=\"次のページへ \">-次$PM{'message_per_page'}件へ</a><BR>\n";
		}elsif($keitai_flag eq "H"){
		    print "次$PM{'message_per_page'}件へ \n ↑ $PM{'cgi_link_url'}/$cgi_name?page=$next_message&mode=$FORM{'mode'}&bbsaction=page_change$mes_p1\n";
		}else{
		print " <a href=\"$cgi_name?page=$next_message&mode=$FORM{'mode'}&bbsaction=page_change$mes_p1\">次$PM{'message_per_page'}件\>\></a>\n";
		}

	}else{
		print "    \n";
	}
	if($keitai_flag eq "EZweb"){
	  print "<BR>\n";
	}elsif($keitai_flag eq "H"){
	  print "\n";
	}else{
	  print "</center>\n";
	}
} # End of disp_button

	
	# 改造,非改造を問わず,下記クレジットの変更は固くお断りします。（著作権侵害となります）
	# なお,当スクリプトの一部,あるいは全部を利用,あるいは参考にしたスクリプトを作成された場合も,
	# かならず当リンクをその掲示板に付加してください。
	&HR;
	print "<DIV ALIGN=\"RIGHT\">" if(($keitai_flag ne "EZweb")&&($keitai_flag ne "H"));

	if($keitai_flag eq "EZweb"){
	    print "<A TASK=\"GO\" DEST=\"http:\/\/www.big.or.jp\/~talk\/welcome\/welcome_im01.cgi\" SENDREFERER=\"TRUE\" LABEL=\"無料CGIの配布元へ \">imgboardR6_b18<\/A><BR>\n";
	    print qq|iﾓｰﾄﾞ\/J\/<B>EZ</B>\/PC/Mac対応<BR>\n|;
	}elsif($keitai_flag eq "H"){
		print "FREE imgboardR6_b18!!\n";
		print qq|H”/i/J/EZ/PC対応\n|;
	}else{
	    print "FREE <A HREF=\"http:\/\/www.big.or.jp\/~talk\/welcome\/welcome_im01.cgi\">imgboardR6_b18<\/A>!!<BR>\n";

	    if($keitai_flag eq "imode"){
		print qq|<B>i</B>/J/EZ/PC対応<BR>\n|;
	    }elsif($keitai_flag eq "J-PHONE"){
		print qq|i/<B>J</B>/EZ/PC対応<BR>\n|;
	    }else{
		print qq|i/J/EZ/PC/Mac対応<BR>\n|;
	    }

	}
	print "<\/DIV><BR>\n" if(($keitai_flag ne "EZweb")&&($keitai_flag ne "H"));

} #????これは何？

	if($keitai_flag eq "EZweb"){
		print "<\/DISPLAY>\n<\/HDML>\n";
	}elsif($keitai_flag eq "H"){
	}else{
		print "<\/BODY>\n<\/HTML>\n";
	}
} #end of output_kiji_html
#
#======================================================#
# imodeで表示する場合に制限長より長い記事を短くする
#======================================================#
#
sub cut_long_kiji_for_imode{

	# 2001.10.23 EZは変に切るとコンパイルエラーになるので切らない
	return if($keitai_flag eq "EZweb");

	
	# 引数 制限長
	local($tmp_imode_kiji_disp_limit)=$_[0];	# 制限長

	local($tmp_limit);
	local($total_kiji_length);

	if($tmp_imode_kiji_disp_limit){
		$tmp_limit="$tmp_imode_kiji_disp_limit";
	}else{
		$tmp_limit='1000';
	}
	$total_kiji_length=length($LDATA{'body'})+length($LDATA{'subject'})+length($LDATA{'name'})+20;
	# 初期設定で設定した制限より長い場合 
	if(($total_kiji_length > ($tmp_limit-10))&&($tmp_limit > 10)){
#&error("aaaa total_kiji_length $total_kiji_length tmp_limit$tmp_limit");

		$LDATA{'body'}=~ s/\<\!--(\s*)user\：\s([^>]*)(\s*)--\>//g;

		# 先頭から指定バイトまでのみ残す
		$LDATA{'body'} =substr("$LDATA{'body'}",0,$tmp_limit);

		if($FORM{'mode'} eq "remove_select"){
		  $LDATA{'body'} .=" ...<font color=green>(以下略)</font></B>";
		}else{
		  $LDATA{'body'} .=" ...<font color=green>(表\示ｵｰﾊﾞ。以下略)</font></B>";
		}
	}

}
#
#===========================================================#
# テキストリンク用ＨＴＭＬ指定部に代入する$data_typeを選択
#===========================================================#

sub define_data_type_disp{

	# サムネイルがある場合はそちらを使う
	if($IMG_PARAMETERS{'snl_location'} ne ""){
#	 &define_data_type_disp2;
#	 return;
	}

	undef $data_type;
	undef $mes_type;
	# 取り扱い可能判定フラグ
	undef $can_handle_flag;# 1=OK,2=NO,3,0=不明
	undef $best_fit_type;	# 推奨タイプ

	if($LDATA{'img_location'} ne ""){

# iモードはGIFのみ表示できる
# 音声はiメロディmld
	  if($keitai_flag eq "imode"){
	   if($KEITAI_ENV{'MACHINE_TYPE'} ne "eggy"){
	    if($LDATA{'img_location'}=~ /\.(bmp|gif)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="&#63714;[$mes_type画像]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.(png)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="&#63714;[PC画像($mes_type形式)]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.(jpe?g)$/i){

# 503シリーズは一部機種でJPEGが閲覧可能
# 無駄なパケットを送らないために、iモードからのアクセスである場合、JPEG画像
# に対しては、画像リンクを作らないようにしているが、JPEGが表示できる機種なら
# リンクを作ることにする。
# 2002.09 現在
#
# JPEG対応
#      N503i,P503i
#      504/251シリーズ全機種
#      R211i,SO211i,N211i,P211i,R692i
#
# FOMA N2001,N2002,P2002,P2101V,D2101V
# SH2101V,T2101(予)
#
# JPEG非対応
#      SO503i,SO503iS,F503i,F503iS,D503,D503iS
#      D211i,F211i,etc
 
		if($KEITAI_ENV{'MACHINE_TYPE'}=~ /[N|P]503/i){
		 $data_type="&#63714;[画像(JPEG形式)]";
		 $can_handle_flag=1;
		# 504/504iS
		}elsif($KEITAI_ENV{'MACHINE_TYPE'}=~ /504/i){
		 $data_type="&#63714;[画像(JPEG形式)]";
		 $can_handle_flag=1;
		}elsif($KEITAI_ENV{'MACHINE_TYPE'}=~ /505/i){
		 $data_type="&#63714;[画像(JPEG形式)]";
		 $can_handle_flag=1;
		# 211も対応
		}elsif($KEITAI_ENV{'MACHINE_TYPE'}=~ /[N|P|SO|R]211/i){
		 $data_type="&#63714;[画像(JPEG形式)]";
		 $can_handle_flag=1;
		# 21xも対応
		}elsif($KEITAI_ENV{'MACHINE_TYPE'}=~ /21.i/i){
		 $data_type="&#63714;[画像(JPEG形式)]";
		 $can_handle_flag=1;
		# 251-iショットサービスも対応
		}elsif($KEITAI_ENV{'MACHINE_TYPE'}=~ /251i/i){
		 $data_type="&#63714;[画像(JPEG形式)]";
		 $can_handle_flag=1;
		}elsif($KEITAI_ENV{'MACHINE_TYPE'}=~ /252i/i){
		 $data_type="&#63714;[画像(JPEG形式)]";
		 $can_handle_flag=1;
		# その他の機種
		}elsif($KEITAI_ENV{'MACHINE_TYPE'}=~ /R692/i){
		 $data_type="&#63714;[画像(JPEG形式)]";
		 $can_handle_flag=1;
		# その他の機種
		}elsif($KEITAI_ENV{'MACHINE_TYPE'}=~ /F671iS/i){
		 $data_type="&#63714;[画像(JPEG形式)]";
		 $can_handle_flag=1;
		# FOMA対応
		}elsif($KEITAI_ENV{'OTHER_PARAM'} eq "FOMA"){
		 $data_type="&#63714;[画像(JPEG形式)]";
		 $can_handle_flag=1;
		}else{
		 $data_type="&#63714;[PC画像(JPEG形式)]";
		 $can_handle_flag=2;
		}
	    }elsif($LDATA{'img_location'}=~ /\.(asf)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="&#63714;[PC動画($mes_type形式)]";
		# FOMA対応(ビジュアルタイプ)
		if($KEITAI_ENV{'OTHER_PARAM'} eq "FOMA"){
		 $can_handle_flag=1;
		}else{
		 $can_handle_flag=2;
		}
	    }elsif($LDATA{'img_location'}=~ /\.(mp3|midi?|wav)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="&#63707;[PC音声($mes_type形式)]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.ram$/i){
		$data_type="[Real音声]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.wma?$/i){
		$data_type="[WinMediaAudio]";
		# FOMA対応(ビジュアルタイプ)
		if($KEITAI_ENV{'OTHER_PARAM'} eq "FOMA"){
		 $can_handle_flag=1;
		}else{
		 $can_handle_flag=2;
		}
	    }elsif($LDATA{'img_location'}=~ /\.mp4$/i){
		$data_type="[MPEG-4動画]";
		# FOMA対応(iモーション機)
		if($KEITAI_ENV{'OTHER_PARAM'} eq "FOMA"){
		 $can_handle_flag=1;
		}else{
		 $can_handle_flag=2;
		}
	    }elsif($LDATA{'img_location'}=~ /\.3gp/i){
		$data_type="[iMotion動画]";
		# FOMA対応(iモーション機)
		if($KEITAI_ENV{'OTHER_PARAM'} eq "FOMA"){
		 $can_handle_flag=1;
		}else{
		 $can_handle_flag=2;
		}
# 2003.06 追加
	    }elsif($LDATA{'img_location'}=~ /\.swf$/i){
		$data_type="[Flash形式]";
		if($KEITAI_ENV{'MACHINE_TYPE'}=~ /50[5|6]/){
		 $can_handle_flag=1;
		}else{
		 $can_handle_flag=2;
		}
	    }elsif($LDATA{'img_location'}=~ /\.smd$/i){
		$data_type="&#63707;[Jｽｶｲﾒﾛﾃﾞｨ]";
		$can_handle_flag=2;
# 2002.04 追加
	    }elsif($LDATA{'img_location'}=~ /\.vcf$|\.vcs$|\.vmg$|\.vbm$|\.vnt$/i){
		$data_type="[Jｽｶｲ VｼﾘｰｽﾞDATA]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.amc$/i){
		$data_type="[ezmovie形式]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.mng$/i){
		$data_type="[Jｽｶｲ Anime]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.noa$/i){
		$data_type="[動画 ﾑｰﾋﾞ写ﾒｰﾙ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.mmf$/i){
		# Jフォン or EZ。互換性はないらしい。
		$data_type="[着メロ(SMAF形式)]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.pmd$|\.qcp$/i){
		$data_type="&#63707;[EZ音声/きゃらメロ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.mel$|\.sml$/i){
		$data_type="&#63707;[音声]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.als$/i){
		$data_type="&#63707;[H\"(DDI-P)着メロ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.dxm$/i){
		$data_type="&#63707;[H\"(DDI-P)FeelSound]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.mld$/i){
		$data_type="&#63707;[iﾒﾛﾃﾞｨ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.txt$|\.html?$/i){
		$data_type="&#63722;[ﾃｷｽﾄ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.hdml$/i){
		$data_type="&#63722;[EZwebデータ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.pac$/i){
		$data_type="&#63814;[ﾎﾟｽﾍﾟ]";
		$can_handle_flag=2;
	    }else{
		$data_type="&#63725;[ﾃﾞｰﾀ]";
		$can_handle_flag=1;
	    }
# iモード(eggy)はGIF/JPEG/PNG/XBM表示できる
# 音声はiメロディmld
	   }else{
	    if($LDATA{'img_location'}=~ /\.(bmp|gif|png|jpe?g)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
	   	$mes_type =~ s/JPG/JPEG/;
		$data_type="&#63714;[$mes_type画像]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.(asf)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="&#63714;[動画($mes_type)]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.(mp3|midi?|wav)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="&#63707;[PC音声($mes_type形式)]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.ram$/i){
		$data_type="[Real音声]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.wma?$/i){
		$data_type="[WinMediaAudio]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.smd$/i){
		$data_type="&#63707;[Jｽｶｲﾒﾛﾃﾞｨ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.mmf$/i){
		# Jフォン or EZ。互換性はないらしい。
		$data_type="[着メロ(SMAF形式)]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.pmd$|\.qcp$/i){
		$data_type="&#63707;[EZ音声/きゃらメロ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.mel$|\.sml$/i){
		$data_type="&#63707;[音声]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.als$/i){
		$data_type="&#63707;[H\"(DDI-P)着メロ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.dxm$/i){
		$data_type="&#63707;[H\"(DDI-P)FeelSound]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.mld$/i){
		$data_type="&#63707;[iﾒﾛﾃﾞｨ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.txt$|\.html?$/i){
		$data_type="&#63722;[ﾃｷｽﾄ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.hdml$/i){
		$data_type="&#63722;[EZwebデータ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.pac$/i){
		$data_type="&#63814;[ﾎﾟｽﾍﾟ]";
		$can_handle_flag=2;
	    }else{
		$data_type="&#63725;[ﾃﾞｰﾀ]";
		$can_handle_flag=1;
	    }
	   }
	  }elsif($keitai_flag eq "J-PHONE"){
# J-PHONE
# コードを変更する場合は
# http://www.j-phone-east.com/p_and_s/sds/jskyweb/jsky_page/reference/emoji/emoji.htm を参照すること
# その携帯で扱えないデータは、うんこにする（特に意味なし。適宜変更してください（笑））
# PNG(ステーションはJPEGも)を表示できる
# smdとmmf形式の音声を扱える。
	    if($LDATA{'img_location'}=~ /\.(bmp|gif)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="\x1b\$Gz\x0f[PC/iﾓｰﾄﾞ画像($mes_type形式)]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.png$/i){
		$data_type="\x1b\$G(\x0f[PNG画像]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.jpe?g$/i){
		if($jstation_flag >= 3){
		  $data_type="\x1b\$G(\x0f[JPEG画像]";
		  $can_handle_flag=1;
		}else{
		  $data_type="\x1b\$Gz\x0f[PC画像(JPEG形式)]";
		  $can_handle_flag=2;
		}
	    }elsif($LDATA{'img_location'}=~ /\.(mp3|midi?|wav)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="\x1b\$Gz\x0f[PC音声($mes_type形式)]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.(asf)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="\x1b\$Gz\x0f[PC動画($mes_type形式)]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.ram$/i){
		$data_type="\x1b\$Gz\x0f[Real音声]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.wma?$/i){
		$data_type="\x1b\$Gz\x0f[WinMediaAudio]";
		$can_handle_flag=2;
# 2003.06 追加
	    }elsif($LDATA{'img_location'}=~ /\.swf$/i){
		 $data_type="[505i-Flash形式]";
		 $can_handle_flag=2;
# 2002.04 追加
	    }elsif(($LDATA{'img_location'}=~ /\.vcf$|\.vcs$|\.vmg$|\.vbm$|\.vnt$/i)&&($jstation_flag <= 3)){
		$data_type="[Jｽｶｲ VｼﾘｰｽﾞDATA]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.vcf$/i){
		$data_type="[Jｽｶｲ vCard File]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.vcs$/i){
		$data_type="[Jｽｶｲ vCalendar File]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.vmg$/i){
		$data_type="[Jｽｶｲ vMessage File]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.vmg$/i){
		$data_type="[Jｽｶｲ vMessage File]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.vbm$/i){
		$data_type="[Jｽｶｲ vBookmark File]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.vnt$/i){
		$data_type="[Jｽｶｲ vNote File]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.amc$/i){
		$data_type="[ezmovie形式]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.mng$/i){
		$data_type="[Jｽｶｲ Anime]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.noa$/i){
		$data_type="[動画 ﾑｰﾋﾞ写ﾒﾙ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.mmf$/i){
		# Jフォン or EZ。互換性はないらしい。
		$data_type="[着メロ(SMAF形式)]";
		$can_handle_flag=1;

	    }elsif($LDATA{'img_location'}=~ /\.pmd$|\.qcp$/i){
		$data_type="\x1b\$Gz\x0f[EZ音声/きゃらメロ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.mld$/i){
		$data_type="\x1b\$Gz\x0f[iﾒﾛﾃﾞｨ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.als$/i){
		$data_type="\x1b\$Gz\x0f[H\"(DDI-P)着メロ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.dxm$/i){
		$data_type="\x1b\$Gz\x0f[H\"(DDI-P)FeelSound]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.mel$|\.sml$/i){
		$data_type="\x1b\$Gz\x0f[音声]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.smd$|\.mmf$/i){
		$data_type="\x1b\$G^\x0f[Jｽｶｲﾒﾛﾃﾞｨ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.txt$|\.html?$/i){
		$data_type="\x1b\$Eh\x0f[ﾃｷｽﾄ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.hdml$/i){
		$data_type="\x1b\$Gz\x0f[EZwebデータ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.pac$/i){
		$data_type="\x1b\$Gz\x0f[ﾎﾟｽﾍﾟ]";
		$can_handle_flag=2;
	    }else{
		$data_type="\x1b\$E<\x0f[ﾃﾞｰﾀ]";
		$can_handle_flag=1;
	    }
	  }elsif($keitai_flag eq "EZweb"){
# EZweb(AU &TU-KA)はBMPとPNGのみ表示できたが、最近は
# BMP非対応になりPNG,JPEG対応になっている。
# WAP・・・は仕様がメチャメチャで困る。
# OPENWAVEが悪いのか？

	    if($LDATA{'img_location'}=~ /\.(jpe?g)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
	   	$mes_type =~ s/JPG/JPEG/;
		$data_type="[画像($mes_type形式)]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.(gif)$/i){
# WAP2.0機はGIF対応
# A3015SA,A3014S,A3013T,A3012CA,A3011SA,C5001T,C3003P,C3001H
		if($KEITAI_ENV{'EZ_WAP_VER'}=~ /2\.0/i){
		 $data_type="[画像(GIF形式)]";
		 $can_handle_flag=1;
		}else{
		 $data_type="[画像(GIF形式)]";
		 $can_handle_flag=2;
		}
	    }elsif($LDATA{'img_location'}=~ /\.(png)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="[$mes_type画像]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.(bmp)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$can_handle_flag=1;
		$data_type="[$mes_type画像]";
	    }elsif($LDATA{'img_location'}=~ /\.(mp3|midi?|wav)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="[PC音声($mes_type形式)]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.(asf)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="[PC動画($mes_type形式)]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.ram$/i){
		$data_type="[Real音声]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.wma?$/i){
		$data_type="[WinMediaAudio]";
		$can_handle_flag=2;
# 2003.06 追加
	    }elsif($LDATA{'img_location'}=~ /\.swf$/i){
		 $data_type="[505i-Flash形式]";
		 $can_handle_flag=2;
# 2002.04 追加
	    }elsif($LDATA{'img_location'}=~ /\.vcf$|\.vcs$|\.vmg$|\.vbm$|\.vnt$/i){
		$data_type="[Jｽｶｲ VｼﾘｰｽﾞDATA]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.amc$/i){
		$data_type="[ezmovie形式]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.mng$/i){
		$data_type="[Jｽｶｲ Anime]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.noa$/i){
		$data_type="[動画 ﾑｰﾋﾞ写ﾒｰﾙ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.mmf$/i){
		# Jフォン or EZ。互換性はないらしい。
		$data_type="[着メロ(SMAF形式)]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.pmd$|\.qcp$/i){
		$data_type="[EZ音声/きゃらメロ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.mld$/i){
		$data_type="[iﾒﾛﾃﾞｨ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.als$/i){
		$data_type="[H\"(DDI-P)着メロ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.dxm$/i){
		$data_type="[H\"(DDI-P)FeelSound]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.mel$|\.sml$/i){
		$data_type="[音声]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.smd$|\.mmf$/i){
		$data_type="[Jｽｶｲﾒﾛﾃﾞｨ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.txt$|\.html?$/i){
		$data_type="[ﾃｷｽﾄ]";
		$can_handle_flag=2;
	    }elsif($LDATA{'img_location'}=~ /\.hdml$/i){
		$data_type="[EZwebデータ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.pac$/i){
		$data_type="[ﾎﾟｽﾍﾟ]";
		$can_handle_flag=2;
	    }else{
		$data_type="[ﾃﾞｰﾀ]";
		$can_handle_flag=1;
	    }
	  }else{
	  # PCから（デモ画面用 半角カタカナを使用しない）
	    if($LDATA{'img_location'}=~ /\.(png|bmp|gif|jpe?g)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
	   	$mes_type =~ s/JPG/JPEG/;
		$data_type="[$mes_type画像]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.(asf)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="[動画($mes_type形式)]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.ram$/i){
		$data_type="[Real音声]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.wma?$/i){
		$data_type="[WinMediaAudio]";
		$can_handle_flag=1;
# 2003.06 追加
	    }elsif($LDATA{'img_location'}=~ /\.swf$/i){
		 $data_type="[505i-Flash形式]";
		 $can_handle_flag=1;
# 2002.04 追加
	    }elsif($LDATA{'img_location'}=~ /\.vcf$|\.vcs$|\.vmg$|\.vbm$|\.vnt$/i){
		$data_type="[Jｽｶｲ VｼﾘｰｽﾞDATA]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.amc$/i){
		$data_type="[ezmovie形式]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.mng$/i){
		$data_type="[Jｽｶｲ Anime]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.noa$/i){
		$data_type="[動画 ﾑｰﾋﾞ写ﾒﾙ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.mmf$/i){
		# Jフォン or EZ。互換性はないらしい。
		$data_type="[着メロ(SMAF形式)]";
		$can_handle_flag=1;

	    }elsif($LDATA{'img_location'}=~ /\.(mp3|midi?|wav)$/i){
		$mes_type="$1";
	   	$mes_type =~ tr/a-z/A-Z/;
		$data_type="[$mes_type音声]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.smd$/i){
		$data_type="[Jスカイメロディ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.pmd$|\.qcp$/i){
		$data_type="[EZ音声/きゃらメロ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.mld$/i){
		$data_type="[iメロディ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.als$/i){
		$data_type="[H\"(DDI-P)着メロ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.dxm$/i){
		$data_type="[H\"(DDI-P)FeelSound]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.mel$|\.sml$/i){
		$data_type="[音声]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.txt$|\.html?$/i){
		$data_type="[テキスト]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.hdml$/i){
		$data_type="[EZwebデータ]";
		$can_handle_flag=1;
	    }elsif($LDATA{'img_location'}=~ /\.pac$/i){
		$data_type="[おやつ]";
		$can_handle_flag=1;
	    }else{
		$data_type="[データ]";
		$can_handle_flag=1;
	    }
	  }
	}
}
#
#=====================================================#
# その他のサブルーチン
#=====================================================#

#=========================#
# フォームのチェック
#=========================#

sub form_check{

	local($crypt_RH)=$REMOTE_HOST;

	foreach $form(sort keys %FORM){

		# フォームの整形
		# タグ禁止の場合
		if($PM{'use_html_tag_in_comment'} !=1){
			$FORM{$form} =~ s/</&lt;/g;		# タグ禁止
			$FORM{$form} =~ s/>/&gt;/g;		# タグ禁止


			# Style指定	禁止
			$FORM{$form} =~ s/style(\s*)=(.|\n)*/
			Sorry..You can not use style in comment./ig;

		}else{
		# タグ許可の場合

# (掲示板イタズラ対策) 各種危険タグを除去

if(($FORM{$form}=~ /</)||($FORM{$form}=~ />/)){
# タグがあった場合のみチェックする(高速化)
$FORM{$form} =~ s/<!--(.|\n)*-->//g;			# SSI等	除去
$FORM{$form} =~ s/<IM(A?)G(E?)(\s|\n)*SRC(.|\n)*\.(cgi|pl)(\s*)>/ig
Sorry..You can not load IMG tag CGI in comment./ig;	# IMGタグ CGI	除去
$FORM{$form} =~ s/<(\/?)COMMENT(.|\n)*>(\s*)(\n?)/
Sorry..You can not use COMMENT tag in comment./ig;	# COMMENTタグ	除去
$FORM{$form} =~ s/<(\/?)FORM(.|\n)*>(\s*)(\n?)/
Sorry..You can not use FORM tag in comment./ig;		# FORM		除去

# imodeではマーキーが良く使われるということと、Netscapeのシェアが2割以下に
# なっていることから、マーキーを許可することに変更します(2000.4)
#$FORM{$form} =~ s/<(\/?)MARQUEE(.|\n)*>(\s*)(\n?)/
#Sorry..You can not use MARQUEE tag in comment./ig;	# マーキー	除去
$FORM{$form} =~ s/<(\/?)A(.|\n)*tel\:(.|\n)*>(\s*)(\n?)/
Sorry..You can not use auto-tel tag in comment./ig;	# 自動電話アンカー除去
$FORM{$form} =~ s/<(\/?)INPUT(.|\n)*>(\s*)(\n?)/
Sorry..You can not use FORM element tag in comment./ig;# FORM要素	除去
$FORM{$form} =~ s/<(\/?)SELECT(.|\n)*>(\s*)(\n?)/
Sorry..You can not use FORM element tag in comment./ig;# SELECTタグ	除去
$FORM{$form} =~ s/<(\/?)script(.|\n)*>(\s*)(\n?)/
Sorry..You can not use SCRIPT tag in comment./ig;	# Javascript,VBscript 除去
$FORM{$form} =~ s/<(\/?)OBJECT(.|\n)*>(\s*)(\n?)/
Sorry..You can not use OBJECT tag in comment./ig;	# OBJECT(ActiveX) 除去
$FORM{$form} =~ s/<(\/?)applet(.|\n)*>(\s*)(\n?)/
Sorry..You can not use JAVA in comment./ig;		# APPLET 除去
$FORM{$form} =~ s/<META(.+)Refresh(.|\n)*>(\s*)(\n?)//ig;#METAタグ飛ばし禁止
$FORM{$form} =~ s/<(\/?)EMBED(.+)SRC(.|\n)*>(\s*)(\n?)/
Sorry..You can not use EMBED tag in comment./ig;	# EMBEDタグ	除去
$FORM{$form} =~ s/<(\/?)SERVER(.|\n)*>(\s*)(\n?)/
Sorry..You can not use SERVER tag in comment./ig;	# SERVERタグ	除去
$FORM{$form} =~ s/<(\/?)plaintext(.|\n)*>(\s*)(\n?)/
Sorry..You can not use plaintext tag in comment./ig;	# PLAINTEXTタグ	除去
$FORM{$form} =~ s/<(\/?)xmp(.|\n)*>(\s*)(\n?)/
Sorry..You can not use xmp tag in comment./ig;		# XMPタグ	除去
$FORM{$form} =~ s/<(\/?)strike(.|\n)*>(\s*)(\n?)/
Sorry..You can not use strike tag in comment./ig;	# STRIKEタグ	除去
$FORM{$form} =~ s/<s>/
Sorry..You can not use strike tag in comment./ig;	# STRIKEタグ	除去
$FORM{$form} =~ s/<(\/?)listing(.|\n)*>(\s*)(\n?)/
Sorry..You can not use listing tag in comment./ig;	# LISTINGタグ	除去
$FORM{$form} =~ s/<(\/?)BODY(.|\n)*>(\s*)(\n?)/
Sorry..You can not use BODY tag in comment./ig;		# BODYタグ	除去
$FORM{$form} =~ s/<(\/?)TITLE(.|\n)*>(\s*)(\n?)/
Sorry..You can not use TITLE tag in comment./ig;	# TITLEタグ	除去
$FORM{$form} =~ s/<(\/?)BASEFONT(.|\n)*>(\s*)(\n?)/
Sorry..You can not use BASEFONT tag in comment./ig;	# BASEFONTタグ	除去
$FORM{$form} =~ s/<(\/?)frame(.|\n)*>(\s*)(\n?)/
Sorry..You can not use FRAME tag in comment./ig;	# FRAMEタグ	除去
$FORM{$form} =~ s/<(\/?)HTML(.|\n)*>(\s*)(\n?)/
Sorry..You can not use HTML tag in comment./ig;		# HTML閉タグ	除去
$FORM{$form} =~ s/(\/?)COMMENT(.|\n)*>(\s*)(\n?)/
Sorry..You can not use COMMENT tag in comment./ig;	# COMMENTタグ	除去
	}
# タグがあってもなくても調べる
unless(($form eq "body")||($form eq "subject")||($form eq "viewmode")||($form eq "name")){
$FORM{$form} =~ s/style(\s*)=(.|\n)*/
Sorry..You can not use style in tag on comment./ig;	# Style指定	禁止
$FORM{$form} =~ s/(.|\n)*onLoad(\s*)\=/ig
Sorry..You can not use char onLoad in comment./ig;	# onLoad	除去
$FORM{$form} =~ s/(.|\n)*onClick(\s*)\=/ig
Sorry..You can not use char onClick in comment./ig;	# onClick	除去
}
#危険タグ除去ここまで
			# IMGタグの埋込みを可否？
			if($PM{'use_img_tag_in_comment'} !=1){
				$FORM{$form} =~ s/<IM(A?)G(E?)(\s|\n)*SRC(.|\n)*>(\s*)(\n?)/Sorry..You can not use IMG tag in comment./ig;#IMGタグ除去
			}else{
			# IMGタグを埋込む場合は外部画像画像であることを明記する。
				if(($form eq 'body')&&($FORM{$form}=~ /<IMA?GE?(\s)*SRC(.*)>/i)){
					$FORM{$form} =~ s/ALT(\s)*=(\s)*\"(.+)\"/ /ig;	#ALT除去
					$FORM{$form} =~ s/ALT(\s)*=(\s)*([^>]+)/ /ig;	#ALT除去
					$FORM{$form} =~ s/border(\s)*=(\s)*([^>]+)/ /ig;#Border除去
					$FORM{$form} =~ s/<IMA?GE?\s*SRC\s?=\s*(\S*)(\s*)>/<IMG SRC=$1 ALT="この画像は外部ＷＷＷサーバの画像です" Border=0>外部画像 /ig;
				}
			}
		}
		$FORM{$form} =~ s/\r//g;		#CR除去
		$FORM{$form} =~ s/\n/<BR>/g;		#LFを<BR>に
		$FORM{$form} =~ s/\t//g;		#TABの除去
	}

	# フォームの値を代入
	$name      	= "$FORM{'name'}";
	$email     	= "$FORM{'email'}";
	$subject   	= "$FORM{'subject'}";
	$body      	= "$FORM{'body'}";
	$rmkey		= "$FORM{'rmkey'}";
	$imgtitle 	= "$FORM{'imgtitle'}";
	$img_location	= "$PM{'img_dir'}/$new_fname" if $new_fname ne '';
	$viewmode	= "$FORM{'viewmode'}";
	$memberID	= "$FORM{'memberID'}";

	#<フォームの有無のチェック>
	# 基本的にチェックする。ただし、プロファイル登録だけを行う
	# ユーザの場合は名前やemailをチェックしない。
	if($FORM{'bbsaction'} ne 'pf_change'){
		&check_form_data_exist;
	}
        # 各パラメータは空にならないようにする
	$name	 =' 無名 '      if $name eq '';
	$email   =' no_email'   if $email eq '';
	$subject =' 無題 '      if $subject eq '';
	$body    =' 本文なし '  if $body eq '';
	$rmkey  ='no_key'  	if $rmkey eq '';
	$memberID='9999'	if $memberID eq '';

        # 新パラメータ
	if($keitai_flag ne "pc"){
	  $FORM{'optKeitaiFlag'}			="$keitai_flag";
	  $FORM{'optKeitaiServiceCompany'}	="$KEITAI_ENV{'SERVICE_COMPANY'}";
	  $FORM{'optKeitaiHttpVersion'}		="$KEITAI_ENV{'HTTP_VERSION'}";
	  $FORM{'optKeitaiMachineType'}		="$KEITAI_ENV{'MACHINE_TYPE'}";
	  $FORM{'optKeitaiOtherParam'}		="$KEITAI_ENV{'OTHER_PARAM'}";
	  $FORM{'optKeitaiMelodyType'}		="$KEITAI_ENV{'MELODY_TYPE'}";
	}

# 追加項目に未記入の場合のデフォルト値は以下の書き方を参考にしてください
#	$FORM{'optA'} =' 無題 '      if $FORM{'optA'} eq '';

	# 本文にユーザ情報を含める
	# 暗号化
	if($KEITAI_ENV{'SERIAL_LONG'} ne ""){
		$crypt_RH="$KEITAI_ENV{'SERIAL_LONG'}"."-KSN-"."$KEITAI_ENV{'SERIAL_SHORT'}";
	}
 	if($crypt_RH ne ""){
		$crypt_RH=&tiny_encode("$crypt_RH");
	}
	$body    = "$body<!-- user： $crypt_RH-->";


        # いたずら防止 (99/12/01 追加分)
        $email   =~ s/"/&quot;/g;
        $email   =~ s/style(\s*)=(.|\n)*//ig;

	undef $p_key;	
	foreach $p_key(keys %FORM){
		if($p_key=~ /opt_data/){
			$FORM{$p_key}=~ s/style(\s*)=(.|\n)*//ig;
			$FORM{$p_key}=~ s/"/&quot;/g;
		}
	}


}
#=======================#
# パスワード整合チェック
#=======================#
#
# 引数1 = チェックしたいパスワード
# 引数2 = 暗号化済み（かもしれない）パスワード
# 返値  = 一致=1, 不一致=0
sub check_pass{

	local($guess, $pass) = @_;
	local($crypt_guess);
	local($crypt_pass);

	$crypt_guess	=&make_pass("$guess");
	$crypt_pass	=&make_pass("$pass");

	if($crypt_guess eq "$crypt_pass"){
		return(1);
	}else{
		return(0); # 外れたら失敗
	}
}
#
#========================#
# 暗号化パスワードを作成
#========================#
#
sub make_pass{

	local($plain) = @_;# 引数
	local($salt);
	local($tmp_pass);

	$salt="$ENV{'PROCESSOR_REVISION'}"."$plain";

	if($plain=~ /^ZzZ/){	# 2重暗号化を防ぐ
		$tmp_pass = "$plain";
	}else{
		$tmp_pass = crypt($plain, $salt);
		$tmp_pass = "ZzZ"."$tmp_pass";
	}
	return ($tmp_pass);

}
#
sub tiny_encode{
	local($plain) = @_;# 引数
	 return($plain) if($plain=~ /\,/);
  	 $plain =~ s/n/\,/ig;
    	 $plain =~ tr/a-m/b-n/;
   	 $plain =~ tr/A-M/B-N/; # 2002.12 自宅サーバ対応で追加
  	 $plain =~ s/\,/a/ig;
   	 $plain =~ s/4/\,/g;
    	 $plain =~ tr/0-3/1-4/;
  	 $plain =~ s/\,/0/g;
 	 $plain ="T-Enc"."$plain";
	 return($plain);
}

sub tiny_decode{
	local($plain) = @_;# 引数
	 if($plain=~ /T-Enc(.*)$/){
	  $plain = $1;
	  $plain =~ s/a/\,/ig;
    	  $plain =~ tr/b-n/a-m/;
   	  $plain =~ tr/B-N/A-M/; # 2002.12 自宅サーバ対応で追加
  	  $plain =~ s/\,/n/ig;
   	  $plain =~ s/0/\,/g;
    	  $plain =~ tr/1-4/0-3/;
  	  $plain =~ s/\,/4/g;
	 }
	 return($plain);
}
#
#=========================================================#
#   <あるunq_idの記事を一つ呼び出す（記事修正機能用）>    #
#=========================================================#
#
sub load_target_data{

	local($t_pattern)=$FORM{'target'};
	local($found_number)=0;

	undef @T_MESSAGE;
	local ($t_message);

	# データ読込み
	&read_file_data("$PM{'file'}");

	undef $match_count;
	undef @SEP_DATA;
	foreach (@MESSAGE){

		$tmpdata 	= $_;	# 全体データを保存
		@SEP_DATA 	= split(/\t/,"$_");	# 切断して配列に入れる

	#	@IM122R6DATA=('subject','name','email','date','body','img_location','imgtitle','seq_no','blood_name','rmkey','unq_id','permit','other');

		$i=0;
		foreach $p_key(@IM122R6DATA){ # init_valiablesで定義
			$LDATA{$p_key}=$SEP_DATA[$i];
			$i++;
		}

		if($LDATA{'unq_id'} eq "$t_pattern"){
				push(@T_MESSAGE, $_);
				last; # ループから抜ける
		}
	}

	$found_number=@T_MESSAGE;

	if($found_number != 1){
		&error(" ターゲットデータ探索異常。探索unq_id $t_pattern 発見数$found_number");
	}

	# ターゲットのデータをクッキーに代入してフォームに表示して見せる

	$LDATA{'subject'}=&Dec_EQ("$LDATA{'subject'}");

	# 予備入力項目パラメータを復元
	# bodyの中に、コメントアウト形式でデータは隠し保存されている
	# 書式<!--opt:パラメータ名=値;パラメータ名2=値2・・・-->
	#<!--opt:と-->を除きパラメータ部を抽出する処理
	if($LDATA{'body'} ne ''){
		($LDATA{'body'},$opt_form_data)	=split(/<\!--opt:/,$LDATA{'body'});
		$opt_form_data			=~ s/-->//g;
	}

	$LDATA{'body'}=~ s/\<!-- user：\s([^>]*)(\s*)--\>//g;

	#パラメータ$opt_form_dataが追加されている場合．
         undef %OPTDATA;

	if($opt_form_data ne ''){
		foreach ( split(/;/,$opt_form_data)){
			local($name,$value) = split(/\=/);
			$value=&Dec_EQ("$value");
			$OPTDATA{$name}	= $value;
			$COOKIE{$name}		="$value";
		}
	}
	$COOKIE{'subject'}	="$LDATA{'subject'}";
	$COOKIE{'name'}		="$LDATA{'name'}";
	$COOKIE{'email'}	="$LDATA{'email'}";
	$COOKIE{'body'}		="$LDATA{'body'}";
}
#
#=========================================================#
#   <あるblood_nameの記事群を呼び出しバッファに入れる>    #
#=========================================================#
#
# 返信時の参照記事を表示するために使う
sub load_family_data{

# 引数は親の unq_id(blood_name)で有り、そのblood_nameを持つ記事は
# @T_MESSAGEに入って返される。

	local($t_pattern)=$FORM{'target'};
	local($found_number)=0;
	local($tmp_find_flag)=0;

	undef @T_MESSAGE;
	local ($t_message);

	# データ読込み
	&read_file_data("$PM{'file'}");

	undef $match_count;
	undef @SEP_DATA;
	foreach (@MESSAGE){

		$tmpdata 	= $_;	# 全体データを保存
		@SEP_DATA 	= split(/\t/,"$_");	# 切断して配列に入れる

	#	@IM122R6DATA=('subject','name','email','date','body','img_location','imgtitle','seq_no','blood_name','rmkey','unq_id','permit','other');

		$i=0;
		foreach $p_key(@IM122R6DATA){ # init_valiablesで定義
			$LDATA{$p_key}=$SEP_DATA[$i];
			$i++;
		}

		if(($tmp_find_flag==0)&&($LDATA{'unq_id'} eq "$t_pattern")){
			$tmp_find_flag=1;
			push(@T_MESSAGE, $_);
		}elsif(($tmp_find_flag==1)&&($LDATA{'blood_name'} eq "$t_pattern")){
				push(@T_MESSAGE, $_);
		}
	}

	$found_number=@T_MESSAGE;
	return($found_number);
}
#
#====================#
# METHODのチェック
#====================#
#
# GETに投稿を受け付けない。(ただしJSKYのみ可能)
# あと$PM{'no_upload_from_pc'} ==1の場合はPCから投稿させない。
#
sub check_form_method{

	local($mes_p1,$mes_p2)=@_;	# 引数 エラーメッセージ

  	if($ENV{'REQUEST_METHOD'} ne 'POST'){
		# GETの時
	  	if(($keitai_flag eq "J-PHONE")&&($jstation_flag < 3)){
		#  Ｊフォンでかつ、ＪＳＫＹの時だけ特別にGETを認める
		}else{
		  &error("$mes_p1<BR>$mes_p2");
		}
	}
	# $PM{'no_upload_from_pc'} ==1の場合はPCから投稿させない。
	&check_upload_from_pc;

}
#
#====================#
# PCチェック
#====================#
#
# $PM{'no_upload_from_pc'} ==1の場合はPCから投稿させない。
#
sub check_upload_from_pc{

	if($PM{'no_upload_from_pc'} ==1){
	  	if(($keitai_flag eq "imode")||($keitai_flag eq "J-PHONE")||($keitai_flag eq "EZweb")){
			# 投稿できます
		}else{
			&error(" エラー 現在の設定では、携帯からしか投稿を受け付けないようになっています。<BR> PCから投稿する場合は管理者に<a href=\"$PM{'cgi_hontai_name'}\">imgboard本体($PM{'cgi_hontai_name'})</a>のアクセス先URLを聞き、そのURLから投稿してください ");
		}
	}else{
		# 投稿できます
	}
}
#
#====================#
# 記事データの修正
#====================#

sub replace_data{

	local($target_tid)=@_;	# 引数 ターゲットのID
	local($tmp_rmkey);	# 記事に設定されていた削除キー
	local($tmp_crypt_rmkey)=$FORM{'rmkey'};	# 暗号化する削除キー

	if($PM{'use_crypt'} ==1 ){
		$tmp_crypt_rmkey=&make_pass($tmp_crypt_rmkey);
	}

	# ●セキュリティチェック
 	&check_form_method(" セキュリティ警告 "," GETによる記事投稿は受け付けません ");

	# ●フォームの内容をチェック
	&form_check;

	if($error_message ne ''){
		&set_cookies;		# クッキーをセット(120Rev5以降)
		&error($error_message);
		exit;
	}

	# セパレータとして問題あるものを、事前に置換
	$subject=&Enc_EQ("$subject");

	undef $tmp_data;

	foreach $p_key(keys %FORM){
		if($p_key=~ /^opt(.+)$/){
			$tmp_data=&Enc_EQ($FORM{$p_key});
			$opt_data.="opt_data_"."$1"."\="."$tmp_data"."\;";
			undef $tmp_data;
		}
	}

	$all_message=0;

	# データ読込み
	&read_file_data("$PM{'file'}");

	undef $match_count;
	undef @SEP_DATA;
	foreach (@MESSAGE){

	       if(($_=~ /$target_tid/)&&($match_count < 1)){

			$match_count++;

			undef @SEP_DATA;
			undef %LDATA;

#	@IM122R6DATA=('subject','name','email','date','body','img_location','imgtitle','seq_no','blood_name','rmkey','unq_id','permit','other');

			$tmpdata 	= $_;	# 全体データを保存

			@SEP_DATA 	= split(/\t/,"$_");	# 切断して配列に入れる

			$i=0;
			foreach $p_key(@IM122R6DATA){ # init_valiablesで定義
				$LDATA{$p_key}=$SEP_DATA[$i];
				$i++;
			}

	# ●新しいメッセージを作る（imgboard1.22R6.1新形式）
#	$new_message = "$subject\t$name\t$email\t$date_data\t$body<\!--opt\:$opt_data-->\t$img_location\t$imgtitle<\!--dsize=$img_data_size;type=$IMGSIZE{'type'};width=$IMGSIZE{'width'};height=$IMGSIZE{'height'};hw_racio=$IMGSIZE{'hw_racio'};-->\t$new_seq_no\t$FORM{'blood'}\t$rmkey\t$unq_id\t$permit\t$other";


#&error("$subject $target_tid mc $match_count 9 $LDATA{'rmkey'}");

			# 上書きするものはここで上書き代入
			# 前のデータ保存をそのまま保存するものはコメントアウト

			$LDATA{'subject'}	="$subject";
			$LDATA{'name'}		="$name";
			$LDATA{'email'}		="$email";
#			$LDATA{'date'}		="$date_data";
			$LDATA{'body'}		="$body<\!--opt\:$opt_data-->";
#			$LDATA{'img_location'}	="$img_location";
#			$LDATA{'imgtitle'}	="$imgtitle<\!--dsize=$img_data_size;type=$img_type;width=$img_width;height=$img_height;hw_racio=$img_hw_racio;-->";
#			$LDATA{'seq_no'}	="$new_seq_no";
#			$LDATA{'blood_name'}	="$FORM{'blood'}";
#			$LDATA{'rmkey'}		="$rmkey";
#			$LDATA{'unq_id'}	="$unq_id";
#			$LDATA{'permit'}	="";
#			$LDATA{'other'}		="";

			# 結合して復元する
			foreach(@IM122R6DATA){
				$new_message.="$LDATA{$_}"."\t";
			}
			push(@TMPMESSAGE, $new_message);
		}else{
			push(@TMPMESSAGE, $tmpdata);
		}# end of if

	} #end of foreach

	$tmp_rmkey="$LDATA{'rmkey'}";

	# パスワードをチェック
	if(($tmp_rmkey eq "$FORM{'rmkey'}")||($PM{'admin_passwd'} eq "$FORM{'rmkey'}")||($tmp_rmkey eq "$tmp_crypt_rmkey")||($PM{'admin_passwd'} eq "$tmp_crypt_rmkey")){
#		&error("一致しました。既削除キー $tmp_rmkey 入力されたパスワード$FORM{'rmkey'} ");
	}else{
		&error("パスワードが違います。","記事の修正には投稿時に入力したパスワードが必要です。<BR>再度パスワードを入力してください ");
	}


	# データ書き出し開始
	# 書き出し前にバッファに入れる
	undef @TMP_MESSAGE;

	@TMP_MESSAGE	=@TMPMESSAGE;

	# 書き出し処理
	&write_file_data("$PM{'file'}");
#&error("$subject $target_tid mc $match_count");

}

#===============================#
# フォームの入力項目のチェック
#===============================#

sub check_form_data_exist{
#

	if(($PM{'form_check_name'}==1)&&($name eq '')){
		$error_message .= "名前がありません。<BR>";
	}
	if(($PM{'form_check_email'}==1)&&($email eq '')){
		$error_message .= "emailがありません。現在の設定ではemailは必須項目となっています。<BR>";
	}
	if(($PM{'form_check_subject'}==1)&&($subject eq '')){
		$error_message .= "題名がありません。<BR>";
	}
	if(($PM{'form_check_body'}==1)&&($body eq '')){
		$error_message .= "本文がありません。<BR>";
	}
	if(($PM{'form_check_img'}==1)&&($img_data_exists != '1')){
		$error_message .= "添付画像がありません。<BR>";
	}
	if(($PM{'form_check_rmkey'}==1)&&($rmkey eq '')){
		$error_message .= "削除キーがありません。<BR>";
	}
# 追加項目に未記入の場合の警告メッセージは、以下の「optX」等の部分を適宜
# 書き換えてください

	if(($PM{'form_check_optA'}==1)&&($FORM{'optA'} eq '')){
		$error_message .= "optA がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optB'}==1)&&($FORM{'optB'} eq '')){
		$error_message .= "optB がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optC'}==1)&&($FORM{'optC'} eq '')){
		$error_message .= "optC がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optD'}==1)&&($FORM{'optD'} eq '')){
#		$error_message .= " アイコン選択がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optE'}==1)&&($FORM{'optE'} eq '')){
		$error_message .= " 携帯番号がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optF'}==1)&&($FORM{'optF'} eq '')){
		$error_message .= "optF がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optG'}==1)&&($FORM{'optG'} eq '')){
		$error_message .= "optG がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optH'}==1)&&($FORM{'optH'} eq '')){
		$error_message .= " optH がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optI'}==1)&&($FORM{'optI'} eq '')){
		$error_message .= " optI がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optJ'}==1)&&($FORM{'optJ'} eq '')){
		$error_message .= " optJ がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optK'}==1)&&($FORM{'optK'} eq '')){
		$error_message .= " optK がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optL'}==1)&&($FORM{'optL'} eq '')){
		$error_message .= "optL がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optM'}==1)&&($FORM{'optM'} eq '')){
		$error_message .= "optM がありません。<BR>";# 予備
	}
	if(($PM{'form_check_optN'}==1)&&($FORM{'optN'} eq '')){
		$error_message .= " optN がありません。<BR>";# 予備
	}
}

#==========================================#
# フォームの入力項目の省略可・必須を自動表示
#==========================================#

sub auto_omit_disp{

	# パラメータデフォルトを指定
	if($PM{'auto_disp_omit_frag'} ne '1'){
		$PM{'auto_disp_omit_frag'}=0;
	}

	local($html_h)="*"; # 必須の場合
	local($html_s)="";  # 省略可能な場合

	if($PM{'auto_disp_omit_frag'} eq "1"){

		foreach(keys %PM){
		    if($_ =~ /^form_check_(.+)$/){
			if($PM{$_}==1){
			  $DISP_OMIT{$1} .="$html_h";
		    	}else{
			  $DISP_OMIT{$1} .="$html_s";
		        }
		    }
		}
	}
}

#============================#
# 登録会員キーチェック
#============================#

sub check_entrypass{

	local($tmp_entrypass)=$FORM{'entrypass'};
 
	if($PM{'use_crypt'} == 1){
		$tmp_entrypass=&make_pass("$tmp_entrypass");
	}

	# ２バイト文字が入り、コンパイルエラーになる現象を防ぐ
	if($FORM{'entrypass'}=~ /[\x80-\x9f\xe0-\xff]/){
	  $FORM{'entrypass'}="";
	  &error(" エラー 会員パスに日本語は使えません "," 4ケタ以内の半角数字に限られます ");
	}

	if($FORM{'memberID'}=~ /[\x80-\x9f\xe0-\xff]/){
	  $FORM{'memberID'}="";
	  &error(" 入力エラー。常連番号は4ケタ以内の半角数字に限られます。 "," 日本語は使わないでください ");
	}


	# 会員キーチェック
	if($PM{'use_post_password'}==1){
	 if($FORM{'entrypass'} eq "$PM{'post_passwd'}"){
		return;	# OK
	 }elsif($tmp_entrypass eq "$PM{'post_passwd'}"){
		return;	# OK
	 }else{
		&error(" 会員ﾊﾟｽﾜﾄﾞ（数字）が違います．投稿できませんでした．<BR>(詳細)携帯からの投稿の場合、ユーザを特定する手段がないため、掲示板に対する連続投稿いたずら等を防げません。そのため、携帯からの投稿には会員パスワドが必須となっています。携帯ユーザの方は、掲示板管理者から会員パスワドを教えてもらってください ");
	 }
	}
}

#=======================================#
# 掲示板荒し対策２(1.22Rev6 機能強化版)
#=======================================#

sub protect_from_BBS_cracker{
#
# （悪質掲示板荒らし対策です）
#
# 大幅機能追加(1.22 Rev4)
# 名前、禁止単語による制限機能を追加しました。ホスト名を頻繁に変更する
# 相手等、高度な「荒し技」を持つ相手からのイタズラが続く場合に、これを
# 使ってください。 リストは初期設定のところにあります。

	undef $bad_user_flag;
	local($error_mes_bl);
	local($error_mes_type);
	local($w_pattern);

	# デフォルトのダミーエラーメッセージ
	$error_mes_bl="CGI error 223458 BLT Default";


	#外部のブラックリストファイル（禁単語）を読込む
	if(($use_ext_blacklist ==1)&&($PM{'no_upload_by_black_word'}==1)){
		$add_black_word_count=&load_ext_list('blkword.txt','BLACK_WORD');
	}

 	# 投稿時以外(view時など)は、ホスト名以外のフィルタはスキップして負荷軽減（ここから）
	if($FORM{'bbsaction'} eq 'post'){

	# 既に検出している場合はスキップして高速化
	if(($bad_user_flag!=1)&&($PM{'no_upload_by_black_word'}==1)){

	  foreach (@BLACK_WORD){

	    $w_pattern="$_";
	    $w_pattern=~ s/\s//g;
	    $w_pattern=~ s/　//g;

	    if($w_pattern ne ""){
		$blkw_count++;
		#記事すべての項目をチェックする
		local(@ALL_ITEM)=('body','name','subject','email','imgtitle','optA');
		local($ttt_form)="";
		foreach $form(@ALL_ITEM){
		        $ttt_form = $FORM{"$form"};
			$ttt_form =~ s/\s//g;
			$ttt_form =~ s/　//g;
			if (index($ttt_form,$w_pattern) >= 0){
				$error_mes_type="black_word";
				$bad_user_flag=1;
				last;# 検出したら抜ける
			}
		}
	    }
	  }
	}


	# 問題点を検出した場合の処理
	if($bad_user_flag==1){
		# ダミーのエラーメッセージを出す
		if($error_mes_type eq "black_word"){
			# 設定で指定している場合はそれを使う。ないならデフォルト	
			if($PM{'error_message_to_black_word'} ne ""){
				$error_mes_bl="$PM{'error_message_to_black_word'}";
			}
		}
       	&error("$error_mes_bl $blkw_count<!--abwc $add_black_word_count-->");
	}

	}	# 投稿時以外(view時など)は、ホスト名以外のフィルタはスキップ（ここまで）
}

# 外部リストをロードする部品

sub load_ext_list{

	local($list_fname)	= $_[0];	# リストの名前
	local($array_name)	= $_[1];	# 配列の名前
	local($add_count)	= 0;		# リストから追加された項目数

	if(-e "$list_fname"){
	open(IN, "$list_fname")|| &error("設定エラー．ファイル\"$list_fname\"を読込めません．処理は中断されました．");
	eval "flock(IN,1);" if($PM{'flock'} == 1 );
		while(<IN>){
			if($_ =~ /^([^#])(.*)$/){	#コメントアウトは除く
				if($_ =~ /^(\s*)(\S+)(\s*)(\#?)(.*)$/){
					# Perl4でも動く書き方にする（長くなるけど）
					if($array_name eq 'BLACK_LIST'){
# 携帯非対応					push(@BLACK_LIST, $2);
					}elsif($array_name eq 'BLACK_WORD'){
						push(@BLACK_WORD, $2);
					}
					$add_count++;
				}
			}
		}
	eval "flock(IN,8);" if($PM{'flock'} == 1 );
	close(IN);
	}
	return($add_count);	# リストから追加された項目数
}

sub change_pattern_match{

	# 正規表現をPerlパターンマッチへ変換

	local($d_pattern)	= $_[0];
	$d_pattern=~ s/\s|\r|\n|\;|\)//g;	# 念のため
	$d_pattern=~ s/\./\\./g;
	$d_pattern=~ s/\?/\./g;
	$d_pattern=~ s/\*/\.\*/g;
	$d_pattern=~ s/P_TAIL$/\$/i;
	$d_pattern=~ s/P_END$/\$/i;
	$d_pattern=~ s/^P_HEAD/\^/i;
	$d_pattern=~ s/P_SPACE/\\s/i;
	return($d_pattern)
}


#============================#
# ＪＵＭＰ用ＨＴＭＬ
#============================#

sub jump_html{

	local($mes_01)	= $_[0];	# メッセージを引数として取得
	local($mes_02)	= $_[1];	# メッセージを引数として取得
	local($cgin01)	= "$cgi_name";
	&output_Content_type; 

	# 返信時にページを記憶する
	if(($FORM{'page'} ne "")&&($FORM{'bbsaction'} eq "post")&&($FORM{'prebbsaction'} eq "disp_rep_form")){
		$cgin01="$cgin01"."?page=$FORM{'page'}";
# レスを上に持って行く設定の場合スレッドが先頭へ行くので、先頭へジャンプ
		if($PM{'res_go_up'} == 1){
			$cgin01="$cgin01"."?page=1";
		}
	}

	if($keitai_flag eq "EZweb"){
	# wap対応

print<<EOF;
<HDML VERSION="3.0" TTL="0">
<DISPLAY name="index" TITLE="確認メッセージ">
<ACTION type="accept" task="gosub" DEST="#2ndmes" label="次へ">
$mes_01<BR>
</DISPLAY>

<DISPLAY name="2ndmes">
<ACTION type="accept" task="noop" DEST="#inmemid" label=" ">
$mes_02<BR>
<A TASK="GO" LABEL="GO" DEST="$cgi_name?t=$sec&bbsaction=postjump">TOPへ戻る</a><BR>
 
</DISPLAY>
</HDML>
EOF

	}elsif($keitai_flag eq "H"){

	}else{

print<<EOF;
<HTML>
<HEAD>
 <TITLE>wait..</TITLE>
 <META HTTP-EQUIV="Refresh" CONTENT="5; URL=$cgin01">
</HEAD>
<BODY BGCOLOR="#D0D0D0">
[Imgboard - Mes]<BR>

 $mes_01 $mes_02 <BR>
$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}" accesskey=0>掲示板へ戻る</a>
</BODY>
</HTML>

EOF

	}
}


#============================#
# エラーの出力
#============================#

sub error{

	local($error_message)	= $_[0];	# メッセージを引数として取得
	local($error_message2)	= $_[1];	# メッセージを引数として取得
	local($lform_action);

	if($keitai_flag eq "imode"){
		$lform_action="$ENV{'HTTP_REFERER'}";
	}elsif($keitai_flag eq "J-PHONE"){
		$lform_action="$cgi_name";
	}elsif($keitai_flag eq "EZweb"){
		$lform_action="$cgi_name";
	}else{
		$lform_action="$ENV{'HTTP_REFERER'}";
	}

	&output_Content_type; 

	if($keitai_flag eq "EZweb"){
	# wap対応

print<<EOF;
<HDML VERSION="3.0" TTL="0">
<DISPLAY TITLE="Error">
<ACTION type="accept" task="noop" label=" ">
<ACTION type="soft1" task="prev" label="１つ前">
<ACTION type="soft2" task="go" dest="$cgi_name?t=$sec&bbsaction=errorjump" label="中止">
<CENTER>imgboard<BR>
<CENTER>--エラーです--<BR>
<A TASK="GO" LABEL=" 戻る " DEST="$cgi_name?t=$sec&bbsaction=errorjump">TOPへ戻る</a><BR> 
<A TASK="RETURN" LABEL=" 再入力 ">再入力する</a><BR> 
$error_message<BR>
/
$error_message2<BR>
</DISPLAY>
</HDML>
EOF

	}elsif($keitai_flag eq "H"){

	}else{

print<<EOF;
<HTML>
<HEAD>
<TITLE>Error</TITLE>
</HEAD>

<BODY BGCOLOR=\"#D0D0D0">
<CENTER>
from imgbd.<BR>
 [ｴﾗｰです] 
</CENTER>
<BR>
$error_message<BR>/
$error_message2<BR>
<FORM METHOD="GET" ACTION="$lform_action">
<INPUT TYPE="HIDDEN" NAME="page" VALUE=1>
<INPUT TYPE="SUBMIT" VALUE=" 戻る "> 
</FORM>
</BODY>
</HTML>
EOF

	}

	&rm_tmp_uploaded_files;			# 一時保存された画像データを削除
	exit;
}

#===================================#
# 一時登録された画像ファイルの削除
#===================================#
# asx/asf対応(2001.01)
sub rm_tmp_uploaded_files{
	if($img_data_exists==1){
		sleep 1;
		foreach $fname_list(@NEWFNAMES){
			if(-e "$PM{'img_dir'}/$fname_list"){
				unlink("$PM{'img_dir'}/$fname_list");
				# メタファイルも削除する
				&rm_meta_file("$PM{'img_dir'}/$fname_list");
			}
			# 携帯用ファイルも削除する
			if($fname_list=~ /\.(jpe?g|gif|png|bmp|mng)$/i){
				  &rm_snl_file("$unq_id","$PM{'img_dir'}","$existing_snl_type_list");
			}
		}
	}
}

#===================================#
# ASX メタファイルの削除
#===================================#
# Winodows Mediaのストリーム再生やeggyのストリーム再生対応のために
# 機能拡張した。 削除するファイルがメタファイルを持っていそうな
# 名前だったらメタファイルらしきファイルを探し、もしあれば消しておく
sub rm_meta_file{

	local($tmp_rm_meta_file)=$_[0]; # 引数は削除するファイル名本体（パス付き）

	# asx等に対応
	if($tmp_rm_meta_file=~ /^(.*)\.(asf|wma|wmv?)$/){
	   if(-e "$1\.asx"){
		unlink("$1\.asx");# ASF(古い表記の仕方)
	   }
	   if(-e "$1\.wax"){
		unlink("$1\.wax");# ASF&WinMediaAudio(一時的に使われた)
	   }
	   if(-e "$1\.wvx"){
		unlink("$1\.wvx");# ASF&WinMediaAudio/Video(現在はこれが推奨らしい)
	   }
	}
}

#===================================#
# ASFストリーム用メタファイルの出力
#===================================#
# ASF/Winodows MediaのASXへ対応
# eggy等のために、メタファイルを動的に出力する
#
sub output_meta_file_HTML{

	local($tmp_rm_meta_file)=$_[0]; # 引数1はファイル名本体
	local($tmp_moreinfo)	=$_[1]; # 引数2はジャンプ先
	local($tmp_author)	=$_[2]; # 引数3は作者名
	local($tmp_copyright)	=$_[3]; # 引数4は著作権者


	if($tmp_moreinfo eq ""){
		$tmp_moreinfo="$HTTP_REFERER";
	}

	# ＵＲＬ指定しないといけないので、ＵＲＬを作る

	# $PM{'img_url'}を作る
	if($PM{'img_url'} eq 'http://あなたのプロバイダ/あなたのディレクトリ/img-box'){
		&error(" 設定エラー ストリーム再生をする場合、img_urlの指定は必須となります ");
	}

	# 画像の相対パスからファイル名だけ切り出す
	$tmp_rm_meta_file=~ s/^(.+)\///g;
	if($tmp_rm_meta_file=~ /^\.\/(.*)$/){
		$tmp_rm_meta_file="$1";
	}

	# この段階で$tmp_rm_meta_fileはファイル名だけになっている
	# $PM{'img_url'}にそのファイル名をくっつける
	$tmp_rm_meta_file="$PM{'img_url'}/$tmp_rm_meta_file";


	# asx対応(WindowsMedia Platform SDKによると、最近は本当は
	# wvxでasf,wma,wmvを全部兼用できるみたいだけど・・古いパソコンや
	# 古いMIME設定のWWWサーバを使っている人が困るだろうから細かく分け
	# ておくことにする （詳細はhttp://msdn.microsoft.com/library/psdk/wm_media/wmplay/mmp_sdk/metafileextensionguidelines.htm を参照してください）

	if($tmp_rm_meta_file=~ /^(.*)\.(asf)$/){
		print "Content-type: video/x-ms-asf\n\n";
#		print "Content-type: application/mplayer2\n\n";
	# wax対応(Windows Media Audio対応)
	}elsif($tmp_rm_meta_file=~ /^(.*)\.(wma)$/){
		print "Content-type: audio/x-ms-wax\n\n";
	# wvx対応(Windows Media Video対応)
	}elsif($tmp_rm_meta_file=~ /^(.*)\.(wmv)$/){
		print "Content-type: video/x-ms-wvx\n\n";
	}

# METAファイルのエレメントを自分で変更したい人は以下のURLを参照すれば情報があります
# http://msdn.microsoft.com/library/psdk/wm_media/wmplay/mmp_sdk/windowsmediametafileelementsreference.htm

print<<HTML_END;
<ASX version ="3.0">
<Entry>
<TITLE>ストリーム$tmp_rm_meta_file</TITLE>
<MOREINFO HREF="$tmp_moreinfo"/>
<!-- 上のタイトルないの文字列はWMPの表示というところに表示されます。Moreinfoで記述するHREFはこのタイトルをクリックした場合の飛び先になります。  -->

<BANNER HREF="http://www.big.or.jp/~talk/t-club/icon/l_icon3.gif">
    <ABSTRACT>Click here to get this CGI.</ABSTRACT>
    <MOREINFO HREF="http://www.big.or.jp/~talk/welcome/welcome3.cgi" />
</BANNER>
<!-- このバナーは変更しないで下さい -->


<AUTHOR>$tmp_author</AUTHOR>
<!-- 作成者で表示する文字列 -->

<COPYRIGHT>$tmp_copyright</COPYRIGHT>
<!-- 著作権で表示する文字列 -->

<REF HREF="$tmp_rm_meta_file"/>

<!-- REF HREFで指定するURLはストリームのソースである"http://xxxx/xxx.asf"とします。  -->

</Entry>
</ASX>
HTML_END
exit;

}

#========================================#
# EZ用画像埋め込みHDMLの出力
#========================================#
# EZでダウンロードできるように、動的に埋め込みHDMLを出力する
#
sub output_EZ_img_HTML{

	local($tmp_rm_meta_file)=$_[0]; # 引数1はファイル名本体
	local($tmp_img_dir)	="img-box"; # 画像保存ディレクトリ名(デフォルト)
	local($mes_p1)		="";

	if($tmp_moreinfo eq ""){
		$tmp_moreinfo="$HTTP_REFERER";
	}

	# ＵＲＬ指定しないといけないので、ＵＲＬを作る

	# $PM{'img_url'}を作る
	if($PM{'img_url'} eq 'http://あなたのプロバイダ/あなたのディレクトリ/img-box'){
		&error(" 設定エラー EZで画像や着メロを再生をする場合、img_urlの指定は必須となります ");
	}

	# 画像の相対パスからファイル名だけ切り出す
	$tmp_rm_meta_file=~ s/^(.+)\///g;
	if($tmp_rm_meta_file=~ /^\.\/(.*)$/){
		$tmp_rm_meta_file="$1";
	}

	# この段階で$tmp_rm_meta_fileはファイル名だけになっている
	# $PM{'img_url'}にそのファイル名をくっつける
	$tmp_rm_meta_file="$PM{'img_url'}/$tmp_rm_meta_file";

	if($tmp_rm_meta_file=~ /^(.*)\.(pmd)$/){
		$mes_p1=qq| 着メロぉ♪ |;
	}elsif($tmp_rm_meta_file=~ /^(.*)\.(mmf)$/){
		$mes_p1=qq| 着メロぉ♪ |;
	}elsif($tmp_rm_meta_file=~ /^(.*)\.(qcp)$/){
		$mes_p1=qq| 着メロぉ♪ |;
	}else{
		$mes_p1=qq| 画像 |;
	}

print<<HTML_END;
<HDML VERSION="3.0" MARKABLE="TRUE">
<DISPLAY NAME="melo" TITLE="$mes_p1">
<ACTION TYPE="SOFT1" TASK="PREV" LABEL="戻る">
<ACTION TYPE="ACCEPT" TASK="NOOP" LABEL=" ">
<CENTER>
 <IMG SRC="$tmp_rm_meta_file" alt=NowLoading...>
</DISPLAY>
</HDML>
HTML_END
exit;

}
#
#  管理メニュー(ワード検索メニュー)用のＨＴＭＬです．
#
sub ez_output_search_menu_HTML{

	local($mes_p1);

	if($FORM{'MatchMode'} eq "OR"){
		$mes_p1=" IDEFAULT=2";
	}

print<<HTML_END;
<HDML VERSION="3.0" TTL="0">
<DISPLAY NAME="index" TITLE="ワード検索">
<ACTION type="accept" task="go" dest="#SELM" label="次へ">
<ACTION type="soft1" task="prev" label="１つ前">
<CENTER>--ワード検索--<BR>
記事の全文検索を行います。検索ワードを入力します。<BR>
</DISPLAY>

<CHOICE NAME="SELM" METHOD=NUMBER $mes_p1>
<CE TASK=GO DEST="#inAD">AND検索(通常)
<CE TASK=GO DEST="#inOR">OR検索
</CHOICE>

<ENTRY name="inAD" key="SearchWords" default="$COOKIE{'SearchWords'}">
<ACTION type="accept" task="go" dest="$cgi_name?t=$sec" label="検索実行" method="post" postdata="mode=search_menu&MatchMode=AND&SearchWords=\$SearchWords">
<ACTION type="soft2" task="prev" label="１つ前">
ワード入力。複合のワードを入力する場合は半角スペースで各単語を区切<BR>
</ENTRY>

<ENTRY name="inOR" key="SearchWords" default="$COOKIE{'SearchWords'}">
<ACTION type="accept" task="go" dest="$cgi_name?t=$sec" label="検索実行" method="post" postdata="mode=search_menu&MatchMode=OR&SearchWords=\$SearchWords">
<ACTION type="soft2" task="prev" label="１つ前">
ワード入力。複合のワードを入力する場合は半角スペースで各単語を区切<BR>
</ENTRY>

</HDML>
HTML_END
}
#
sub ez_output_search_menu_HTML2{
print<<HTML_END;
</HDML>
HTML_END
}
#
#=============================#
# 携帯用ファイルの削除(R7)
#=============================#
#
# 将来の全携帯対応を考えて拡張子は
# いろいろできるようにしておく
#
sub rm_snl_file{

	local($tmp_rm_snl_unq_id)	=$_[0]; # 引数1はUID
	local($tmp_rm_snl_dir)		=$_[1]; # 引数2はパス
	local($tmp_rm_snl_exist_type)	=$_[2]; # 引数3はSNL存在リスト

	local($snl_future_bit);		# 携帯用ファイル名の将来拡張ビット
	local($snl_ext);		# 携帯用ファイルの実際の拡張子

	$tmp_rm_snl_unq_id="snl"."$tmp_rm_snl_unq_id";

	 @SNL_TYPE=split(/\//,$tmp_rm_snl_exist_type);

	if($tmp_rm_snl_exist_type ne ""){
	   foreach $snl_type(@SNL_TYPE){
	    	($snl_ext,$snl_future_bit,$dummy)=split(/\-/,$snl_type);
		if(-e "$tmp_rm_snl_dir/$tmp_rm_snl_unq_id$snl_future_bit\.$snl_ext"){
			unlink("$tmp_rm_snl_dir/$tmp_rm_snl_unq_id$snl_future_bit\.$snl_ext");
		}
	   }
	}
}
#
#====================#
# ブラウザチェック
#====================#

sub check_browser_type{

	if($HTTP_USER_AGENT=~ /icab/i){
	  # icabで投稿するとエラーになるので排除する
	  if($FORM{'bbsaction'} eq 'post'){
	    &error(" エラー このブラウザでは記事の投稿はできません ");
	  }
	}

	$jstation_flag	="1";	# ステーション、パケット対応機フラグ(Ｊフォン)
	$ishot_flag	="0";	# i-shot判別(0=不明,1以上 i-shot)

	$http_upload_ok_flag	="0";# HTTPアップロード対応フラグ(R7 NEW)
	$file_attach_mail	="0";# メールに添付ファイル可能機種(R7 NEW)

	undef @TMP_UA;
# kame

# 動作チェック
#$HTTP_USER_AGENT="DoCoMo/1.0/D501i";
#$HTTP_USER_AGENT="DoCoMo/1.0/F503iS/c10";
#$HTTP_USER_AGENT="DoCoMo/1.0/SH251i/c10";
#$HTTP_USER_AGENT="DoCoMo/2.0 D2101V(c100)";
#$HTTP_USER_AGENT="DoCoMo/2.0 F2051(c100;TB)";
#$HTTP_USER_AGENT="DoCoMo/1.0/F504i/c10/TB";
#$HTTP_USER_AGENT="DoCoMo/1.0/N504iS/c10/TB";

#$HTTP_USER_AGENT="L-mode//1.0/AT/PSTN101/5120/4000/";
#$HTTP_USER_AGENT="L-mode//2.0/AT/PSTN101/5120/4000/1605800440/1/102000200";

#$HTTP_USER_AGENT="ASTEL/1.0/J-0511.00/c10/smel";
#$HTTP_USER_AGENT="UP.Browser/3.04-SN13 UP.Link/3.3.0.5";
#$HTTP_USER_AGENT="KDDI-HI21 UP.Browser/6.0.2.254(GUI) MMP/1.1";
#$HTTP_USER_AGENT="PDXGW/1.0 (TX=8;TY=7;GX=96;GY=84;C=C256;G=BF;GI=2)";
#$HTTP_USER_AGENT="J-PHONE/2.0/J-SH02";
#$HTTP_USER_AGENT="J-PHONE/4.0/J-SH51/SNxxxxx SH/0001a Profile/MIDP-1.0 Configuration/CLDC-1.0 Ext-Profile/JSCL-1.1.0";
#$HTTP_USER_AGENT="L-mode//1.0////";



	@TMP_UA = split(/\//,$HTTP_USER_AGENT);

	# FOMA対応(2002.09.25)
	# http://www.nttdocomo.co.jp/p_s/imode/spec/useragent.html

	if($HTTP_USER_AGENT=~ /DoCoMo\/2\.0\s(\w+)\(c(\d+)/i){

	  $keitai_flag="imode";
	  $KEITAI_ENV{'SERVICE_COMPANY'}	='DoCoMo';
	  $KEITAI_ENV{'HTTP_VERSION'}		='2.0';
	  $KEITAI_ENV{'MACHINE_TYPE'}		="$1";
	  $KEITAI_ENV{'CACHE_SIZE'}		="$2"; # KB(N2001以外は100KB)
	  $KEITAI_ENV{'STREAM_SPEED'}		="";
	  $KEITAI_ENV{'OTHER_PARAM'}		="FOMA";

	  $http_upload_ok_flag	="0";
	  $file_attach_mail	="1";
	  $handle_data_line	="png-jpeg-gif";

	}elsif($TMP_UA[0]=~ /DoCoMo/i){

	  $keitai_flag="imode";
	  $KEITAI_ENV{'SERVICE_COMPANY'}	=$TMP_UA[0];
	  $KEITAI_ENV{'HTTP_VERSION'}		=$TMP_UA[1];
	  $KEITAI_ENV{'MACHINE_TYPE'}		=$TMP_UA[2];
	  $KEITAI_ENV{'CACHE_SIZE'}		=$TMP_UA[3];
	  $KEITAI_ENV{'STREAM_SPEED'}		=$TMP_UA[4];
	  $KEITAI_ENV{'OTHER_PARAM'}		=$TMP_UA[5];

	  $KEITAI_ENV{'CACHE_SIZE'}		=~ s/c//ig;#cを除去

	  if($KEITAI_ENV{'CACHE_SIZE'} eq ""){
	    $KEITAI_ENV{'CACHE_SIZE'}		=5; # 501の時はキャッシュは5KB
	  }

	  # 2002.12 i-shot判別を追加(2003.06修正)
	  if($KEITAI_ENV{'MACHINE_TYPE'}=~ /504iS|505i|506i/i){
		$ishot_flag=1;
	  }elsif($KEITAI_ENV{'MACHINE_TYPE'}=~ /25.i/i){
		$ishot_flag=1;
	  # 2701対応(i-shot,FOMAハイブリッド機)
	  }elsif($KEITAI_ENV{'MACHINE_TYPE'}=~ /270./i){
		$ishot_flag=1;
	  }

	  $http_upload_ok_flag	="0";
	  $file_attach_mail	="0";
	  $handle_data_line	="gif";

	}elsif($TMP_UA[0]=~ /L\-mode/i){

	  $keitai_flag="imode";
	  $KEITAI_ENV{'SERVICE_COMPANY'}	="NTT";
	  $KEITAI_ENV{'HTTP_VERSION'}		=$TMP_UA[2];
	  $KEITAI_ENV{'MACHINE_TYPE'}		=$TMP_UA[4];
	  $KEITAI_ENV{'CACHE_SIZE'}		=$TMP_UA[5];
	  $KEITAI_ENV{'OTHER_PARAM'}		="L-mode"."$KEITAI_ENV{'HTTP_VERSION'}";

	  $KEITAI_ENV{'CACHE_SIZE'}		=int($KEITAI_ENV{'CACHE_SIZE'}/1024);

	  $http_upload_ok_flag	="0";
	  $file_attach_mail	="0";
	  if($KEITAI_ENV{'HTTP_VERSION'} eq "1.0"){
	    # 第一世代端末
	    $handle_data_line	="gif";
	  }else{
	    # 高度化端末
	    $handle_data_line	="jpeg-gif";
	  }

	}elsif($TMP_UA[0]=~ /ASTEL/i){

	  # アステルのドットiはほぼimode互換である。
	  $keitai_flag="imode";
	  $KEITAI_ENV{'SERVICE_COMPANY'}=$TMP_UA[0];
	  $KEITAI_ENV{'HTTP_VERSION'}	=$TMP_UA[1];
	  $KEITAI_ENV{'MACHINE_TYPE'}	=$TMP_UA[2];
	  $KEITAI_ENV{'OTHER_PARAM'}	=$TMP_UA[3];
	  $KEITAI_ENV{'MELODY_TYPE'}	=$TMP_UA[4];

	  $KEITAI_ENV{'OTHER_PARAM'}		="dot-i";
	  $handle_data_line			="png-gif";


	}elsif($TMP_UA[0]=~ /UP\.Browser/i){

	# ブラウザ名/ブラウザバージョン-デバイスID UP.Link/UP.Linkバージョン
	# UP.Browser/3.04-SN12 UP.Link/3.3.0.1 みたいなパターン
	# KDDI-HI21 UP.Browser/6.0.2.252(GUI) MMP/1.1   # EZ次世代(実機)
	# HI21 UP.Browser/6.0.2.273(GUI) MMP/1.1   	# EZ次世代(Sim)

	  $keitai_flag="EZweb";
	  local($tmp_ez_mc);
	  local($tmp_ez_cc);
	  local($tmp_ez_ver);

	  # WRAP2.0機(GIF/PNG)を検出する
	  $tmp_ez_ver =substr("$TMP_UA[1]",0,3);
	  if($tmp_ez_ver >= 6.0){
		$KEITAI_ENV{'EZ_WAP_VER'}='2.0';
	  	if($TMP_UA[0]=~ /^(KDDI)\-(..)(.)(.+)\s(.*)$/i){
			$tmp_ez_mc = $2;# 機種コード
			$tmp_ez_cc = $3;# キャリアコード
	  	}elsif($TMP_UA[0]=~ /^(..)(.)(.+)\s(.*)$/i){
			$tmp_ez_mc = $1;# 機種コード
			$tmp_ez_cc = $2;# キャリアコード
		}
	  }else{
		$KEITAI_ENV{'EZ_WAP_VER'}='1.0';
		if($TMP_UA[1]=~ /(.*)\-(..)(.)(.+)\s(.*)$/i){
			$tmp_ez_mc = $2;# 機種コード
			$tmp_ez_cc = $3;# キャリアコード
		}
	  }

	  # 機種コード
	   if($tmp_ez_mc eq "SY"){
	   	$KEITAI_ENV{'MACHINE_TYPE'}="SANYO";
	   }elsif($tmp_ez_mc eq "CA"){
	   	$KEITAI_ENV{'MACHINE_TYPE'}="CASIO";
	   }elsif($tmp_ez_mc eq "TS"){
	   	$KEITAI_ENV{'MACHINE_TYPE'}="東芝";
	   }elsif($tmp_ez_mc eq "HI"){
	   	$KEITAI_ENV{'MACHINE_TYPE'}="日立";
	   }elsif($tmp_ez_mc eq "MA"){
	   	$KEITAI_ENV{'MACHINE_TYPE'}="松下";
	   }elsif($tmp_ez_mc eq "KC"){
	   	$KEITAI_ENV{'MACHINE_TYPE'}="KYOSERA";
	   }elsif($tmp_ez_mc eq "DN"){
	   	$KEITAI_ENV{'MACHINE_TYPE'}="DENSO";
	   }else{
	   	$KEITAI_ENV{'MACHINE_TYPE'}="";
	   }

	   # キャリアコード
	   if($tmp_ez_cc eq "I"){
	   	$KEITAI_ENV{'SERVICE_COMPANY'}="au"; # IDO
	   }elsif($tmp_ez_cc eq "T"){
	   	$KEITAI_ENV{'SERVICE_COMPANY'}="TU-KA";
	   }elsif($tmp_ez_cc eq "C"){
	   	$KEITAI_ENV{'SERVICE_COMPANY'}="au"; # セルラー
	   }elsif($tmp_ez_cc eq "0"){
	   	$KEITAI_ENV{'SERVICE_COMPANY'}="au"; # cdmaOne
	   }elsif($tmp_ez_cc eq "1"){
	   	$KEITAI_ENV{'SERVICE_COMPANY'}="au"; # cdmaOne
	   }elsif($tmp_ez_cc eq "2"){
	   	$KEITAI_ENV{'SERVICE_COMPANY'}="au"; # cdmaOne
	   }elsif($tmp_ez_cc eq "G"){
	   	$KEITAI_ENV{'SERVICE_COMPANY'}="UP.Simulator"; # UP.Simulator
	   }else{
	   	$KEITAI_ENV{'SERVICE_COMPANY'}="";
	   }

	   $KEITAI_ENV{'HTTP_VERSION'}=$TMP_UA[2];

	   # 受信バイト数
	   $KEITAI_ENV{'MAX_TEXT'}="$ENV{'HTTP_X_UP_DEVCAP_MAX_PDU'}";
	   $KEITAI_ENV{'MAX_TEXT'}="1492" if($KEITAI_ENV{'MAX_TEXT'} eq "");
	   # EZwebの場合,１．４KBと制限が低いので、１ページの記事数を２つに減らす
	   if(($KEITAI_ENV{'MAX_TEXT'} < 2000)&&($PM{'message_per_page'} > 4)&&($KEITAI_ENV{'EZ_WAP_VER'} ne "2.0")){
	     $PM{'message_per_page'}=2;
	   }
	   if($PM{'message_per_page'} >= 4){
		# コンパイルエラー1019(文字数オーバ)対策 2002.05
	     $PM{'message_per_page'}=4;
	   }
	   $KEITAI_ENV{'MACHINE_TYPE'}="$KEITAI_ENV{'SERVICE_COMPANY'}"."-"."$KEITAI_ENV{'MACHINE_TYPE'}"."-"."WAP"."$KEITAI_ENV{'EZ_WAP_VER'}";




#	$ENV{'HTTP_X_UP_SUBNO'}="0123456789_c7.ezweb.ne.jp";

	  # iクッキー用の番号をサブスクライバーIDより作成
	  $KEITAI_ENV{'UP_SUBNO'}=$ENV{'HTTP_X_UP_SUBNO'};
	  # 0123456789_c7.ezweb.ne.jp のような形式が入る
	  if($ENV{'HTTP_X_UP_SUBNO'}=~ /^.+(\d{4,4})_/i){
	  	$KEITAI_ENV{'UP_SHORT_SUBNO'}=$1;
		$KEITAI_ENV{'SERIAL_SHORT'}=$1;
		$KEITAI_ENV{'SERIAL_LONG'}=$ENV{'HTTP_X_UP_SUBNO'};
	  }else{
#	  	$KEITAI_ENV{'MACHINE_TYPE'}="UP.sim";
	  }

	  # 2003.02 改良
	  if($ENV{'HTTP_X_UP_FAX_ACCEPTS'} eq 'none'){
		# ez@mail対応機を検出 (Thanks to CGIぽん)
		# au 400/1000系
		# tu-ka 最近の機種全部
	  	$KEITAI_ENV{'EZ_MAIL'}="1";
	  }


	  $http_upload_ok_flag	="1";	# どうもできるらしい
	  $file_attach_mail	="1";	# 現在販売されているものは全機種ＯＫ

	}elsif(($TMP_UA[0]=~ /PDXGW\/(.*)GI\=(\d)/i)||($TMP_UA[0]=~ /Ginga\/(.*)GI\=(\d)/i)){

	  # H",feel H"
	  $keitai_flag="H";
	  $KEITAI_ENV{'SERVICE_COMPANY'}="DDIPocket";
	  if($2 >= 2){
		$KEITAI_ENV{'MACHINE_TYPE'}="feelH";
	  }else{
		$KEITAI_ENV{'MACHINE_TYPE'}="H";
	  }

  	}elsif($TMP_UA[0]=~ /J-PHONE/i){

		# http://www.dp.j-phone.com/terminal/index.html
	  	$keitai_flag="J-PHONE";
	  	$KEITAI_ENV{'MACHINE_TYPE'}=$ENV{'HTTP_X_JPHONE_MSNAME'};

		$http_upload_ok_flag	="0";	# 基本的にできない
	  	$file_attach_mail	="1";	# 基本的にできる

	  	$KEITAI_ENV{'SERVICE_COMPANY'}=$TMP_UA[0];
	  	$KEITAI_ENV{'HTTP_VERSION'}=$TMP_UA[1];
	  	$KEITAI_ENV{'OTHER_PARAM'}=$TMP_UA[3];
	   	if($KEITAI_ENV{'HTTP_VERSION'} >= 4){
			# パケット対応機
			$jstation_flag="4";
			$KEITAI_ENV{'CACHE_SIZE'}='12';
			$handle_data_line	="png-jpeg-gif-mng";

			# iクッキー用の番号をシリアル番号より作成
	  		# SNXXXXXXXXX SH のような形式が入る
	  		if($KEITAI_ENV{'OTHER_PARAM'} =~ /^SN(.+)(\d{4,4})\s/i){
	  			$KEITAI_ENV{'SERIAL_LONG'}="$1"."$2";
	  			$KEITAI_ENV{'SERIAL_SHORT'}=$2;
	  		}

			$http_upload_ok_flag	="1"; # 51系は直接アップ可能

		}elsif($KEITAI_ENV{'HTTP_VERSION'} >= 3){
			# ステーション対応機
			$jstation_flag="3";
			$KEITAI_ENV{'CACHE_SIZE'}='6';
			$handle_data_line	="png-jpeg";
		}else{
			$KEITAI_ENV{'CACHE_SIZE'}='6';
			$handle_data_line	="png";
		}
	}else{
	  # PC
	  $keitai_flag="pc";
	  $http_upload_ok_flag	="1";
	  $file_attach_mail	="1";
	  $handle_data_line	="jpeg-gif-png-bmp";
	  $KEITAI_ENV{'CACHE_SIZE'}='100';
	}

	# デバック用に携帯フラグを強制セットする
	# imode,J-PHONE,FOMAを指定、PCモード強制はpcを指定
	if($debug_mode >= 3){
	  if($PM{'keitai_force_set'} ne ""){
		if($PM{'keitai_force_set'} eq "eggy"){
			$keitai_flag="imode";
			$KEITAI_ENV{'MACHINE_TYPE'}="eggy"; 
		}elsif($PM{'keitai_force_set'} eq "FOMA"){
			$keitai_flag="imode";
	#		$KEITAI_ENV{'MACHINE_TYPE'}="N2001";
			$KEITAI_ENV{'MACHINE_TYPE'}="P2101V";
		}else{
			$keitai_flag="$PM{'keitai_force_set'}";
		}
	  }
	  if($PM{'keitai_force_set'} eq "pc"){
		$keitai_flag="pc";
	  }
	  if($PM{'station_force_set'} ne ""){
		$jstation_flag="$PM{'station_force_set'}";
	  }
	}

#$keitai_flag="imode";
#$KEITAI_ENV{'MACHINE_TYPE'}="251i";


	# 各携帯別の変数を作っておく
	# imode
	if($keitai_flag eq "imode"){
		$form_method="POST";
		$accesskey_p1=qq|[0].|;
		$HR=qq|<HR>|;

	# J-PHONE
	}elsif($keitai_flag eq "J-PHONE"){
	   if($jstation_flag >= 3){
		# ステーション対応機,パケット対応機
		$form_method="POST";
	   }else{
		# Jスカイ対応機
		$form_method="GET";
	   }
	   $HR=qq|<HR>|;
	# EZweb(DDI/Tuka)
	}elsif($keitai_flag eq "EZweb"){
		$form_method="POST";
		$accesskey_p1=qq|[0].|;
		$HR=qq|<BR>|;
	# H"(DDI Pocket)
	}elsif($keitai_flag eq "H"){
		$form_method="POST";
		$accesskey_p1=qq||;
		$HR=qq|\n|;
	# PC
	}else{
		$form_method="POST";
		$accesskey_p1=qq|[0].|;
		$HR=qq|<HR>|;
		if($PM{'no_view_from_pc'}== 1){
			&error(" 警告 <BR> このURLは携帯からのアクセス専用です。パ\ソ\コ\ン等それ以外の手段からアクセスされる場合は、<a href=\"$PM{'cgi_hontai_name'}\">imgboard本体($PM{'cgi_hontai_name'})</a>のアクセスURLを管理者に教えてもらい、それを入力してアクセスしてください ");
		}
	}


}

#====================#
# プロバイダチェック
#====================#

sub check_ISP{

	if($SERVER_NAME=~ /bekkoame\./){
		&error(" CGI設定エラー。imgboardがサポート外サイトを検出しました。<BR>「$SERVER_NAME」は、CGIに関して特殊な制約があるため、残念ながらimgboardを利用することができません。他のプロバイダをご利用ください ");
	}

	if(($SERVER_NAME=~ /hi\-ho\.ne\.jp/)||($SERVER_NAME=~ /\.nifty\.com/)){
	# img_url設定が必要なサイトで設定が未設定の場合は警告を出す
		if($PM{'img_url'} eq 'http://あなたのプロバイダ/あなたのディレクトリ/img-box'){
			&error(" CGI設定にエラーがあります。<BR>あなたが設置しようとしているプロバイダ
			「 $SERVER_NAME 」では特殊な設定が必要になります。新FAQ掲示板を参照して、これを設定してください ");
		}
	}

	if($SERVER_NAME=~ /www5.\.biglobe/){
	# img_url設定が必要なサイトで設定が未設定の場合は警告を出す
		if($PM{'img_url'} eq 'http://あなたのプロバイダ/あなたのディレクトリ/img-box'){
			&error(" CGI設定にエラーがあります。<BR>あなたが設置しようとしているプロバイダ
			「 $SERVER_NAME 」では＄img_urlの設定が必要になります。これを設定してください。
			なお、設定方法がわからない場合はサポート掲示板の過去ログを参照してください ");
		}
	}

}


#====================#
# Apache1.3.x対策
#====================#

sub check_RH{
	if(($REMOTE_HOST eq "")||($REMOTE_HOST =~ /^null$/i)){
	    $REMOTE_HOST = "$ENV{'REMOTE_ADDR'}";
	}

	# 1.22 Rev4 イタズラ投稿防止策
	# リモートホストがない場合は登録させない。メッセージはダミー

	if(($REMOTE_HOST eq "")&&($PM{'no_upload_by_no_RH_user'}=='1')){
	    &error("CGIエラー No REMOTE_HOST <BR>現在、リモートホスト情報がない場合は、投稿できない設定になっています。 ");
	}
}

#================================#
# 連続投稿制限 メイン(1.22 Rev4)
#================================#

sub limit_upload_times{
	if($PM{'limit_upload_times_flag'}==1){
		# 連続投稿カウンタを実行
		# $new_utc_setはクッキーに設定される。
		# 引数は設定部で設定。デフォルト値を持つので空でもいい。
		$new_utc_set=&count_upload_times("$PM{'upload_limit_type'}","$PM{'upload_limit_times'}");
	}
}
#
#================================#
# 連続投稿制限 サブ(1.22 Rev4)
#================================#

sub count_upload_times{

	# 連続投稿カウンタ
	# 引数は時刻レンジ、制限回数
	# 返値は新カウンタセット値,グローバル変数の$now_up_counterに現在の連続回数

	#初期化
	local($PM{'upload_limit_type'})	= $_[0];	# 時刻レンジを引数として取得
	local($PM{'upload_limit_times'})	= $_[1];	# 制限回数を引数として取得
	local($tmp_up_counter);

	# デフォルト値をセット
	$PM{'upload_limit_type'}="2min" if($PM{'upload_limit_type'} eq "");
	$PM{'upload_limit_times'}="5" if($PM{'upload_limit_times'} eq "");

	local(@NOWTIME)	= localtime(time);
	local($yday)		= $NOWTIME[7];

	# 時刻データからタイムベースナンバーを作る
	if($PM{'upload_limit_type'} eq "day"){		# 1日当たり？回で制限
		$up_base_num=35+$yday;
	}elsif($PM{'upload_limit_type'} eq "1hour"){	# 1時間当たり？回で制限
		$up_base_num=35+$yday+$hour;
	}elsif($PM{'upload_limit_type'} eq "10min"){	# 10分当たり？回で制限
		$up_base_num=35+$yday+(int(($min+1)/10));
	}elsif($PM{'upload_limit_type'} eq "2min"){	# 2分当たり？回で制限
		$up_base_num=35+$yday+(int(($min+1)/2));
	}elsif($PM{'upload_limit_type'} eq "1min"){	# 1分当たり？回で制限
		$up_base_num=35+$yday+(int(($min+1)/1));
	}else{						# デフォルトは2分	
		$up_base_num=35+$yday+(int(($min+1)/2));
	}

	if($COOKIE{'utc'} eq ""){
		# クッキーの値がない場合はセット
		$tmp_up_counter=$up_base_num;
		$now_up_counter=1;

		return($tmp_up_counter);
	}else{
		$tmp_up_counter=$COOKIE{'utc'};	# クッキーからカウンタ値を読む
	}		

	# エラーチェック
	if($tmp_up_counter=~ /^(\d+)$/){
		# なにもしない
	}else{
		# ０あるいは、数字以外の異常値になっている場合リセットする
		$tmp_up_counter=$up_base_num;
		# これをクッキーにセットする
		return($tmp_up_counter);
	}
	return(1) if($up_base_num==0);		# ０除算予防(通常はない)

#&error("up base $up_base_num yday $yday utc $COOKIE{'utc'} tmp_up $tmp_up_counter");

	# メイン処理
	if(($tmp_up_counter % $up_base_num)==0){
		# タイムベースが一致する場合はカウントアップする
		$tmp_up_counter+=$up_base_num;
		$now_up_counter=int($tmp_up_counter/$up_base_num);
		if($now_up_counter > $PM{'upload_limit_times'}){
			&error(" CGIエラー overtimes 掲示板管理者が設定した連続投稿
回数をオーバーしました。<BR>しばらく投稿できません ");
			exit;
		}
	}else{
		# タイムベースが一致しない場合はカウンタをリセットし、新タイムペースを設定
		$tmp_up_counter=$up_base_num;
		$now_up_counter=1;
	}
	# これをクッキーにセットする
	return($tmp_up_counter);
}
#
#===================================#
# プロバイダのOSを判定する
#===================================#
# 引数なし、返値はＯＳの種類(win,mac)
# Perl for Winは新しいOS(NT SP4,Windows2000等)を検出
# できないバグがある そのため、いろんなヒントから、
# Windowsであることを検出するものとする。なお、強制
# 的に設定することもできるようにする。これらのフラグ
# はbinmode切替えやメール処理で用いる。
sub check_www_server_os{

	local($tmp_www_server_os)="";

	# 事前準備（エラーチェック）
	$tmp_www_server_os= $^O;

	# Win98 & NT4(SP4)対策
	if($tmp_www_server_os eq ""){
		$tmp_www_server_os= $ENV{'OS'};
	}

	# AnHTTPd /OmniHTTPd/IIS対策
	if($ENV{'SERVER_SOFTWARE'} =~ /AnWeb|Omni|IIS\//i){
		$tmp_www_server_os= 'win';
	}

	# Win Apache 対策
	if($ENV{'WINDIR'} ne ""){
		$tmp_www_server_os= 'win';
	}

	# Perlが新OSを検知できない場合,強制的に指定する
	if($force_www_server_os_to =~ /win/i){
		$tmp_www_server_os = 'win';
	}elsif($force_www_server_os_to =~ /mac/i){
		$tmp_www_server_os = 'mac';
	}
	return($tmp_www_server_os);
}
#
#==================================#
# 自動URLリンク機能 Ver0.98(R5 NEW)
#==================================#
#
sub set_auto_url_link{

	# 引数１は処理したいデータ;
	# 返値は処理後のデータ;
	local($tmp_data)=@_;

	# アンカータグを書くユーザなら自動リンクをオフにする
	# ない場合のみ処理
	$PM{'auto_mail_find'}=1;

	if($tmp_data!~ /<A(\s)(\n?)|<IMA?GE?(.*)/i){
	   $tmp_data =~ s/[\x80-\x9f\xe0-\xff]./$&\x01/g; # 2バイト文字

	   # 自動リンク(EZweb用)
	   if($keitai_flag eq "EZweb"){
		# 特殊文字フィルタと干渉するので、なにもしない 2002.03
	   # 自動リンク(EZweb用)
	   }elsif($keitai_flag eq "H"){
		# なにもしない
	   # 自動リンク(iモード/Jフォン用)
	   }else{
		# 自動URLリンク
		# 日本語ドメインに対応するとこんなかんじ？？
		# 2001.04.12 改行対応
		# 2001.08.20 小修正（tripod等で認識ミスがあるので訂正）
		$tmp_data =~ s/(https?\:\/\/[^\s|\:|\<]+)\.(\/?)([\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]*)/<A HREF="$1.$2$3$4" TARGET="_blank">$1.$2$3$4<\/A>/ig;
		$tmp_data =~ s/(r?ftp\:\/\/[\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\:]+)/<A HREF="$1" TARGET="_blank">$1<\/A>/g;
		# 自動mailリンク(mailtoルール)		
		$tmp_data =~ s/(mailto\:[\-_\.a-zA-Z0-9\@]+)/<A HREF="$1" TARGET="_blank">$1<\/A>/g;
		# 自動telリンク(telルール)		
		$tmp_data =~ s/(tel\:[\-\(\)0-9\+\#\*]+)/<A HREF="$1" TARGET="_blank">$1<\/A>/g;

		# 自動メルアドリンク(自動検出)
		if($PM{'auto_mail_find'}==1){
		  $tmp_data =~ s/([\-_\.a-zA-Z0-9]+)\@([\-a-zA-Z0-9]+)\.([\-a-zA-Z0-9\.]+)([^a-zA-Z0-9]+)/<A HREF="mailto\:$1\@$2\.$3">$1\@$2\.$3<\/A>$4/g;
		}

		# 自動電話番号リンク(iモード/Jフォン用)
		if($PM{'auto_tel_link'}==1){
		  if($keitai_flag ne "pc"){
		    # 一般電話番号を見つける（一般数字との誤認識を防ぐため
		    # 0で始まり-があるやつだけを認識）
		    $tmp_data =~ s/([^\d]+)\(?0(\d{1,5})\)?\-\(?(\d{1,5})\)?\-(\d{3,6})/$1<A HREF="tel\:0$2$3$4">0$2\-$3\-$4<\/A>/g;
		    # 携帯の番号を見つける(-がなくて上で漏れたやつでも、
		    # 携帯の番号くさいなら拾う)
		    $tmp_data =~ s/([^\d]+)(070|090)(\d|\-)(\d+)/$1<A HREF="tel\:$2$3$4">$2$3$4<\/A>/g;
		  }
		}
	   }
	   $tmp_data =~ tr/\x01//d;
	}
	return($tmp_data);
}

#=================================================#
# HTMLのアンカータグをHDML形式に変換する(未完成)
#=================================================#
sub chenge_a_to_ez{
	# 引数１は処理したいデータ;
	# 返値は処理後のデータ;
	local($tmp_data,$a_type)=@_;
	# wapじゃないときはスキップする
	if(($keitai_flag ne "EZweb")&&($keitai_flag ne "H")){
		return($tmp_data);
	}

	if($a_type eq "href"){
		$tmp_data =~ s/<A HREF="/<A TASK="GO" DEST="/ig;
	}elsif($a_type eq "mail"){
		$tmp_data =~ s/<A HREF="mailto\:/<A TASK="GOSUB" LABEL="Mail" DEST="device:home\/goto?svc=Email&SUB=sendMsg" VARS="TO=/g;
	}elsif($a_type eq "tel"){
	}else{
	}
	return($tmp_data);
}
#========================================#
# 自動株価リンク機能 Ver0.5 (imodeA NEW)
#========================================#
#
sub set_auto_quote_link{

	# 引数１は処理したいデータ;
	# 返値は処理後のデータ;
	local($tmp_data)=@_;
	local($site_ref_head,$site_ref_tail);

	if($keitai_flag eq "imode"){
	    $site_ref_head="$PM{'auto_quote_ref_i_head'}";
	    $site_ref_tail="$PM{'auto_quote_ref_i_tail'}";
	}elsif($keitai_flag eq "J-PHONE"){
	    $site_ref_head="$PM{'auto_quote_ref_jphone_head'}";
	    $site_ref_tail="$PM{'auto_quote_ref_jphone_tail'}";
	}elsif($keitai_flag eq "EZweb"){
	    # wapの時はなにもしない
	    return($tmp_data);
	}elsif($keitai_flag eq "H"){
	    # Hの時はなにもしない
	    return($tmp_data);
	}else{
	    $site_ref_head="$PM{'auto_quote_ref_head'}";
	    $site_ref_tail="$PM{'auto_quote_ref_tail'}";
	}

	# アンカータグを書くユーザなら自動リンクをオフにする
	# ない場合のみ処理
	$PM{'auto_quote_find'}=1;
	# 半角
	$tmp_data =~ s/([^\d+])(\<|\＜|\(|\（)(\d{4,4}0?)(\>|\＞|\)|\）)([^\d+])/$1$2<A HREF="$site_ref_head$3$site_ref_tail" TARGET="_blank">$3<\/A>$4$5/g;
	# 全角 (perl4対策でevalを使用)
#	$tmp_data =~ s/([^\d+])(\<|\＜|\(|\（)((?:\x82[\x4F-\x58]){4,4})(\x82\x4F)?(\>|\＞|\)|\）)([^\d+])/$1$2<A HREF="$site_ref_head$3$site_ref_tail" TARGET="_blank">$3$4<\/A>$5$6/g;
	return($tmp_data);
}
#=========================#
# Content-type のチェック
#========================
#
sub content_type_check{

	local($content_type) = @_;

# 画像
	$ext{'image/jpg'}	= 'jpg'; 
	$ext{'image/jpeg'}	= 'jpg'; 	# for NN
	$ext{'image/pjpg'}	= 'jpg';
	$ext{'image/pjpeg'}	= 'jpg';	# for IE
	$ext{'image/gif'}	= 'gif';	# for NN&IE
	$ext{'image/png'}	= 'png';	# for PNG  file
	$ext{'image/x-png'}	= 'png';	# for PNG  file

	# eggy/FOMAからはasfのアップロードを認める
	if(($KEITAI_ENV{'MACHINE_TYPE'} eq "eggy")||($KEITAI_ENV{'OTHER_PARAM'} eq "FOMA")){
		$ext{'video/(.*)-asf'}	= 'asf';# for DoCoMo eggy
	}

	# gif,jpeg以外に以下のタイプのデータも投稿できるようにするには
	# 初期設定にて$PM{'allow_other_multimedia_data'}を1にしてください．
	if($PM{'allow_other_multimedia_data'} ==1){
		&additional_content_types;
	}

	# imgタグで埋め込み可能なタイプ
	foreach(keys %ext){
		if($content_type =~ /$_/ig){
			return $ext{$_};
		}
	}
	# imgタグで埋め込むと危険なタイプ
	foreach(keys %ext2){
		if($content_type =~ /$_/ig){
			return $ext2{$_};
		}
	}
        # これでも駄目なら拡張子から判断
	 if($fname=~ /\.gif$/i){return 'gif';}
	 if($fname=~ /\.jpe?g$/i){return 'jpg';}

	 # eggyからはasfのアップロードを認める
	if(($KEITAI_ENV{'MACHINE_TYPE'} eq "eggy")||($KEITAI_ENV{'MACHINE_TYPE'}=~ /[N|P|D|SH|T]210.V/i)){
	   if($fname=~ /\.asf$/i){return 'asf';}# for DoCoMo eggy
	 }

	# 携帯（Jフォン）2002.04 スーパーメール& Vシリーズ対応
	 if($fname=~ /\.mng$/i){return 'mng';}	# PNG アニメーション
	 if($fname=~ /\.noa$/i){return 'noa';}	# ムービーファイル(Nancy)
	 if($fname=~ /\.vcf$/i){return 'vcf';}	# vCard（アドレス帳）
	 if($fname=~ /\.vcs$/i){return 'vcs';}	# vCalendar（スケジュール帳）
	 if($fname=~ /\.vmg$/i){return 'vmg';}	# vMessage（メールデータ）
	 if($fname=~ /\.vbm$/i){return 'vbm';}	# vBookmark（ブックマークデータ）
	 if($fname=~ /\.vnt$/i){return 'vnt';}	# vNote（定型文・メモ帳）
	# 携帯（EZ new）
	 if($fname=~ /\.amc$/i){return 'amc';}	# ezmovie

	 # 2002.12 MP4対応
	 if($fname=~ /\.mp4$/i){return 'mp4';}	# iモーション動画(ISMA-MPEG4:MP)
	 if($fname=~ /\.3gp$/i){return '3gp';}	# MP4データ(iモーション)
	 if($fname=~ /\.3gpp$/i){return '3gpp';}# MP4データ(iモーション)
	 if($fname=~ /\.3gp4$/i){return '3gp4';}# MP4データ(iモーション)

	 if($fname=~ /\.png$/i){return 'png';}
	 if($fname=~ /\.bmp$/i){return 'bmp';}
	 if($fname=~ /\.wrl$/i){return 'wrl';}
	 if($fname=~ /\.midi?$/i){return 'mid';}
	 if($fname=~ /\.kar$/i){return 'kar';}

	 if($fname=~ /\.amc$/i){return 'amc';}
	 if($fname=~ /\.mmf$/i){return 'mmf';}
	 if($fname=~ /\.smd$/i){return 'smd';}
	 if($fname=~ /\.pmd$/i){return 'pmd';}
	 if($fname=~ /\.sml$/i){return 'sml';}
	 if($fname=~ /\.mel$/i){return 'mel';}
	 if($fname=~ /\.als$/i){return 'als';}
	 if($fname=~ /\.mld$/i){return 'mld';}
	 if($fname=~ /\.qcp$/i){return 'qcp';}
	 if($fname=~ /\.at3$/i){return 'at3';}	# ATRAC3 ファイル

	# gif,jpeg以外に以下のタイプのデータも投稿できるようにするには
	# 初期設定にて$PM{'allow_other_multimedia_data'}を1にしてください．
        if($PM{'allow_other_multimedia_data'} ==1){
         # (自分でリストをさらに追加する場合の注意)
         # cgi,asp,pl,sh,exe.shtml,js,jse,vbs,vbe,hta,wsh,xlm等の拡張子はセキ
	 # ュリティ上危険なので絶対追加しないこと（特にWindowsユーザ）

	# Other Audio
	 if($fname=~ /\.vqf$/i){return 'vqf';}	# NTT Twin VQ Audio
	 if($fname=~ /\.vql$/i){return 'vql';}	# NTT Twin VQ Audio
	 if($fname=~ /\.midi?$/i){return 'mid';}# Midi 
	 if($fname=~ /\.wav$/i){return 'wav';}	# WAV

	 if($fname=~ /\.rtf$/i){return 'rtf';}	# Word98
	 if($fname=~ /\.csv$/i){return 'csv';}	# データベース
	 if($fname=~ /\.mov$/i){return 'mov';}
	 if($fname=~ /\.ram$/i){return 'ram';}	# Real Audioファイル

	 # その他細かい物は削除。今後は e_FTPboardをご利用ください。

	 if($fname=~ /\.avi$/i){return 'avi';}
	 if($fname=~ /\.mpg$/i){return 'mpg';}
	 if($fname=~ /\.asf$/i){return 'asf';}
	 if($fname=~ /\.asx$/i){return 'asx';}
	 if($fname=~ /\.vod$/i){return 'vod';}
	 if($fname=~ /\.txt$/i){return 'txt';}
	 if($fname=~ /\.html?$/i){return 'html';}
	 if($fname=~ /\.pac$/i){return 'pac';}     #Post Pet
        }

	$unknown_data_exit=1;

# データタイプ不明の場合の最終判断
	if($unknown_data_exit==1){
		&error(" このタイプのデータはアップロードできません．");
	}else{
		return 'dat';
	}
}

#=========================#
# Content-type の追加
#=========================#
sub additional_content_types{

# おまけ機能(~_~)
# gif,jpeg以外に以下のタイプのデータも投稿できるようにできます。
# 投稿させたくないデータタイプには#を先頭につけてコメントアウトして下さい。
#
# 2002.04 携帯でｱｯﾌﾟﾛｰﾄﾞしないものを削った
#
# <ご注意！>
# なお投稿許可させたくない場合は#を先頭につけてコメントアウトして下さい。

# 画像系（その他）
	$ext{'image/png'}	= 'png';	# for PNG  file
	$ext{'image/x-png'}	= 'png';	# for PNG  file
#	$ext{'image/bmp'}	= 'bmp';	# for BMP  file

# アーカイブ系
	$ext2{'application/zip'}= 'zip';	# for ZIP   (Win)
	$ext2{'x-zip'}= 'zip';			# for ZIP   (Win)
	$ext2{'compressed/lha'}= 'lzh';		# for LZH   (Win)

# 3D & ビデオ系
	$ext2{'x-world/x-vrml'}	= 'wrl';	# for 3D-VRML file
	$ext2{'video/(.*)-asf'}= 'asf';		# for NetShow file
	$ext2{'application/x-ntt-vod'}= 'vod';	# for VOD Script file
	$ext2{'application/x-ntt-vod2'}= 'nsmil';# for VOD Script file
	$ext2{'application/x-noa'}= 'noa';	# ムービー写メール
	$ext2{'video/3gpp'}= '3gp';		# iモーション

# JSKY スーパーメール対応
	$ext2{'audio/x-smd'}	= 'smd';	# for SMD
	$ext2{'application/x-smaf'}= 'mmf';	# for MMF
	$ext2{'video/x-mng'}	= 'mng';	# for Animation file
	$ext2{'video/mng'}	= 'mng';	# for Animation file
	$ext2{'text/x-vbookmark'}= 'vbm';	# for vBookMark file
	$ext2{'text/x-vcalender'}= 'vcs';	# for vCalendar file(謎？)
	$ext2{'text/x-vcalendar'}= 'vcs';	# for vCalendar file
	$ext2{'text/x-vmessage'}= 'vmg';	# for vMessage file
 
# 会社で仕事に役立ち系
	$ext2{'text/html'}= 'html';	 	# HTMLテキスト
	$ext2{'text/plain'}= 'txt'; 		# テキスト
	$ext2{'message/rfc822'}= 'eml';		# Outlook Express メイル

# 音楽系
	$ext2{'audio/mpeg'}= 'mp3';			# for MPEG Audio
	$ext2{'audio/x-mpegurl'}= 'm3u';		# for MPEG Audio
	$ext2{'audio/x-wav'}= 'wav';		# for WAV Audio
	$ext2{'audio/(.+)mid'}= 'mid';		# for MIDI file
	$ext2{'audio/(.+)aiff'}= 'aiff';	# for AIFF file
}
#
#====================================================#
# imgtitleから、$IMG_PARAMETERS{name}情報を抜き出す
#====================================================#
# 引数はコメントアウト付きの$tmp_imgtitle
# 返値はコメントアウトなしの$tmp_imgtitleと連想配列 $IMG_PARAMETERS{$name}
sub parse_img_param{

	local($ttmp_imgtitle)= $_[0];	# 引数として取得

	# imgtitleの中にsize,height,width等のパラメータを格納
	# 書式<!--パラメータ名=値;パラメータ名2=値2・・・-->
	# <!--と-->を除きパラメータ部を抽出
	if($ttmp_imgtitle ne ''){
		($ttmp_imgtitle,$img_parameters)=split(/<\!--/,$ttmp_imgtitle);
		$img_parameters=~ s/-->//g;
	}

	# パラメータ$img_parametersが追加されている場合．
	if($img_parameters ne ''){
		foreach ( split(/;/,$img_parameters)){
			local($name,$value) = split(/\=/);
			$IMG_PARAMETERS{$name} = $value;
		}
	}
	return($ttmp_imgtitle);
}
#
#========================#
# CGI名をとりだす
#========================#
#
sub get_script_name {

	local($file_name) = $0;
	local($path_name);
	local($script_name);

	# パスがある場合は削る
	if ($file_name =~ /\\|\//) {
	  if ($file_name =~ /^(.*)\\([^\\]*)$/) {
		$path_name	=$1;
		$script_name	=$2;
	  }elsif($file_name =~ /^(.*)\/([^\/]*)$/) {
		$path_name	=$1;
		$script_name	=$2;
	  }else{
		$script_name	="$file_name";
	  }
	}else{
	  $script_name="$file_name";
	}

	$script_path_name="$path_name"; # グローバル変数(パス)

	return("$script_name");
}

#===================================#
# 記事登録時に管理者にメール
#===================================#

sub send_mail{

	if ($PM{'use_email'}==1){

		# OSの種別を判別
		$www_server_os =&check_www_server_os;

		# OSチェック結果でWindows,Macだったユーザには、警告を出す
		if($www_server_os=~ /(win|mac)/i){
			&error("管理者設定にエラーがあります<BR>メール通知\機\能\は $1 サーバでは使用できません。オフにしてください。");
			return;
		}

		# パラメータチェック（セキュリティチェック）
		if($email=~ /.*\@.*\..*/){
			$eemail_address=$email;
		}else{
			$eemail_address="dummy\@dummy.co.jp";
		}

		$eemail_name="$name";
		$eemail_subject	="$subject";
		$eemail_imgtitle="$imgtitle";

		# 本文が長すぎる場合はカットする。メール爆弾系のイタズラ対策。
		$eemail_body=$body;
		$eemail_body=~ s/\<BR\>/\n/gi;
		$eemail_body=~ s/\<\!-- user/\n\<\!-- user/i;

		if($PM{'mail_body_limit'}){
			$tmp_mail_body_limit="$PM{'mail_body_limit'}";
		}else{
			$tmp_mail_body_limit='360';
		}

		# 初期設定で設定した制限より長い場合 
		if(length($body) >$tmp_mail_body_limit){
 			# 先頭から50バイトまでのみ残す
			$eemail_body =substr("$body",50);
			$eemail_body .=" \/\/長過ぎますので、以後はカットしました.<!-- user： $REMOTE_HOST --> - $HTTP_REFERER ";
		}

  		# URLが指定されている場合はフルURL表記にする。
		# 外部画像対応修正
		$eemail_img_location="$img_location";
		if(($PM{'cgi_link_url'}!~ /http:\/\/yourprovider\/yourname\/imgboard/)&&($img_location!~ /^http:\/\//i)){
			$eemail_img_location="$PM{'cgi_link_url'}".""."$img_location";
			$eemail_img_location=~ s/(\/?)\.\//\//g; # 相対パスを修正
		}

		# セキュリティ対策のため、問題のある文字をフィルタ
		$eemail_address		=~ s/\,|\;|\://g;
		$eemail_name		=~ s/\,|\;|\://g;
		$eemail_subject		=~ s/\,|\;|\://g;
		$eemail_imgtitle	=~ s/\,|\;|\://g;

		# メール文面ここから
$m_mes .= "MIME-Version: 1.0\n";
$m_mes .= "Reply-to: $eemail_address\n";
$m_mes .= "From: $eemail_address\n";
$m_mes .= "Subject: \[imgboard\]New article is added (via imode)\n";
$m_mes .= "Content-Type: text/plain; charset=iso-2022-jp\n";
$m_mes .= "Content-Transfer-Encoding: 7bit\n\n";

$m_mes .= "imgboardアクセスに($keitai_flag-$KEITAI_ENV{'MACHINE_TYPE'})経由で記事が投稿されました。\n";
$m_mes .= "[URL] \n";
$m_mes .= "$PM{'cgi_link_url'}"."\/"."$cgi_name \n";
$m_mes .= "[DATE] $date_data\n";
$m_mes .= "[NAME] $eemail_name\n" 		if($eemail_name ne "");
$m_mes .= "[e-mail] $eemail_address\n"	if($eemail_address ne "");
$m_mes .= "---------------------------------------\n";
$m_mes .= "[TITLE] $eemail_subject\n" 		if($eemail_subject ne "");
$m_mes .= "[MES] \n $eemail_body\n"		if($eemail_body ne "");
$m_mes .= "[File Title]  $eemail_img_title\n" 	if($eemail_img_title ne "");
$m_mes .= "[File URL  ]  $img_data_size\n" 	if($img_location ne "");
$m_mes .= "        $eemail_img_location \n"	if($img_location ne "");
$m_mes .= "[AGENT] $HTTP_USER_AGENT\n"		if($HTTP_USER_AGENT);
$m_mes .= "[連続] $now_up_counter 回 [リミッタ現在設定] $PM{'upload_limit_times'} / $PM{'upload_limit_type'} \n"	if($PM{'limit_upload_times_flag'}==1);
$m_mes .= " 以上 \n";

	# メール文面ここまで

	# メールで標準の形態、漢字コードJIS、改行コードLFに変換する。
	$m_mes=~ s/\r\n/\n/g;		# 改行コードを変換
	$m_mes=~ s/\r/\n/g;			#改行コードを変換
	&jcode'convert(*m_mes, 'jis');	# 漢字コードをJISに(修正99.11)

	# メールを送出
	open (MAIL, "|$PM{'mail_prog'} $PM{'recipient'}") || &error(" 管理者設定にエラーがあります<BR>メールプログラム$PM{'mail_prog'}が見つかりません。メールプログラムのパスを再確認してください。<BR>またWebサーバとメールサーバが別のサーバの場合使用できません。\n");
		print MAIL "$m_mes";	
   	close (MAIL);
	}
}

#
#=====================================#
#     <ＨＴＭＬ--管理メニュー>        #
#=====================================#
#
#  管理メニュー用のＨＴＭＬです．カスタマイズの必要はありません。
#
sub output_admin_menu_HTML{
print<<HTML_END;
<HTML>
<BODY BGCOLOR=PINK>
画像Upload掲示板<BR>
<CENTER>
(携帯ｱｸｾｽ)<BR>
<BR>
管理メニュー<BR>
</CENTER>
$HR
・<a href="$cgi_name?page=$FORM{'page'}&mode=remove_select"> 記事削除 </a><BR>
・<a href="$cgi_name?page=$FORM{'page'}&mode=change_set"> 設定変更 </a><BR>
・<a href="$cgi_name?page=$FORM{'page'}&mode=show_howto"> 使い方 </a><BR>
・<a href="$cgi_name?page=$FORM{'page'}&mode=whats_imgboard"> imgboardとは</a><BR>
$HR
・<a href="$cgi_name?page=$FORM{'page'}&mode=user_01"> おリンク </a><BR>
・<a href="$cgi_name?page=$FORM{'page'}&mode=user_02"> ---- </a><BR>
$HR
デバック<BR>
・<a href="$cgi_name?page=$FORM{'page'}&mode=check_env">機種情報 </a><BR>
<BR>
$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}" accesskey=0>戻る</a><BR>
$HR

</BODY>
</HTML>
HTML_END
}
#
#===============================================#
#     <ＨＴＭＬ--管理メニュー(設定変更1/4)>        #
#===============================================#
#
#  管理メニュー(設定変更)用のＨＴＭＬの１ページ目です．
#
sub output_change_set_HTML{
print<<HTML_END;
<HTML>
<BODY BGCOLOR=PINK>
画像Upload掲示板<BR>
<center>
(携帯ｱｸｾｽ)<BR>
<BR>
設定変更メニュー<BR>
(<B>1P</B>/<a href="$cgi_name?page=$FORM{'page'}&mode=change_set2">2P</a>)<BR>
(<a href="$cgi_name?page=$FORM{'page'}&mode=change_set3">3P</a>/<a href="$cgi_name?page=$FORM{'page'}&mode=change_set4">4P</a>)<BR>

</center>
$HR
(はじめに)<BR>
imgboardは特に設定しなくても大体のサーバで動きますが、
数多くのカスタマイズパラメータが用意されてますので、
これをお使いいただくとさらに自分好みの設定にすることが
可\能\です。ほとんどの設定はcgi中にありますが、一部パラ
メータはWebでも設定できます。
（なお、ここでcgi中と重複する設定した場合、ここにある設定が優先されます）

$HR
<FORM action=$cgi_name>
(基本設定)<BR>
公開モード<BR>
<SELECT NAME=bbs_open>
<OPTION SELECTED>$PM{'bbs_open'}
<OPTION VALUE="3">3=読書OK(通常)
<OPTION VALUE="2">2=ReadOnly
<OPTION VALUE="1">1=管理MENUのみ
</SELECT>
<BR>
<BR>
<INPUT TYPE=TEXT VALUE="$PM{'max_message'}" SIZE=3 MAXLENGTH=4>件 最大保存<BR> 
<INPUT TYPE=TEXT VALUE="$PM{'gisa'}" SIZE=3 MAXLENGTH=4>(h)時差<BR>
<BR>
--以降1=YES,0=NO<BR>
*がﾃﾞﾌｫﾙﾄ値--<BR>
<BR>
HTML_END

 &show_select_typeA("use_rep","$PM{'use_rep'}"," 返信あり ","*","");
 &show_select_typeA("res_go_up","$PM{'res_go_up'}"," 返信を上へ ","*","");
 &show_select_typeA("disp_new_notice","$PM{'disp_new_notice'}"," 最新３記事Mark","*","");
print<<HTML_END;
$HR
(PC投稿拒否)<BR>
携帯からの投稿のみを受け付けたい場合は1
HTML_END
 &show_select_typeA("no_upload_from_pc","$PM{'no_upload_from_pc'}","","*","");

print<<HTML_END;
$HR
(PC閲覧拒否)<BR>
携帯からだけ閲覧できるようにしたい場合は1
(PCからはこのメニューも見えなくなるので注意)
HTML_END
 &show_select_typeA("no_upload_from_pc","$PM{'no_upload_from_pc'}","","*","");

print<<HTML_END;

$HR
(添付ﾌｧｲﾙ)<BR>
デフォルトではGIF/JPEG/PNG/MNG/ﾑｰﾋﾞｰ写ﾒｰﾙ(Nancy形式)/ezmovie/ASF(ASFはドコモのeggyのみ)許可です。それ以外の各種マルチメディアデータ（テキスト,HTML,着メロなど約３０種類）の投稿を許可する場合は以下のフラグを1にしてください。<BR>
HTML_END
 &show_select_typeA("allow_other_multimedia_data","$PM{'allow_other_multimedia_data'}"," 許可 ","","*");
 print<<HTML_END;

$HR
(自動backup)<BR>
HTML_END
 &show_select_typeA("make_backup_file","$PM{'make_backup_file'}"," する ","*","");
 
print<<HTML_END;
<SELECT NAME="backup_day_interval">
<OPTION SELECTED>$PM{'backup_day_interval'}
<OPTION VALUE="2">2日
<OPTION VALUE="3">3日
<OPTION VALUE="7">7日
<OPTION VALUE="14">14日
<OPTION VALUE="30">30日
<OPTION VALUE="60">60日
</SELECT>間隔(日)
$HR
(自動メール)<BR>
HTML_END

 &show_select_typeA("use_email","$PM{'use_email'}"," 送る ","","*");
 &show_text_input_typeA("mail_body_limit","$PM{'mail_body_limit'}","ﾒｰﾙ長ﾘﾐﾀ",3,3,"istyle=4");

print<<HTML_END;
$HR
<INPUT TYPE=HIDDEN NAME=bbsaction VALUE="change_config">
<INPUT TYPE=PASSWORD NAME="passwd" SIZE=5 MAXLENGTH=12 istyle=4>
<INPUT TYPE=SUBMIT VALUE="適用">
</FORM>

(<B>1P</B>/<a href="$cgi_name?page=$FORM{'page'}&mode=change_set2">2P</a>)<BR>
(<a href="$cgi_name?page=$FORM{'page'}&mode=change_set3">3P</a>/<a href="$cgi_name?page=$FORM{'page'}&mode=change_set4">4P</a>)<BR>


$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}&mode=disp_admin_menu" accesskey=0>戻る</a><BR>
$HR
</BODY>
</HTML>
HTML_END
}
#

#===============================================#
#     <ＨＴＭＬ--管理メニュー(設定変更2/4)>     #
#===============================================#
#
#  管理メニュー(設定変更)用のＨＴＭＬの２ページ目です．
#
sub output_change_set2_HTML{
print<<HTML_END;
<HTML>
<BODY BGCOLOR=PINK>
画像Upload掲示板<BR>
<center>
(携帯ｱｸｾｽ)<BR>
<BR>
設定変更メニュー<BR>
(<a href="$cgi_name?page=$FORM{'page'}&mode=change_set">1P</a>/<B>2P</B>)<BR>
(<a href="$cgi_name?page=$FORM{'page'}&mode=change_set3">3P</a>/<a href="$cgi_name?page=$FORM{'page'}&mode=change_set4">4P</a>)<BR>
</center>
<FORM action=$cgi_name>

$HR
HTML_END

if($debug_mode >= 3){
print<<HTML_END;
(デバック)<BR>
携帯モード固定<BR>
固定すると他機種からうまく投稿できなくなりますのでご注意ください。
通常は自動認識にセットし、「空白」になるようにしておいてください。
なお、EZweb、H”にすると、このメニューにアクセスできなくなるため、固定モードをWeb上から解除できなくなります。その場合はfile.datの先頭部にあるkeitai_force_setの行をエディタで１行消して、手動で復帰させてください。<BR>
<SELECT NAME=keitai_force_set>
<OPTION SELECTED>$PM{'keitai_force_set'}
<OPTION VALUE="imode">iモード
<OPTION VALUE="J-PHONE">Jフォン
<OPTION VALUE="EZweb">EZweb（解除不能\）
<OPTION VALUE="H">H”（解除不能\）
<OPTION VALUE="eggy">MｽﾃｰｼﾞVisual(Eggy)
<OPTION VALUE="FOMA">FOMA
<OPTION VALUE="NULL">自動*
</SELECT>
<BR>
Jフォン<BR>
<SELECT NAME=station_force_set>
<OPTION SELECTED>$PM{'station_force_set'}
<OPTION VALUE="3">3=ｽﾃｰｼｮﾝ対応
<OPTION VALUE="4">4=ﾊﾟｹｯﾄ対応
<OPTION VALUE="1">1=非ｽﾃｰｼｮﾝ対応
<OPTION VALUE="">自動*
</SELECT>
<BR>
HTML_END
}

 &show_select_typeA("flock","$PM{'flock'}"," flock使用 ","","");
 &show_select_typeA("use_crypt","$PM{'use_crypt'}","PASS暗号化 ","","");

print<<HTML_END;
$HR
(ｾｷｭﾘﾃｨ)<BR>
管理者ﾊﾟｽ [使用]<BR>
<BR>
(連投制限)<BR>
HTML_END

 &show_select_typeA("limit_upload_times_flag","$PM{'limit_upload_times_flag'}"," 連投制限 ","*","");
 &show_text_input_typeA("upload_limit_times","$PM{'upload_limit_times'}"," 制限回数 ",2,3,"istyle=4");
 &show_text_input_typeA("upload_limit_type","$PM{'upload_limit_type'}"," ｶｳﾝﾀｸﾘｱ ",4,5);
 &HR;
 print "(いたずら対策)<BR>\n";
 print "禁止語句による制限です。チェックする項目を以下で指定してください<BR>\n";
 &show_select_typeA("no_upload_by_black_word","$PM{'no_upload_by_black_word'}"," ﾕｰｻﾞ名/本文 ","","*");

print<<HTML_END;
<BR>
IPによる制限<BR>
携帯のIPは不定なため当機\能\は使用できません<BR>
$HR
<INPUT TYPE=HIDDEN NAME=bbsaction VALUE="change_config">
<INPUT TYPE=PASSWORD NAME="passwd" SIZE=5 MAXLENGTH=12 istyle=4>
<INPUT TYPE=SUBMIT VALUE="適用">
</FORM>


(<a href="$cgi_name?page=$FORM{'page'}&mode=change_set">1P</a>/<B>2P</B>)<BR>
(<a href="$cgi_name?page=$FORM{'page'}&mode=change_set3">3P</a>/<a href="$cgi_name?page=$FORM{'page'}&mode=change_set4">4P</a>)<BR>


$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}&mode=disp_admin_menu" accesskey=0>戻る</a><BR>
$HR
</BODY>
</HTML>
HTML_END
}
#
#===============================================#
#     <ＨＴＭＬ--管理メニュー(設定変更3/4)>     #
#===============================================#
#
#  管理メニュー(設定変更)用のＨＴＭＬの3ページ目です．
#
sub output_change_set3_HTML{
print<<HTML_END;
<HTML>
<BODY BGCOLOR=PINK>
画像Upload掲示板<BR>
<center>
(携帯ｱｸｾｽ)<BR>
<BR>
設定変更メニュー<BR>
(<a href="$cgi_name?page=$FORM{'page'}&mode=change_set">1P</a>/<a href="$cgi_name?page=$FORM{'page'}&mode=change_set2">2P</a>)<BR>
(<B>3P</B>/<a href="$cgi_name?page=$FORM{'page'}&mode=change_set4">4P</a>)<BR>
HTML関連<BR>
</center>
<FORM action=$cgi_name>
$HR
(HTML)<BR>
ﾀｲﾄﾙ<BR>
<INPUT TYPE=TEXT NAME="title" MAXLENGTH=20 SIZE=22 VALUE="$PM{'title'}">
<BR>
戻り先<BR>
<INPUT TYPE=TEXT NAME="back_url" MAXLENGTH=40 SIZE=56 VALUE="$PM{'back_url'}">
<BR>
<BR>
-色指定-<BR>
<INPUT TYPE=TEXT NAME="im_body_bgcolor" MAXLENGTH=10 SIZE=6 VALUE="$PM{'im_body_bgcolor'}">背景<BR>

<INPUT TYPE=TEXT NAME="im_body_text" MAXLENGTH=10 SIZE=6 VALUE="$PM{'im_body_text'}">TEXT<BR>
<INPUT TYPE=TEXT NAME="im_body_link" MAXLENGTH=10 SIZE=6 VALUE="$PM{'im_body_link'}">LINK
<BR>

<INPUT TYPE=TEXT NAME="im_body_vlink" MAXLENGTH=10 SIZE=6 VALUE="$PM{'im_body_vlink'}">VLINK<BR>
$HR
(表\示ﾘﾐﾀ)<BR>
画面狭いので(^^)<BR>
HTML_END

 &show_text_input_typeA("message_per_page","$PM{'message_per_page'}"," 記事/ﾍﾟｰｼﾞ ",2,2,"istyle=4");
 &show_text_input_typeA("kiji_disp_limit_imode","$PM{'kiji_disp_limit_imode'}"," 文字/1記事",3,3,"istyle=4");
 print "カナ自動半角\n";
 &show_select_typeA("hankaku_filter","$PM{'hankaku_filter'}"," する ","*","");
print<<HTML_END;
$HR
(自動ﾘﾝｸ作成)<BR>
以降1=YES,0=NO<BR>
HTML_END

 &show_select_typeA("auto_url_link","$PM{'auto_url_link'}"," URL自動 ","*","");
 &show_select_typeA("auto_tel_link","$PM{'auto_tel_link'}"," 電番自動* ","*","");
 &show_select_typeA("no_q2_flag","$PM{'no_q2_flag'}","Q2禁止 ");
print<<HTML_END;
*11X等の番号はﾌｨﾙﾀされます<BR>
$HR
(FORM)<BR>
必須指定<BR>
1=必須,0=省略可<BR>
HTML_END

 &show_select_typeA("form_check_name","$PM{'form_check_name'}"," お名前 ","*","");
 &show_select_typeA("form_check_email","$PM{'form_check_email'}"," ﾒﾙｱﾄﾞ ","","*");
 &show_select_typeA("form_check_subject","$PM{'form_check_subject'}"," 題名欄 ","","*");
 &show_select_typeA("form_check_body","$PM{'form_check_body'}"," 本文欄 ","","*");

print<<HTML_END;
<BR>
iｸｯｷｰ<BR>
HTML_END
 &show_select_typeA("no_body_in_icookie","$PM{'no_body_in_icookie'}"," 本文非記憶 ","*","");
print<<HTML_END;

$HR
<INPUT TYPE=HIDDEN NAME=bbsaction VALUE="change_config">
<INPUT TYPE=PASSWORD NAME="passwd" SIZE=5 MAXLENGTH=12 istyle=4>
<INPUT TYPE=SUBMIT VALUE="適用">
</FORM>

(<a href="$cgi_name?page=$FORM{'page'}&mode=change_set">1P</a>/<a href="$cgi_name?page=$FORM{'page'}&mode=change_set2">2P</a>)<BR>
(<B>3P</B>/<a href="$cgi_name?page=$FORM{'page'}&mode=change_set4">4P</a>)<BR>


$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}&mode=disp_admin_menu" accesskey=0>戻る</a><BR>
$HR
</BODY>
</HTML>
HTML_END
}
#
#
#===============================================#
#     <ＨＴＭＬ--管理メニュー(設定変更4/4)>     #
#===============================================#
#
#  管理メニュー(設定変更)用のＨＴＭＬの4ページ目です．
#
sub output_change_set4_HTML{


print<<HTML_END;
<HTML>
<BODY BGCOLOR=PINK>
画像Upload掲示板<BR>
<center>
(携帯ｱｸｾｽ)<BR>
<BR>
設定変更メニュー<BR>
(<a href="$cgi_name?page=$FORM{'page'}&mode=change_set">1P</a>/<a href="$cgi_name?page=$FORM{'page'}&mode=change_set2">2P</a>)<BR>
(<a href="$cgi_name?page=$FORM{'page'}&mode=change_set3">3P</a>/<B>4P</B>)<BR>
</center>
<FORM action=$cgi_name>
$HR
会員ﾊﾟｽ(投稿ﾊﾟｽ)の有無の設定と、ﾊﾟｽﾜﾄﾞ（４ｹﾀの数字）の設定がここでできます。なお、ここで
設定を変更すると、ここでの設定の方が優先度が高いため、スクリプト
内で指定した会員ﾊﾟｽ関連の指定が以後効かなくなりますので、ご注意
ください。
なお、会員ﾊﾟｽをここで変更し、そのﾊﾟｽを忘れてしまった場合は、
ここで新ﾊﾟｽﾜﾄﾞを設定してください。<BR>

1=YES,0=NO<BR>
*がﾃﾞﾌｫﾙﾄ値<BR>

HTML_END

 &show_select_typeA("use_post_password","$PM{'use_post_password'}"," 投稿ﾊﾟｽ使用 ","*","");

print<<HTML_END;


HTML_END

  if($PM{'use_post_password'} == 1){

print<<HTML_END;
<INPUT TYPE=TEXT NAME="post_passwd" MAXLENGTH=10 SIZE=6>投稿ﾊﾟｽ<BR>
↑4ｹﾀの数字
$HR
HTML_END

  }else{
print<<HTML_END;
$HR
HTML_END

  }

print<<HTML_END;
<INPUT TYPE=HIDDEN NAME=bbsaction VALUE="change_config">
<INPUT TYPE=PASSWORD NAME="passwd" SIZE=5 MAXLENGTH=12 istyle=4>
<INPUT TYPE=SUBMIT VALUE="適用">
</FORM>

(<a href="$cgi_name?page=$FORM{'page'}&mode=change_set">1P</a>/<a href="$cgi_name?page=$FORM{'page'}&mode=change_set2">2P</a>)<BR>
(<a href="$cgi_name?page=$FORM{'page'}&mode=change_set3">3P</a>/<B>4P</B>)<BR>


$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}&mode=disp_admin_menu" accesskey=0>戻る</a><BR>
$HR
</BODY>
</HTML>
HTML_END
}
#
#
sub show_select_typeA{
    # 引数 NAME,デフォルト値、項目名、1に説明、0に説明
    local($value_name)=$_[0];
    local($selected_value)=$_[1];
    local($p_name)=$_[2];
    local($mes_p1)=$_[3];
    local($mes_p0)=$_[4];
print<<HTML_END;
<SELECT NAME="$value_name">
<OPTION SELECTED>$selected_value
<OPTION VALUE="1">1$mes_p1
<OPTION VALUE="0">0$mes_p0
</SELECT>$p_name<BR>
HTML_END
}
#
sub show_text_input_typeA{
    # 引数 NAME,デフォルト値、項目名,サイズ、最大サイズ
    local($value_name)	=$_[0];
    local($def_value)	=$_[1];
    local($p_name)	=$_[2];
    local($t_size)	=$_[3];
    local($max_length)	=$_[4];
    local($other_para)	=$_[5];
print<<HTML_END;
<INPUT TYPE=TEXT SIZE="$t_size" MAXLENGTH="$max_length" NAME="$value_name" VALUE="$def_value" $other_para>
$p_name<BR>
HTML_END
}
#
#===============================================#
#     <ＨＴＭＬ--管理メニュー(使い方)>          #
#===============================================#
#
#  管理用メニュー(使い方解説)用のＨＴＭＬです．
#
sub output_show_howto_HTML{
print<<HTML_END;
<HTML>
<BODY BGCOLOR=PINK>
画像Upload掲示板<BR>
<CENTER>
(携帯ｱｸｾｽ)<BR>
<BR>
使い方<BR>
</CENTER>
$HR
(閲覧)<BR>
記事を読むモードです。
最初の画面モードです。
ページの変更は「次？件」
「前？件」「先頭」リンクを
使って下さい。<BR>
<BR>
(投稿)<BR>
記事を投稿するモードです。
パスワードが設定されている場合は
掲示板運営者から会員パスワドを聞
いてから、投稿画面へ進んでください。
投稿画面に進んだら、各項目を埋めて
投稿ボタンを押して下さい。
投稿すると、４桁の常連番号が自動的に
振られます。これを記憶しておきましょう。
２度目以降の入力時に前回の入力データを
復元できるようになり、入力が楽になります
(iクッキー機\能\)。
<P>
(画像/動画投稿)<BR>
51,52,53ｼﾘｰｽﾞ以降のJ-SKY ﾊﾟｹｯﾄ対応\機\(ﾑｰﾋﾞ写ﾒｰﾙ機)は直接写真をｱｯﾌﾟﾛｰﾄﾞ可\能\です。<BR>なお、その他の写メール機、EZのフォトメール、i-shot等からは画像を投稿できません。これらのｶﾒﾗ付き携帯に関しては、現在開発中のスクリプト「全ｶﾒﾗ付き携帯対応のimgboard1.22R7」からの対応になりますので、それをお使いください。

<P>
(削除)<BR>
管理人は管理メニューから削除メニューを出し、消したい
記事の左肩にチェックをつけて、管理パスワドを最下欄に
記入し、削除ボタンを押して下さい。
(β版では、imodeから削除できるのは、管理パスワドを知っている掲
示板管理人のみです。正式版ではiクッキー番号を入れる
ことによりユーザも削除できるようになります)<p>

(その他)<BR>
現在、iモード、Jフォン（Ｊスカイ）、EZweb、
アステルのドットi、Ｈ”(閲覧のみ)に対応しています。
他の携帯には対応していません。<BR>

なお、2003.07現在各携帯で表\示できるのは以下の画像のみです。
<BR>
<BR>
ドコモ<BR>
(GIF形式)imode<BR>
(GIF/JPEG形式)P/N503,P/N/SO/R211,全251系,全504,505系<BR>
全FOMA<BR>

<BR>
Jフォン<BR>
(PNG形式)Ｊスカイ機<BR>
(PNG/JPEG形式)ステーション対応機<BR>
パケット対応機<BR>
<BR>
アステル<BR>
(PNG/GIF形式)ドットi<BR>
<BR>
AU(EZweb)<BR>
初期型(PNG/BMP形式)<BR>
最新型(GIF/JPEG/PNG形式)<BR>
詳細は<a href=http://www.au.kddi.com/ezfactory/tec/spec/new_win/ezkishu.html>
ここ</a><BR>

<BR>
$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}&mode=disp_admin_menu" accesskey=0>戻る</a><BR>
$HR
</BODY>
</HTML>
HTML_END
}
#
#
#===============================================#
#     <ＨＴＭＬ--管理メニュー(ワード検索)>            #
#===============================================#
#
#  管理メニュー(ワード検索メニュー)用のＨＴＭＬです．
#
sub output_search_menu_HTML{

	local($mes_p1);
	local($mes_p2);

	if($FORM{'MatchMode'} eq "OR"){
		$mes_p1="selected";
	}else{
		$mes_p2="selected";
	}

print<<HTML_END;
<HTML>
<BODY BGCOLOR=PINK>
画像Upload掲示板<BR>
<CENTER>
(携帯ｱｸｾｽ)<BR>
<BR>
ワード検索<BR>
</CENTER>
$HR
記事の全文検索を行います。複合のワードを入力する場合は半角スペースで各単語を区切って入力してください
<FORM METHOD=GET action="$cgi_name">
<INPUT TYPE=HIDDEN NAME="mode" VALUE="search_menu">
<INPUT TYPE=TEXT SIZE=15 NAME="SearchWords" MAXLENGTH=40 istyle=1 MODE=hiragana VALUE="$FORM{'SearchWords'}">
<BR>
<SELECT NAME="MatchMode">
<OPTION VALUE="AND" $mes_p2>AND 検索
<OPTION VALUE="OR" $mes_p1>OR 検索
</SELECT>
<BR><BR>
<CENTER>
<INPUT TYPE=SUBMIT VALUE="検索実行">
</FORM>
<BR>
$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}" accesskey=0>検索終了</a><BR>
</CENTER>
HTML_END
}
#
sub output_search_menu_HTML2{
print<<HTML_END;
</BODY>
</HTML>
HTML_END
}
#
#
#===============================================#
#     <ＨＴＭＬ--管理メニュー(imgboardとは)>    #
#===============================================#
#
#  管理メニュー(imgboard解説)用のＨＴＭＬです．
#
sub output_whats_imgboard_HTML{
print<<HTML_END;
<HTML>
<BODY BGCOLOR=PINK>
画像Upload掲示板<BR>
<CENTER>
(携帯ｱｸｾｽ)<BR>
<BR>
imgboardとは<BR>
</CENTER>
$HR
PCから直接画像をｱｯﾌﾟﾛｰﾄﾞできる機能\を持ったFreeの掲示板です。設定が簡単で設置しやすく、高速\表\示・高機\能\なのが特徴で、現在設置数は数千、ﾕｰｻﾞは数万人おり、ﾌｧｲﾙｱｯﾌﾟﾛｰﾄﾞ機能\持った掲示板の定番として、多くの皆様からご愛顧いただいております。<BR>
<BR>
<CENTER>
携帯ｱｸｾｽCGIとは
</CENTER>
<BR>
画像Upload掲示板(携帯ｱｸｾｽCGI)は、imgboard運用者やそのお友達のﾕｰｻﾞ方々からの、「iﾓｰﾄﾞからも、ｺﾒﾝﾄ投稿（ﾃｷｽﾄのみ）、閲覧、削除等をできるようにして欲しい」というご要望に応えて、2000年4月に開発した追加ｽｸﾘﾌﾟﾄです。なお、このｽｸﾘﾌﾟﾄは、基本的には単体では動きませんので、imgboardと組合わせてご使用ください。
<BR>

$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}&mode=disp_admin_menu" accesskey=0>戻る</a><BR>
$HR
</BODY>
</HTML>
HTML_END
}
#
#=====================================#
#     <ＨＴＭＬ--メンバー確認>        #
#=====================================#
#
#  メンバー確認用のＨＴＭＬです．
#
sub output_member_check_HTML{

	local($mes_p1);
	local($mes_p2);
	local($mes_p3);
	local($mes_p4);
	local($mes_p5);
	local($mes_p8);

	if($keitai_flag eq "imode"){
		$mes_p1=qq|istyle="4"|;
		$mes_p2=qq|istyle="4"|;
	}elsif($keitai_flag eq "J-PHONE"){
		$mes_p1=qq|MODE=numeric|;
		$mes_p2=qq|MODE=numeric|;
	  if($jstation_flag >= 4){
		$mes_p4=qq|新型|;
	  }else{
		$mes_p4=qq|旧型|;
	  }
	}elsif($keitai_flag eq "EZweb"){
		&error(" EZはmodeでdisp_member_check_ezを呼ぶこと ");
	}elsif($keitai_flag eq "H"){
		&error(" Ｈ”からは投稿できません ");
	}
	if($FORM{'parent'} ne ""){
	   if($PM{'use_rep'} == 1 ){
		$mes_p8 =qq|記事$FORM{'parent'}に返信<BR>|;
	   }
	}


if($PM{'use_post_password'}==1){

print<<HTML_END;
$HR
<CENTER>
$mes_p8
メンバー確認<BR>
</CENTER>
$HR

<FORM ACTION="$cgi_name" METHOD="$form_method">
会員ﾊﾟｽﾜﾄﾞ\*<BR>
<INPUT TYPE="password" NAME="entrypass" SIZE=4 VALUE="$COOKIE{'entrypass'}" MAXLENGTH="8" $mes_p1><BR><BR>
HTML_END

$mes_p5=qq| (注１)投稿者は、運営者から通知されたﾊﾟｽﾜﾄﾞを入力してください 。|;

}else{

print<<HTML_END;
$HR
<CENTER>
$mes_p8<BR>
常連番号をお持ちの方は入力してください。持ってない方はお好きな番号(4桁)を
入れて「次へ」を押してください<BR>
</CENTER>
$HR
<FORM ACTION="$cgi_name" METHOD="$form_method">
<INPUT TYPE="hidden" NAME="entrypass" VALUE="$PM{'post_passwd'}" MAXLENGTH="8">
HTML_END
}

print<<HTML_END;
常連番号(省略\可)<BR>
<INPUT TYPE="password" NAME="memberID" SIZE=4 VALUE="$COOKIE{'memberID'}" MAXLENGTH="4" $mes_p2>
<INPUT TYPE="hidden" NAME="mode" VALUE="disp_input_menu">
<INPUT TYPE="hidden" NAME="blood" VALUE="$FORM{'blood'}">
<INPUT TYPE="hidden" NAME="parent" VALUE="$FORM{'parent'}">
<INPUT TYPE="hidden" NAME="page" VALUE="$FORM{'page'}">
<INPUT TYPE="submit" VALUE="次へ">
</FORM>

 $mes_p5
<BR>
(注)過去に、掲示板に投稿された方には、常連番号が
発行されています。この番号を入力することにより、
名前、メールアドレス等を自動で入力することができます。
<BR>
<CENTER>
$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}" accesskey=0>戻る</a>
</CENTER>
$HR
</BODY>
</HTML>
HTML_END
}
#
##
#=============================#
#     <ＨＴＭＬ--デバック>    #
#=============================#
#
#  デバック用のＨＴＭＬです．
#
sub output_check_env_HTML{
print<<HTML_END;
<HTML>
<BODY BGCOLOR=PINK>
画像Upload掲示板<BR>
<CENTER>
<BR>
</CENTER>

デバック用<BR>
$HR
<BR>
Debug<BR>
<BR>
HTTP_USER_AGENT<BR>
$HTTP_USER_AGENT<BR>
<BR>
REMOTE_HOST<BR>
$REMOTE_HOST<BR>
<BR>
HTTP_REFERER<BR>
$HTTP_REFERER<BR>
<BR>
SERVICE_COMPANY<BR>
$KEITAI_ENV{'SERVICE_COMPANY'}<BR>
<BR>
HTTP_VERSION<BR>
$KEITAI_ENV{'HTTP_VERSION'}<BR>
<BR>
MACHINE_TYPE<BR>
$KEITAI_ENV{'MACHINE_TYPE'}<BR>
<BR>
CACHE_SIZE<BR>
$KEITAI_ENV{'CACHE_SIZE'} KB<BR>
<BR>
STREAM_SPEED<BR>
$KEITAI_ENV{'STREAM_SPEED'}<BR>
<BR>
OTHER_PARAM<BR>
$KEITAI_ENV{'OTHER_PARAM'}<BR>
<BR>
keitai_f $keitai_flag <BR>

$accesskey_p1<a href="$cgi_name?page=$FORM{'page'}&mode=disp_admin_menu" accesskey=0>戻る</a><BR>
$HR
</BODY>
</HTML>
HTML_END
}
#================================== EZweb start ==============================#
#
#==================================#
# EZweb用 カスタム不可
#==================================#
# EZウェブ用↓

sub ez_top_html{
print<<HTML_END;
<HDML VERSION="3.0" MARKABLE="TRUE" TTL="0">
HTML_END
}
sub ez_top_button_html{

   local($mes_p1)="";

	# 投稿完了後はACCEPTでjump_htmlへ戻らないようにする
	if(($FORM{'bbsaction'} eq "postjump")||($FORM{'bbsaction'} eq "errorjump")){
	  $mes_p1=qq|<ACTION type="accept" task="noop" label=" ">|;
	}

# 管理メニューは使えない
print<<HTML_END;
<DISPLAY NAME="index" TITLE="$PM{'title'}">
$mes_p1
<CENTER>画像Upload掲示板<BR>
<CENTER>EZwebモード<BR>
 $cm_out_exit_h<a TASK="GO" DEST="$PM{'back_url'}">HOME</a><BR>$cm_out_exit_f
-<A LABEL="投稿を開始する" TASK="GO" DEST="$cgi_name?mode=disp_member_check_ez&page=$FORM{'page'}">投稿</A><BR>
-<A LABEL="EZからは不可" TASK="GO" DEST="$cgi_name?page=$FORM{'page'}">管理</A><BR>
HTML_END
}

sub ez_kiji_base_html{

    local($mail_link)="";
    local($tel_link) ="";
    local($keitai_env_link) ="";

    # 事前準備
    #  日付データを短くする
    if($LDATA{'date'}=~ /\[(\d+)\/(\d+)\/(\d+)\,(\d+)\:(\d+)\:(\d+)\]/){
	$LDATA{'date'}="$2\/$3"."_"."$4\:$5";
    }

    $OPTDATA{'optD'}="";
   #  メールアドレスがある場合だけリンクする
       if(($LDATA{'email'} eq "")||($LDATA{'email'}=~ /no_email/i)||($LDATA{'email'} eq "none")){
	   $mail_link="($LDATA{'name'})";
       }else{

	# ez@mail対応端末（Thanks to CGIぽん）
#	if($KEITAI_ENV{'EZ_MAIL'}==1){
#	   $mail_link=qq|(<A DEST="device:home\/goto?svc=Email&SUB=sendMsg" VARS="TO=$LDATA{'email'}\"  TASK="GOSUB" LABEL="投稿者へMail">$LDATA{'name'}</A>)|;
	# ez@mail非対応端末
#	}else{
	   $mail_link=qq|<A TASK="GOSUB" LABEL="投稿者へMail" DEST="mailto:$LDATA{'email'}\">$LDATA{'name'}</A>|;
#	}

	# コンパイルエラーになる現象を防ぐ
	if($LDATA{'email'}!~ /(\w+)@(\w+)/){
	  $mail_link="($LDATA{'name'})";
	}
	# ２バイト文字がVARSに入り、コンパイルエラーになる現象を防ぐ
	if($LDATA{'email'}=~ /[\x80-\x9f\xe0-\xff]/){
	  $mail_link="($LDATA{'name'})";
	}
       }
       $tel_link="";
# <ACTION TYPE=ACCEPT TASK=CALL LABEL="電話する" NUMBER="0000-00-0000">

	if($OPTDATA{'optKeitaiFlag'} ne ""){
	  $keitai_env_link=qq|<BR>$OPTDATA{'optKeitaiFlag'}：$OPTDATA{'optKeitaiMachineType'}<BR>|;
	}

        # コンパイルエラーを防ぐためにコンテンツに含まれる危険HTMLタグや危険文字を取る
        foreach(keys %LDATA){
	  $LDATA{$_} =~ s/$HR//g;
	  $LDATA{$_} =~ s/<HR>//ig;		 # 2002.03 add
	  $LDATA{$_} =~ s/<(\/?)RIGHT>//ig;	 # 2002.03 add
	  $LDATA{$_} =~ s/<(\/?)LINE>//ig;	 # 2002.03 add
	  $LDATA{$_} =~ s/<(\/?)WRAP>//ig;	 # 2002.03 add

	  $LDATA{$_} =~ s/&/&amp;/g;	 # 2002.03 add
	  $LDATA{$_} =~ s/</&lt;/ig;	 # 2002.03 add
	  $LDATA{$_} =~ s/>/&gt;/g;	 # 2002.03 add
	  $LDATA{$_} =~ s/"/&quot;/g;	 # 2002.03 add
	  $LDATA{$_} =~ s/\$/&dol;/g;	 # 2002.03 add

	  $LDATA{$_} =~ s/<\/CENTER\>//ig;
	  $LDATA{$_} =~ s/<(\/?)DIV>//ig;
	  $LDATA{$_} =~ s/<(\/?)FONT(.|\n)*>//ig;

	  if ($LDATA{$_} =~ /[\xF8\xF9]/) {
	   $LDATA{$_} =&remove_emoji_i("$LDATA{$_}");	 # 2002.05 add
	  }
        }

print<<HTML_END;
$disp_seq_no)$LDATA{'date'}<BR>
$LDATA{'subject'}
$mail_link<BR>
$disp_re<BR>
$LDATA{'body'}<BR>
HTML_END

    if($LDATA{'img_location'} ne ""){
	if($can_handle_flag == 1 ){	# 扱える場合はリンク表示

print<<HTML_END;
<BR>
$data_type- $IMG_PARAMETERS{'dsize'}<BR> 
<A TASK="GOSUB" DEST="$cgi_name?bbsaction=output_EZ_img&mRef=$LDATA{'img_location'}&dummy=" LABEL="再生する">$LDATA{'imgtitle'}</A><BR>
HTML_END

	}else{

print<<HTML_END;
<BR>
$data_type-$IMG_PARAMETERS{'dsize'}<BR>
$LDATA{'imgtitle'}
HTML_END

	}
    }

   if($keitai_env_link ne ""){
	print "$keitai_env_link\n";
   }
}
#=====================================#
#     <絵文字削除>                    #
#=====================================#
#
sub remove_emoji_i{
 local($target_str)	= $_[0];# 引数でもらう
 $target_str =~ s/\G((?:[\x80-\x9F\xE0-\xEF\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*)(?:[\xf8\xf9][\x40-\xff]|[\xf0-\xf4][\x40-\xff])/$1/go;
 return("$target_str");
}

#=====================================#
#     <ＨＤＭＬ--メンバー確認>        #
#=====================================#
#
#  メンバー確認用のＨＤＭＬです(EZweb)．
#
sub ez_output_member_check_HTML{

	local($mes_p1);
	local($mes_p2);
	local($mes_p3);
	local($mes_p4);
	local($mes_p5);
	local($mes_p6);
	local($mes_p7);

	if($keitai_flag eq "EZweb"){
	}

	if($FORM{'parent'} ne ""){
	   if($PM{'use_rep'} == 1 ){
		$mes_p8 =qq|<CENTER>-記事$FORM{'parent'}に返信-<BR>|;
	   }
	}

	if($PM{'use_post_password'}==1){
		$mes_p4=qq|&entrypass=\$entrypass|;
		$mes_p5=qq| 運営者から通知されたﾊﾟｽﾜﾄﾞを入力 |;
		$mes_p6=qq|inpass|;
		$mes_p6=qq|inpass|;
	}else{
		$mes_p3=qq|&entrypass=$PM{'post_passwd'}|;
		$mes_p6=qq|inmemid|;
		$mes_p6=qq|inmemid|;
	}

print<<HTML_END;
<HDML VERSION="3.0" MARKABLE="TRUE" TTL="0">
<ACTION TYPE="ACCEPT" TASK="GO" DEST="#$mes_p6" LABEL="次へ">
<ACTION TYPE="soft1" TASK="PREV" LABEL="中止">
<DISPLAY NAME="index" TITLE="$PM{'title'}">
<CENTER>画像Upload掲示板<BR>
<CENTER>($keitai_flagモード)<BR>
$mes_p8
<CENTER>投稿前に、メンバー確認をします。<BR>
<CENTER><BR>
</DISPLAY>
HTML_END


	if($PM{'use_post_password'}==1){

print<<HTML_END;

<ENTRY name="inpass" key="entrypass" default="$COOKIE{'entrypass'}">
<ACTION TYPE="ACCEPT" TASK="GO" DEST="#inmemid" LABEL="数字を入力">
$mes_p5<BR>
会員パス:\<BR>
</ENTRY>
HTML_END

	}

print<<HTML_END;

<ENTRY name="inmemid" key="memberID" default="$COOKIE{'memberID'}">
<ACTION type="accept" task="go" dest="$cgi_name" label="次へ" method="post" postdata="page=$FORM{'page'}$mes_p3&mode=disp_input_menu&blood=$FORM{'blood'}&parent=$FORM{'parent'}&memberID=\$memberID$mes_p4">
常連番号のある方は、入力してね。（iクッキーで入力が楽になるよ。）<BR>
常連番号:（省略可）<BR>
</ENTRY>

</HDML>
HTML_END
exit;
}
#
#========================= EZweb ================================#

#======================== H" start ==============================#
#
#==================================#
# Ｈ”用 カスタム不可（閲覧のみ）
#==================================#
# Ｈ”用↓カスタム不可
sub H_top_html{
# SELまでは出力できない
}

sub H_top_button_make{

	local($last_disp_message)="$last_message";

	# お尻の位置をチェック
	if($last_message > $all_message){
	    $last_disp_message="$all_message";
	}

	if($start_message != $last_disp_message){
	# 通常
	    $H_disp_button_mes001=qq|$start_message-$last_disp_message/$mes_p2$all_message件 |;

	}else{
	# １ページに１記事しかない
	    $H_disp_button_mes001=qq|$start_message/$all_message件 |;
	}

# 先頭へ
print<<HTML_END;
<SEL=0;$PM{'cgi_link_url'}/$cgi_name?page=1&mode=$FORM{'mode'}&bbsaction=page_change>
HTML_END

	if($start_message > 1){
		$pre_message = $start_message - $PM{'message_per_page'};
		$pre_message =1 if $pre_message < 1;
		$tmp_disp_message=$start_message-1;

# ('@','A','B','C','D','E','F','G','H');

		$H_disp_button_top =qq| H先頭へ |;
		$H_disp_button_pre =qq| @前$PM{'message_per_page'}件へ |;
# 戻る
print<<HTML_END;
<SEL=1;$PM{'cgi_link_url'}/$cgi_name?page=$pre_message&mode=$FORM{'mode'}&bbsaction=page_change>
HTML_END

	}

	if($all_message > $last_message){
		$next_message = $last_message+1;
		$last_disp_message=$last_message+$PM{'message_per_page'};
		if($all_message < $last_disp_message){
			$last_disp_message=$all_message;
		}
		$H_disp_button_next=qq| B次$PM{'message_per_page'}件へ |;
# ススム
print<<HTML_END;
<SEL=3;$PM{'cgi_link_url'}/$cgi_name?page=$next_message&mode=$FORM{'mode'}&bbsaction=page_change>
HTML_END

	}

	if($PM{'back_url'} ne 'http://あなたのプロバイダ/あなたのディレクトリ/index.html'){
# 戻り先URL
print<<HTML_END;
<SEL=7;$PM{'back_url'}>
HTML_END
		$H_disp_button_exit=qq| FHome |;

	}

# CGI入手先
print<<HTML_END;
<SEL=9;http://www.big.or.jp/~talk/welcome/welcome_im01.cgi>
HTML_END

}

sub H_top_button_html{

# ここより本文
print<<HTML_END;
<BODY>
画像Upload掲示板
(H"モード)
 Ｈ”からは閲覧のみ可\能\です。
管理/投稿はＨ”からはできません

$H_disp_button_mes001

HTML_END
}

sub H_disp_button{

print<<HTML_END;
$H_disp_button_pre
$H_disp_button_next
$H_disp_button_top
$H_disp_button_exit
GGet This CGI
HTML_END
}

sub H_kiji_base_html{

    local($mail_link)="";
    local($tel_link) ="";

    # 事前準備
    #  日付データを短くする
    if($LDATA{'date'}=~ /\[(\d+)\/(\d+)\/(\d+)\,(\d+)\:(\d+)\:(\d+)\]/){
	$LDATA{'date'}="$2\/$3"."_"."$4\:$5";
    }

    $OPTDATA{'optD'}="";
   #  メールアドレスがある場合だけリンクする
       if(($LDATA{'email'} eq "")||($LDATA{'email'}=~ /no_email/i)||($LDATA{'email'} eq 'none')){
	   $mail_link="($LDATA{'name'})";
       }else{
	   $mail_link=qq|($LDATA{'name'})\n <#MAIL>$LDATA{'email'}|;
       }
       $tel_link="";

        # 見栄えが悪くなるのを防ぐためにコンテンツに含まれるHTMLタグを取る
        foreach(keys %LDATA){
	  $LDATA{$_} =~ s/$HR//g;
	  $LDATA{$_} =~ s/<\/CENTER\>//ig;
	  $LDATA{$_} =~ s/<(\/?)DIV>//ig;
	  $LDATA{$_} =~ s/<(\/?)FONT(.|\n)*>//ig;
	  $LDATA{$_} =~ s/<BR>/\n/ig;
	  $LDATA{$_} =~ s/<P>/\n\n/ig;
	  $LDATA{$_} =~ s/<!--(.*)-->//g;
	  $LDATA{$_} =~ s/</<</g; # 仕様による
        }
	  $LDATA{'imgtitle'} =~ s/^img(.*)$//g;

print<<HTML_END;
($disp_seq_no)$LDATA{'date'}
$LDATA{'subject'}
$mail_link
$LDATA{'body'}
HTML_END
    if($LDATA{'img_location'} ne ""){
print<<HTML_END;

$data_type- $IMG_PARAMETERS{'dsize'}
$LDATA{'imgtitle'}
$LDATA{'img_location'} 

HTML_END

    }
}


#========================= H" ================================#

#=========================#
# HRを出力する(EZweb対策)
#=========================#

sub HR{
# 引数１はHRタグにそのまま代入,引数2はHRもどきの長さ
    local($hr_para,$hr_length)= @_;
    local($b);

	  if($keitai_flag eq "EZweb"){
	      if($hr_length eq ""){
		  $hr_length=15;
	      }
              print "<CENTER>";
              for($b=0;$b<$hr_length;$b++){
              print "-";
	      }
              print "<BR>\n";
	  }elsif($keitai_flag eq "H"){
	      if($hr_length eq ""){
		  $hr_length=11;
	      }
              print "\n";
              for($b=0;$b<$hr_length;$b++){
              print "-";
	      }
              print "\n";
 	  }else{
             print "<HR $hr_para>\n";
	  }
}

#==================================#
# imgboard スクリプト尻切れ検出用 
#==================================#

sub check_script_end{
	$script_end_flag='1';
}

# スクリプト終端です

