#!/usr/bin/perl

## -----------------------------------------------------------------
## 上記のperlのパスを自分の環境に合わせて変更してください。
## perlのパスは大抵は、 /usr/bin/perl か /usr/local/bin/perl です。
## 分からない場合は、サーバ管理者に訊いてください。
## -----------------------------------------------------------------

## -----------------------------------------------------------------
## p.cgi , ver1.02 , 2002/06/22 , Moomin+
## -----------------------------------------------------------------

# SSIを使うのならjcode.pl,formline.plへのパスは絶対パスで書く
require './jcode.pl';
require './formline.pl';

#require '/usr/local/apache/htdocs/freecgi/jcode.pl';
#require '/usr/local/apache/htdocs/freecgi/formline.pl';

#use Socket;

## -----------------------------------------------------------------
## 注意事項
## 1. この懸賞用検索エンジンの著作権はMoomin+が、配布権は株式会社パ
##    ブリックリレーションズ(以下、P社)が保持します。改編される場合
##    はMoomin+、再配布される場合はP社の了承が必要です。
## 2. 改編や再配布をされたい場合、サポートBBSに投稿をお願いします。
##    随時、可否の判断をさせていただきます。
## 3. 有用な改編、アイデアがありましたら、次期バージョンに採り入れ
##    ていきたいと思いますので、サポートBBSに投稿いただければうれ
##    しいです。
## 4. このスクリプトを使用した上で、発生したいかなる損害に対しても
##    Moomin+とP社は一切の責任を負いません。
## 5. このスクリプトを使用した時点で、P社利用規約に同意したものとみ
##    なさせていただきます。
##
## P社ホームページ: http://www.prjapan.co.jp/
## このCGIのページ: http://www.prjapan.co.jp/freecgi/
## P社利用規約: http://www.prjapan.co.jp/freecgi/kiyaku.php3
## サポートBBS: http://www.prjapan.co.jp/freecgi/bbs/
## -----------------------------------------------------------------

## -----------------------------------------------------------------
## スクリプト名を設定
## -----------------------------------------------------------------

#このスクリプトのファイル名
$THISFILENAME=$ENV{'SCRIPT_NAME'};
$THISFILENAME=~s/(.+)\/([^\/]+)$/$2/;

## -----------------------------------------------------------------
## 設定を保存するディレクトリが用意されているかチェック
## -----------------------------------------------------------------

#色々なファイルをおくディレクトリ
#このディレクトリは777で作成してね。

#SSIを使うならdataへのパスは絶対パスで書く
$DATADIR='./data/';
#$DATADIR='/usr/local/apache/htdocs/freecgi/data/';

if (!-e $DATADIR || !-r $DATADIR || !-w $DATADIR || !-x $DATADIR){
  &fatal("$THISFILENAMEを設置したディレクトリにdataというディレクトリを作成してください。<br>dataディレクトリのパーミッションは777にしてください。");
}

## -----------------------------------------------------------------
## 設定ファイルがあれば設定を読み込む
## -----------------------------------------------------------------

#設定を保存しているファイル
$CONFFILE=$DATADIR.'/p_conf.cgi';

&get_conf();

## -----------------------------------------------------------------
## 設定がない場合、必要最低限の設定を行う
## -----------------------------------------------------------------

#PRJAPANから発行された利用者ID
$PRJUSERID=$PRJUSERID?$PRJUSERID:'prjid';

#管理者パスワード
$ADMINPASS=$ADMINPASS?$ADMINPASS:'123';

# 曜日 0: 英語 1: 日本語
#使ってません。
$YOUBI_TYPE=($YOUBI_TYPE eq '')?0:$YOUBI_TYPE;

#登録データの処理方法 0:自動的に公開 1:管理者による認証が必要
$REGISTMODE=($REGISTMODE eq '')?0:$REGISTMODE;

#期限切れのデータをログファイルから削除するか 0: no 1: yes
# 1を設定。変更できません。
$DELPASTDATA=($DELPASTDATA eq '')?1:$DELPASTDATA;

#アクセス数をカウントする際に1時間以内に同一IPからのアクセスがあった場合カウントするか 0: no 1:yes
$SAMEUSER=($SAMEUSER eq '')?1:$SAMEUSER;

#アクセス数を表示するか  0: no 1:yes
$DISPACCESSNUM=($DISPACCESSNUM eq '')?1:$DISPACCESSNUM;
$DISPACCESSNUMI=($DISPACCESSNUMI eq '')?1:$DISPACCESSNUMI;

#プレゼントの賞品画像を表示するか  0: no 1:yes
$DISPPINFOIMG=($DISPPINFOIMG eq '')?1:$DISPPINFOIMG;
$DISPPINFOIMGI=($DISPPINFOIMGI eq '')?0:$DISPPINFOIMGI;

#1ページあたりの表示件数
$DISPINFONUM=($DISPINFONUM eq '')?20:$DISPINFONUM;
$DISPINFONUMI=($DISPINFONUMI eq '')?5:$DISPINFONUMI;

#タイトルのサイズ(1-7)
$TITLEFONTSIZE=($TITLEFONTSIZE)?$TITLEFONTSIZE:6;
$TITLEFONTSIZEI=($TITLEFONTSIZEI)?$TITLEFONTSIZEI:3;

#トップページのカテゴリ表示列数
#使ってません。
$CATEGORYCOLS=($CATEGORYCOLS)?$CATEGORYCOLS:2;

## -----------------------------------------------------------------
## 以下の設定システム用のものです。変更する必要ありません。(たぶん)
## -----------------------------------------------------------------

$GENRES_A[1]='現金・金券';
$GENRES_A[2]='旅券・宿泊券';
$GENRES_A[3]='映画・演劇招待券';
$GENRES_A[4]='優待券・割引券';
$GENRES_A[5]='食事券等';
$GENRES_A[6]='海外旅行・国内旅行';
$GENRES_A[7]='特産品・旅行グッズ';
$GENRES_A[8]='PC本体・周辺機器';
$GENRES_A[9]='PCサプライ・ソフト';
$GENRES_A[10]='家電商品';
$GENRES_A[11]='ゲーム・玩具';
$GENRES_A[12]='衣服・服飾';
$GENRES_A[13]='貴金属・化粧品';
$GENRES_A[14]='鞄・靴・腕時計・メガネ';
$GENRES_A[15]='スポーツ・アウトドア';
$GENRES_A[16]='健康食品・健康グッズ';
$GENRES_A[17]='食べ物';
$GENRES_A[18]='飲み物';
$GENRES_A[19]='書籍・音楽・ビデオ';
$GENRES_A[20]='日用品・生活雑貨';
$GENRES_A[21]='文具・楽器・趣味用品';
$GENRES_A[22]='家具・寝具・インテリア';
$GENRES_A[23]='車・単車・自転車';
$GENRES_A[24]='植物・ペット関連';
$GENRES_A[25]='携帯電話・浄水器';
$GENRES_A[26]='その他';

$PRESENT_SUBMITWAY_A[1]="CGIフォーム";
$PRESENT_SUBMITWAY_A[2]="フォームメール";
$PRESENT_SUBMITWAY_A[3]="メール";
$PRESENT_SUBMITWAY_A[4]="郵送";
$PRESENT_SUBMITWAY_A[5]="TEL FAX";
$PRESENT_SUBMITWAY_A[6]="その他";

$PRESENT_ANNOUNCE_A[1]="HP上で発表";
$PRESENT_ANNOUNCE_A[2]="当選者にのみメールで通知";
$PRESENT_ANNOUNCE_A[3]="応募者全員に結果を通知";
$PRESENT_ANNOUNCE_A[4]="賞品の発送をもって当選者の発表とする";
$PRESENT_ANNOUNCE_A[5]="電話やファックス、郵送にて通知";
$PRESENT_ANNOUNCE_A[6]="メールマガジンで発表";
$PRESENT_ANNOUNCE_A[7]="雑誌、書籍で発表";
$PRESENT_ANNOUNCE_A[9]="その他";

$PRESENT_SUBMITTYPE_A[1]="今回のみ";
$PRESENT_SUBMITTYPE_A[2]="毎月";
$PRESENT_SUBMITTYPE_A[3]="毎週";
$PRESENT_SUBMITTYPE_A[4]="毎日";
$PRESENT_SUBMITTYPE_A[5]="隔週";
$PRESENT_SUBMITTYPE_A[6]="常設";
$PRESENT_SUBMITTYPE_A[7]="不定期連続";
$PRESENT_SUBMITTYPE_A[8]="その他";

$PRESENT_SELECTWINNERWAY_A[0]="先着";
$PRESENT_SELECTWINNERWAY_A[1]="もれなく（応募者全員）";
$PRESENT_SELECTWINNERWAY_A[2]="抽選";
$PRESENT_SELECTWINNERWAY_A[3]="正解者全員";
$PRESENT_SELECTWINNERWAY_A[4]="優秀者・優勝者";
$PRESENT_SELECTWINNERWAY_A[5]="ゲームなど";
$PRESENT_SELECTWINNERWAY_A[6]="その他";

$PRESENT_SUBMITIF_A[0]="アンケート";
$PRESENT_SUBMITIF_A[1]="クイズ（キーワードを入力）";
$PRESENT_SUBMITIF_A[2]="コンテスト・公募";
$PRESENT_SUBMITIF_A[3]="無料会員登録（無料メールマガジン登録）";
$PRESENT_SUBMITIF_A[4]="ゲーム";
$PRESENT_SUBMITIF_A[5]="商品モニター";
$PRESENT_SUBMITIF_A[6]="クローズド（商品購入が必要・応募後費用がかかる）";
$PRESENT_SUBMITIF_A[7]="簡単なアンケート(記入選択数5箇所以内)";
$PRESENT_SUBMITIF_A[8]="来場者・来店者（WWW上を含まない）";
$PRESENT_SUBMITIF_A[9]="その他";

$PRESENT_SPECIAL_A[1]="大量（500名以上に当たる）";
$PRESENT_SPECIAL_A[2]="豪華（総額100万円以上）";
$PRESENT_SPECIAL_A[3]="レアマニア限定品サイン入りグッズ";
$PRESENT_SPECIAL_A[4]="男性限定男性が喜ぶ";
$PRESENT_SPECIAL_A[5]="女性限定女性が喜ぶ";
$PRESENT_SPECIAL_A[6]="地域限定企画";
$PRESENT_SPECIAL_A[7]="努力と才能で勝ち取る";
$PRESENT_SPECIAL_A[8]="ポイントをためるともらえる";
$PRESENT_SPECIAL_A[9]="もれなく";

#大量当選の人数
$MANYWINNERNO=500;

$ENV{'TZ'}='JST-9';

#このスクリプトのURL
$THISURLNAME="http://".$ENV{'SERVER_NAME'}.$ENV{'SCRIPT_NAME'};

#ロックファイル
$LOCKFILE='p_lock.cgi';

#ログファイル
$LOGFILE=$DATADIR.'p_log.cgi';
$LOGFILEI=$DATADIR.'p_logi.cgi';

#IPチェックするディレクトリ
$IPDIR=$DATADIR.'ip/';

#画像ファイルを保存するディレクトリ
$IMGDIR=$DATADIR.'img/';

#期限切れ処理をした日を保存しておくファイル名
$DELPASTDATAFILE=$DATADIR.'p_autodel.cgi';
$DELPASTDATAFILEI=$DATADIR.'p_autodeli.cgi';

#登録データの処理をした日を保存しておくファイル名
$REGISTMODEFILE=$DATADIR.'p_regmode.cgi';
$REGISTMODEFILEI=$DATADIR.'p_regmodei.cgi';

#プレゼント情報のIDを保存しておくファイル名
$NEXTIDFILE=$DATADIR.'p_nextid.cgi';

#カバーページ
$COVERPAGE=$DATADIR.'p_cover.cgi';
$COVERPAGEI=$DATADIR.'p_coveri.cgi';
$COVERPAGE2=$DATADIR.'p_cover2.cgi';
$COVERPAGE2I=$DATADIR.'p_cover2i.cgi';

#メニューページ
$NAVIPAGE=$DATADIR.'p_navi.cgi';
$NAVIPAGE2=$DATADIR.'p_navi2.cgi';

#スロットページ
$SLOTPAGE=$DATADIR.'p_slot.cgi';

#マガジンレイアウト
$MAGLAYOUT=$DATADIR.'p_maglayout.cgi';
$MAGLAYOUTI=$DATADIR.'p_maglayouti.cgi';

#プレゼント情報レイアウト
$PINFOLAYOUT=$DATADIR.'p_infolayout.cgi';
$PINFOLAYOUTI=$DATADIR.'p_infolayouti.cgi';
$PINFOLAYOUTORG='';

#SSIレイアウト
$SSILAYOUT=$DATADIR.'p_ssilayout.cgi';
$SSILAYOUTI=$DATADIR.'p_ssilayouti.cgi';

#クリック数
$CLICKSUM=$DATADIR.'p_click.cgi';
$CLICKSUMI=$DATADIR.'p_clicki.cgi';

#プレゼント情報を取得するサーバ
$PINFOSERVER='www.prjapan.co.jp';

#プレゼント情報を取得するスクリプト
$PINFOSCRIPT='/freecgi/g.php3';

#MOOMINからの連絡を取得するスクリプト
$MOOMINMSGSCRIPT='/freecgi/m.php3';

#ソケット関係
$PF_INET=2;
if ($OS eq "Solaris") {
  $SOCK_STREAM = 2;
} else {
  $SOCK_STREAM = 1;
}

#ssiで出力する際のデフォルトの文字コード
$SSIOUTPUTCHACODE="euc";

#モバイル?pc?
$UA=&uacheck();

## -----------------------------------------------------------------
## proxyを使っている場合はコメントを外して設定してください。
## -----------------------------------------------------------------

#$PROXY_HOST='xxx.xxx.xxx.xxx';
#$PROXY_PORT='8080';

## -----------------------------------------------------------------
## SSI ?
## -----------------------------------------------------------------

if ($ARGV[0] eq "ssi") {
  &info_ssi($ARGV[1],$ARGV[2],$ARGV[3],$ARGV[4],$ARGV[5]);
  exit;
}

## -----------------------------------------------------------------
## 設定ここまで。以下から本格的な動作です。
## -----------------------------------------------------------------

&read_parse(*in);

## -----------------------------------------------------------------
## 初期設定がされていないとき(idがprjidのままのとき)だけ表示されます。
## -----------------------------------------------------------------

if ($PRJUSERID eq 'prjid' && !$in{'is'}){
  &put_header("管理画面");
  &my_print("まず各種設定を行ってください。「PRJAPANから発行された利用者ID」と「管理者パスワード」は必ず変更してください。再設定は管理者ページから可能です。<p><hr>");
  &put_admin_menu_setting();
  &put_footer();
  exit;
}


## -----------------------------------------------------------------
## 動作によって処理を分岐します。
## -----------------------------------------------------------------

&cookie();

if ($in{'m'} eq 'new'){
  &info_new($in{'n'},0,0);
}elsif ($in{'m'} eq 'newi'){
  &info_newi($in{'n'});
}elsif ($in{'m'} eq 'last'){
  &info_last($in{'n'},0,0);
}elsif ($in{'m'} eq 'genre'){
  &info_genre($in{'n'},$in{'g'},0,0);
}elsif ($in{'m'} eq 'ranku'){
  &info_ranku($in{'n'},0,0);
}elsif ($in{'m'} eq 'rankd'){
  &info_rankd($in{'n'},0,0);
}elsif ($in{'m'} eq 'easy'){
  &info_easy($in{'n'},0,0);
}elsif ($in{'m'} eq 'quiz'){
  &info_quiz($in{'n'},0,0);
}elsif ($in{'m'} eq 'many'){
  &info_many($in{'n'},$in{'w'},0,0);
}elsif ($in{'m'} eq 'monitor'){
  &info_monitor($in{'n'},0,0);
}elsif ($in{'m'} eq 'all'){
  &info_all($in{'n'},0,0);
}elsif ($in{'m'} eq 'fast'){
  &info_fast($in{'n'},0,0);
}elsif ($in{'m'} eq 'go'){
  &go($in{'i'},$in{'u'});
}elsif ($in{'m'} eq 'go2'){
  &go2($in{'i'},$in{'u'});
}elsif ($in{'m'} eq 'go2_ad'){
  &go2_ad();
}elsif ($in{'m'} eq 'go3'){
  &go3($in{'i'},$in{'u'});
}elsif ($in{'m'} eq 'go3_ad'){
  &go3_ad();
}elsif ($in{'m'} eq 'search'){
  &search($in{'keyword'},$in{'searchtype'},$in{'n'});
}elsif ($in{'m'} eq 'admin_login'){
    &admin_login($in{'mode'},$in{'id'},$in{'pass'});
}elsif ($in{'m'} eq 'modify'){
  if (&auth()) {
    &modify($in{'dellist'},$in{'modlist'},$in{'ua'});
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'setconf'){
  if (&auth() || $in{'is'}) {
    &set_conf($in{'prjuserid'},$in{'adminpass'},$in{'bgcolor'},$in{'bgimage'},$in{'textcolor'},$in{'linkcolor'},$in{'alinkcolor'},$in{'vlinkcolor'},$in{'youbi_type'},$in{'registmode'},$in{'delpastdata'},$in{'sameuser'},$in{'dispaccessnum'},$in{'disppinfoimg'},$in{'dispaccessnumi'},$in{'disppinfoimgi'},$in{'dispinfonum'},$in{'sitename'},$in{'titlefontsize'},$in{'titlecolor'},$in{'titlegif'},$in{'titlegifw'},$in{'titlegifh'},$in{'hlinecolor'},$in{'categorycols'},$in{'genremark'},$in{'os'},$in{'headerad'},$in{'footerad'},$in{'dispinfonumi'},$in{'sitenamei'},$in{'titlefontsizei'},$in{'titlecolori'},$in{'titlegifi'},$in{'titlegifiw'},$in{'titlegifih'},$in{'headeradi'},$in{'footeradi'},$in{'affid'},$in{'goad'},$in{'textad'});
    &message("完了","設定を保存しました。<p><a href=$THISFILENAME target=_top>$SITENAMEトップへ</a>");
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'viewsetconf'){
  if (&auth()){
    &put_header("管理画面");
    &put_admin_menu_setting();
    &put_footer();
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'viewcover'){
  if (&auth()){
    &edit_cover_file(0);
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'viewcoveri'){
  if (&auth()){
    &edit_cover_file(1);
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'viewnavi'){
  if (&auth()){
    &edit_navi_file();
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'slot'){
  &view_slot();
}elsif ($in{'m'} eq 'viewslot'){
  if (&auth()){
    &edit_slot_file();
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'maglayout'){
  if (&auth()){
    &edit_maglayout(0);
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'maglayouti'){
  if (&auth()){
    &edit_maglayout(1);
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'ssilayout'){
  if (&auth()){
    &edit_ssilayout(0);
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'ssilayouti'){
  if (&auth()){
    &edit_ssilayout(1);
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'pinfolayout'){
  if (&auth()){
    &edit_pinfolayout(0);
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'pinfolayouti'){
  if (&auth()){
    &edit_pinfolayout(1);
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'mag'){
  if (&auth()){
    &edit_mag($in{'start'},$in{'end'},$in{'num'},$in{'ua'});
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'datacheck'){
  if (&auth()){
#    if ($REGISTMODE ) {
      &datacheck();
#    }else {
#      &message("注意","審査を行わない設定になっています。<p><a href=$THISFILENAME target=_top>$SITENAMEトップへ</a>");
#    }
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'datachecki'){
  if (&auth()){
#    if ($REGISTMODE ) {
      &datachecki();
#    }else {
#      &message("注意","審査を行わない設定になっています。<p><a href=$THISFILENAME target=_top>$SITENAMEトップへ</a>");
#    }
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'savecover'){
  if (&auth()){
    if ($in{'ua'}) {
      &write_file($COVERPAGEI,$in{'cover'},'w');
      &write_file($COVERPAGE2I,$in{'cover2'},'w');
    }else {
      &write_file($COVERPAGE,$in{'cover'},'w');
      &write_file($COVERPAGE2,$in{'cover2'},'w');
    }
    &message("完了","トップページを保存しました。<p><a href=$THISFILENAME target=_top>$SITENAMEトップへ</a>");
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'savenavi'){
  if (&auth()){
    &write_file($NAVIPAGE,$in{'navi'},'w');
    &write_file($NAVIPAGE2,$in{'navi2'},'w');
    &message("完了","メニューページを保存しました。<p><a href=$THISFILENAME target=_top>$SITENAMEトップへ</a>");
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'saveslot'){
  if (&auth()){
    &write_file($SLOTPAGE,$in{'slot'},'w');
    &message("完了","スロットページを保存しました。<p><a href=$THISFILENAME target=_top>$SITENAMEトップへ</a>");
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'savemaglayout'){
  if (&auth()){
    if ($in{'ua'}) {
      &write_file($MAGLAYOUTI,$in{'maglayout'},'w');
    }else {
      &write_file($MAGLAYOUT,$in{'maglayout'},'w');
    }
    &message("完了","マガジンレイアウトを保存しました。<p><a href=$THISFILENAME target=_top>$SITENAMEトップへ</a>");
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'savessilayout'){
  if (&auth()){
    if ($in{'ua'}) {
      &write_file($SSILAYOUTI,$in{'ssilayout'},'w');
    }else {
      &write_file($SSILAYOUT,$in{'ssilayout'},'w');
    }
    &message("完了","SSIレイアウトを保存しました。<p><a href=$THISFILENAME target=_top>$SITENAMEトップへ</a>");
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'savepinfolayout'){
  if (&auth()){
    if ($in{'ua'}) {
      &write_file($PINFOLAYOUTI,$in{'pinfolayout'},'w');
    }else {
      &write_file($PINFOLAYOUT,$in{'pinfolayout'},'w');
    }
    &message("完了","懸賞情報のレイアウトを保存しました。<p><a href=$THISFILENAME target=_top>$SITENAMEトップへ</a>");
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'savepinfo'){
  if (&auth()){
    &save_pinfo($in{'id'},$in{'imgid'},$in{'present_url'},$in{'present_provodername'},$in{'hp_name'},$in{'present_submittype'},$in{'present_startdate'},$in{'present_closedate'},$in{'present_selectwinnerway'},$in{'present_announce'},$in{'present_winnerno'},$in{'pgenres'},$in{'name_prize'},$in{'present_submitway'},$in{'present_special'},$in{'present_submitif'},$in{'comment400'},$in{'status'},$in{'rank'},$in{'priority'},$in{'lastupdate'},$in{'ua'},$in{'imgdel'},$in{'newimg'});
    &message("完了","情報を保存しました。<p><a href=$THISFILENAME target=_top>$SITENAMEトップへ</a>");
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'newregist'){
  if (&auth()){
    &mod_id("",0);
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'newregisti'){
  if (&auth()){
    &mod_id("",1);
  }else {
    &fatal("利用経路が正しくありません。");
  }
}elsif ($in{'m'} eq 'navi'){
  &navi();
}elsif ($in{'m'} eq 'cover'){
  &cover();
}else{
  &getinfo();
  &auto_del();
  &index_page();
}

exit;

## -----------------------------------------------------------------
## ここからサブルーチンです。
## -----------------------------------------------------------------

## -----------------------------------------------------------------
## SSI用分岐
## -----------------------------------------------------------------
sub info_ssi {
  local($script,$code,$num,$mode,$submode)=@_;

  $THISFILENAME=$script;
  $num=5 unless ($num=~/^\d+$/);
  $SSIOUTPUTCHACODE=($code!~/^euc$/i && $code!~/^jis$/i && $code!~/^sjis$/i)?$SSIOUTPUTCHACODE:$code;
  $submode=1 unless ($submode>0 && $submode<27);

  if ($mode eq 'last') {
    &info_last(0,1,$num);
  }elsif ($mode eq 'genre') {
    &info_genre(0,$submode,1,$num);
  }elsif ($mode eq 'ranku') {
    &info_ranku(0,1,$num);
  }elsif ($mode eq 'rankd') {
    &info_rankd(0,1,$num);
  }elsif ($mode eq 'easy') {
    &info_easy(0,1,$num);
  }elsif ($mode eq 'quiz') {
    &info_quiz(0,1,$num);
  }elsif ($mode eq 'many') {
    &info_many(0,$MANYWINNERNO,1,$num);
  }elsif ($mode eq 'monitor') {
    &info_monitor(0,1,$num);
  }elsif ($mode eq 'all') {
    &info_all(0,1,$num);
  }elsif ($mode eq 'fast') {
    &info_fast(0,1,$num);
  }else {
    &info_new(0,1,$num);
  }
}

## -----------------------------------------------------------------
## SSI用のリスト作成＆表示
## -----------------------------------------------------------------
sub make_list{
  local($ssinum,$ua,*lines)=@_;
  local($i,@info,$out,$ssilayout,$tmplayout);
  local($infonum)=@lines;

  $infonum=($ssinum<$infonum)?$ssinum:$infonum;

  if ($UA){
    $ssilayout=&read_file($SSILAYOUTI);
  }else {
    $ssilayout=&read_file($SSILAYOUT);
  }

  if (!$ssilayout) {
    $ssilayout='<a href=%%URL%% target=_blank>%%PRIZE%%が%%WINNER%%にあたる</a><br>';
  }

  for ($i=0;$i<$infonum;$i++) {
    $lines[$i]=~s/\n//;
    @info=split("\t",$lines[$i]);

    $info[8]=$PRESENT_SELECTWINNERWAY_A[$info[8]];
    $info[10]=$info[10]?$info[10]."名様":"全員";
    $info[15]=$PRESENT_SUBMITIF_A[$info[15]];

    if ($DISPPINFOIMG) {
      $img=&check_img($info[0],$info[1],$info[20],$info[21]);
      $img=$img?("<img src=\"$img\" border=0 align=left>"):"";
    }

    $tmplayout=$ssilayout;
    $tmplayout=~s/%%PRIZE%%/$info[12]/g;
    $tmplayout=~s/%%PROVIDER%%/$info[3]/g;
    $tmplayout=~s/%%URL%%/$THISFILENAME?m=go&i=$info[0]&u=$info[21]/g;
    $tmplayout=~s/%%SELECT%%/$info[8]/g;
    $tmplayout=~s/%%WINNER%%/$info[10]/g;
    $tmplayout=~s/%%CLOSE%%/$info[7]/g;
    $tmplayout=~s/%%HOW%%/$info[15]/g;
    $tmplayout=~s/%%CONTENTS%%/$info[16]/g;
    $tmplayout=~s/%%IMG%%/$img/g;
    $tmplayout=~s/%%RANK%%/$info[18]/g;

    $out.=$tmplayout;
  }

  if ($out) {
    if ($UA) {
      &my_print($out);
    }else {
      if ($SSIOUTPUTCHACODE=~/^sjis$/i) {
	&jcode'euc2sjis(*out);
	&jcode'z2h_sjis(*out);
      }elsif ($SSIOUTPUTCHACODE=~/^jis$/i) {
	&jcode'euc2jis(*out);
	&jcode'z2h_jis(*out);
      }
      print $out;
    }
  }
}

## -----------------------------------------------------------------
## 入力チェック
## -----------------------------------------------------------------
sub check_arg {
  local($str)=@_;
  if ($str eq '') { return 0; }
  return &checkch($str);
}

## -----------------------------------------------------------------
## 機種依存文字チェック
## -----------------------------------------------------------------
sub checkch {
  local($line) = @_;
  my $code = 'euc';
  my $restat = 1;

  if ($code =~ /^(?:jis|euc|sjis)$/ && $line =~ /[\x80-\xFF]/o) {

    my $bad = '';

    # G3 は考慮しない
    my $c = 0;
    foreach (unpack('C*', $line)) {
      if ($c) {
	if (0x00A1 <= $_ && $_ <= 0x00FE && $c != 0x008E) {
	  my $n = ($c<<8)|$_;
	  unless (($n < 0xB0A1)?
		  ($n < 0xA4A1)?
		  ($n < 0xA3B0)?
		  ($n < 0xA2DC)?
		  ($n < 0xA2BA)? (0xA1A1 <= $n && $n <= 0xA2AE):
		  ($n < 0xA2CA)? ($n <= 0xA2C1):
		  ($n <= 0xA2D0):
		  ($n < 0xA2F2)? ($n <= 0xA2EA):
		  ($n <= 0xA2F9 || $n == 0xA2FE):
		  ($n < 0xA3C1)? ($n <= 0xA3B9): # 数字
		  ($n < 0xA3E1)? ($n <= 0xA3DA): # 英大文字
		  ($n <= 0xA3FA): # 英小文字
		  ($n < 0xA6A1)?
		  ($n < 0xA5A1)? ($n <= 0xA4F3): # ひらがな
		  ($n <= 0xA5F6): # カタカナ
		  ($n < 0xA7A1)?
		  ($n < 0xA6C1)? ($n <= 0xA6B8): # ギリシャ大文字
		  ($n <= 0xA6D8): # ギリシャ小文字
		  ($n < 0xA8A1)?
		  ($n < 0xA7D1)? ($n <= 0xA7C1): # ロシア大文字
		  ($n <= 0xA7F1): # ロシア小文字
		  ($n <= 0xA8C0): # 罫線素片
		  ($n < 0xD0A1)? ($n <= 0xCFD3): # 第一水準漢字
		  ($n <= 0xF4A6)) { # 第二水準漢字
	    $c = pack('CC', $c, $_);
	    if ($c ne '') {
	      $bad .= ($c = pack('CC', $c, $_));
	      $restat = 0;
	    }
	  }
	}
	$c = 0;
      } elsif ((0x00A1 <= $_ && $_ <= 0x00FE) || $_ == 0x008E) {
	$c = $_;
      }
    }

  }
  return $restat;
}

## -----------------------------------------------------------------
## プレゼント情報を保存
## -----------------------------------------------------------------
sub save_pinfo {
  local($id,$imgid,$present_url,$present_provodername,$hp_name,$present_submittype,$present_startdate,$present_closedate,$present_selectwinnerway,$present_announce,$present_winnerno,$pgenres,$name_prize,$present_submitway,$present_special,$present_submitif,$comment400,$status,$rank,$priority,$lastupdate,$ua,$imgdel,$newimg)=@_;
  local($newinfo,$errmsg);
  $pgenres=~s/\0/^/g;
  $comment400=~s/\r//g;
  $comment400=~s/\n//g;

  if ($present_url!~/^https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+$/i) {
    $errmsg.="<li>プレゼントURLの書式が正しくありません。";
  }
  if (!&check_arg($present_provodername)) {
    $errmsg.="<li>プレゼント提供者の書式が正しくありません。(機種依存文字が含まれている場合もこのエラーが表示されます。)";
  }
  if ($present_startdate!~/^\d\d\d\d\-\d\d\-\d\d$/) {
    $errmsg.="<li>プレゼント開始日の書式が正しくありません。";
  }
  if ($present_closedate!~/^\d\d\d\d\-\d\d\-\d\d$/) {
    $errmsg.="<li>プレゼント終了日の書式が正しくありません。";
  }
  if ($present_winnerno!~/^\d+$/) {
    $errmsg.="<li>当選者数の書式が正しくありません。(もれなくの場合は0を記入してください。)";
  }
  if (!$pgenres){
    $errmsg.="<li>賞品ジャンルは最低１つ選んでください。";
  }
  if (!&check_arg($name_prize)) {
    $errmsg.="<li>プレゼント賞品名の書式が正しくありません。(機種依存文字が含まれている場合もこのエラーが表示されます。)";
  }
  if (!&check_arg($comment400)) {
    $errmsg.="<li>内容の書式が正しくありません。(機種依存文字が含まれている場合もこのエラーが表示されます。)";
  }
  if ($status!=0 && $status!=1) {
    $errmsg.="<li>公開／非公開の書式が正しくありません。";
  }
  if ($rank!~/^\d+$/) {
    $errmsg.="<li>アクセス数の書式が正しくありません。(新規登録の場合は0を記入してください。)";
  }
  if ($priority!~/^\d+$/) {
    $errmsg.="<li>優先度の書式が正しくありません。(最低は0です。)";
  }
  if ($newimg && $newimg!~/^https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+$/i) {
    $errmsg.="<li>画像ファイルのURLの書式が正しくありません。";
  }

  if ($errmsg) {
    &fatal("</center><ul>".$errmsg."</ul><p><hr><a href=http://apex.wind.co.jp/tetsuro/izonmoji/ target=_blank>機種依存文字の参考サイト: 機種依存文字劇場</a><hr><center>");
  }

  if ($id eq '') {
    $newinfo=1;
    $id=&read_file($NEXTIDFILE);
    &write_file($NEXTIDFILE,($id+1),'w');
  }

  if ($id && $imgdel) {
    if (!$UA) {
      unlink $IMGDIR.$id;
      system("touch ".$IMGDIR.$id.".noimg");
    }else {
      unlink $IMGDIR.$id."i";
      system("touch ".$IMGDIR.$id.".noimgi");
    }
  }elsif ($id && $newimg) {
    if (!$UA) {
      unlink $IMGDIR.$id.".noimg";
      &write_file($IMGDIR.$id,$newimg,'w');
    }else {
      unlink $IMGDIR.$id.".noimgi";
      &write_file($IMGDIR.$id."i",$newimg,'w');
    }
  }

  $lastupdate=!$lastupdate?&get_today():$lastupdate;
  local($line)=join("\t", $id,$imgid,$present_url,$present_provodername,$hp_name,$present_submittype,$present_startdate,$present_closedate,$present_selectwinnerway,$present_announce,$present_winnerno,$pgenres,$name_prize,$present_submitway,$present_special,$present_submitif,$comment400,$status,$rank,$priority,$lastupdate);

  if ($newinfo) {

    if (!$ua) {
      open(IN,$LOGFILE);
    }else {
      open(IN,$LOGFILEI);
    }
    open(OUT,">$LOGFILE.tmp");

    while (<IN>) {
      print OUT $_;
    }
    print OUT $line."\n";
    close(IN);
    close(OUT);

    if (!$ua) {
      rename "$LOGFILE.tmp", $LOGFILE;
    }else {
      rename "$LOGFILE.tmp", $LOGFILEI;
    }

    &unlock();
  }else {

    if (!$ua) {
      open(IN,$LOGFILE);
    }else {
      open(IN,$LOGFILEI);
    }
    open(OUT,">$LOGFILE.tmp");

    while (<IN>) {
      if (/^$id\t/) {
	print OUT $line."\n";
      }else {
	print OUT $_;
      }
    }
    close(IN);
    close(OUT);

    if (!$ua) {
      rename "$LOGFILE.tmp", $LOGFILE;
    }else {
      rename "$LOGFILE.tmp", $LOGFILEI;
    }
    &unlock();
  }
}

## -----------------------------------------------------------------
## トップページを編集(imode兼用)
## -----------------------------------------------------------------
sub edit_cover_file {
  local($useragent)=@_;
  &put_header("カバーページ編集");
  local($outputmsg);
  $outputmsg = <<"_COVER_";

トップページに表示する内容を記載ください。すべてのHTMLタグが利用可能です。<br>
入力内容のチェックは有りませんのでご注意ください。<p>

検索窓の上の部分に設置するHTMLタグを記載してください。<br>
<form method=post action=$THISFILENAME>
<input type=hidden name=m value=savecover>
<input type=hidden name=ua value=$useragent>
<textarea name=cover cols=65 rows=20>

_COVER_

  &my_print($outputmsg);
  if ($useragent){
    print &read_file($COVERPAGEI);
  }else {
    print &read_file($COVERPAGE);
  }

  $outputmsg = <<"_COVER_";

</textarea><p>

検索窓の下の部分に設置するHTMLタグを記載してください。<br>
<textarea name=cover2 cols=65 rows=20>

_COVER_
  &my_print($outputmsg);

  if ($useragent){
    print &read_file($COVERPAGE2I);
  }else {
    print &read_file($COVERPAGE2);
  }

  $outputmsg = <<"_COVER_";

</textarea>
<input type=submit value="保存">
</form>

<hr>
色に関する参考ページ:<a href="http://www.nsknet.or.jp/~satoru_o/colors/web/web.htm" target=_blank>COLORS / Web Safe Color Chart</a><br>
HTMLに関する参考ページ:<a href="http://tohoho.wakusei.ne.jp/www.htm" target=_blank>とほほのWWW入門</a><br>
imode用HTMLに関する参考ページ:<a href="http://www.nttdocomo.co.jp/mc-user/i/tag/" target=_blank>NTT / iモード対応HTMLタグ一覧</a>
<hr>

_COVER_
  &my_print($outputmsg);
  &put_footer();
}

## -----------------------------------------------------------------
## メニューページを編集(pcのみ)
## -----------------------------------------------------------------
sub edit_navi_file {
  &put_header("naviページ編集");
  local($outputmsg);
  $outputmsg = <<"_COVER_";

メニューページに表示する内容を記載ください。すべてのHTMLタグが利用可能です。<br>
入力内容のチェックは有りませんのでご注意ください。<p>

メニューの上の部分に設置するHTMLタグを記載してください。<br>
<form method=post action=$THISFILENAME>
<input type=hidden name=m value=savenavi>
<input type=hidden name=ua value=$useragent>
<textarea name=navi cols=65 rows=20>

_COVER_

  &my_print($outputmsg);
  print &read_file($NAVIPAGE);

  $outputmsg = <<"_COVER_";

</textarea><p>

メニューの下の部分に設置するHTMLタグを記載してください。<br>
<textarea name=navi2 cols=65 rows=20>

_COVER_

  &my_print($outputmsg);
  print &read_file($NAVIPAGE2);

  $outputmsg = <<"_COVER_";

</textarea>
<input type=submit value="保存">
</form>

<hr>
色に関する参考ページ:<a href="http://www.nsknet.or.jp/~satoru_o/colors/web/web.htm" target=_blank>COLORS / Web Safe Color Chart</a><br>
HTMLに関する参考ページ:<a href="http://tohoho.wakusei.ne.jp/www.htm" target=_blank>とほほのWWW入門</a><br>
imode用HTMLに関する参考ページ:<a href="http://www.nttdocomo.co.jp/mc-user/i/tag/" target=_blank>NTT / iモード対応HTMLタグ一覧</a>
<hr>

_COVER_

  &my_print($outputmsg);
  &put_footer();
}

## -----------------------------------------------------------------
## スロット懸賞の設定(pcのみ)
## -----------------------------------------------------------------
sub edit_slot_file {
  &put_header("slotページ編集");
  local($outputmsg);
  $outputmsg = <<"_COVER_";

スロット懸賞のところで表示されるページを、今、アッタールに登録されているあなたのIDでのページに変更することができます。すべてのHTMLタグが利用可能です。<br>
入力内容のチェックは有りませんのでご注意ください。<p>

今、アッタールに登録されていない方は<a href=http://www.ataru.jp/ target=_blank>こちら</a>からまず会員登録をしてください。すでに登録されている方は、<a href=http://www.ataru.jp/ target=_blank>こちら</a>からログインし、「ホームページを持っている方は」というリンクより、スロット懸賞用のJAVASCRIPTを生成し、以下の記入欄にカット＆ペーストして内容を保存してください。<p>

<form method=post action=$THISFILENAME>
<input type=hidden name=m value=saveslot>
<input type=hidden name=ua value=$useragent>
<textarea name=slot cols=65 rows=20>

_COVER_

  &my_print($outputmsg);

  print &read_file($SLOTPAGE);

  $outputmsg = <<"_COVER_";

</textarea><p>

<input type=submit value="保存">
</form>

<hr>

_COVER_

  &my_print($outputmsg);
  &put_footer();
}

## -----------------------------------------------------------------
## スロット懸賞ページ表示(pcのみ)
## -----------------------------------------------------------------
sub view_slot {
  $UA=1;
  &put_header("スロットページ");
  &my_print(&read_file($SLOTPAGE));
  &my_print("</body></html>");
}

## -----------------------------------------------------------------
## マガジンのレイアウトを編集(imode兼用)
## -----------------------------------------------------------------
sub edit_maglayout {
  local($useragent)=@_;
  &put_header("マガジンレイアウト編集");
  local($outputmsg);
  $outputmsg = <<"_COVER_";

マガジンのレイアウトを記載してください。すべてのHTMLタグが利用可能です。<br>
入力内容のチェックは有りませんのでご注意ください。<p>
「%%」で囲まれた以下の文字列は各情報の値が展開されます。

<ul>
<li>%%PRIZE%% … 賞品名
<li>%%PROVIDER%% … 提供者名
<li>%%URL%% … URL
<li>%%WINNER%% … 当選者数
<li>%%CLOSE%% … 締切
<li>%%HOW%% … 応募方法
<li>%%CONTENTS%% … 内容
</ul>

例:<p>

[賞品名] %%PRIZE%%<br>
[提供者名] %%PROVIDER%%<br>
[URL] %%URL%%<br>
[当選者数] %%WINNER%%<br>
[締切] %%CLOSE%%<br>
[応募方法] %%HOW%%<br>
[内容]<br>
%%CONTENTS%%<p>

<form method=post action=$THISFILENAME>
<input type=hidden name=m value=savemaglayout>
<input type=hidden name=ua value=$useragent>
<textarea name=maglayout cols=65 rows=30>
_COVER_

  &my_print($outputmsg);
  if ($useragent){
    if (!-e $MAGLAYOUTI) {
      $outputmsg = <<"_COVER_";
[賞品名] %%PRIZE%%
[提供者名] %%PROVIDER%%
[URL] %%URL%%
[当選者数] %%WINNER%%
[締切] %%CLOSE%%
[応募方法] %%HOW%%
[内容]
%%CONTENTS%%
----------------------------------------------------------------------
_COVER_

  &my_print($outputmsg);
    }else {
      print &read_file($MAGLAYOUTI);
    }
  }else {
    if (!-e $MAGLAYOUT) {
      $outputmsg = <<"_COVER_";
[賞品名] %%PRIZE%%
[提供者名] %%PROVIDER%%
[URL] %%URL%%
[当選者数] %%WINNER%%
[締切] %%CLOSE%%
[応募方法] %%HOW%%
[内容]
%%CONTENTS%%
----------------------------------------------------------------------
_COVER_

      &my_print($outputmsg);
    }else {
      print &read_file($MAGLAYOUT);
    }
  }

  $outputmsg = <<"_COVER_";

</textarea>
<input type=submit value="保存">
</form>

_COVER_

  &my_print($outputmsg);
  &put_footer();
}

## -----------------------------------------------------------------
## SSIのレイアウトを編集(imode兼用)
## -----------------------------------------------------------------
sub edit_ssilayout {
  local($useragent)=@_;
  &put_header("SSIレイアウト編集");
  local($outputmsg);
  $outputmsg = <<"_COVER_";

SSIのレイアウトを記載してください。すべてのHTMLタグが利用可能です。<br>
入力内容のチェックは有りませんのでご注意ください。<p>
「%%」で囲まれた以下の文字列は各情報の値が展開されます。

<ul>
<li>%%PRIZE%% … 賞品名
<li>%%PROVIDER%% … 提供者名
<li>%%URL%% … URL
<li>%%SELECT%% … 選考方法
<li>%%WINNER%% … 当選者数
<li>%%CLOSE%% … 締切
<li>%%HOW%% … 応募方法
<li>%%CONTENTS%% … 内容
<li>%%IMG%% … 画像
<li>%%RANK%% … クリック数
</ul>

例:<p>

&lt;a href="%%URL%%" target=_blank>
%%PRIZE%% が %%WINNER%% にあたる
&lt;/a>
&lt;br><p>

<form method=post action=$THISFILENAME>
<input type=hidden name=m value=savessilayout>
<input type=hidden name=ua value=$useragent>
<textarea name=ssilayout cols=65 rows=30>
_COVER_

  &my_print($outputmsg);
  if ($useragent){
    print &read_file($SSILAYOUTI);
  }else {
    print &read_file($SSILAYOUT);
  }

  $outputmsg = <<"_COVER_";

</textarea>
<input type=submit value="保存">
</form>

_COVER_

  &my_print($outputmsg);
  &put_footer();
}

## -----------------------------------------------------------------
## 懸賞情報のレイアウトを編集(imode兼用)
## -----------------------------------------------------------------
sub edit_pinfolayout {
  local($useragent)=@_;
  &put_header("懸賞情報のレイアウト編集");
  local($outputmsg);
  $outputmsg = <<"_COVER_";

懸賞情報のレイアウトを記載してください。すべてのHTMLタグが利用可能です。<br>
入力内容のチェックは有りませんのでご注意ください。<p>
「%%」で囲まれた以下の文字列は各情報の値が展開されます。

<ul>
<li>%%PRIZE%% … 賞品名
<li>%%PROVIDER%% … 提供者名
<li>%%URL%% … URL
<li>%%WINNER%% … 選考方法と当選者数
<li>%%CLOSE%% … 締切
<li>%%HOW%% … 応募方法
<li>%%CONTENTS%% … 内容
<li>%%RANK%% … アクセス数
<li>%%IMG%% … 賞品画像
</ul>

例:<p>
_COVER_

  &my_print($outputmsg);
  if ($useragent){
    $outputmsg = <<"_COVER_";
&lt;a href="%%URL%%" target=_blank>
%%PRIZE%%(%%WINNER%%)
&lt;/a>
[%%RANK%%]
&lt;br><br>
%%IMG%%
&lt;hr>
_COVER_
    &my_print($outputmsg);
  }else {
    $outputmsg = <<"_COVER_";
&lt;a href="%%URL%%" target=_blank>
&lt;font size+=1>%%PRIZE%%
&lt;/font>
&lt;/a>
&lt;br><br>
提供: %%PROVIDER%% / 当選者数: %%WINNER%%
&lt;br><br>
締切: %%CLOSE%% / 応募方法: %%HOW%% / アクセス数: %%RANK%%<br>
&lt;blockquote>
%%IMG%% %%CONTENTS%%
&lt;/blockquote><br>
&lt;br clear=all><br>
&lt;hr>
_COVER_
    &my_print($outputmsg);
  }
  $outputmsg = <<"_COVER_";
<form method=post action=$THISFILENAME>
<input type=hidden name=m value=savepinfolayout>
<input type=hidden name=ua value=$useragent>
<textarea name=pinfolayout cols=65 rows=30>
_COVER_

  &my_print($outputmsg);
  if ($useragent){
    print &read_file($SSILAYOUTI);
  }else {
    print &read_file($SSILAYOUT);
  }

  $outputmsg = <<"_COVER_";

</textarea><br>
<input type=submit value="保存">
</form>

<hr>
色に関する参考ページ:<a href="http://www.nsknet.or.jp/~satoru_o/colors/web/web.htm" target=_blank>COLORS / Web Safe Color Chart</a><br>
HTMLに関する参考ページ:<a href="http://tohoho.wakusei.ne.jp/www.htm" target=_blank>とほほのWWW入門</a><br>
imode用HTMLに関する参考ページ:<a href="http://www.nttdocomo.co.jp/mc-user/i/tag/" target=_blank>NTT / iモード対応HTMLタグ一覧</a>
<hr>

_COVER_
  &my_print($outputmsg);
  &put_footer();
}

## -----------------------------------------------------------------
## マガジンを編集(imode兼用)
## -----------------------------------------------------------------
sub edit_mag {
  local($start,$end,$num,$ua)=@_;
  local($layout,@info,$line,@lines,@tmp,$tmplayout);

  if ($start!~/^\d\d\d\d\-\d\d\-\d\d$/ || $end!~/^\d\d\d\d\-\d\d\-\d\d$/ || $num!~/^\d+$/) {
    &fatal("入力された値の書式が違います。");
  }

  $start=~s/-//g;
  $end=~s/-//g;

  if ($ua){
    $layout=&read_file($MAGLAYOUTI);
    if (!$layout) {
      &fatal("マガジンレイアウトをまず保存してください。");
    }
    open(IN,$LOGFILEI);
  }else {
    $layout=&read_file($MAGLAYOUT);
    if (!$layout) {
      &fatal("マガジンレイアウトをまず保存してください。");
    }
    open(IN,$LOGFILE);
  }

  while ($line=<IN>) {
    next if $line!~/\t/;
    $line=~s/\n//;
    @info=split("\t",$line);
    $info[20]=~s/-//g;
    if ($start<=$info[20] && $info[20]<=$end) {
      push(@lines,$line);
    }
  }
  close(IN);

  @tmp = map {(split /\t/)[19]} @lines;
  @lines = @lines[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp];

  &put_header("マガジン編集");
  &my_print("マガジンを取得してください。<form><textarea name=maglayout cols=70 rows=30>");

  foreach (@lines) {
    @info=split("\t");
    $info[8]=$PRESENT_SELECTWINNERWAY_A[$info[8]];
    $info[10]=$info[10]?$info[10]."名様":"";
    $info[15]=$PRESENT_SUBMITIF_A[$info[15]];
    $info[16]=&formline'form($info[16]);

    $tmplayout=$layout;
    $tmplayout=~s/%%PRIZE%%/$info[12]/g;
    $tmplayout=~s/%%PROVIDER%%/$info[3]/g;
    $tmplayout=~s/%%URL%%/$info[2]/g;
    $tmplayout=~s/%%WINNER%%/$info[8]$info[10]/g;
    $tmplayout=~s/%%CLOSE%%/$info[7]/g;
    $tmplayout=~s/%%HOW%%/$info[15]/g;
    $tmplayout=~s/%%CONTENTS%%/$info[16]/g;
    &my_print($tmplayout);
    $num--;
    if (!$num) { last; }
  }
  &my_print("</textarea></form>");

  &put_footer();
}

## -----------------------------------------------------------------
## メニューページを表示(pcのみ)
## -----------------------------------------------------------------
sub navi {
  local($i);
  &put_header("ようこそ！");
  print &read_file($NAVIPAGE);
  local($outputmsg);
  $outputmsg = <<"_COVER_";
<hr>
<font size=2>
$GENREMARK<a href="$THISFILENAME?m=new" target=main>新着</a><br>
$GENREMARK<a href="$THISFILENAME?m=last" target=main>締切直前</a><br>
$GENREMARK<a href="$THISFILENAME?m=ranku" target=main>人気順</a><br>
$GENREMARK<a href="$THISFILENAME?m=rankd" target=main>当たりやすい</a><br>
$GENREMARK<a href="$THISFILENAME?m=easy" target=main>簡単応募</a><br>
$GENREMARK<a href="$THISFILENAME?m=all" target=main>もれなく</a><br>
$GENREMARK<a href="$THISFILENAME?m=fast" target=main>先着</a><br>
$GENREMARK<a href="$THISFILENAME?m=many&w=$MANYWINNERNO" target=main>$MANYWINNERNO名以上</a><br>
$GENREMARK<a href="$THISFILENAME?m=quiz" target=main>クイズ</a><br>
$GENREMARK<a href="$THISFILENAME?m=monitor" target=main>モニター</a><br>

_COVER_

  &my_print($outputmsg);

  if (-e $SLOTPAGE) {
    &my_print($GENREMARK."<a href=\"".$THISFILENAME."?m=slot\" target=main>スロット</a><hr>");
  }else {
    &my_print($GENREMARK."<a href=\"http://www.ataru.jp/freecgi.html\" target=main>スロット</a><hr>");
  }

  for($i=1;$GENRES_A[$i] ne '';$i++){
    &my_print("$GENREMARK<a href=\"$THISFILENAME?m=genre&g=$i\" target=main>".$GENRES_A[$i]."</a><br>");
  }

  local ($freesubmitname)=$SITENAME;
  &jcode'convert(*freesubmitname,"sjis");
  local ($freesubmitopt)=&urlencode($freesubmitname);

  $outputmsg = <<"_COVER_";

<hr>
$GENREMARK<a href="$THISFILENAME?m=cover" target=main>$SITENAMEトップページ</a><br>
$GENREMARK<a href="http://www.prjapan.co.jp/free_submit.php3?n=$freesubmitopt&m=present&aff=$AFFID" target=main>情報登録(当サイトに情報を登録される場合はPRJAPANの一括登録よりお願いします)</a><br>
$GENREMARK<a href="$THISFILENAME?m=admin_login" target=main>管理者画面へ</a><br>
</font>
_COVER_

  &my_print($outputmsg);
  print &read_file($NAVIPAGE2);

  &put_footer();
}

## -----------------------------------------------------------------
## トップページを表示(pcのみ)
## -----------------------------------------------------------------
sub cover {
  &put_header("ようこそ！");
#  &put_ad($HEADERAD);
  &put_title();
  &my_print(&read_file($COVERPAGE));
  &put_search();
  &my_print(&read_file($COVERPAGE2));
#  &put_ad($FOOTERAD);
  &put_footer();
}

## -----------------------------------------------------------------
## タイトル、広告、文字色などの設定を保存
## -----------------------------------------------------------------
sub set_conf{
  local($prjuserid,$adminpass,$bgcolor,$bgimage,$textcolor,$linkcolor,$alinkcolor,$vlinkcolor,$youbi_type,$registmode,$delpastdata,$sameuser,$dispaccessnum,$disppinfoimg,$dispaccessnumi,$disppinfoimgi,$dispinfonum,$sitename,$titlefontsize,$titlecolor,$titlegif,$titlegifw,$titlegifh,$hlinecolor,$categorycols,$genremark,$os,$headerad,$footerad,$dispinfonumi,$sitenamei,$titlefontsizei,$titlecolori,$titlegifi,$titlegifiw,$titlegifih,$headeradi,$footeradi,$affid,$goad,$textad)=@_;

  if ($adminpass!~/^\w+$/) {
    $errmsg.="<li>管理者パスワードの書式が正しくありません。";
  }
  if ($bgcolor && $bgcolor!~/^#\w\w\w\w\w\w$/ && $bgcolor!~/^[a-zA-Z]+$/) {
    $errmsg.="<li>背景色の書式が正しくありません。";
  }
  if ($textcolor && $textcolor!~/^#\w\w\w\w\w\w$/ && $textcolor!~/^[a-zA-Z]+$/) {
    $errmsg.="<li>文字色の書式が正しくありません。";
  }
  if ($linkcolor && $linkcolor!~/^#\w\w\w\w\w\w$/ && $linkcolor!~/^[a-zA-Z]+$/) {
    $errmsg.="<li>リンク色の書式が正しくありません。";
  }
  if ($alinkcolor && $alinkcolor!~/^#\w\w\w\w\w\w$/ && $alinkcolor!~/^[a-zA-Z]+$/) {
    $errmsg.="<li>アクティブリンク色の書式が正しくありません。";
  }
  if ($vlinkcolor && $vlinkcolor!~/^#\w\w\w\w\w\w$/ && $vlinkcolor!~/^[a-zA-Z]+$/) {
    $errmsg.="<li>アクセス済リンク色の書式が正しくありません。";
  }
  if ($bgimage && !-e $bgimage && $bgimage!~/^https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+$/i) {
    $errmsg.="<li>背景画像ファイルへのURLの書式が正しくありません。";
  }
  if ($registmode!=0 && $registmode!=1) {
    $errmsg.="<li>登録データの処理方法の書式が正しくありません。";
  }
  if ($sameuser!=0 && $sameuser!=1) {
    $errmsg.="<li>同一IPからのアクセスに対する処理方法の書式が正しくありません。";
  }
  if ($hlinecolor && $hlinecolor!~/^#\w\w\w\w\w\w$/ && $hlinecolor!~/^[a-zA-Z]+$/) {
    $errmsg.="<li>区切り線の色の書式が正しくありません。";
  }
  if ($genremark && !&check_arg($genremark)) {
    $errmsg.="<li>ジャンルの前につけるマークの書式が正しくありません。(機種依存文字が含まれている場合もこのエラーが表示されます。)";
  }
  if ($os && $os ne 'Solaris') {
    $errmsg.="<li>OSの書式が正しくありません。";
  }
  if ($dispaccessnum!=0 && $dispaccessnum!=1) {
    $errmsg.="<li>アクセス数を表示するかの書式が正しくありません。";
  }
  if ($disppinfoimg!=0 && $disppinfoimg!=1) {
    $errmsg.="<li>画像ファイルを表示するかの書式が正しくありません。";
  }
  if ($dispinfonum!~/^\d+$/ || $dispinfonum<1) {
    $errmsg.="<li>1ページあたりの表示件数の書式が正しくありません。";
  }
  if ($sitename && !&check_arg($sitename)) {
    $errmsg.="<li>タイトルの書式が正しくありません。(機種依存文字が含まれている場合もこのエラーが表示されます。)";
  }
  if ($titlefontsize!~/^\d$/ || $titlefontsize<1 || $titlefontsize>7) {
    $errmsg.="<li>タイトルのサイズの書式が正しくありません。";
  }
  if ($titlecolor && $titlecolor!~/^#\w\w\w\w\w\w$/ && $titlecolor!~/^[a-zA-Z]+$/) {
    $errmsg.="<li>タイトルの文字色の書式が正しくありません。";
  }
  if ($titlegif && !-e $titlegif && $titlegif!~/^https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+$/i) {
    $errmsg.="<li>タイトル画像ファイルへのURLの書式が正しくありません。";
  }
  if ($titlegifw && $titlegifw!~/^\d*$/i) {
    $errmsg.="<li>タイトル画像の横サイズの書式が正しくありません。";
  }
  if ($titlegifh && $titlegifh!~/^\d*$/i) {
    $errmsg.="<li>タイトル画像の縦サイズの書式が正しくありません。";
  }
  if ($dispaccessnumi!=0 && $dispaccessnumi!=1) {
    $errmsg.="<li>imode用アクセス数を表示するかの書式が正しくありません。";
  }
  if ($disppinfoimgi!=0 && $disppinfoimgi!=1) {
    $errmsg.="<li>imode用画像ファイルを表示するかの書式が正しくありません。";
  }
  if ($dispinfonumi!~/^\d+$/ || $dispinfonumi<1) {
    $errmsg.="<li>imode用1ページあたりの表示件数の書式が正しくありません。";
  }
  if ($sitenamei && !&check_arg($sitenamei)) {
    $errmsg.="<li>imode用タイトルの書式が正しくありません。(機種依存文字が含まれている場合もこのエラーが表示されます。)";
  }
  if ($titlefontsizei!~/^\d$/ || $titlefontsizei<1 || $titlefontsizei>7) {
    $errmsg.="<li>imode用タイトルのサイズの書式が正しくありません。";
  }
  if ($titlecolori && $titlecolori!~/^#\w\w\w\w\w\w$/ && $titlecolori!~/^[a-zA-Z]+$/) {
    $errmsg.="<li>imode用タイトルの文字色の書式が正しくありません。";
  }
  if ($titlegifi && !-e $titlegifi && $titlegifi!~/^https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+$/i) {
    $errmsg.="<li>imode用タイトル画像ファイルへのURLの書式が正しくありません。";
  }
  if ($titlegifiw && $titlegifiw!~/^\d*$/i) {
    $errmsg.="<li>imode用タイトル画像の横サイズの書式が正しくありません。";
  }
  if ($titlegifih && $titlegifih!~/^\d*$/i) {
    $errmsg.="<li>imode用タイトル画像の縦サイズの書式が正しくありません。";
  }
  if ($affid && $affid!~/^\d+$/){
    $errmsg.="<li>PRJAPANのアフィリエイトIDの書式が正しくありません。";
  }
  if ($goad!=0 && $goad!=1 && $goad!=2) {
    $errmsg.="<li>懸賞表示ページに広告を表示するかの書式が正しくありません。";
  }

  if ($errmsg) {
    &fatal("</center><ul>".$errmsg."</ul><p><hr><a href=http://apex.wind.co.jp/tetsuro/izonmoji/ target=_blank>機種依存文字の参考サイト: 機種依存文字劇場</a><hr><center>");
  }

  $headerad=~s/\r//g;
  $headerad=~s/\n//g;
  $headeradi=~s/\r//g;
  $headeradi=~s/\n//g;
  $footerad=~s/\r//g;
  $footerad=~s/\n//g;
  $footeradi=~s/\r//g;
  $footeradi=~s/\n//g;
  $textad=~s/\r//g;
  $textad=~s/\n//g;

  local($conf)="PRJUSERID\t$prjuserid\n
BGCOLOR\t$bgcolor\n
BGIMAGE\t$bgimage\n
TEXTCOLOR\t$textcolor\n
ALINKCOLOR\t$alinkcolor\n
VLINKCOLOR\t$vlinkcolor\n
LINKCOLOR\t$linkcolor\n
YOUBI_TYPE\t$youbi_type\n
ADMINPASS\t$adminpass\n
REGISTMODE\t$registmode\n
DELPASTDATA\t$delpastdata\n
SAMEUSER\t$sameuser\n
DISPACCESSNUM\t$dispaccessnum\n
DISPACCESSNUMI\t$dispaccessnumi\n
DISPPINFOIMG\t$disppinfoimg\n
DISPPINFOIMGI\t$disppinfoimgi\n
DISPINFONUM\t$dispinfonum\n
SITENAME\t$sitename\n
TITLEGIF\t$titlegif\n
TITLEGIFW\t$titlegifw\n
TITLEGIFH\t$titlegifh\n
TITLEFONTSIZE\t$titlefontsize\n
TITLECOLOR\t$titlecolor\n
HLINECOLOR\t$hlinecolor\n
CATEGORYCOLS\t$categorycols\n
GENREMARK\t$genremark\n
OS\t$os\n
HEADERAD\t$headerad\n
FOOTERAD\t$footerad\n
DISPINFONUMI\t$dispinfonumi\n
SITENAMEI\t$sitenamei\n
TITLEGIFI\t$titlegifi\n
TITLEGIFIW\t$titlegifiw\n
TITLEGIFIH\t$titlegifih\n
TITLEFONTSIZEI\t$titlefontsizei\n
TITLECOLORI\t$titlecolori\n
HEADERADI\t$headeradi\n
FOOTERADI\t$footeradi\n
TEXTAD\t$textad\n
GOAD\t$goad\n
AFFID\t$affid\n
";

  &write_file($CONFFILE,$conf,'w');
}

## -----------------------------------------------------------------
## タイトル、広告、文字色などの設定を読み込む
## -----------------------------------------------------------------
sub get_conf {
  if (!-e $CONFFILE){ return 1; }

  open(IN,$CONFFILE);
  while ($line=<IN>) {
    if ($line=~/^PRJUSERID\t(.*)/) {
      $PRJUSERID=$1;
    }elsif ($line=~/^BGCOLOR\t(.*)/) {
      $BGCOLOR=$1;
    }elsif ($line=~/^BGIMAGE\t(.*)/) {
      $BGIMAGE=$1;
    }elsif ($line=~/^TEXTCOLOR\t(.*)/) {
      $TEXTCOLOR=$1;
    }elsif ($line=~/^ALINKCOLOR\t(.*)/) {
      $ALINKCOLOR=$1;
    }elsif ($line=~/^VLINKCOLOR\t(.*)/) {
      $VLINKCOLOR=$1;
    }elsif ($line=~/^LINKCOLOR\t(.*)/) {
      $LINKCOLOR=$1;
    }elsif ($line=~/^YOUBI_TYPE\t(.*)/) {
      $YOUBI_TYPE=$1;
    }elsif ($line=~/^ADMINPASS\t(.*)/) {
      $ADMINPASS=$1;
    }elsif ($line=~/^REGISTMODE\t(.*)/) {
      $REGISTMODE=$1;
    }elsif ($line=~/^DELPASTDATA\t(.*)/) {
      $DELPASTDATA=$1;
    }elsif ($line=~/^SAMEUSER\t(.*)/) {
      $SAMEUSER=$1;
    }elsif ($line=~/^DISPACCESSNUM\t(.*)/) {
      $DISPACCESSNUM=$1;
    }elsif ($line=~/^DISPACCESSNUMI\t(.*)/) {
      $DISPACCESSNUMI=$1;
    }elsif ($line=~/^DISPPINFOIMG\t(.*)/) {
      $DISPPINFOIMG=$1;
    }elsif ($line=~/^DISPPINFOIMGI\t(.*)/) {
      $DISPPINFOIMGI=$1;
    }elsif ($line=~/^DISPINFONUM\t(.*)/) {
      $DISPINFONUM=$1;
    }elsif ($line=~/^SITENAME\t(.*)/) {
      $SITENAME=$1;
    }elsif ($line=~/^TITLEGIF\t(.*)/) {
      $TITLEGIF=$1;
    }elsif ($line=~/^TITLEGIFW\t(.*)/) {
      $TITLEGIFW=$1;
    }elsif ($line=~/^TITLEGIFH\t(.*)/) {
      $TITLEGIFH=$1;
    }elsif ($line=~/^TITLEFONTSIZE\t(.*)/) {
      $TITLEFONTSIZE=$1;
    }elsif ($line=~/^TITLECOLOR\t(.*)/) {
      $TITLECOLOR=$1;
    }elsif ($line=~/^HLINECOLOR\t(.*)/) {
      $HLINECOLOR=$1;
    }elsif ($line=~/^CATEGORYCOLS\t(.*)/) {
      $CATEGORYCOLS=$1;
    }elsif ($line=~/^GENREMARK\t(.*)/) {
      $GENREMARK=$1;
    }elsif ($line=~/^OS\t(.*)/) {
      $OS=$1;
    }elsif ($line=~/^AFFID\t(.*)/) {
      $AFFID=$1;
    }elsif ($line=~/^GOAD\t(.*)/) {
      $GOAD=$1;
    }elsif ($line=~/^TEXTAD\t(.*)/) {
      $TEXTAD=$1;
    }elsif ($line=~/^HEADERAD\t(.*)/) {
      $HEADERAD=$1;
    }elsif ($line=~/^FOOTERAD\t(.*)/) {
      $FOOTERAD=$1;
    }elsif ($line=~/^DISPINFONUMI\t(.*)/) {
      $DISPINFONUMI=$1;
    }elsif ($line=~/^SITENAMEI\t(.*)/) {
      $SITENAMEI=$1;
    }elsif ($line=~/^TITLEGIFI\t(.*)/) {
      $TITLEGIFI=$1;
    }elsif ($line=~/^TITLEGIFIW\t(.*)/) {
      $TITLEGIFIW=$1;
    }elsif ($line=~/^TITLEGIFIH\t(.*)/) {
      $TITLEGIFIH=$1;
    }elsif ($line=~/^TITLEFONTSIZEI\t(.*)/) {
      $TITLEFONTSIZEI=$1;
    }elsif ($line=~/^TITLECOLORI\t(.*)/) {
      $TITLECOLORI=$1;
    }elsif ($line=~/^HEADERADI\t(.*)/) {
      $HEADERADI=$1;
    }elsif ($line=~/^FOOTERADI\t(.*)/) {
      $FOOTERADI=$1;
    }
  }
  close(IN);
}

## -----------------------------------------------------------------
## プレゼント情報の修正／削除を分岐
## -----------------------------------------------------------------
sub modify {
  local($dellist,$modlist,$ua)=@_;
  if ($dellist) {
    &del_ids($dellist,$ua);
    &message("完了","削除完了しました。<p><a href=$THISFILENAME target=_top>$SITENAMEトップへ</a>");
  }elsif ($modlist) {
    &mod_id($modlist,$ua);
  }
}

## -----------------------------------------------------------------
## プレゼント情報の画像ファイルを表示するために必要な情報を取り出す
## -----------------------------------------------------------------
#使ってません。
sub get_img_info {
  local($id,$ua)=@_;
  local($line,@info);

  if (!$id) { return ('',''); }

  if ($ua) {
    open(IN,$LOGFILEI);
  }else {
    open(IN,$LOGFILE);
  }

  while ($line=<IN>) {
    if ($line=~/^$id\t/) {
      @info=split("\t",$line);
      last;
    }
  }
  close(IN);

  return ($info[1],$info[20]);
}

## -----------------------------------------------------------------
## プレゼント情報を編集する
## -----------------------------------------------------------------
sub mod_id {
  local($id,$ua)=@_;
  local($i,@info,$img);
  local($outputmsg);

  if ($id) {
    if ($ua) {
      open(IN,$LOGFILEI);
    }else {
      open(IN,$LOGFILE);
    }

    while (<IN>) {
      if (/^$id\t/) {
	@info=split("\t");
	last;
      }
    }
    close(IN);
  }

  &put_header("情報編集");
  $outputmsg = <<"_COVER_";
<form method=post action=$THISFILENAME>
<input type=hidden name=m value=savepinfo>
<input type=hidden name=id value=$id>
<input type=hidden name=ua value=$ua>
<input type=hidden name=lastupdate value="$info[20]">
<input type=hidden name=imgid value="$info[1]">
<input type=hidden name=hp_name value="$info[4]">
<input type=hidden name=present_announce value="$info[9]">
<input type=hidden name=present_special value="$info[14]">

プレゼントURL<br>
<input type=text name=present_url value="$info[2]" size=50><br>
プレゼント提供者<br>
<input type=text name=present_provodername value="$info[3]" size=50><br>

応募の締め切りのタイプを選択して下さい。<br>
<select name=present_submittype>
_COVER_

  &my_print($outputmsg);

  for($i=1;$PRESENT_SUBMITTYPE_A[$i] ne '';$i++){
    if ($info[5] eq $i) {
      &my_print("<option value=$i selected>".$PRESENT_SUBMITTYPE_A[$i]);
    }else {
      &my_print("<option value=$i>".$PRESENT_SUBMITTYPE_A[$i]);
    }

  }

  $outputmsg = <<"_COVER_";
</select><br>

プレゼント開始日(例：2002-03-05)<br>
<input type=text name=present_startdate value="$info[6]"><br>

プレゼント終了日(例：2002-03-05)<br>
<input type=text name=present_closedate value="$info[7]"><br>

選考方法を選択して下さい。<br>
<select name=present_selectwinnerway>
_COVER_

  &my_print($outputmsg);

  for($i=0;$PRESENT_SELECTWINNERWAY_A[$i] ne '';$i++){
    if ($info[8] eq $i) {
      &my_print("<option value=$i selected>".$PRESENT_SELECTWINNERWAY_A[$i]);
    }else {
      &my_print("<option value=$i>".$PRESENT_SELECTWINNERWAY_A[$i]);
    }
  }

  $outputmsg = <<"_COVER_";
</select><br>

当選者数(半角数字。もれなくの場合は0を記入してください。)<br>
<input type=text name=present_winnerno value="$info[10]"><br>

賞品ジャンルを選択して下さい。<br>
_COVER_
  &my_print($outputmsg);

  for($i=1;$GENRES_A[$i] ne '';$i++){
    if ($info[11]=~/\^$i\^/ ||$info[11]=~/^$i\^/ || $info[11]=~/\^$i$/ || $info[11]=~/^$i$/) {
      &my_print("<input type=checkbox name=pgenres value=\"$i\" checked>".$GENRES_A[$i]."<br>");
    }else {
      &my_print("<input type=checkbox name=pgenres value=\"$i\">".$GENRES_A[$i]."<br>");
    }
  }

  $outputmsg = <<"_COVER_";

賞品名<br>
<input type=text name=name_prize value="$info[12]" size=50><br>

応募方法を選択して下さい。<br>
<select name=present_submitway>
_COVER_
  &my_print($outputmsg);

  for($i=1;$PRESENT_SUBMITWAY_A[$i] ne '';$i++){
    if ($info[13] eq $i ) {
      &my_print("<option value=$i selected>".$PRESENT_SUBMITWAY_A[$i]);
    }else {
      &my_print("<option value=$i>".$PRESENT_SUBMITWAY_A[$i]);
    }
  }

  &my_print("</select><br>応募条件を選択して下さい。<br><select name=present_submitif>");

  for($i=1;$PRESENT_SUBMITIF_A[$i] ne '';$i++){
    if ($info[15] eq $i ) {
      &my_print("<option value=$i selected>".$PRESENT_SUBMITIF_A[$i]);
    }else {
      &my_print("<option value=$i>".$PRESENT_SUBMITIF_A[$i]);
    }
  }

  $outputmsg = <<"_COVER_";
</select><br>

内容<br>
<textarea name=comment400 cols=65 rows=10>$info[16]</textarea><br>

この情報を一般に公開しますか(0:公開 1:非公開)<br>
<input type=text name=status value="$info[17]"><br>

アクセス数(半角数字。新規登録の場合は0を記入してください。)<br>
<input type=text name=rank value="$info[18]"><br>

優先度(半角数字。最低は0です。数字が大きい程上位に表示されます。)<br>
<input type=text name=priority value="$info[19]"><br>

画像関係(無記入可能)<br>
_COVER_
  &my_print($outputmsg);

  if($info[1] && $info[20]){
    $img=&check_img($id,$info[1],$info[20],$ua);
    if ($img) {
      &my_print("<img src=\"$img\" border=0><br><input type=checkbox name=imgdel>画像削除(この項目にチェックされた場合、以下の画像ファイルのURLを記入されても反映されません。)<br>");
    }
  }
  if ($img=~/www\.prjapan\.co\.jp/){ 
    &my_print("新しい画像ファイルのURL:<input type=text name=newimg value=\"\"><br>");
  }else {
    &my_print("新しい画像ファイルのURL:<input type=text name=newimg value=\"$img\"><br>");
  }

  &my_print("<input type=submit value=\"保存\"></form>");

  &put_footer();
}

## -----------------------------------------------------------------
## プレゼント情報を削除する
## -----------------------------------------------------------------
sub del_ids {
  local($dellist,$ua)=@_;
  local @dels=split(",",$dellist);

  &lock() or &fatal("Busy");

  if (!$ua) {
    open(IN,$LOGFILE);
  }else {
    open(IN,$LOGFILEI);
  }
  open(OUT,">$LOGFILE.tmp");

  local $i,$flg;
  while ($line=<IN>) {
    next if $line!~/\t/;
    $flg=0;
    for ($i=0;$dels[$i]!="";$i++) {
      if ($line=~/^$dels[$i]\t/) {
	$flg=1;
      }
    }
    if (!$flg) {
      print OUT $line;
    }
  }
  close(IN);
  close(OUT);

  if (!$ua) {
    rename "$LOGFILE.tmp", $LOGFILE;
  }else {
    rename "$LOGFILE.tmp", $LOGFILEI;
  }

  &unlock();
}

## -----------------------------------------------------------------
## 管理者用ログインページの分岐
## -----------------------------------------------------------------
sub admin_login {
  local($mode,$id,$pass)=@_;

  if (&auth()) {
    &put_header_with_cookie("管理画面");
    &put_admin_menu();
    &put_footer();
  }else {
    if ($mode eq "login") {
      if ($id ne $PRJUSERID || $pass ne $ADMINPASS) {
	&fatal("IDかPASSのどちらか、あるいは両方が間違っています。");
      }

      &put_header_with_cookie("管理画面");
      &put_admin_menu();
      &put_footer();
    }else {
      &put_header("管理画面");
      &put_admin_login_form();
      &put_footer();
    }
  }
}

## -----------------------------------------------------------------
## 同一ipからのアクセスが1時間以内にあるか調べる
## -----------------------------------------------------------------
sub ip_check {
  local($id)=@_;
  if ($SAMEUSER){ return 1; }

  if (!-e $IPDIR){ mkdir $IPDIR, 0777; }

  if (!(time() % 7200)){
    #2時間経過したファイルは削除
    system "find $IPDIR -mmin +60 -exec rm -f {} \;";
  }

  if (!-e $IPDIR.$ENV{'REMOTE_ADDR'}.$id ||
      (-e $IPDIR.$ENV{'REMOTE_ADDR'}.$id && -M $IPDIR.$ENV{'REMOTE_ADDR'}.$id>0.04)) {
    system "touch ".$IPDIR.$ENV{'REMOTE_ADDR'}.$id.$UA;
    return 1;
  }else {
    return 0;
  }
}

## -----------------------------------------------------------------
## クリック数を集計しているファイルをカウントアップ
## -----------------------------------------------------------------
sub count_up {
  local($fname)=@_;
  local($csum);

  &lock() or &fatal("Busy");

  open(COUT,">$fname.tmp");
  if (-e $fname) {
    open(CIN,$fname);
    $csum=<CIN>;
    close(CIN);
    print COUT ++$csum;
  }else {
    print COUT "1";
  }
  close(COUT);
  rename "$fname.tmp", $fname;

  &unlock();
}

## -----------------------------------------------------------------
## 懸賞ページを表示(ノーマル)
## -----------------------------------------------------------------
sub go {
  local($id,$ua)=@_;
  local($line,@info,$url,$csum);

  if (!$ua) {
    &count_up($CLICKSUM);
  }else {
    &count_up($CLICKSUMI);
  }

  if (&ip_check($id)){

    &lock() or &fatal("Busy");

    if (!$ua) {
      open(IN,$LOGFILE);
    }else {
      open(IN,$LOGFILEI);
    }

    open(OUT,">$LOGFILE.tmp");
    while ($line=<IN>) {
      if ($line=~/^$id\t/) {
	@info=split("\t",$line);
	$info[18]++;
	$url=$info[2];
	$line=join("\t",@info)."\n";
      }
      print OUT $line;
    }
    close(IN);
    close(OUT);

    if (!$ua) {
      rename "$LOGFILE.tmp", $LOGFILE;
    }else {
      rename "$LOGFILE.tmp", $LOGFILEI;
    }

    &unlock();
  }else {
    if (!$ua) {
      open(IN,$LOGFILE);
    }else {
      open(IN,$LOGFILEI);
    }
    while ($line=<IN>) {
      if ($line=~/^$id\t/) {
	@info=split("\t",$line);
	$url=$info[2];
	last;
      }
    }
    close(IN);
  }

  print "Location: $url\n\n";
}

## -----------------------------------------------------------------
## 懸賞ページを表示(フレーム)
## -----------------------------------------------------------------
sub go2 {
  local($id,$ua)=@_;

  print "Content-type: text/html\n\n";
  print <<"_HEADER_";
<html>
<head>
<META HTTP-EQUIV="Content-Language" content="ja">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<title></title>
</head>

<FRAMESET rowS="40,*" FRAMEBORDER=1 BORDER=0 FRAMESPACING=0 FRAMESPACING=0>
<FRAME SRC="$THISFILENAME?m=go2_ad" NAME="navi">
<FRAME SRC="$THISFILENAME?m=go&i=$id&u=$ua" NAME="main">
<NOFRAMES>

<BODY>フレームが使えるブラウザでどうぞ。</body>

</NOFRAMES>
</FRAMESET>
</HTML>

_HEADER_
}

## -----------------------------------------------------------------
## 懸賞ページを表示(広告)
## -----------------------------------------------------------------
sub go2_ad {
  print "Content-type: text/html\n\n";
  print <<"_HEADER_";
<html>
<head>
<META HTTP-EQUIV="Content-Language" content="ja">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META http-equiv="content-type" content="text/html;charset=x-euc-jp">
<title></title>
</head>
<body bgcolor="#ffffff" leftmargin="0" topmargin="5" marginwidth="0" marginheight="0">
<center>
<font size=2>
<font color=#ff0000>[PR]</font>
<script src="http://www.onparade.jp/textb/banner2c.php3?k=e"></script>
<font color=#ff0000>[PR]</font>
<br>
<font color=#ff0000>[PR]</font>
$TEXTAD
<font color=#ff0000>[PR]</font>
</font>
</center>
</body>
</HTML>

_HEADER_
}

## -----------------------------------------------------------------
## 懸賞ページを表示(別ウィンドウ)
## -----------------------------------------------------------------
sub go3 {
  local($id,$ua)=@_;

  print "Content-type: text/html\n\n";
  print <<"_HEADER_";
<html>
<head>
<META HTTP-EQUIV="Content-Language" content="ja">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<title></title>
</head>

<FRAMESET rowS="0,*" FRAMEBORDER=1 BORDER=0 FRAMESPACING=0 FRAMESPACING=0>
<FRAME SRC="$THISFILENAME?m=go3_ad" NAME="navi">
<FRAME SRC="$THISFILENAME?m=go&i=$id&u=$ua" NAME="main">
<NOFRAMES>

<BODY>フレームが使えるブラウザでどうぞ。</body>

</NOFRAMES>
</FRAMESET>
</HTML>

_HEADER_
}

## -----------------------------------------------------------------
## 懸賞ページを表示(別ウィンドウ/広告)
## -----------------------------------------------------------------
sub go3_ad {
  print "Content-type: text/html\n\n";
  print <<"_HEADER_";
<html>
<head>
<META HTTP-EQUIV="Content-Language" content="ja">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META http-equiv="content-type" content="text/html;charset=x-euc-jp">
<script language="JavaScript">
<!--
var platform=navigator.appVersion;
var w = null;
var Os;
if(platform.indexOf("Mac") > 0){
  Os="Mac";
};

function openWin( Filename ){
  if(w != null && navigator.appName != "Netscape" && Os !="Mac"){
    w.close();
  }
  w = window.open( Filename, "", "menubar=no,toolbar=no,location=no,directories=no,status=no,scrollbars=no,resizable=no,width=500,height=80");
  if ( navigator.appName == "Netscape" ) {
    x = window.screenX + 5;
    y = window.screenY + 110;
    w.moveTo( x, y );
  }else{
    x = window.left;
    y = window.top;
    x = x + 5;
    y = y + 120;
    w.moveTo( x, y );
  }
}

//-->
</script>
<title></title>
</head>
<body onLoad="openWin('$THISFILENAME?m=go2_ad');">
</body>
</HTML>

_HEADER_
}

## -----------------------------------------------------------------
## 懸賞情報を検索して結果を表示
## -----------------------------------------------------------------
sub search {
  local($keyword,$searchtype,$dispstart)=@_;
  local($i,$line,@keys,$match,@info,@lines,$keynum);
  local $dispend;

  $dispstart=$dispstart?$dispstart:0;

  $keyword=~s/\s+/\s/g;
  $keyword=~s/\t//g;
  @keys=split("\s",$keyword);
  $keynum=@keys;

  if (!$UA) {
    $dispend=$dispstart+$DISPINFONUM;
    open(LOG,$LOGFILE);
  }else {
    $dispend=$dispstart+$DISPINFONUMI;
    open(LOG,$LOGFILEI);
  }

  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if (!$info[17]) {
      if ($searchtype eq "and") {
	$match=0;
	for ($i=0;$i<$keynum;$i++) {
	  if ($line=~/$keys[$i]/i) {
	    $match++;
	  }
	}
	if ($match && $match==$keynum) {
	  push(@lines,$line);
	}
      }else {
	for ($i=0;$i<$keynum;$i++) {
	  if ($line=~/$keys[$i]/i) {
	    push(@lines,$line);
	    last;
	  }
	}
      }
    }
  }
  close(LOG);

  local @tmp = map {(split /\t/)[19]} @lines;
  @lines = @lines[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp];

  local $infonum=@lines;

  if ($infonum) {
    &make_page("検索結果",$dispstart,$dispend,"search","&keyword=$keyword&searchtype=$searchtype",1,$UA,*lines);
  }else {
    &put_header("検索結果");
    if (!$UA) {
      &put_ad($HEADERAD);
    }else {
      &put_ad($HEADERADI);
    }
    &my_print("<hr>[ $keyword ] を $searchtype 検索で探しましたが、該当する情報がありませんでした。<p><hr>");
    &put_search($keyword);
    &my_print("<hr>");
    if (!$UA) {
      &put_ad($FOOTERAD);
    }else {
      &put_ad($FOOTERADI);
    }
    &put_footer();
  }
}

## -----------------------------------------------------------------
## 編集したマガジンを表示
## -----------------------------------------------------------------
sub make_mag {
  local($dispstart)=@_;
  local($i,$line,@info,@lines);
  local $dispend;

  $dispstart=$dispstart?$dispstart:0;

  if (!$UA) {
    $dispend=$dispstart+$DISPINFONUM;
    open(LOG,$LOGFILE);
  }else {
    $dispend=$dispstart+$DISPINFONUMI;
    open(LOG,$LOGFILEI);
  }
  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if (!$info[17]) {
      push(@lines,$line);
    }
  }
  close(LOG);

  @lines=reverse(@lines);

  &make_page("新着情報",$dispstart,$dispend,"new","",1,$UA,*lines);
}

## -----------------------------------------------------------------
## 新着情報を表示
## -----------------------------------------------------------------
sub info_new {
  local($dispstart,$ssi,$ssinum)=@_;
  local($i,$line,@info,@lines);
  local $dispend;

  $dispstart=$dispstart?$dispstart:0;

  if (!$UA) {
    $dispend=$dispstart+$DISPINFONUM;
    open(LOG,$LOGFILE);
  }else {
    $dispend=$dispstart+$DISPINFONUMI;
    open(LOG,$LOGFILEI);
  }
  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if (!$info[17]) {
      push(@lines,$line);
    }
  }
  close(LOG);

  @lines=reverse(@lines);

  if ($ssi) {
    &make_list($ssinum,$UA,*lines);
  }else {
    &make_page("新着情報",$dispstart,$dispend,"new","",1,$UA,*lines);
  }

}

## -----------------------------------------------------------------
## 管理者がimode用の新着情報チェックする際に表示させる
## -----------------------------------------------------------------
sub info_newi {
  local($dispstart)=@_;
  local($i,$line,@info,@lines);

  $dispstart=$dispstart?$dispstart:0;
  local $dispend=$dispstart+$DISPINFONUM;

  open(LOG,$LOGFILEI);
  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if (!$info[17]) {
      push(@lines,$line);
    }
  }
  close(LOG);

  @lines=reverse(@lines);

  &make_page("新着情報",$dispstart,$dispend,"newi","",0,1,*lines);
}

## -----------------------------------------------------------------
## 管理者が未審査情報をチェックする際に表示させる
## -----------------------------------------------------------------
sub datacheck {
  local($dispstart)=@_;
  local($i,$line,@info,@lines);

  $dispstart=$dispstart?$dispstart:0;
  local $dispend=$dispstart+$DISPINFONUM;

  open(LOG,$LOGFILE);
  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if ($info[17]) {
      push(@lines,$line);

    }
  }
  close(LOG);

  @lines=reverse(@lines);

  &make_page("未審査情報",$dispstart,$dispend,"datacheck","",0,0,*lines);
}

## -----------------------------------------------------------------
## 管理者が未審査情報をチェックする際に表示させる(imode用)
## -----------------------------------------------------------------
sub datachecki {
  local($dispstart)=@_;
  local($i,$line,@info,@lines);

  $dispstart=$dispstart?$dispstart:0;
  local $dispend=$dispstart+$DISPINFONUM;

  open(LOG,$LOGFILEI);
  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if ($info[17]) {
      push(@lines,$line);
    }
  }
  close(LOG);

  @lines=reverse(@lines);

  &make_page("未審査情報i",$dispstart,$dispend,"datachecki","",0,1,*lines);
}

## -----------------------------------------------------------------
## 検索結果やジャンル別で取得した懸賞情報を表示
## -----------------------------------------------------------------
sub make_page {
  local($title,$dispstart,$dispend,$mode,$submode,$adf,$ua,*lines)=@_;
  local($i,$j);
  local($outputmsg);
  local($dispinfonumber)=!$UA?$DISPINFONUM:$DISPINFONUMI;
  local $infonum=@lines;

  if (!$infonum) { &message("該当する情報がありません。"); exit; }

  $dispend=($infonum>$dispend)?$dispend:$infonum;

  &put_header($title);

  if (!$ua) {
    if (!-e $PINFOLAYOUT){
      $PINFOLAYOUTORG='<a href=%%URL%% target=_blank><font size+=1>%%PRIZE%%</font></a><br>提供: %%PROVIDER%% / 当選者数: %%WINNER%%<br>締切: %%CLOSE%% / 応募方法: %%HOW%% / アクセス数: %%RANK%%<blockquote>%%IMG%% %%CONTENTS%%</blockquote><br clear=all><hr>';
    }else {
      $PINFOLAYOUTORG=&read_file($PINFOLAYOUT);
    }
  }else {
    if (!-e $PINFOLAYOUTI){
      $PINFOLAYOUTORG='<a href=%%URL%%>%%PRIZE%%(%%WINNER%%)</a>[%%RANK%%]<br>%%IMG%%<hr>';
    }else {
      $PINFOLAYOUTORG=&read_file($PINFOLAYOUTI);
    }
  }

  if ($adf) {
    if (!$ua) {
      &put_ad($HEADERAD);
    }else {
      &put_ad($HEADERADI);
    }
  }
  if (!$ua) {
    &my_print("<font size=+2>$title</font> [ 情報数 : $infonum ]");
  }else {
    &my_print("<a href=$THISFILENAME>$SITENAMEIトップページ</a><br>");
  }
  if (&auth() && !$UA) {

    $outputmsg = <<"_COVER_";

<SCRIPT LANGUAGE="Javascript">
<!--//
function godel() {
  delarray=new Array();

_COVER_

    &my_print($outputmsg);

    if($infonum == 1){
      &my_print("  if(document.M.delid.checked){\n");
      &my_print("    delarray.push(document.M.delid.value);\n");
      &my_print("  }\n");
      &my_print("  if(document.M.modid.checked){\n");
      &my_print("    document.M.modlist.value=document.M.modid.value;\n");
      &my_print("  }\n");
    }else {
      for ($i=$dispstart,$j=0;$i<$dispend;$i++,$j++) {
	&my_print("  if(document.M.delid[".$j."].checked){\n");
	&my_print("    delarray.push(document.M.delid[".$j."].value);\n");
	&my_print("  }\n");
	&my_print("  if(document.M.modid[".$j."].checked){\n");
	&my_print("    document.M.modlist.value=document.M.modid[".$j."].value;\n");
	&my_print("  }\n");
      }
    }
    $outputmsg = <<"_COVER_";

  document.M.dellist.value=delarray.join(",");
  if(document.M.dellist.value && document.M.modlist.value){
    alert("削除と修正は同時に処理できません。");
    return false;
  }else if(!document.M.dellist.value && !document.M.modlist.value){
    alert("削除または修正する情報を選んでください。");
    return false;
  }else if(document.M.dellist.value){
    flg=confirm("削除を実行してよろしいですか？");
    if(flg==true){
      document.M.submit();
      return true;
    }else{
      return false;
    }
  }else if(document.M.modlist.value){
    flg=confirm("修正を実行してよろしいですか？");
    if(flg==true){
      document.M.submit();
      return true;
    }else{
      return false;
    }
  }
}
//-->
</SCRIPT>

<form method=post name=M action="$THISFILENAME">
<input type=hidden name=m value=modify>
<input type=hidden name=dellist value=>
<input type=hidden name=modlist value=>
<input type=hidden name=ua value=$ua>

_COVER_

  &my_print($outputmsg);

  }
  local($startnumber)=$dispstart+1;
  &my_print("<hr>検索結果の $startnumber 番から $dispend 番までの情報を表示しています。<hr>");

  for ($i=$dispstart;$i<$dispend;$i++) {
    $lines[$i]=~s/\n//;
    &put_pinfo(split("\t",$lines[$i]),$ua);
  }

  local $max=int($infonum/$dispinfonumber+0.99);

  for ($i=0;$i<$max;$i++) {
    &my_print("<a href=\"$THISFILENAME?m=$mode&n=".($i*$dispinfonumber)."$submode\">".($i+1)."</a>　");
  }
  &my_print("<hr>");

  if ($adf) {
    if (!$ua) {
      &put_ad($FOOTERAD);
    }else {
      &put_ad($FOOTERADI);
    }
  }

  if (&auth() && !$UA) {
    &my_print("<div align=right>");
    &my_print("<input type=button value=\"修正または削除(管理者のみ)\" onClick=\"javascript:return godel();\">　");
    &my_print("<input type=reset value=\"キャンセル\"></div></form>");
  }

  &put_footer();
}

## -----------------------------------------------------------------
## 簡単応募の懸賞情報を表示
## -----------------------------------------------------------------
sub info_easy {
  local($dispstart,$ssi,$ssinum)=@_;
  &info_present_submitif($dispstart,"簡単応募","easy","7",$ssi,$ssinum);
}

## -----------------------------------------------------------------
## クイズの懸賞情報を表示
## -----------------------------------------------------------------
sub info_quiz {
  local($dispstart,$ssi,$ssinum)=@_;
  &info_present_submitif($dispstart,"クイズ","quiz","1",$ssi,$ssinum);
}

## -----------------------------------------------------------------
## モニターの懸賞情報を表示
## -----------------------------------------------------------------
sub info_monitor {
  local($dispstart,$ssi,$ssinum)=@_;
  &info_present_submitif($dispstart,"モニター","monitor","5",$ssi,$ssinum);
}

## -----------------------------------------------------------------
## 簡単応募、クイズ、モニターの懸賞情報を表示する関数の本体
## -----------------------------------------------------------------
sub info_present_submitif {
  local($dispstart,$title,$mode,$num,$ssi,$ssinum)=@_;
  local($i,$line,@info,@lines,@tmp);
  local $dispend;

  $dispstart=$dispstart?$dispstart:0;

  if (!$UA) {
    $dispend=$dispstart+$DISPINFONUM;
    open(LOG,$LOGFILE);
  }else {
    $dispend=$dispstart+$DISPINFONUMI;
    open(LOG,$LOGFILEI);
  }
  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if (!$info[17] && $info[15] eq $num) {
      push(@lines,$line);
    }
  }
  close(LOG);

  @tmp = map {(split /\t/)[19]} @lines;
  @lines = @lines[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp];

  if ($ssi) {
    &make_list($ssinum,$UA,*lines);
  }else {
    &make_page($title,$dispstart,$dispend,$mode,"",1,$UA,*lines);
  }
}

## -----------------------------------------------------------------
## もれなくの懸賞情報を表示
## -----------------------------------------------------------------
sub info_all {
  local($dispstart,$ssi,$ssinum)=@_;
  &info_present_selectwinnerway($dispstart,"もれなく","all","1",$ssi,$ssinum);
}

## -----------------------------------------------------------------
## 先着の懸賞情報を表示
## -----------------------------------------------------------------
sub info_fast {
  local($dispstart,$ssi,$ssinum)=@_;
  &info_present_selectwinnerway($dispstart,"先着","fast","0",$ssi,$ssinum);
}

## -----------------------------------------------------------------
## もれなく、先着の懸賞情報を表示する関数の本体
## -----------------------------------------------------------------
sub info_present_selectwinnerway {
  local($dispstart,$title,$mode,$num,$ssi,$ssinum)=@_;
  local($i,$line,@info,@lines,@tmp);
  local $dispend;

  $dispstart=$dispstart?$dispstart:0;

  if (!$UA) {
    $dispend=$dispstart+$DISPINFONUM;
    open(LOG,$LOGFILE);
  }else {
    $dispend=$dispstart+$DISPINFONUMI;
    open(LOG,$LOGFILEI);
  }
  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if (!$info[17] && $info[8] eq $num) {
      push(@lines,$line);
    }
  }
  close(LOG);

  @tmp = map {(split /\t/)[19]} @lines;
  @lines = @lines[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp];

  if ($ssi) {
    &make_list($ssinum,$UA,*lines);
  }else {
    &make_page($title,$dispstart,$dispend,$mode,"",1,$UA,*lines);
  }
}

## -----------------------------------------------------------------
## ジャンル別の懸賞情報を表示
## -----------------------------------------------------------------
sub info_genre {
  local($dispstart,$genre,$ssi,$ssinum)=@_;
  local($i,@info,@lines,$line,@tmp);
  local $dispend;

  $dispstart=$dispstart?$dispstart:0;

  if (!$UA) {
    $dispend=$dispstart+$DISPINFONUM;
    open(LOG,$LOGFILE);
  }else {
    $dispend=$dispstart+$DISPINFONUMI;
    open(LOG,$LOGFILEI);
  }
  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if (($info[11]=~/\^$genre\^/ ||$info[11]=~/^$genre\^/ || $info[11]=~/\^$genre$/ || $info[11]=~/^$genre$/) && !$info[17]) {
      push(@lines,$line);
    }
  }
  close(LOG);

  @tmp = map {(split /\t/)[19]} @lines;
  @lines = @lines[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp];

  if ($ssi) {
    &make_list($ssinum,$UA,*lines);
  }else {
    &make_page($GENRES_A[$genre],$dispstart,$dispend,"genre","&g=$genre",1,$UA,*lines);
  }
}

## -----------------------------------------------------------------
## 大量当選の懸賞情報を表示
## -----------------------------------------------------------------
sub info_many {
  local($dispstart,$winner,$ssi,$ssinum)=@_;
  local($i,@info,@lines,$line,@tmp);
  local $dispend;

  $dispstart=$dispstart?$dispstart:0;

  if (!$UA) {
    $dispend=$dispstart+$DISPINFONUM;
    open(LOG,$LOGFILE);
  }else {
    $dispend=$dispstart+$DISPINFONUMI;
    open(LOG,$LOGFILEI);
  }
  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if ($info[10] > $winner && !$info[17]) {
      push(@lines,$line);
    }
  }
  close(LOG);

  @tmp = map {(split /\t/)[19]} @lines;
  @lines = @lines[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp];

  if ($ssi) {
    &make_list($ssinum,$UA,*lines);
  }else {
    &make_page($winner."名以上",$dispstart,$dispend,"many","&w=$MANYWINNERNO",1,$UA,*lines);
  }
}

## -----------------------------------------------------------------
## 人気順の懸賞情報を表示
## -----------------------------------------------------------------
sub info_ranku {
  local($dispstart,$ssi,$ssinum)=@_;
  local(@tmp1,@tmp2,@info,@lines,$line);
  local $dispend;

  $dispstart=$dispstart?$dispstart:0;

  if (!$UA) {
    $dispend=$dispstart+$DISPINFONUM;
    open(LOG,$LOGFILE);
  }else {
    $dispend=$dispstart+$DISPINFONUMI;
    open(LOG,$LOGFILEI);
  }
  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if (!$info[17]) {
      push(@lines,$line);
    }
  }
  close(LOG);

  @tmp1=@tmp2=();
  foreach (@lines) {
    local(@vals)=split(/\t/);
    push(@tmp1, $vals[18]);
    push(@tmp2, $vals[19]);
  }
  @lines=@lines[sort {$tmp1[$b] cmp $tmp1[$a] or
			$tmp2[$b] <=> $tmp2[$a]} 0 .. $#tmp1];

  if ($ssi) {
    &make_list($ssinum,$UA,*lines);
  }else {
    &make_page("人気順",$dispstart,$dispend,"ranku","",1,$UA,*lines);
  }
}

## -----------------------------------------------------------------
## 当たりやすいの懸賞情報を表示
## -----------------------------------------------------------------
sub info_rankd {
  local($dispstart,$ssi,$ssinum)=@_;
  local(@tmp1,@tmp2,@info,@lines,$line);
  local $dispend;

  $dispstart=$dispstart?$dispstart:0;

  if (!$UA) {
    $dispend=$dispstart+$DISPINFONUM;
    open(LOG,$LOGFILE);
  }else {
    $dispend=$dispstart+$DISPINFONUMI;
    open(LOG,$LOGFILEI);
  }
  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if (!$info[17]) {
      push(@lines,$line);
    }
  }
  close(LOG);

  @tmp1=@tmp2=();
  foreach (@lines) {
    local(@vals)=split(/\t/);
    push(@tmp1, $vals[18]);
    push(@tmp2, $vals[19]);
  }
  @lines=@lines[sort {$tmp1[$a] cmp $tmp1[$b] or
			$tmp2[$b] <=> $tmp2[$a]} 0 .. $#tmp1];

  if ($ssi) {
    &make_list($ssinum,$UA,*lines);
  }else {
    &make_page("当たりやすい",$dispstart,$dispend,"rankd","",1,$UA,*lines);
  }
}

## -----------------------------------------------------------------
## 締切前の懸賞情報を表示
## -----------------------------------------------------------------
sub info_last {
  local($dispstart,$ssi,$ssinum)=@_;
  local(@tmp1,@tmp2,@info,@lines,$line);
  local $dispend;

  $dispstart=$dispstart?$dispstart:0;

  if (!$UA) {
    $dispend=$dispstart+$DISPINFONUM;
    open(LOG,$LOGFILE);
  }else {
    $dispend=$dispstart+$DISPINFONUMI;
    open(LOG,$LOGFILEI);
  }
  while ($line=<LOG>) {
    next if $line!~/\t/;
    @info=split("\t",$line);
    if (!$info[17]) {
      push(@lines,$line);
    }
  }
  close(LOG);

  @tmp1=@tmp2=();
  foreach (@lines) {
    local(@vals)=split(/\t/);
    push(@tmp1, $vals[7]);
    push(@tmp2, $vals[19]);
  }
  @lines=@lines[sort {$tmp1[$a] cmp $tmp1[$b] or
			$tmp2[$b] <=> $tmp2[$a]} 0 .. $#tmp1];

  if ($ssi) {
    &make_list($ssinum,$UA,*lines);
  }else {
    &make_page("締切直前",$dispstart,$dispend,"last","",1,$UA,*lines);
  }
}

## -----------------------------------------------------------------
## 各懸賞情報をレイアウトにしたがって表示する
## -----------------------------------------------------------------
sub put_pinfo {
  local($id,$imgid,$present_url,$present_provodername,$hp_name,$present_submittype,$present_startdate,$present_closedate,$present_selectwinnerway,$present_announce,$present_winnerno,$pgenres,$name_prize,$present_submitway,$present_special,$present_submitif,$comment400,$status,$rank,$priority,$lastupdate,$ua)=@_;
  local($img,$tmplayout);

  $present_selectwinnerway=$PRESENT_SELECTWINNERWAY_A[$present_selectwinnerway];
  $present_winnerno=$present_winnerno?$present_winnerno."名様":"";
  $present_submitif=$PRESENT_SUBMITIF_A[$present_submitif];

  if ($DISPPINFOIMG) {
    $img=&check_img($id,$imgid,$lastupdate,$ua);
    $img=$img?("<img src=\"$img\" border=0 align=left>"):"";
  }

  if (&auth() && !$UA) {
    &my_print("<div align=right><input type=checkbox name=delid value=$id>削除 || ");
    &my_print("<input type=radio name=modid value=$id>修正</div>");
  }

  $tmplayout=$PINFOLAYOUTORG;
  $tmplayout=~s/%%PRIZE%%/$name_prize/g;
  $tmplayout=~s/%%PROVIDER%%/$present_provodername/g;
  if (!$UA) {
    if ($GOAD==1) {
      $tmplayout=~s/%%URL%%/$THISFILENAME?m=go2&i=$id&u=$ua/g;
    }elsif ($GOAD==2) {
      $tmplayout=~s/%%URL%%/$THISFILENAME?m=go3&i=$id&u=$ua/g;
    }else {
      $tmplayout=~s/%%URL%%/$THISFILENAME?m=go&i=$id&u=$ua/g;
    }
  }else {
    $tmplayout=~s/%%URL%%/$THISFILENAME?m=go&i=$id&u=$ua/g;
  }
  $tmplayout=~s/%%WINNER%%/$present_selectwinnerway$present_winnerno/g;
  $tmplayout=~s/%%CLOSE%%/$present_closedate/g;
  $tmplayout=~s/%%HOW%%/$present_submitif/g;
  $tmplayout=~s/%%CONTENTS%%/$comment400/g;
  $tmplayout=~s/%%IMG%%/$img/g;
  $tmplayout=~s/%%RANK%%/$rank/g;

  &my_print($tmplayout);

#  print "<hr size=1 color=\"$HLINECOLOR\">";

}

## -----------------------------------------------------------------
## トップページ(imodeとpcの分岐をおこなう)
## -----------------------------------------------------------------
sub index_page {
  if (!$UA) {
    print "Content-type: text/html\n\n";
    print <<"_HEADER_";
<html>
<head>
<META HTTP-EQUIV="Content-Language" content="ja">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META http-equiv="content-type" content="text/html;charset=x-euc-jp">
<title>$SITENAME - ようこそ</title>
</head>

<FRAMESET colS="200,*" FRAMEBORDER=1 BORDER=0 FRAMESPACING=0 FRAMESPACING=0>
<FRAME SRC="$THISFILENAME?m=navi" NAME="navi">
<FRAME SRC="$THISFILENAME?m=cover" NAME="main">
<NOFRAMES>

<BODY>フレームが使えるブラウザでどうぞ。</body>

</NOFRAMES>
</FRAMESET>
</HTML>

_HEADER_

  }else {
    &put_header("ようこそ！");
    &put_title();
#    &put_ad($HEADERADI);
    &my_print(&read_file($COVERPAGEI));
    &put_search();
    &my_print("<hr>");
    &put_menu();
    &my_print(&read_file($COVERPAGE2I));
#    &put_ad($FOOTERADI);
    &put_footer();
  }
}

## -----------------------------------------------------------------
## 指定したサーバから懸賞情報を取得する
## -----------------------------------------------------------------
sub getinfo {
  local $today=&get_today();
  local $lastaccess,$clicksum,$clicksumi;
  local ($freesubmitname)=$SITENAME;
  &jcode'convert(*freesubmitname,"sjis");
  local ($freesubmitopt)=&urlencode($freesubmitname);
  local ($freesubmitopturl)=&urlencode($THISURLNAME);

  if (!$UA) {
    $clicksum=&read_file($CLICKSUM);
    $lastaccess=&read_file($REGISTMODEFILE);
  }else {
    $clicksumi=&read_file($CLICKSUMI);
    $lastaccess=&read_file($REGISTMODEFILEI);
  }

  if ($today ne $lastaccess) {
    local $nextid=&read_file($NEXTIDFILE);
    local $line,$flg;
    $nextid=$nextid?$nextid:1;
    local $url="$PINFOSCRIPT?s=$lastaccess&c=$today&m=$REGISTMODE&i=$PRJUSERID&n=$nextid&ua=$UA&cs=$clicksum&csi=$clicksumi&sn=$freesubmitopt&u=$freesubmitopturl";

    local $hostaddr,$proto,$sockaddrs,$port;
    local $prx1,$prx2,$prx3,$prx4;

    if ($PROXY_HOST) {
      ($prx1,$prx2,$prx3,$prx4)=split(/./, $PROXY_HOST);
      $hostaddr=pack("C4",$prx1,$prx2,$prx3,$prx4);
      $url="http://".$PINFOSERVER."/".$url;
      $port=$PROXY_PORT;
    }else {
      $hostaddr=(gethostbyname($PINFOSERVER))[4] || return 0;
      $port=80;
    }

    $proto=(getprotobyname('tcp'))[2] || return 0;
    socket(SOCK, $PF_INET, $SOCK_STREAM, $proto) || return 0;
    $sockaddrs = pack('S n a4 x8', $PF_INET, $port, $hostaddr);
    connect(SOCK, $sockaddrs) || return 0;
    local $oldhandle=select(SOCK);
    $| = 1;
    select($oldhandle);

    print SOCK "GET $url HTTP/1.0\r\n\r\n";
    while (<SOCK>) {
      if ($_ eq "\r\n") { $flg=1; }
      if ($flg && $_ ne "\r\n") {
	if ($_=~/^nextid:(\d+)$/) {
	  $nextid=$1;
	}elsif ($_=~/^errcode:(\d+)$/) {
	  $errcode=$1;
	}else {
	  $line.=$_;
	}
      }
    }
    close(SOCK);

    if ($errcode==1) {
      &fatal("情報を取得するための入力値がただしくありません。");
    }elsif ($errcode==2) {
      &fatal("DBへのアクセスに失敗しました。しばらくしてからやり直してください。");
    }elsif ($errcode==3) {
      &fatal("利用者として登録されていません。");
    }

    if ($line) {
      &write_file($NEXTIDFILE,$nextid,'w');
      if (!$UA) {
	&write_file($LOGFILE,$line,'a');
	&write_file($REGISTMODEFILE,$today,'w');
      }else {
	&write_file($LOGFILEI,$line,'a');
	&write_file($REGISTMODEFILEI,$today,'w');
      }
    }
  }
}

## -----------------------------------------------------------------
## 指定したサーバからmoomin+の連絡事項をとってくる
## -----------------------------------------------------------------
sub get_moomin_msg {
  local $url="$MOOMINMSGSCRIPT?i=$PRJUSERID";
  local $hostaddr,$proto,$sockaddrs,$port;
  local $prx1,$prx2,$prx3,$prx4;

  if ($PROXY_HOST) {
    ($prx1,$prx2,$prx3,$prx4)=split(/./, $PROXY_HOST);
    $hostaddr=pack("C4",$prx1,$prx2,$prx3,$prx4);
    $url="http://".$PINFOSERVER."/".$url;
    $port=$PROXY_PORT;
  }else {
    $hostaddr=(gethostbyname($PINFOSERVER))[4] || return 0;
    $port=80;
  }

  $proto=(getprotobyname('tcp'))[2] || return 0;
  socket(SOCK, $PF_INET, $SOCK_STREAM, $proto) || return 0;
  $sockaddrs = pack('S n a4 x8', $PF_INET, $port, $hostaddr);
  connect(SOCK, $sockaddrs) || return 0;
  local $oldhandle=select(SOCK);
  $| = 1;
  select($oldhandle);

  print SOCK "GET $url HTTP/1.0\r\n\r\n";
  while (<SOCK>) {
    if ($_ eq "\r\n") { $flg=1; }
    if ($flg && $_ ne "\r\n") {
      if ($_=~/^errcode:(\d+)$/) {
	$errcode=$1;
      }else {
	$line.=$_;
      }
    }
  }
  close(SOCK);

  if ($errcode==1) {
    return "<font color=#ff0000>情報を取得するための入力値がただしくありません。</font>";
  }elsif ($errcode==2) {
    return "<font color=#ff0000>DBへのアクセスに失敗しました。しばらくしてからやり直してください。</font>";
  }elsif ($errcode==3) {
    return "<font color=#ff0000>利用者として登録されていません。</font>";
  }

  if ($line) {
    return $line;
  }else {
    return "連絡事項はありません。";
  }
}

## -----------------------------------------------------------------
## 締切を過ぎたデータを削除
## -----------------------------------------------------------------
sub auto_del {
  local $today=&get_today();
  local $lastaccess;

  if (!$DELPASTDATA){ return 1; }

  if (!$UA) {
    $lastaccess=&read_file($DELPASTDATAFILE);
  }else {
    $lastaccess=&read_file($DELPASTDATAFILEI);
  }

  if ($today ne $lastaccess){
    local $day=$today;
    local $close;

    $day=~s/-//g;

    &lock() or &fatal("Busy");

    if (!$UA) {
      open(IN,$LOGFILE);
    }else {
      open(IN,$LOGFILEI);
    }

    open(OUT,">$LOGFILE.tmp");

    while ($line=<IN>) {
      next if $line!~/\t/;
      @info=split("\t",$line);
      $close=$info[7];
      $close=~s/-//g;
      if ($day<$close) {
	print OUT $line;
      }else {
	#ローカルに保存した関連ファイルがあれば削除
	if (!$UA) {
	  unlink $IMGDIR.$info[0];
	  unlink $IMGDIR.$info[0].".noimg";
	}else {
	  unlink $IMGDIR.$info[0]."i";
	  unlink $IMGDIR.$info[0].".noimgi";
	}
      }
    }

    close(IN);
    close(OUT);
    if (!$UA) {
      rename "$LOGFILE.tmp", $LOGFILE;
    }else {
      rename "$LOGFILE.tmp", $LOGFILEI;
    }

    &unlock();
    if (!$UA) {
      &write_file($DELPASTDATAFILE,$today,'w');
    }else {
      &write_file($DELPASTDATAFILEI,$today,'w');
    }
  }
}

## -----------------------------------------------------------------
## HTMLヘッダを表示する関数の本体
## -----------------------------------------------------------------
sub put_htmlheader {
  local($subTitle,$ckflg)=@_;
  local($outputmsg);

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

  if ($ckflg) {
    local $cookie_path=$ENV{'SCRIPT_NAME'};
    $cookie_path=~s/[^\/]*$//;
    print "Set-Cookie: prjapanpcgi=$PRJUSERID$ADMINPASS; expires=";
    print &get_cookeexpire(60*60*24)."; ";
    print "path=$cookie_path\n";
  }

  $outputmsg = <<"_COVER_";

<html>
<head>
<META HTTP-EQUIV="Content-Language" content="ja">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
_COVER_

  &my_print($outputmsg);

if(!$UA){
  print "<META http-equiv=\"content-type\" content=\"text/html;charset=x-euc-jp\">";
}

  $outputmsg = <<"_COVER_";
<title>$SITENAME - $subTitle</title>
</head>
<body text="$TEXTCOLOR" background="$BGIMAGE" bgcolor="$BGCOLOR" link="$LINKCOLOR" alink="$ALINKCOLOR" vlink="$VLINKCOLOR">
_COVER_

  &my_print($outputmsg);
}


## -----------------------------------------------------------------
## 広告を表示
## -----------------------------------------------------------------
sub put_ad {
  local($ad)=@_;
  &my_print("<center>$ad</center>");
}

## -----------------------------------------------------------------
## TITLEを表示
## -----------------------------------------------------------------
sub put_title {
  if (!$UA) {
    if ($TITLEGIF && -e $TITLEGIF){
      &my_print("<center><img src=\"$TITLEGIF\" alt=\"$SITENAME\" width=\"$TITLEGIFW\" height=\"$TITLEGIFH\" border=0></center>");
    }else {
      &my_print("<center><font size=\"$TITLEFONTSIZE\" color=\"$TITLECOLOR\">$SITENAME</font></center>");
    }
  }else {
    if ($TITLEGIFI && -e $TITLEGIFI){
      &my_print("<center><img src=\"$TITLEGIFI\" alt=\"$SITENAMEI\" width=\"$TITLEGIFIW\" height=\"$TITLEGIFIH\" border=0></center>");
    }else {
      &my_print("<center><font size=\"$TITLEFONTSIZEI\" color=\"$TITLECOLORI\">$SITENAMEI</font></center>");
    }
  }
}

## -----------------------------------------------------------------
## 検索窓を表示
## -----------------------------------------------------------------
sub put_search {
  local($key)=@_;
  local($outputmsg);
  $outputmsg = <<"_COVER_";

<form method=post action="$THISFILENAME">
<input type=hidden name=m value=search>
<input type=text name=keyword size=50 value="$key">
<input type=submit value="検索"><br>
検索方法: <input type=radio name=searchtype value=and>AND <input type=radio name=searchtype value=or checked>OR<br>
※検索するキーワードは半角スペースで区切ってください。<br>
</form>
<br>
_COVER_

  &my_print($outputmsg);
}

## -----------------------------------------------------------------
## メニューを表示(imode用)
## -----------------------------------------------------------------
sub put_menu {
  local ($freesubmitname)=$SITENAME;
  &jcode'convert(*freesubmitname,"sjis");
  local ($freesubmitopt)=&urlencode($freesubmitname);
  local($outputmsg);

  if ($UA) {
    $outputmsg = <<"_COVER_";

<a href="$THISFILENAME?m=new">新着</a><br>
<a href="$THISFILENAME?m=last">締切直前</a><br>
<a href="$THISFILENAME?m=ranku">人気順</a><br>
<a href="$THISFILENAME?m=rankd">当たりやすい</a><br>
<a href="$THISFILENAME?m=all">もれなく</a><br>
<a href="$THISFILENAME?m=fast">先着</a><br>
<a href="$THISFILENAME?m=many&w=500">500名以上</a><br>
<a href="mailto:%20?subject=$SITENAMEI&amp;body=$THISURLNAME">友達に紹介</a><br>

_COVER_
  }
  &my_print($outputmsg);
}

## -----------------------------------------------------------------
## タイトル、広告、文字色などの設定を編集
## -----------------------------------------------------------------
sub put_admin_menu_setting {
  local($outputmsg);

  $GENREMARK=~s/</&lt;/g;
  $GENREMARK=~s/>/&gt;/g;
  $GENREMARK=~s/"/&quot;/g;
  $HEADERAD=~s/</&lt;/g;
  $HEADERAD=~s/>/&gt;/g;
  $HEADERAD=~s/"/&quot;/g;
  $FOOTERAD=~s/</&lt;/g;
  $FOOTERAD=~s/>/&gt;/g;
  $FOOTERAD=~s/"/&quot;/g;
  $HEADERADI=~s/</&lt;/g;
  $HEADERADI=~s/>/&gt;/g;
  $HEADERADI=~s/"/&quot;/g;
  $FOOTERADI=~s/</&lt;/g;
  $FOOTERADI=~s/>/&gt;/g;
  $FOOTERADI=~s/"/&quot;/g;

  $outputmsg = <<"_COVER_";

<form method=post action="$THISFILENAME">
<input type=hidden name=m value=setconf>
<input type=hidden name=is value=1>

<hr>
<b>PC、imode共通の設定</b>
<hr>

PRJAPANから発行された利用者ID<br>
<input type=text name=prjuserid value="$PRJUSERID"><br>

管理者パスワード(半角英数字)<br>
<input type=text name=adminpass value="$ADMINPASS"><br>

背景色(例: #ffffff , red)<br>
<input type=text name=bgcolor value="$BGCOLOR"><br>
背景画像ファイルへのURL<br>
<input type=text name=bgimage value="$BGIMAGE"><br>
文字色(例: #ffffff , red)<br>
<input type=text name=textcolor value="$TEXTCOLOR"><br>
リンク色(例: #ffffff , red)<br>
<input type=text name=linkcolor value="$LINKCOLOR"><br>
アクティブリンク色(例: #ffffff , red)<br>
<input type=text name=alinkcolor value="$ALINKCOLOR"><br>
アクセス済リンク色(例: #ffffff , red)<br>
<input type=text name=vlinkcolor value="$VLINKCOLOR"><br>

登録データの処理方法 (0:自動的に公開 1:管理者による認証が必要)<br>
<input type=text name=registmode value="$REGISTMODE"><br>

アクセス数をカウントする際に1時間以内に同一IPからのアクセス
があった場合カウントしますか(0: いいえ 1:はい)<br>
<input type=text name=sameuser value="$SAMEUSER"><br>

ジャンルの前につけるマーク(HTMLタグも可能。画像も可能。)<br>
<input type=text name=genremark value="$GENREMARK"><br>

サーバのOSがSolarisの場合のみ「Solaris」と記入してください。<br>
<input type=text name=os value="$OS"><br>

PRJAPANにアフィリエイトとして登録されている場合、IDを記入してください。<br>
<input type=text name=affid value="$AFFID"><br>

<hr>
<b>PC用の設定</b>
<hr>

画像ファイルを表示するか (0: いいえ 1: はい)<br>
<input type=text name=disppinfoimg value="$DISPPINFOIMG"><br>

1ページあたりの表示件数(半角数字)<br>
<input type=text name=dispinfonum value="$DISPINFONUM"><br>

タイトル (タイトル画像が使われているなら画像のALT文に使われます)<br>
<input type=text name=sitename value="$SITENAME"><br>

タイトルのサイズ(半角数字。1-7)<br>
<input type=text name=titlefontsize value="$TITLEFONTSIZE"><br>

タイトルの文字色(例: #ffffff , red)<br>
<input type=text name=titlecolor value="$TITLECOLOR"><br>

タイトル画像ファイルのURL<br>
<input type=text name=titlegif value="$TITLEGIF"><br>

タイトル画像の横サイズ(半角数字。無記入可能。)<br>
<input type=text name=titlegifw value="$TITLEGIFW"><br>

タイトル画像の縦サイズ(半角数字。無記入可能。)<br>
<input type=text name=titlegifh value="$TITLEGIFH"><br>

ページヘッダに設置する広告(すべてのHTMLタグが利用可能です。入力チェックはありません。)<br>
<textarea name=headerad cols=70 rows=5>$HEADERAD</textarea><br>

ページフッタに設置する広告(すべてのHTMLタグが利用可能です。入力チェックはありません。)<br>
<textarea name=footerad cols=70 rows=5>$FOOTERAD</textarea><br>

懸賞情報を表示するページに広告を表示するか<br>
(0: 表示なし 1: フレームで上部100ピクセルに表示 2: 別ウィンドウで表示)<br>
<input type=text name=goad value="$GOAD"><br>

懸賞情報を表示するページに設置する広告<br>
半角60字くらいの文字広告にしてください。<br>
(すべてのHTMLタグが利用可能です。入力チェックはありません。)<br>
<textarea name=textad cols=70 rows=5>$TEXTAD</textarea><br>

<hr>
<b>imode用の設定</b>
<hr>

画像ファイルを表示するか (0: いいえ 1: はい)<br>
<input type=text name=disppinfoimgi value="$DISPPINFOIMGI"><br>

1ページあたりの表示件数(半角数字)<br>
<input type=text name=dispinfonumi value="$DISPINFONUMI"><br>

タイトル (タイトル画像が使われているなら画像のALT文に使われます)<br>
<input type=text name=sitenamei value="$SITENAMEI"><br>

タイトルのサイズ(半角数字。1-7)<br>
<input type=text name=titlefontsizei value="$TITLEFONTSIZEI"><br>

タイトルの文字色(例: #ffffff , red)<br>
<input type=text name=titlecolori value="$TITLECOLORI"><br>

タイトル画像ファイルのURL<br>
<input type=text name=titlegifi value="$TITLEGIFI"><br>

タイトル画像の横サイズ(半角数字。無記入可能。)<br>
<input type=text name=titlegifiw value="$TITLEGIFIW"><br>

タイトル画像の縦サイズ(半角数字。無記入可能。)<br>
<input type=text name=titlegifih value="$TITLEGIFIH"><br>

ページヘッダに設置する広告(すべてのHTMLタグが利用可能です。入力チェックはありません。)<br>
<textarea name=headeradi cols=70 rows=5>$HEADERADI</textarea><br>

ページフッタに設置する広告(すべてのHTMLタグが利用可能です。入力チェックはありません。)<br>
<textarea name=footeradi cols=70 rows=5>$FOOTERADI</textarea><br>
<p>

<input type=submit value="保存">
</form>
<hr>
色に関する参考ページ:<a href="http://www.nsknet.or.jp/~satoru_o/colors/web/web.htm" target=_blank>COLORS / Web Safe Color Chart</a><br>
HTMLに関する参考ページ:<a href="http://tohoho.wakusei.ne.jp/www.htm" target=_blank>とほほのWWW入門</a>
<hr>

_COVER_

  &my_print($outputmsg);
}

## -----------------------------------------------------------------
## 管理者用メニューを表示
## -----------------------------------------------------------------
sub put_admin_menu {
  local ($freesubmitname)=$SITENAME;
  &jcode'convert(*freesubmitname,"sjis");
  local ($freesubmitopt)=&urlencode($freesubmitname);
  local $today=&get_today();
  local $lastweek=&get_lastweek();
  local($outputmsg);
  local($moomin_msg)=&get_moomin_msg();

  $outputmsg = <<"_COVER_";

管理者用のページです。<p>

<hr>
■PC,imode共通管理メニュー
<ul>
<li><a href="$THISFILENAME?m=viewsetconf">タイトルや文字色、広告等の各種設定を変更する。</a><br>
</ul>
<p>

<hr>
■PC用管理メニュー
<ul>
<li><a href="$THISFILENAME?m=viewcover">トップページを編集する。<br>
<li><a href="$THISFILENAME?m=viewnavi">メニューページを編集する。<br>
<li><a href="$THISFILENAME?m=viewslot">今、アッタールのスロット懸賞ページをあなた専用のものにする。<br>
<li><a href="$THISFILENAME?m=datacheck">未審査情報をチェックする。</a><br>
<li><a href="$THISFILENAME?m=maglayout">マガジンのレイアウトを作成する。</a><br>
<li><a href="$THISFILENAME?m=ssilayout">SSIのレイアウトを作成する。</a><br>
<li><a href="$THISFILENAME?m=pinfolayout">懸賞情報のレイアウトを作成する。</a><br>
<li>マガジンを編集する。<br>
期間の書式は[YYYY-MM-DD]です。たとえば2002-03-02のような感じです。<br>
取得数は半角数字です。<br>
<form method=post action="$THISFILENAME">
<input type=hidden name=m value=mag>
<input type=hidden name=ua value=0>
取得期間: <input type=text name=start value="$lastweek"> 〜 <input type=text name=end value="$today"><br>
取得数: <input type=text name=num value=20><br>
<input type=submit value="編集">
</form>
<li><a href="$THISFILENAME?m=newregist">自分のサイトだけに情報を登録する。</a><br>
<li><a href="http://www.prjapan.co.jp/free_submit.php3?n=$freesubmitopt&m=present">PRJAPANを利用して複数のサイトに情報を登録する。</a><p>
</ul>

※<br>
現在公開されている情報の修正、削除は、検索結果やジャンルごとに表示された情報を見るページでできます。<p>

<hr>
■imode用管理メニュー
<ul>
<li><a href="$THISFILENAME?m=viewcoveri">トップページを編集する。<br>
<li><a href="$THISFILENAME?m=datachecki">未審査情報をチェックする。</a><br>
<li><a href="$THISFILENAME?m=newi">新着情報を修正、削除チェックする。</a><br>
<li><a href="$THISFILENAME?m=ssilayouti">SSIのレイアウトを作成する。</a><br>
<li><a href="$THISFILENAME?m=maglayouti">マガジンのレイアウトを作成する。</a><br>
<li><a href="$THISFILENAME?m=pinfolayouti">懸賞情報のレイアウトを作成する。</a><br>
<li>マガジンを編集する。<br>
期間の書式は[YYYY-MM-DD]です。たとえば2002-03-02のような感じです。<br>
取得数は半角数字です。<br>
<form method=post action="$THISFILENAME">
<input type=hidden name=m value=mag>
<input type=hidden name=ua value=1>
取得期間: <input type=text name=start value="$lastweek"> 〜 <input type=text name=end value="$today"><br>
取得数: <input type=text name=num value=20><br>
<input type=submit value="編集">
</form>
<li><a href="$THISFILENAME?m=newregisti">自分のサイトだけに情報を登録する。</a><br>
<li><a href="http://www.prjapan.co.jp/free_submit.php3?n=$freesubmitopt&m=ipresent">PRJAPANを利用して複数のサイトに情報を登録する。</a><p>
</ul>

<hr>
■Moomin+からの連絡事項<br>
$moomin_msg

<p>
<hr>
■このCGIに関するメニュー
<ul>
<li><a href="http://www.prjapan.co.jp/" target=_blank>Free CGI Moomin+</a>
<li><a href="http://www.prjapan.co.jp/freecgi/kiyaku.php3" target=_blank>利用者規約</a>
<li><a href="http://www.prjapan.co.jp/freecgi/faq.php3" target=_blank>FAQ</a>
<li><a href="http://www.prjapan.co.jp/freecgi/bbs/" target=_blank>BBS</a>
</ul>

<p>

_COVER_

  &my_print($outputmsg);
}

## -----------------------------------------------------------------
## ジャンルを表示(現在使っていない)
## -----------------------------------------------------------------
sub put_genre {
  local($i,$j,$k);
  local $gen=$#GENRES_A;

  print "<table border=0 width=90%>";
  for ($i=1,$k=1;$i<$gen;$k++,$i=$j) {
    print "<tr valign=top>";
    for ($j=$i;$j<=$CATEGORYCOLS*$k;$j++) {
      if ($GENRES_A[$j] ne '') {
	print "<td>$GENREMARK<a href=\"$THISFILENAME?m=genre&g=$j\">".$GENRES_A[$j]."</a></td>";
      }else {
	print "<td>　</td>";
      }
    }
    print "</tr>";
  }
  print "</table>";
}

## -----------------------------------------------------------------
## 管理者用ログインのID、PASS入力フォームを表示
## -----------------------------------------------------------------
sub put_admin_login_form {
  local($outputmsg);
  $outputmsg = <<"_COVER_";

<form method=post action="$THISFILENAME">
<input type=hidden name=m value=admin_login>
<input type=hidden name=mode value=login>
ID:<input type=text name=id size=10><br>
PASS:<input type=password name=pass size=10><br>
<input type=submit value="ログイン">
</form>

_COVER_

  &my_print($outputmsg);
}

## -----------------------------------------------------------------
## HTMLフッタを表示
## -----------------------------------------------------------------
sub put_footer {
  if (!$UA) {
    &my_print("<br><br><center><font size=2><a href=http://www.prjapan.co.jp/freecgi target=_blank>Free CGI / Moomin+</a></font></center><br><br></body></html>");
  }else {
    &my_print("<br><br><center><font size=2>Free CGI / Moomin+</font></center><br><br></body></html>");
  }
}

## -----------------------------------------------------------------
## ファイルに書き出す関数
## -----------------------------------------------------------------
sub write_file(){
  local($filename,$line,$mode)=@_;

  &lock() or &fatal("Busy");

  if ($mode eq "a") {
    open(F, ">>$filename");
  }elsif ($mode eq "w") {
    open(F, ">$filename");
  }else {
    &unlock();
    &fatal("ファイル書き込み失敗");
  }

  print F $line;
  close(F);
  &unlock();
}

## -----------------------------------------------------------------
## ファイルを読み込む関数
## -----------------------------------------------------------------
sub read_file {
  local($filename) = @_;
  local($input);

  if (!-e $filename) {
    return "";
  }

  open(INFILE, "$filename");
  while (<INFILE>) { $input .= $_; };
  close(INFILE);
  return $input;
}

## -----------------------------------------------------------------
## いろいろな形式で日付を取得
## -----------------------------------------------------------------
sub get_date(){
  local($ttime,$ck,$youbi)=@_;
  local(@tmptime) = localtime(time()+$ttime);
  if ($ck) {
    return sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",
		   ('Sun','Mon','Tue','Wed','Thu','Fri','Sat')[$tmptime[6]],
		   $tmptime[3],
		   ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$tmptime[4]],
		   $tmptime[5]+1900,$tmptime[2],$tmptime[1],$tmptime[0]);
  }elsif ($youbi) {
    return sprintf("%4.4d-\%2.2d-\%2.2d(%s)",$tmptime[5]+1900,$tmptime[4]+1,$tmptime[3],
		   (($YOUBI_TYPE)?('日','月','火','水','木','金','土')[$tmptime[6]]
		    :('Sun','Mon','Tue','Wed','Thu','Fri','Sat')[$tmptime[6]]));
  }else{
    return sprintf("%4.4d-\%2.2d-\%2.2d",$tmptime[5]+1900,$tmptime[4]+1,$tmptime[3]);
  }
}

## -----------------------------------------------------------------
## クッキーを取得
## -----------------------------------------------------------------
sub cookie {
  local($key,$value,$term);
  foreach $term (split(/;\s*/,$ENV{'HTTP_COOKIE'})){
    ($key,$value)=split(/=/,$term,2);
    $cookies{$key}=$value;
  }
}

## -----------------------------------------------------------------
## URLエンコードする関数
## -----------------------------------------------------------------
sub urlencode {
  local($url)=@_;
  $url=~s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
  $url=~s/\s/+/g;
  return $url;
}

## -----------------------------------------------------------------
## クッキーなしのHTMLヘッダを表示
## -----------------------------------------------------------------
sub put_header {
  local($subTitle)=@_;
  &put_htmlheader($subTitle,0);
}

## -----------------------------------------------------------------
## クッキーありのHTMLヘッダを表示
## -----------------------------------------------------------------
sub put_header_with_cookie {
  local($subTitle)=@_;
  &put_htmlheader($subTitle,1);
}

## -----------------------------------------------------------------
## クッキーを調べて管理者かどうかを判定
## -----------------------------------------------------------------
sub auth {
  if ($cookies{'prjapanpcgi'} eq "$PRJUSERID$ADMINPASS"){
    return 1;
  }else {
    return 0;
  }
}

## -----------------------------------------------------------------
## クッキーに設定するexpireの日付を取得。
## -----------------------------------------------------------------
sub get_cookeexpire(){
  local($t)=@_;
  return &get_date($t,1,0);
}

## -----------------------------------------------------------------
## 今日の日付を取得。
## -----------------------------------------------------------------
sub get_today(){
  return &get_date(0,0,@_);
}

## -----------------------------------------------------------------
## 7日前の日付を取得。
## -----------------------------------------------------------------
sub get_lastweek(){
  return &get_date(-7*60*60*24,0,0);
}

## -----------------------------------------------------------------
## エラーを表示
## -----------------------------------------------------------------
sub fatal {
  local($message) = @_;
  &message("エラー",$message);
  exit;
}

## -----------------------------------------------------------------
## 普通のメッセージを表示
## -----------------------------------------------------------------
sub message {
  local($title,$message) = @_;

  &put_header($title);

  if (!$UA) {  
    &my_print("<center>\n<h1>$title</h1><p>$message<p><a href=\"javascript:history.back();\">前のページ</a></center>\n");
  }else {
    &my_print("<center>\n<h1>$title</h1><p>$message<p></center>\n");    
  }

  &put_footer();
}

## -----------------------------------------------------------------
## ロック
## -----------------------------------------------------------------
sub lock {
  local($lockFile)=$DATADIR.$LOCKFILE;
  if ($]=~/^5/o) {
    # for perl5
    local($LockEx)=2;
    open(LOCK, ">>$lockFile") || return 2;
    flock(LOCK, $LockEx) || return 0;
    return 1;
  }else {
    # for perl4
    local($lockWait)=10;		# [sec]
    local($lockFileTimeout)=0.004;	# 5.76 [min]
    local($timeOut)=0;
    local($lockFlag)=0;

    if (-M "$lockFile" > $lockFileTimeout) { unlink($lockFile); }
    for($timeOut=0; $timeOut<$lockWait; $timeOut++) {
      open(LOCKORG, ">$lockFile.org") || return 0;
      close(LOCKORG);
      $lockFlag=1, last if (link("$lockFile.org", $lockFile));
      unlink("$lockFile.org");
      sleep(1);
    }
    return $lockFlag;
  }
}

## -----------------------------------------------------------------
## ロック解除
## -----------------------------------------------------------------
sub unlock {
  local($lockFile)=$DATADIR.$LOCKFILE;
  if ($]=~/^5/o) {
    # for perl5
    close(LOCK);
  }else {
    # for perl4
    unlink($lockFile);
  }
}

## -----------------------------------------------------------------
## PCならEUCで、imodeならSJISで表示
## -----------------------------------------------------------------
sub my_print{
  local($msg)=@_;
  if ($UA) { 
    &jcode'euc2sjis(*msg);
    &jcode'z2h_sjis(*msg);
  }
  print $msg;
}

## -----------------------------------------------------------------
## PCかimodeかの判定
## -----------------------------------------------------------------
sub uacheck(){
  local(@user_agent)=split("/",$ENV{'HTTP_USER_AGENT'});
  if ($user_agent[0] eq "DoCoMo"){
    #i-mode
    return 1;
  }elsif ($user_agent[0] eq "ASTEL"){
    #ドットi
    return 2;
  }elsif ($user_agent[0] eq "UP.Browser"){
    #EZweb
    return 3;
  }elsif ($user_agent[0] eq "PDXGW"){
    #H"（ONC）
    return 4;
  }elsif ($user_agent[0] eq "J-PHONE"){
    #J-SKY
    return 5;
  }else {
    #それ以外(pc)
    return 0;
  }
}

## -----------------------------------------------------------------
## CGIに渡された値を解析して%inに設定
## -----------------------------------------------------------------
sub read_parse {
  local (*in) = @_ if @_;
  local ($i,$key,$val);

  if ($ENV{'REQUEST_METHOD'} eq 'POST') {
    read(STDIN, $in, $ENV{'CONTENT_LENGTH'});
  }else {
    $in=$ENV{'QUERY_STRING'};
  }

  @in=split(/[&;]/,$in);

  foreach $i (0 .. $#in) {
    $in[$i] =~ s/\+/ /g;
    ($key, $val)=split(/=/,$in[$i],2);
    $key =~ s/%(..)/pack("c",hex($1))/ge;
    $val =~ s/%(..)/pack("c",hex($1))/ge;

    if ($UA) {
      &jcode'h2z_sjis(*key);
      &jcode'h2z_sjis(*val);
      &jcode'sjis2euc(*key);
      &jcode'sjis2euc(*val);
    }else {
      &jcode'h2z_euc(*key);
      &jcode'h2z_euc(*val);
      &jcode'convert(*key,'euc');
      &jcode'convert(*val,'euc');
    }

    $in{$key}.="\0" if (defined($in{$key}));
    $in{$key}.=$val;
  }

  return scalar(@in);
}

## -----------------------------------------------------------------
## 懸賞情報をとってくるサーバに画像ファイルがあるか調べる関数の本体
## -----------------------------------------------------------------
sub check_img_prj {
  local($url)=@_;
  local %month=('Jan'=>'01',
		'Feb'=>'02',
		'Mar'=>'03',
		'Apr'=>'04',
		'May'=>'05',
		'Jun'=>'06',
		'Jul'=>'07',
		'Aug'=>'08',
		'Sep'=>'09',
		'Oct'=>'10',
		'Nov'=>'11',
		'Dec'=>'12');

  local $hostaddr,$proto,$sockaddrs,$port;
  local $prx1,$prx2,$prx3,$prx4;

  if ($PROXY_HOST) {
    ($prx1,$prx2,$prx3,$prx4)=split(/./, $PROXY_HOST);
    $hostaddr=pack("C4",$prx1,$prx2,$prx3,$prx4);
    $url="http://".$PINFOSERVER."/".$url;
    $port=$PROXY_PORT;
  }else {
    $hostaddr=(gethostbyname($PINFOSERVER))[4] || return 0;
    $port=80;
  }

  $proto=(getprotobyname('tcp'))[2] || return 0;
  socket(SOCK, $PF_INET, $SOCK_STREAM, $proto) || return 0;
  $sockaddrs = pack('S n a4 x8', $PF_INET, $port, $hostaddr);
  connect(SOCK, $sockaddrs) || return 0;
  local $oldhandle=select(SOCK);
  $| = 1;
  select($oldhandle);

  print SOCK "HEAD $url HTTP/1.0\r\n\r\n";
  while (<SOCK>) {
    if (/^Last-Modified: \w+, (\d+) (\w+) (\d+)/) {
      close(SOCK);
      return $3.$month{$2}.$1;
    }
  }
  close(SOCK);
  return 0;
}

## -----------------------------------------------------------------
## 懸賞情報をとってくるサーバに画像ファイルがあるか調べる関数
## -----------------------------------------------------------------
sub check_img {
  local($id,$imgid,$ldate,$ua)=@_;
  local $url="/img_p/".$imgid.".jpg";
  local $url2="/img_p/".$imgid.".gif";
  local($lastmodify);
  local($img_path)=$THISURLNAME;
 
  if (!-e $IMGDIR) { mkdir $IMGDIR, 0777; }

  if (!$UA) {
    if (-e $IMGDIR.$id.".noimg") {
      return "";
    }
    if (-e $IMGDIR.$id) {
      return &read_file($IMGDIR.$id);
    }
  }else {
    if (-e $IMGDIR.$id.".noimgi") {
      return "";
    }
    if (-e $IMGDIR.$id."i") {
      return &read_file($IMGDIR.$id."i");
    }
  }

  #imodeならPRのサーバにはないのでアクセスしない
  if ($ua) { return ""; }

  $ldate=~s/-//g;
  $lastmodify=&check_img_prj($url);
  if ($lastmodify && $lastmodify<=$ldate) {
    return "http://".$PINFOSERVER.$url;
  }

  $lastmodify=&check_img_prj($url2);
  if ($lastmodify && $lastmodify<=$ldate) {
    return "http://".$PINFOSERVER.$url2;
  }

  return "";
}

