<mark_sheet>
    <style scoped>
    </style>

	<div if={ cur_race['race_status'] >= 90 } class="Race_Infomation_Box">本レースは中止となりました</div>
	<div if={ cur_race['race_status'] < 90 && Object.keys(race_horse).length <= 0 } class="Race_Infomation_Box">このレースは出走メンバーが確定しておりません</div>
    <div if={ cur_race['race_status'] == 20 } class="NoData_Msg"><div class="Msg">枠順が確定し次第更新します</div></div>
    <virtual if={ cur_race['race_status'] < 90 && Object.keys(race_horse).length >= 1 && cur_race['race_status'] != 20 }>

		<!-- 式別・方式選択ボタンタイプ -->
		<nav class="Odds_Menu01">
			<ul>
				<li class="{ (hno1 == cur_houshiki_1) ? 'Active' : ''} { hno1 == 1 ? 'Formation' : '' }"
					each={ label1,hno1 in houshiki_button1 }
					if={ edit_houshiki_button1_disable(hno1) }>
					<a href="javascript:void(0)" onClick={ act_houshiki_1.bind(this, hno1) }>{ label1 }</a>
				</li>
			</ul>
		</nav>

		<nav class="Odds_Menu02 { cur_houshiki < '3' ? 'CheckMenu' : ''} ">
			<ul>
				<li class="{ (select_shikibetu[sno]) ? 'Active' : '' }" each={ sno, label in disp_shikibetu } >
					<a href="javascript:void(0)" onClick={ act_shikibetu.bind(this, sno) } class="shikibetsu_btn" style="pointer-events: {edit_shikibetsu_disable(sno)}">{ label }</a>
				</li>
			</ul>
		</nav>

		<nav class="Odds_Menu03" if={ ( '3' == cur_houshiki_1 && '6' <= cur_shikibetu) || ( '3' == cur_houshiki_1 && '4' == cur_shikibetu) }>
			<ul>
				<li class="{ (hno2 == cur_houshiki) ? 'Active' : '' }" each={ label2,hno2 in houshiki_button2[cur_shikibetu] }>
					<a href="javascript:void(0)" onClick={ act_houshiki.bind(this, hno2)  }>{ label2 }</a>
				</li>
			</ul>
			<div class="Multi_Select" if={multi_attr}>
				<span><input type="checkbox" class="MultiCheck" onClick={ act_multi.bind(this) } checked={ (multi) ? 'checked' : '' } id="MultiCheck"/>
				<label for="MultiCheck">マルチ</label></span>
			</div>
		</nav>

		<div class="select_item" >
			<div class="umaban_container">
				<table class="RaceCard_Table RaceOdds_HorseList_Table">
					<thead>
						<tr class="col_label">
							<th class="Waku">枠番</th>
							<th class="Waku">車番</th>
							<th class="Mark">予想</th>
							<th>選手名</th>
							<th each={ tmp,rix in data_number_v[0] } if={ edit_show_column(rix, 'in') } style="width: 50px;">
								<span>{edit_label(rix, cur_shikibetu)}</span>
							</th>
						</tr>
					</thead>
					<tbody>
						<tr if={ race_horse[uix + 1] } class="{ race_horse[uix + 1]['sales_sts'] == '1' || race_horse[uix + 1]['sales_sts'] == '3' ? 'torikeshi' : ''}" id="tr_{uix+ 1}" each={ ary_row,uix in data_number_v }>
							<td class="Waku">{race_horse[uix + 1]['wakuban']}</td>
							<td class="Waku{ uix + 1 }">{ uix + 1 }</td>
							<td class="Mark_User">
								<!--span if={ my_mark[race_horse[uix + 1]['syaban']] } class="MarkIcon Mark{ my_mark[race_horse[uix + 1]['syaban']] }"></span-->
								<!--span>{ my_mark_label[my_mark[race_horse[uix + 1]['syaban']]] }</span-->
								<svg if={ my_mark[race_horse[uix + 1]['syaban']] } class="Icon_Shirushi01 Icon_{ edit_kaime_mark(my_mark[race_horse[uix + 1]['syaban']], true, cur_shikibetu) }">
									<use xlink:href="/common/img/icon/icon_shirushi.svg#icon-{ edit_kaime_mark(my_mark[race_horse[uix + 1]['syaban']], false, cur_shikibetu) }"></use>
								</svg>
							</td>
							<td class="Player_Info">
								<dl>
									<dt class="PlayerName">
									{ race_horse[uix + 1]['name'] }
									</dt>
									<dd class="PlayerFrom">{ race_horse[uix + 1]['fuken'] } <virtual if={race_horse[uix + 1]['age'] != null}>{ race_horse[uix + 1]['age'] }歳</virtual></dd>
									<dd if={ kaisai_mode == 'keirin' } class="PlayerClass"><virtual if={race_horse[uix + 1]['graduate'] != null}>{ race_horse[uix + 1]['graduate'] }期</virtual> { race_horse[uix + 1]['kyu'] }{ race_horse[uix + 1]['han'] } <em if={race_horse[uix + 1]['rating'] != nnull}>{ sprintf('%.2f', race_horse[uix + 1]['rating']) }</em></dd>
								</dl>
							</td>
							<td each={ row,rix in ary_row } if={ race_horse[uix + 1]['sales_sts'] != '1' &&  race_horse[uix + 1]['sales_sts'] != '3' && edit_show_column(rix, 'in') } class="Player_Select">
								<div if={ edit_show_column(rix, 'in') }>
									<input type="{ edit_show_input_type(rix) }" class="HorseCheck_Select" id="uc-{rix}-{uix + 1}" name="" value="1"
										checked={edit_number_active(rix,uix + 1) ? true : false}
										disabled={edit_number_disable(rix,uix + 1) ? true : false}
										onClick={act_number.bind(this, rix, uix + 1)}/>
									<label for="uc-{rix}-{uix + 1}" class="Check01Btn_Off" ></label>
								</div>
							</td>
							<td if={ race_horse[uix + 1]['sales_sts'] == '1' || race_horse[uix + 1]['sales_sts'] == '3' } class="Player_Select" colspan="{ check_column(rix, 'in') }">
								<div>取消</div>
							</td>
						</tr>
						<tr class="ActionBtn">
							<td colspan="4" class="Txt">
								<div>
									<span>印の選手を選択</span>
								</div>
							</td>
							<td each={ tmp, rix in btn_func } if={ edit_show_column(rix, 'in') }>
								<div if={ edit_show_column(rix, 'all') }>
									<virtual if={ !btn_func_stat['mark'][rix] }>
										<input type="checkbox" id="btn_mark_{rix}" class="Mark_Action" checked={ btn_func_stat['mark' ][rix] ? true : false} onClick={ act_ext_func.bind(this,'mark', rix) }>
										<label for="btn_mark_{rix}"></label>
									</virtual>
									<virtual if={ btn_func_stat['mark'][rix] }>
										<input type="checkbox" id="btn_mark_{rix}" class="Mark_Action" checked={ btn_func_stat['mark' ][rix] ? true : false} onClick={ act_ext_func.bind(this,'clear', rix) }>
										<label for="btn_mark_{rix}"></label>
									</virtual>
								</div>
							</td>
						</tr>
						<tr class="ActionBtn">
							<td colspan="4" class="Txt">
								<div>
									<span>すべてを選択</span>
								</div>
							</td>
							<td each={ tmp, rix in btn_func } if={ edit_show_column(rix, 'in') }>
								<div if={ edit_show_column(rix, 'all') }>
									<virtual if={ !btn_func_stat['all'][rix] }>
										<input type="checkbox" id="btn_all_{rix}" class="All_Action" checked={ btn_func_stat['all'][rix] ? true : false} onClick={ act_ext_func.bind(this, 'all', rix) }>
										<label for="btn_all_{rix}"></label>
									</virtual>
									<virtual if={ btn_func_stat['all'][rix] }>
										<input type="checkbox" id="btn_all_{rix}" class="All_Action" checked={ btn_func_stat['all'][rix] ? true : false} onClick={ act_ext_func.bind(this, 'clear', rix) }>
										<label for="btn_all_{rix}"></label>
									</virtual>
								</div>
							</td>
						</tr>
				    </tbody>
				</table>
			</div><!-- /.umaban_container -->
		</div> <!-- /.select_item -->


		<!--div class="BetTable Bet01"-->
		<!--virtual each={ key, shikibetu in select_shikibetu } if={ key }-->
			<!--div each={ key, shikibetu in select_shikibetu } if={ bet_mode == 'add'} class="BetTable Bet01 { select_kaime[shikibetu] == true  ? 'color' : '' }"-->
			<div each={ shikibetu, label in disp_shikibetu } class="BetTable Bet01 { select_kaime[shikibetu] == true  ? 'color' : '' }" style="display: { select_shikibetu[shikibetu] ? 'block' : 'none' };">
				<div class="Selected_Table">
					<div class="Selected_Table_Inner">
						<div class="BetKaime_Table">
							<div id="select_kumiawase" class="kaime_view FormationType">
								<div class="Kenshu" >{disply_bet_label[shikibetu]} <virtual if={ shikibetu != '1' }>{houshiki[shikibetu][cur_houshiki]}</virtual>&nbsp;<virtual if={multi}>マルチ</virtual></div>

								<!-- 枠系以外 -->
								<div class="LabelWrap" if={ ('3' != shikibetu) && ('4' != shikibetu) && btn_uno } each={ tmp,rix in data_number_v[0] }>
									<div class="LabelArrow" if={ edit_label(rix, shikibetu) != '--' }> <span>{edit_label(rix, shikibetu)}</span> </div>
									<div class="Num">
										<virtual if={ btn_uno[rix] && Object.keys(btn_uno[rix]).length >= 1 }>
										<div class="Shaban_InBox" each={ bool, syaban in btn_uno[rix] } if={ bool && edit_label(rix, shikibetu) != '--' }>
											<virtual if={ rix != 2 || shikibetu == 9 || shikibetu == 8 }>
												<svg if={ my_mark[syaban] && shikibetu != 3 && shikibetu != 4  } class="Icon_Shirushi01 Icon_{ edit_kaime_mark(my_mark[syaban], true, shikibetu) }">
													<use xlink:href="/common/img/icon/icon_shirushi.svg#icon-{ edit_kaime_mark(my_mark[syaban], false, shikibetu) }"></use>
												</svg>
												<span class="Wakuban Waku{ (shikibetu == 3 || shikibetu == 4) ? '1' : syaban }">{syaban}</span>
											</virtual>
										</div>
										</virtual>
									</div>
								</div>

								<!-- 枠系 -->
								<div class="LabelWrap" if={ ( shikibetu == 3 || shikibetu == 4 ) && btn_uno } each={ tmp,rix in data_number_v[0] }>
									<div class="LabelArrow" if={ edit_label(rix, shikibetu) != '--' }> <span>{edit_label(rix, shikibetu)}</span> </div>
									<div class="Num">
										<virtual if={ btn_waku[rix] && Object.keys(btn_waku[rix]).length >= 1 }>
										<div class="Shaban_InBox" each={ bool, syaban in btn_waku[rix] } if={ bool && edit_label(rix, shikibetu) != '--' }>
											<virtual if={ rix != 2 || shikibetu == 9 || shikibetu == 8 }>
												<span class="Wakuban Waku1">{syaban}</span>
												<svg if={ my_mark[syaban] && shikibetu != 3 && shikibetu != 4  } class="Icon_Shirushi01 Icon_{ edit_kaime_mark(my_mark[syaban], true, shikibetu) }">
													<use xlink:href="/common/img/icon/icon_shirushi.svg#icon-{ edit_kaime_mark(my_mark[syaban], false, shikibetu) }"></use>
												</svg>
											</virtual>
										</div>
										</virtual>
									</div>
								</div>

								<span class="OddsData01" if={ select_bet_odds[shikibetu] && select_bet_odds[shikibetu].length > 1 }>{ sprintf("%0.1f", select_min_odds[shikibetu]) }倍 ～ { sprintf("%0.1f", select_max_odds[shikibetu]) }倍</span>
								<span class="OddsData01" if={ select_bet_odds[shikibetu] && select_bet_odds[shikibetu].length == 1 }>{ sprintf("%0.1f", select_min_odds[shikibetu]) }倍</span>
							</div>
							<div class="pay FormationType">
								<div class="FormationTypeWrap">
									<div class="AssumedOdds FormationType">
										<dl class="PayData01"> <dt><span class="kumiawase_kensu"><em>{bet_count[shikibetu]}</em>点</span></dt> </dl>
									</div>
								</div>
							</div>
						</div>
						<div class="kaime_open">
							<input class="disp_none" type="checkbox" id="p-chk_open_{shikibetu}">
							<label for="p-chk_open_{shikibetu}"><span onclick={ act_odds_open.bind(this, shikibetu) } class="{ is_odds_open[shikibetu] ? 'Open' : '' }">{ is_odds_open[shikibetu] ? '展開を閉じる' : '展開する' }</span></label>
						</div>
					</div>
					<div class="Select">
						<input class="BuyCheck_Select disp_none" type="checkbox" value="1" id="p-chk_sel_{shikibetu}" onclick={ act_select_kaime.bind(this, shikibetu) } checked={ select_kaime[shikibetu] == true ?  true : false } >
						<!--input class="BuyCheck_Select disp_none" type="checkbox" value="1" id="p-chk_sel_{shikibetu}" onclick={ act_select_kaime.bind(this, shikibetu) } checked={ select_kaime[shikibetu] ?  true : false } disabled={ select_kaime[shikibetu] ? false : true }-->
						<label class="Check01Btn_Off" for="p-chk_sel_{shikibetu}"></label>
					</div>
				</div>

				<table class="RaceOdds_Result_Table04" if={ is_odds_open[shikibetu] && odds[cur_shikibetu]}>
					<thead>
						<tr>
							<th class="th_col_keys Sort_Btn01" onclick={ act_select_odds_sort.bind(this, select_bet_odds[shikibetu], 'kaime', shikibetu) }><button class="sort">組み合わせ</button></th>
							<th class="th_col_odds Sort_Btn01" onclick={ act_select_odds_sort.bind(this, select_bet_odds[shikibetu], 'odds', shikibetu) }><button class="sort">オッズ</button></th>
							<th class="th_col_select">選択</th>
						</tr>
					</thead>

					<tbody class="list">
						<tr each={ odds_obj, idx in select_bet_odds[shikibetu] } class="{ select_odds[sprintf('%s_%s', shikibetu, Object.keys(odds_obj)[0])] ? 'bg-danger' : '' }">
							<td class="Apart">
								<div class="Num">
									<virtual each={ syaban, k in Object.keys(odds_obj)[0].split('0') }>
										<div class="Shaban_InBox " if={ syaban != 0 }>
											<span class="Wakuban Waku{ (shikibetu == 3 || shikibetu == 4) ? '1' : syaban }">{syaban}</span>
											<span class="name" if={shikibetu != 3 && shikibetu != 4 && race_horse[syaban] != undefined}>{race_horse[syaban]['names']}</span>
											<svg if={ my_mark[syaban] && shikibetu != 3 && shikibetu != 4  } class="Icon_Shirushi01 Icon_{ edit_kaime_mark(my_mark[syaban], true, shikibetu) }">
												<use xlink:href="/common/img/icon/icon_shirushi.svg#icon-{ edit_kaime_mark(my_mark[syaban], false, shikibetu) }"></use>
											</svg>
										</div>
										<span if={ k != 0 && Object.keys(odds_obj)[0].split('0').length > k+1 } class={ edit_kaime_class(shikibetu) }></span>
									</virtual>
								</div>
							</td>
							<td class="AssumedOdds">
								<span class="OddsData01">{sprintf("%0.1f", Object.values(odds_obj)[0])}</span>
							</td>
							<td class="Select">
								<input class="BuyCheck_Select disp_none" type="checkbox" value="1" id="p-chk_sel_comb_{idx}_{shikibetu}" onclick={ act_select_odds.bind(this, Object.keys(odds_obj)[0], shikibetu) } checked="{ select_odds[sprintf('%s_%s', shikibetu, Object.keys(odds_obj)[0])] ? true : false }" >
								<label class="Check01Btn_Off" for="p-chk_sel_comb_{idx}_{shikibetu}"> </label>
							</td>
						</tr>
					</tbody>
				</table>
			</div>
		<!--/virtual-->

        <div class="addSyaken" if={add_bet_item_event}>
            <div class="icon">
                <svg id="グループ_21363" data-name="グループ 21363" xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 13 13">
                    <path id="パス_6159" data-name="パス 6159" d="M12.489,3.97A6.52,6.52,0,1,0,13,6.5a6.478,6.478,0,0,0-.511-2.53m-3.84,7.619a5.524,5.524,0,0,1-4.3-10.178,5.524,5.524,0,0,1,4.3,10.178" fill="#fff"/>
                    <path id="パス_6160" data-name="パス 6160" d="M99.728,142.159,96.8,139.336a.489.489,0,1,1,.678-.7l2.2,2.123,3.955-4.37a.489.489,0,0,1,.725.656Z" transform="translate(-94.069 -132.585)" fill="#fff"/>
                </svg>
            </div>
            <div class="text">買い目が追加されました</div>
            <div class="triangle"></div>
        </div>

		<div class="View_Count"><span style="font-size:12px; font-weight: normal;">組み合わせ</span><br><sapn id="kumi">4</sapn>点</div>

		<div if={ check_active_num() } class="InputFixedArea_Wrap">
			<div class="InputFixedArea01 {vote_mode == 'TIPSTAR' ? 'tipstar' : ''}" style="position: fixed; bottom: 0px;">
				<dl class="TotalBetDL">
					<dt id="total_bet">組み合わせ：{ edit_bet_count(bet_count) }点 / 選択済：<span id="odds_select">{ edit_select_count() }</span><span>件</span></dt>
				</dl>
				<div class="InputBtnBox" onClick={ act_add_bet.bind(this) }>
                    <button id="action_input_money_{event_id}" class="Btn01 BtnCol01" disabled={edit_bet_count(bet_count) == 0 ? true : false}><span>カートに追加する</span></button>
                </div>
			</div>
		</div>
        <virtual if={bet_tutorial}>
            <div class="CenterModal commonRegister betTipstar" style="display: block;">
                <div class="CenterModal-bg modal-close">
                </div>
                <div class="CenterModalContent">
                <p class="head">新機能</p>
                    <div class="contentInter">
                        <p class="text1">ネットケイリンで<br>車券投票ができるようになりました。</p>
                        <p class="img">
                            <img src="{args.cdn_url}/common/img/race/tipstar_explain.png" alt="「投票シート」の右上から、投票先を切り替えることができます。">
                        </p>
                        <p class="text2">「投票シート」の右上から、投票先を切り替えることができます。</p>
                        <p class="text3">※車券投票にはそれぞれアカウントが必要となります。</p>
                    </div>
                    <div class="CloseBtn modal-close">
                        <span>閉じる</span>
                    </div>
                </div>
            </div>
        <virtual>
    </virtual>

    <script>
     // $Id: ipat_sp.tag 436 2017-09-11 07:51:07Z ysimizu $
     "use strict"

     var self = this;
     self.args = self.opts;
     self.debug = true;
     self.param = null;
     if (self.debug) console.log('sel.args: %O', self.args);

     //self.selection_type = 2;	// 1: プルダウン,簡易表示 2: ボタン,俺プロ仕様

     // 0: 競車場選択(初期化)
     // 1: レース選択
     // 2: 式別選択(単勝,複勝...)
     // 3: 方式選択(通常,BOX,フォーメーション...)
     // 式別・方式による、車番ボタンの状態、印選択・全選択の使用可否・チェックルーチン、ラベル
     // 左から
     //   key:   1桁目: 式別  2桁目: 方式
     //   in:    軸が入力可能か否か  1: 可  0: 不可
     //   all:   印で選択、全選択ボタンが使用可能か否か 1: 可 0: 不可
     //   check: チェック関数
     //      0: なし
     //      'radio' : 単一選択(既に選択中の車番は選択解除)
     //      'nodupp': 他の軸の同一車番が選択不可
     //      'max'   : 番号の選択最大数チェック :n は引数
     //   label: 式別、方式による表題

     self.houshiki_attr = {
	     // 単勝
	     '11': {in: [1,0,0], all: [1,0,0], check: [0,0,0], label: ['1着','--','--']}, // 通常
	     '12': {in: [1,0,0], all: [0,0,0], check: [0,0,0], label: ['1着','--','--']}, // 通常
	     // 複勝
//	     '20': {in: [1,0,0], all: [0,0,0], check: ['radio',0,0], label: ['--','--','--']}, // 通常
	     // 枠複
	     '30': {in: [1,1,0], all: [0,0,0], check: ['radio','radio',0], label: ['枠1','枠2','--']}, // 通常
	     '31': {in: [1,1,0], all: [1,1,0], check: [0,0,0], label: ['枠1','枠2','--']},  // フォーメーション
	     '32': {in: [1,0,0], all: [1,0,0], check: [0,0,0], label: ['選択','--','--']}, // BOX
	     '33': {in: [1,1,0], all: [0,1,0], check: ['radio&nodupp',0,0], label: ['軸','相手','--']},  // ながし
	     // 車連
//             '50': {in: [1,0,0], all: [0,0,0], check: ['max:2',0,0], label: ['--','--','--']}, // 通常
             '51': {in: [1,1,0], all: [1,1,0], check: [0,0,0], label: ['車1','車2','--']},  // フォーメーション
             '52': {in: [1,0,0], all: [1,0,0], check: [0,0,0], label: ['選択','--','--']}, // BOX
             '53': {in: [1,1,0], all: [0,1,0], check: ['radio&nodupp',0,0], label: ['軸','相手','--']},  // ながし
	     // ワイド
             '70': {in: [1,0,0], all: [0,0,0], check: ['max:2',0,0], label: ['--','--','--']}, // 通常
             '71': {in: [1,1,0], all: [1,1,0], check: [0,0,0], label: ['車1','車2','--']},  // フォーメーション
             '72': {in: [1,0,0], all: [1,0,0], check: [0,0,0], label: ['選択','--','--']}, // BOX
             '73': {in: [1,1,0], all: [0,1,0], check: ['radio&nodupp',0,0], label: ['軸','相手','--']},  // ながし
	     // 2車単
	     '60': {in: [1,1,0], all: [0,0,0], check: ['radio&nodupp','radio&nodupp',0], label: ['1着','2着','--']}, // 通常
	     '61': {in: [1,1,0], all: [1,1,0], check: [0,0,0], label: ['1着','2着','--']},  // フォーメーション
	     '62': {in: [1,0,0], all: [1,0,0], check: [0,0,0], label: ['選択','--','--']}, // BOX
	     '63': {in: [1,1,0], all: [0,1,0], check: ['radio&nodupp',0,0], label: ['1着軸','相手','--']},  // 1着ながし
	     '64': {in: [1,1,0], all: [0,1,0], check: ['radio&nodupp',0,0], label: ['2着軸','相手','--']},  // 2着ながし
	     // 3連複
             '80': {in: [1,1,1], all: [0,0,0], check: ['radio&nodupp','radio&nodupp','radio&nodupp'], label: ['車1','車2','車3']}, // 通常
             '81': {in: [1,1,1], all: [1,1,1], check: [0,0,0], label: ['車1','車2','車3']},   // フォーメーション
             '82': {in: [1,0,0], all: [1,0,0], check: [0,0,0], label: ['選択','--','--']},  // BOX
             '83': {in: [1,1,0], all: [0,1,0], check: ['radio&nodupp',0,0], label: ['軸','相手','--']},  // 軸1頭ながし
             '86': {in: [1,1,1], all: [0,0,1], check: ['radio&nodupp','radio&nodupp',0], label: ['軸1','軸2','相手']},   // 軸2頭ながし
	     // 3連単
             '90': {in: [1,1,1], all: [0,0,0], check: ['radio&nodupp','radio&nodupp','radio&nodupp'], label: ['1着 ','2着 ','3着']}, // 通常
             '91': {in: [1,1,1], all: [1,1,1], check: [0,0,0], label: ['1着 ','2着 ','3着']},   // フォーメーション
             '92': {in: [1,0,0], all: [1,0,0], check: [0,0,0], label: ['選択','--','--']}, // BOX
             '93': {in: [1,1,0], all: [0,1,0], check: ['radio&nodupp',0,0], label: ['1着軸','相手','--']},  // 1着ながし
             '94': {in: [1,1,0], all: [0,1,0], check: ['radio&nodupp',0,0], label: ['2着軸','相手','--']},  // 2着ながし
             '95': {in: [1,1,0], all: [0,1,0], check: ['radio&nodupp',0,0], label: ['3着軸','相手','--']},  // 3着ながし
             '96': {in: [1,1,1], all: [0,0,1], check: ['radio&nodupp','radio&nodupp'], label: ['1着軸','2着軸','相手']},   // 1,2着ながし
             '97': {in: [1,1,1], all: [0,0,1], check: ['radio&nodupp','radio&nodupp',0], label: ['1着軸','3着軸','相手']},   // 1,3着ながし
             '98': {in: [1,1,1], all: [0,0,1], check: ['radio&nodupp','radio&nodupp',0], label: ['2着軸','3着軸','相手']},   // 2,3着ながし
	     // 2枠単
	     '40': {in: [1,1,0], all: [0,0,0], check: ['radio&nodupp','radio&nodupp',0], label: ['1着','2着','--']}, // 通常
	     '41': {in: [1,1,0], all: [1,1,0], check: [0,0,0], label: ['1着','2着','--']},  // フォーメーション
	     '42': {in: [1,0,0], all: [1,0,0], check: [0,0,0], label: ['選択','--','--']}, // BOX
	     '43': {in: [1,1,0], all: [0,1,0], check: ['radio&nodupp',0,0], label: ['1着軸','相手','--']},  // 1着ながし
	     '44': {in: [1,1,0], all: [0,1,0], check: ['radio&nodupp',0,0], label: ['2着軸','相手','--']},  // 2着ながし

     };

     // 方式別チェック
     //  eq:1 １つのみ選択
     //  gt:1 １つ以上選択
     //  配列順は、軸に紐づく
     self.houshiki_check = {
	     // 単勝
	     '10': {chk: ['gt:1']}, // 通常
	     '11': {chk: ['gt:1']}, // 通常
	     '12': {chk: ['gt:1']}, // 通常
	     // 複勝
//	     '20': {chk: ['eq:1']}, // 通常
	     // 枠連
	     '30': {chk: ['eq:1','eq:1']}, // 通常
	     '31': {chk: ['gt:1','gt:1']}, // フォーメーション
	     '32': {chk: ['gt:1']}, // BOX
	     '33': {chk: ['eq:1','gt:1']}, // ながし
              // 2車複
	     '50': {chk: ['eq:1','eq:1']}, // 通常
	     '51': {chk: ['gt:1','gt:1']},  // フォーメーション
	     '52': {chk: ['gt:2']}, // BOX
	     '53': {chk: ['eq:1','gt:1']},  // ながし
	     // ワイド
             '70': {chk: ['eq:1','eq:1']}, // 通常
             '71': {chk: ['gt:1','gt:1']},  // フォーメーション
             '72': {chk: ['gt:2']}, // BOX
             '73': {chk: ['eq:1','gt:1']},  // ながし
	     // 2車単
	     '60': {chk: ['eq:1','eq:1']}, // 通常
	     '61': {chk: ['gt:1','gt:1']},  // フォーメーション
	     '62': {chk: ['gt:2']}, // BOX
	     '63': {chk: ['eq:1','gt:1']},  // 1着ながし
	     '64': {chk: ['eq:1','gt:1']},  // 2着ながし
	     // 3連複
             '80': {chk: ['eq:1','eq:1','eq:1']}, // 通常
             '81': {chk: ['gt:1','gt:1','gt:1']},   // フォーメーション
             '82': {chk: ['gt:3']},  // BOX
             '83': {chk: ['eq:1','gt:1']},  // 軸1頭ながし
             '86': {chk: ['eq:1','eq:1','gt:1']},   // 軸2頭ながし
	     // 3連単
             '90': {chk: ['eq:1','eq:1','eq:1']}, // 通常
             '91': {chk: ['gt:1','gt:1','gt:1']},   // フォーメーション
             '92': {chk: ['gt:3']}, // BOX
             '93': {chk: ['eq:1','gt:2']},  // 1着ながし
             '94': {chk: ['eq:1','gt:2']},  // 2着ながし
             '95': {chk: ['eq:1','gt:2']},  // 3着ながし
             '96': {chk: ['eq:1','eq:1','gt:1']},   // 1,2着ながし
             '97': {chk: ['eq:1','eq:1','gt:1']},   // 1,3着ながし
             '98': {chk: ['eq:1','eq:1','gt:1']},   // 2,3着ながし
	     // 枠単
	     '40': {chk: ['eq:1','eq:1']}, // 通常
	     '41': {chk: ['gt:1','gt:1']},  // フォーメーション
	     '42': {chk: ['gt:1']}, // BOX
	     '43': {chk: ['eq:1','gt:1']},  // 1着ながし
	     '44': {chk: ['eq:1','gt:1']},  // 2着ながし
     }

     // ボタン選択型 方式選択1
     self.houshiki_button1 = {
//	     '0': '通常',
	     '3': 'ながし',
	     '2': 'ボックス',
	     '1': 'フォーメーション',
     }
     // ボタン選択型 方式選択2
     self.houshiki_button2 = {
	     '6': { '3': '1着', '4': '2着' },
	     '8': { '3': '軸1', '6': '軸2' },
	     '9': { '3': '1着', '4': '2着','5': '3着','6': '1・2着', '7': '1・3着', '8': '2・3着' },
             '4': { '3': '1着', '4': '2着' },
     };

     // レース情報
     self.race_list = {}; // 出車表リスト
     self.cur_jyo_cd = ''; // 選択中の競車場
     //self.cur_jyo_name = ''; // 選択中の競車場名
     self.cur_race_id = ''; // 選択中のレースID
     self.cur_race = {}; // 選択中のレース情報

     //
     self.shikibetu = {}; // 式別(単勝,複勝,...)
     self.cur_shikibetu = 9; // 選択中の式別
     self.select_shikibetu = {}; // 選択中の式別(複数選択対応)
     self.disp_shikibetu = {}; // 表示用の式別(ソートされている)
     self.houshiki = {}; // 方式(通常,フォーメーション,...)
     self.cur_houshiki = -1; // 選択中の方式
     self.disply_houshiki_label = {'1': 'フォーメーション', '2': 'ボックス'};
     self.data_number = [];
     self.data_number_v = [];
     self.btn_func = [];
     self.btn_func_stat = {all: [0, 0, 0], mark: [0, 0, 0]};
     self.mulit_attr = false; // マルチ(表示する/しない)
     self.mulit = false; // マルチ on,off

     self.btn_uno = {}; // 車番ボタン(選択中はtrue,falseで表現)
     self.btn_uno_disable = {}; // 選択できない車番ボタン
     self.btn_waku = {}; // 枠番ボタン(選択中はtrue,falseで表現)
     self.btn_waku_disable = {}; // 選択できない枠番ボタン

     self.max_uma = 0; // 車番(最大頭数)
     self.max_waku = 0; // 枠番(最大頭数)

     // 投票
     self.bet_money = 100; // 金額
     //self.race = {}; // 投票中のレース情報
     self.race_horse = {}; // 出走車データ
     self.waku_horse = {}; // 枠番順の出走車配列
     self.waku_list = {}; // 車番→枠番変換用

     self.bet_view = []; // 買い目、投票内容表示
     self.bet_select = {}; // 買い目、
     self.bet_select_all = false; //
     self.bet_count = {}; // 現在の買い目点数
     self.bet_odds_list = {}; //フォーメーション、流しのオッズ一覧
     self.disply_bet_view = {}; //表示用(券種ごとにまとめる)
     self.disply_bet_order = [1,9,6,8,5,4,3,7]; //['3連単','2車単','3連複','2車複','2枠単','2枠複','ワイド'];   // 順番
     self.disply_bet_label = {'1':'単勝','9':'3連単','6':'2車単','8':'3連複','5':'2車複','4':'2枠単','3':'2枠複','7':'ワイド'};
     self.isam_domain = ''; // 'ipat'+YYMMDD(開催日)
     self.isam_domain_mark = 'umark_';
     self.is_tipstar_modal = false; //tipstar遷移案内フラグ
     self.is_cahrge = false;

     self.my_mark = {};
     self.my_mark_label = {'0':'--','1':'◎','2':'○','3':'▲','4':'△','5':'☆','6':'注','98':'✓','99':'消'};

     self.total_bet_money = 0;
     self.odds = {}; // オッズデータ
     self.ijyo_waku_list = {};
     self.ijyo_list = {};
     self.select_bet_odds = {}; //選択中のオッズ
     self.select_max_odds = {};
     self.select_min_odds = {};

     self.is_odds_open = {}; //買い目一覧のオッズ表示
     self.select_odds_sort_mode = 'asc';
     self.is_edit = false; //買い目一覧の削除モード
     self.select_kaime = {}; //買い目一覧の組み合わせ選択
     self.select_odds = {};
     self.odds_update_timer = false;
     self.is_charge = false;
     self.show_regist = false;
     self.iframe_url = '';
     self.ts_data = {};
     self.device = self.args.device ? self.args.device : 1;
     self.is_active_button = false;
     if (self.debug) console.log('is_active_button <- false');
     self.distribution_mode = 'bet';
     self.distribution_title = '';
     self.vote_mode = self.args.vote_mode;
     self.is_ekyc = false;
     self.point = 0;
     self.add_bet_item_event = false;
     self.bet_tutorial = false;

     self.on('update', function() {
         //	     console.error('self.update()');
     });
     self.on('updated', function() {
         //	     console.error('self.updated()');
     });


     // 下記、edit_xxxxx関数は、HTMLテンプレートのレンダリング時(riot=update)に動作する

     /*
      * 方式(通常、フォーメーション、BOX...)によるチェックボックス表示/非表示
      */
     edit_show_column(rix, mode)
     {
	     var id = sprintf("%1d%1d", self.cur_shikibetu, self.cur_houshiki);
	     if (undefined === self.houshiki_attr[id]) {
	         return false;
	     } else {
	         return self.houshiki_attr[id][mode][rix];
	     }
	     return false;
     }

     /*
      * 方式(通常、フォーメーション、BOX...)による、ラベル切り替え
      */
     edit_label(rix, shikibetu)
     {
         var id = sprintf("%1d%1d", shikibetu, self.cur_houshiki);
	     if (undefined === self.houshiki_attr[id]) {
	         return '--';
	     } else {
	         return self.houshiki_attr[id]['label'][rix];
	     }
     }

     //--------------------------------------------------
     edit_number_active(rix, uix)
     {
	     var id = sprintf("%1d%1d", self.cur_shikibetu, self.cur_houshiki);
	     if (undefined === self.houshiki_attr[id]) {
	         return false;
	     } else {
	         if (undefined === self.btn_uno[rix]) {
		         //		 console.log('edit_number_active(%s,%s) false(1)',rix,uix);
		         return false;
	         } else if (self.btn_uno[rix][uix]) {
		         //		 console.log('edit_number_active(%s,%s) true',rix,uix);
		         return true;
	         } else {
		         //		 console.log('edit_number_active(%s,%s) false(2)',rix,uix);
		         return false;
	         }
	     }
     }
     //--------------------------------------------------
     edit_number_disable(rix, uix)
     {
	     //	 console.log('edit_number_disable(%s,%s)',rix,uix);
	     if (undefined !== self.btn_uno_disable[rix] && self.btn_uno_disable[rix][uix]) {
	         return true;
	     } else {
	         return false;
	     }
     }

     //--------------------------------------------------
     edit_houshiki_button1_disable( h )
     {
	     var id = sprintf("%1d%1d", self.cur_shikibetu, h);
	     if(undefined !== self.houshiki_attr[id]){
	         return true;
	     }else{
	         return false;
	     }
     }

    //--------------------------------------------------
    // 2020/10/26 masahiro.tsuboi
    //     開発者スキルが低く、
    //     aタグをbootstrap無効化にする方法がうまくいかなかったので、直接styleに書いている。
    //--------------------------------------------------
    edit_shikibetsu_disable(shikibetsu)
    {
        var key = sprintf("bet_type%s_state", shikibetsu);
        if(self.cur_race[key] == '1'){
            return 'auto;';
        }else if(self.cur_race[key] == '0'){
            return 'none; color: #dbdbdb;';
        }else if(self.cur_race[key] == '9' || self.cur_race[key] == '' || self.cur_race[key] == null){
            //枠連、枠単はオッズで判定
            if(shikibetsu == 3 && Object.keys(self.odds['3']).length <= 0){
                return 'none; color: #dbdbdb;';
            }else if(shikibetsu == 4 && Object.keys(self.odds['4']).length <= 0){
                return 'none; color: #dbdbdb;';
            }else if(shikibetsu == 1 && self.cur_houshiki >= 3){
                return 'none; color: #dbdbdb;';
            }else{
                return 'auto;';
            }
        }
    }

    /*
        * 特定の順番にソートしてから、keyと値を反転させる
        *      ※どうやら、jsは数値文字列indexだけだと、ブラウザで勝手に数値の昇順にソートすると思われる。
    */
    disp_sorted_shikibetsu()
    {

        if (!self.shikibetu) return false;

        const order = ['3連単','2車単','3連複','2車複','2枠単','2枠複','ワイド','単勝'];   // 順番
        var sorted_shikibetsu = Object.entries(self.shikibetu).sort(function(a, b){ return order.indexOf(a[1]) - order.indexOf(b[1]) });
        var flip_shikibetsu = {};
        for (var [key, value] of sorted_shikibetsu) {
            flip_shikibetsu[value] = key;
        }

        return flip_shikibetsu;
     }

    //--------------------------------------------------
    edit_kaime_class(shikibetu)
    {
        if(4 == shikibetu || 6 == shikibetu || 9 == shikibetu){	// 枠単,2車単,３連単
            // 馬番の間(矢印)
            return 'Kaime_Arrow'
        }else{
            // 馬番の間(ハイフン)
            return 'Hyphen';
        }
    }

    //--------------------------------------------------
    edit_kaime_mark(mark, upper, shikibetu)
    {
        //if(shikibetu == 3 || shikibetu == 4){
        //    return '';
        //}
        var mark_list = {
             1: 'honmei',
             2: 'taikou',
             3: 'kurosan',
             4: 'shirosan',
             5: 'hoshi',
             98: 'check',
             99: 'keshi'
        }
        if(mark_list[mark]){
            if(upper){
                return mark_list[mark].substring(0, 1).toUpperCase() + mark_list[mark].substring(1);
            }else{
                return mark_list[mark];
            }
        }else{
            return '';
        }
    }

    edit_select_count()
    {
        var count = 0;
        if(Object.keys(self.select_odds).length >= 1){
            count = Object.keys(self.select_odds).length;
        }
        if(self.select_kaime){
            for(var shikibetu in self.select_kaime){
                if(self.select_kaime[shikibetu] == true){
                    count++;
                }
            }
        }
        return count;
    }

    edit_bet_count(bet_count)
    {
        if(!bet_count){
            return 0;
        }else{
            var count = 0;
            for(var shikibetu in bet_count){
                count += bet_count[shikibetu];
            }
            return count;
        }
    }

     /*
      * チェックボックス or ラジオボタン
      */
    edit_show_input_type(rix)
    {
        var id = sprintf("%1d%1d", self.cur_shikibetu, self.cur_houshiki);
        if (undefined === self.houshiki_attr[id]) {
            return 'checkbox';
        }
        if(/^radio/. test(self.houshiki_attr[id]['check'][rix])){
            return 'radio';
        }
        else {
            return 'checkbox';
        }
    }

    check_column(rix, mode)
    {
        var id = sprintf("%1d%1d", self.cur_shikibetu, self.cur_houshiki);
        if (undefined === self.houshiki_attr[id]) {
            return 0;
        } else {
            var count_column
            count_column = self.houshiki_attr[id][mode].filter(function(int){
                if(int >= 1){
                    return true;
                }
            });
            return count_column.length;
        }
    }

    check_active_num()
    {
        console.log('check_active_numcheck_active_numcheck_active_numcheck_active_num');
        console.log(self.btn_uno);
        for(var i in self.btn_uno){
            if(Object.keys(self.btn_uno[i]).length > 0){
                return true;
            }
        }
        return false;
    }

    /*
      * 画面初期化(mount)
      */
     self.on('mount', function() {
	     if (self.debug)  console.log('mount %s', self.args.tag_name);
	     self.args.obs.trigger('tag_mounted', {tag: self.args.tag_name});
     });

    shared_obs.on('tipstar_send_flg', function(e) {
        console.log('tipstar_send_flg : ', e);
        if(e == 'true'){
            self.is_active_button = true;
        }else if(e == 'false'){
            self.is_active_button = false;
            console.log('is_active_button <- false');
        }
        self.update();
    });

    shared_obs.on('change_vote_mode', function(e) {
        console.log('change_vote_mode : ', e);
        self.vote_mode = e;
        self.update();
    });

     /*
      * 画面表示(parent -> trigger -> render_xxxx)
      */
     self.args.obs.on('render_' + self.args.tag_name, function(p) {
	     if (self.debug) console.log('render_%s start p: %O', self.args.tag_name, p);
	    self.param = p;

        self.add_bet_item_event = false;
        // 投票シートでは並び予想を表示
         self.args.obs.trigger('narabi_show_event', 'show');
        var ndisam = new NDIsam();
        var list = ndisam.list('bet_tutorial');
        // pist6はチュートリアルを表示させない
        if(false === list && p['race_id'] !== undefined && p['race_id'].substr(8, 2) != '91'){
            // チュートリアルは初回のみ表示(見たかの状態はローカルストレージに保持)
            self.bet_tutorial = true;
            ndisam.replace('bet_tutorial', 'show_bet_tutorial', 1);
        }

	     // 各種、初期化
	     self.race_list = {}; // 出車表リスト
	     self.cur_jyo_cd = ''; // 選択中の競車場
	     //self.cur_jyo_name = ''; // 選択中の競車場名
	     self.cur_race_id = ''; // 選択中のレースID
	     self.cur_race = {}; // 選択中のレース情報
	     self.cur_shikibetu = 9; // 選択中の式別
	     self.cur_houshiki = -1; // 選択中の方式
	     self.bet_view = [];
	     self.active_syaban = []; //選択可能車番
	     self.active_wakuban = []; //選択可能枠番
	     self.event_id = 'no_set';
	     var event_id_list = {
	         'race' : true,
	         'bet_btn' : true,
	         'odds' : true,
	         'myodds' : true
	     };
	     if(event_id_list[p['rf']]){
	     	self.event_id = p['rf'];
	     }
         //オッズのアップデート停止
         if(self.odds_update_timer){
         	console.log('clearInterval');
             clearInterval(self.odds_update_timer);
         }

	     self.show_data(p);
     });

     // 行・列変換
     var transpose = function(a) {
	     return Object.keys(a[0]).map(function(c) {
	         return a.map(function(r) {
		         return r[c];
	         });
	     });
     }

     /*
      * データ取得、編集
      *  URLパラメータ date   : 日時(必須)
      *                race_id: レースID(省略可)
      *                         レースID指定時は、競車場、 レース番号が選択状態
      *                         レースID省略時は、競車場、 レース番号が未選択状態
      */
     self.show_data = function(p) {
	     if (self.debug) console.log('self.show_data');

	     if (self.debug) console.log('is_active_button <- false');
         self.is_active_button = false;
	     self.kaisai_mode = 'keirin';
	     if(p['race_id'] !== undefined && p['race_id'].substr(8, 2) == '91'){
	         self.kaisai_mode = 'pist6';
	     }

	     var ipat = new IpatDataModel();
	     self.shikibetu = ipat.get_shikibetu();
         if(self.kaisai_mode == 'keirin'){
             //単勝削除
             delete self.shikibetu[1];
         }else{
             //pist6の時は枠系削除
             delete self.shikibetu[3];
             delete self.shikibetu[4];
         }
         self.disp_shikibetu = self.disp_sorted_shikibetsu();

        // 全選択・クリア、印で選択を初期化
        self.select_shikibetu = {};
        //self.select_shikibetu[self.cur_shikibetu] = true;
        self.btn_func_stat = {all: [0, 0, 0], mark: [0, 0, 0]};
        self.btn_uno = {};
        self.btn_waku = {};
        self.select_bet_odds = {};
        self.select_kaime = {};
        self.select_odds = {};

	     var tmp_h = ipat.get_houshiki();
	     self.houshiki = {};
	     for (var key in tmp_h) {
	         var s = key.substr(0, 1);
	         var h = key.substr(1, 1);
	         if (undefined === self.houshiki[s]) {
		         self.houshiki[s] = {};
	         }
	         self.houshiki[s][h] = tmp_h[key];
	     }

	     var api = new AplApiRace(self.args.api_url, true, 'json'/*, true*/);

	     var year = '';
	     if (undefined !== p['date']) {
	         year = p['date'].substr(0, 4);
	     } else {
	         console.error("empty parameter 'date'");
	         return false;
	     }
	     var date = p['date'];

	     self.isam_domain = sprintf("bet_%s", p['race_id']);
	     if (self.debug) console.log('self.isam_domain: %s', self.isam_domain);

         // レース一覧を取得
         api.get('AplRace', {'kaisai_date': date, 'syusai': 'all'}, function(ary_race) {
//         api.get('AplRace', {'kaisai_date': date, 'syusai': self.kaisai_mode}, function(ary_race) {
	         var selected_race = {};
	         for (var i = 0; i < ary_race.length; i++) {
	             self.race_list[ary_race[i].jyo_cd] = ary_race[i].list;

	             if (undefined !== p['race_id']) {
		             for (var idx in ary_race[i].list) {
		                 var row = ary_race[i].list[idx];
		                 if (row['race_id'] == p['race_id']) {
			                 selected_race = row;
		                 }
		             }
	             }
	         }
	         if (self.debug) console.log('self.race_list: %O', self.race_list);

	         if (undefined !== p['race_id']) {
	             // race_id 指定あり、選択状態を再現
	             if (self.debug) console.log('selected_race: %O', selected_race);

	             // 競車場
	             self.act_jyo(selected_race['jyo_cd'], selected_race['jyo']);
	             // レース番号
	             self.act_race(selected_race['race_id'], selected_race['race_name'], selected_race['jyoken']);
	         } else {
	             self.update();
                 //self.args.obs.trigger('render_comp');
	         }
         });

     }

     /*
      * 印を取得(local stolage)
      */
    self.get_shutuba_mark = function(race_id, fn) {
        if (self.debug) console.log('self.get_shutuba_mark(%s)', race_id);

        var cart = new NDCartApi(self.args.cart_url, 'json');
        var group_id = sprintf("SensyuMark_%s", race_id);

        // リスト取得
        cart.get_item_list(group_id, function(data) {
            if ('OK' == data.status) {
            var mark = {};
            // 出馬表の印は、馬番でなく通番
            for (var seq in data.data) {
                var val = data.data[seq]['_cd'].split(/_/);
                if ('0' == val[1])
                continue; // 印を消してもカートに存在
                mark[seq] = val[1];
            }
            self.my_mark = mark;
            if (self.debug) console.log('self.my_mark: %O', self.my_mark);
                    if(undefined !== fn){
                        fn();
                    }
            }
        });

     }

     /*
      * レースデータ切替え
      */
     self.change_race_horse = function(race_id, fn) {
	     if (self.debug) console.log('self.change_race_horse(%s)', race_id);

	     var api = new AplApiRace(self.args.api_url, true, 'json'/*, true*/);

	     // 出走車情報取得
	     api.get('AplRaceHorse', {'race_id': race_id}, function(data) {
                 if (self.debug) console.log('=============AplRaceHorse=============');
                 if (self.debug) console.log(data);
             var rh = {};
	         for (var i = 0; i < data.length; i++) {
		         if ('' == data[i]['syaban']) {
		             alert('出車表に車番がない');
		         }
		         rh[data[i]['syaban']] = data[i];
	         }
	         self.race_horse = rh;
	         if (self.debug) console.log('self.race_horse: %O', self.race_horse);

	         var ary_waku = {};
	         var tmp_active_waku_list = {};
	         for (var u in self.race_horse) {
		         var w = self.race_horse[u]['wakuban'];
		         if (undefined === ary_waku[w]) {
		             ary_waku[w] = {};
		         }
		         ary_waku[w][self.race_horse[u]['syaban']] = {
//		             seq: self.race_horse[u]['seq'],
		             syaban: self.race_horse[u]['syaban'],
		             name: self.race_horse[u]['name'],
		             sales_sts: self.race_horse[u]['sales_sts'],
		             fuken: self.race_horse[u]['fuken'],
		             age: self.race_horse[u]['age'],
		             graduate: self.race_horse[u]['graduate'],
		             kyu: self.race_horse[u]['kyu'],
		             han: self.race_horse[u]['han'],
		             rating: self.race_horse[u]['rating']
		         };
		         if(self.race_horse[u]['sales_sts'] == '1' || self.race_horse[u]['sales_sts'] == '3'){
		             self.ijyo_list[self.race_horse[u]['syaban']] = true;
                     if(self.ijyo_waku_list[w] === undefined){
                         self.ijyo_waku_list[w] = {};
                     }
                     self.ijyo_waku_list[w][self.race_horse[u]['syaban']] = true;
		         }else{
		             self.active_syaban.push(self.race_horse[u]['syaban']);
		             tmp_active_waku_list[w] = true;
		         }
		         self.waku_list[self.race_horse[u]['syaban']] = w;
	         }
		     self.active_wakuban = Object.keys(tmp_active_waku_list);

	         self.waku_horse = ary_waku;

	         // 最大車番を求める
	         self.max_waku = Object.keys(self.waku_horse).length;
	         if(self.debug) console.log('self.max_waku: %s',self.max_waku);

	         if (self.debug) console.log('self.waku_horse: %O', self.waku_horse);
	         fn();
	     });
     }

     /*
      * 車番ボタンリセット
      *  line: 対象となる行 (-1は、全て)
      */
     self.reset_uno = function(line, mode) {
	     if (self.debug) console.log('self.reset_uno(%s,%s)', line, mode);

	     //self.btn_uno = {};
	     for (var i = 0; i < 3; i++) {
	         if (line < 0 || (line >= 0 && i == line)) {
		         self.btn_uno_disable[i] = {};
	         }
	         for (var j = 0; j <= self.max_uma; j++) {
		         if (1 == mode) {
		             // 1: 全てをenable
		             self.btn_uno_disable[i][j] = false;
		         } else {
		             // 0: 全てをdiasble
		             self.btn_uno_disable[i][j] = true;
		         }
	         }
	     }
     }

     /*
      * 競車場選択
      */
     self.act_jyo = function(jyo_cd, jyo_name) {
	     if (self.debug) console.log('self.act_jyo(%s,%s)', jyo_cd, jyo_name);

	     self.cur_jyo_cd = jyo_cd;
	     //self.cur_jyo_name = jyo_name;

	     self.cur_race_id = ''; // レース選択クリア
     }

     /*
      * レース番号選択
      */
     self.act_race = function(race_id, race_name, jyoken, ev) {
	     if (self.debug) console.log('self.act_race(%s,%s,%s)', race_id, race_name, jyoken);

	     if (undefined !== ev) {
	         console.log('self.act_race :%O', ev);
	     }

	     if (undefined !== ev)
	         ev.preventUpdate = true;

	     // !! ここ重要 メニュー選択した段階では、riot update()しない 出走車データ取得(非同期)が完了してから、ev.preventUpdate = false でriot update()する でないと配列(self.race_horse)が完成していないので、不定となる。

	     self.cur_shikibetu = -1; // 式別クリア
	     self.cur_houshiki = -1; // 方式クリア

	     self.cur_race_id = race_id;

	     for (var key in self.race_list[self.cur_jyo_cd]) {
	         var row = self.race_list[self.cur_jyo_cd][key];
	         if (race_id == row['race_id']) {
		         self.cur_race = self.race_list[self.cur_jyo_cd][key];
	         }
	     }

	     self.max_uma = self.cur_race['tosu'];
        if(self.cur_race['jyo_cd'] >= '90'){
            self.max_uma = Object.keys(self.race_horse).length;
        }

         //         console.error('self.cur_race',self.cur_race);
         //         console.error('self.max_uma',self.max_uma);

	     self.data_number = []; // 車番作成
	     for (var i = 0; i < 3; i++) {
	         self.data_number[i] = [];
	         for (var j = 1; j <= self.max_uma; j++) {
		         self.data_number[i][j] = true;
	         }
	     }
	     self.data_number_v = transpose(self.data_number);

	     if (self.debug) console.log('self.cur_race: %O', self.cur_race);
	     if (self.debug) console.log('self.max_uma: %s', self.max_uma);

	     var ipat = new IpatDataModel();
	     self.shikibetu = ipat.get_shikibetu();
         if(self.kaisai_mode == 'keirin'){
             //単勝削除
             delete self.shikibetu[1];
         }else{
             //pist6の時は枠系削除
             delete self.shikibetu[3];
             delete self.shikibetu[4];
         }
         self.disp_shikibetu = self.disp_sorted_shikibetsu();
	     self.change_race_horse(race_id, function() {
         if (undefined !== ev)
	         ev.preventUpdate = false;

	         var api = new AplApiRace(self.args.api_url, true, 'json'/*, true*/);

	         // オッズ取得
	         api.get('AplRaceOdds', {'race_id': race_id}, function(odds_data) {
                     if (self.debug) console.log('=============AplRaceOdds=============');
                     if (self.debug) console.log(odds_data);

		         for (var i = 1; i <= 9; i++) {
		             self.odds[i] = {};
		             if (undefined === odds_data['list_' + i]) {
			             continue;
		             }
		             for(var j = 0; j < odds_data['list_' + i].length; j++) {
			             var oval = odds_data['list_' + i][j];
			             self.odds[i][oval[0]] = [oval[1], oval[2], oval[3]];
		             }
		         }

		         //	     console.error('self.odds: %O',self.odds);
		         if (self.debug) console.log('self.odds: %O', self.odds);
		         self.render_bet_list();
                 // フッターの状態更新update_tags
                 self.args.obs.trigger('update_tag', {'update_tag_name': 'footer_fixed'}, query);

                 self.get_shutuba_mark(self.cur_race_id, function(){
                    //初期表示を3連単デフォルトにする
                    self.act_shikibetu(9);
                    //ボタンを有効にする(html上は無効)
                    self.is_active_button = true;
            	    if (self.debug) console.log('is_active_button <- true');
                    self.update();
                    //render完了の通知をnarabi_yosoに通知(ipat_sp_v2 → editor.html → narabi_yoso)
                    //self.args.obs.trigger('ipat_sp_render_comp');
                    self.list_mark_check();
                 });
	         });
	     });
     }

     /*
      * 式別選択
      */
     self.act_shikibetu = function(sno, ev) {
	     if (self.debug) console.log('self.act_shikibetu(%s)', sno);

//	     self.select_shikibetu = sno;
         self.cur_shikibetu = sno;
	     if(!self.select_shikibetu[sno]){
	         self.cur_shikibetu = sno;
	         self.select_shikibetu[sno] = true;
	     }else if(ev !== undefined){
	         delete self.select_shikibetu[sno];
	         //self.act_odds_open(sno);
	     }

	     //if('3' == sno || '4' == sno){
	     //    self.max_uma = self.max_waku;
	     //}else{
	     //    self.max_uma = self.cur_race['tosu'];
	     //}
	     self.max_uma = self.cur_race['tosu'];
        if(self.cur_race['jyo_cd'] >= '90'){
            self.max_uma = Object.keys(self.race_horse).length;
        }

	     //	     console.error('self.max_uma: %s',self.max_uma);
	     self.data_number = []; // 車番(枠番)作成
	     for (var i = 0; i < 3; i++) {
	         self.data_number[i] = [];
	         for (var j = 1; j <= self.max_uma; j++) {
		         self.data_number[i][j] = true;
	         }
	     }
	     self.data_number_v = transpose(self.data_number);
	     self.btn_func = [0, 1, 2];

	     self.reset_uno(-1, 0); // 車番ボタンリセット
	     self.bet_select = {}; // 選択中の投票内容
	     //self.btn_func_stat = {
	     //    all: [0, 0, 0],
	     //    mark: [0, 0, 0]
	     //};

	     // 全選択・クリア、印で選択初期化
	     self.bet_money = 100; // 金額クリア
	     self.bet_count = {}; // 買い目点数

	     self.multi_attr = false;
	     self.multi = false;

	     var select_houshiki = self.cur_houshiki > 0 ? self.cur_houshiki : 1;// デフォルトは、通常が選択された状態
	     if(self.cur_houshiki >= 4){
	         select_houshiki = 3;
	     }

	     self.act_houshiki(select_houshiki);
	     self.act_houshiki_1(select_houshiki);
     }

     /*
      * 方式選択(ボタンタイプ、ラッパー)
      */
     self.act_houshiki_1 = function(hno1) {
	     if(self.debug) console.log('self.act_houshiki_1(%s)', hno1);
	     self.cur_houshiki_1 = hno1;
	     self.act_houshiki(hno1);

	     //制作
	     self.list_mark_check();
     }

    /*
     * 方式選択
     */
    self.act_houshiki = function(hno) {
        if (self.debug) console.log('self.act_houshiki(%s)', hno);

        self.select_kaime = {};
        // 全選択・クリア、印で選択を初期化
//        self.btn_func_stat = {all: [0, 0, 0], mark: [0, 0, 0]};
        self.bet_count = {}; // 買い目点数クリア
        self.bet_money = 100; // 金額クリア
        self.multi = false;  // マルチクリア
//        self.cur_houshiki = hno;
        self.max_uma = self.cur_race['tosu'];
        if(self.cur_race['jyo_cd'] >= '90'){
            self.max_uma = Object.keys(self.race_horse).length;
        }

        if(Object.keys(self.select_shikibetu).length <= 1){
            self.select_odds = {};
        }

        //流し選択時は初期化
        if(hno >= 3){
            // 全選択・クリア、印で選択を初期化
            self.select_shikibetu = {};
            self.select_shikibetu[self.cur_shikibetu] = true;
            //if('3' == self.cur_shikibetu || '4' == self.cur_shikibetu){
            //    self.max_uma = self.max_waku;
            //}

            self.btn_func_stat = {all: [0, 0, 0], mark: [0, 0, 0]};
            self.btn_uno = {};
            self.btn_waku = {};
            self.select_bet_odds = {};
            self.select_kaime = {};
            self.select_odds = {};
        }else{
            self.cur_shikibetu = 9;
            if(self.cur_houshiki >= 3){
                //ながしからフォーメーション・ボックスを選んだら選手の選択を初期化
                self.btn_uno = {};
                self.btn_waku = {};
            }

            if(self.select_shikibetu[9]){
                self.cur_shikibetu = 9;
            }else if(self.select_shikibetu[8]){
                self.cur_shikibetu = 8;
            }else if(self.select_shikibetu[6]){
                self.cur_shikibetu = 6;
            }else if(self.select_shikibetu[7]){
                self.cur_shikibetu = 7;
            }else if(self.select_shikibetu[5]){
                self.cur_shikibetu = 5;
            }else if(self.select_shikibetu[4]){
                self.cur_shikibetu = 4;
            }else if(self.select_shikibetu[3]){
                self.cur_shikibetu = 3;
            }else if(self.select_shikibetu[1]){
                self.cur_shikibetu = 1;
            }

        }

        self.cur_houshiki = hno;

        self.data_number = []; // 車番(枠番)作成
        for (var i = 0; i < 3; i++) {
            self.data_number[i] = [];
            for (var j = 1; j <= self.max_uma; j++) {
                self.data_number[i][j] = true;
            }
        }
        self.data_number_v = transpose(self.data_number);


        // マルチが選択不可な場合は、非表示
        if (('6' == self.cur_shikibetu && ('3' == self.cur_houshiki || '4' == self.cur_houshiki))
            || ('9' == self.cur_shikibetu && ('3' == self.cur_houshiki || '4' == self.cur_houshiki || '5' == self.cur_houshiki || '6' == self.cur_houshiki || '7' == self.cur_houshiki || '8' == self.cur_houshiki))
                || ('4' == self.cur_shikibetu && ('3' == self.cur_houshiki || '4' == self.cur_houshiki))
            ) {
            self.multi_attr = true;
        } else {
            self.multi_attr = false;
        }

        // 車番ボタンをenable
        var ary_i = self.houshiki_attr[sprintf("%1d%1d", self.cur_shikibetu, self.cur_houshiki)]['in'];
        for (var i = 0; i < 3; i++) {
            for (var j = 1; j <= self.max_uma; j++) {
                if (ary_i[i]) {
                    self.btn_uno_disable[i][j] = false; // 入力可
                } else {
                    self.btn_uno_disable[i][j] = true; // 入力不可
                }
            }
        }

        // 点数を表示するため組合せを生成
        for(var shikibetu in self.select_shikibetu){
            var info = self.make_bet(100, shikibetu);
            if(info < 0){
                self.bet_count[shikibetu] = 0;
                self.select_bet_odds[shikibetu] = {};
                self.select_kaime[shikibetu] = {};
                if(Object.keys(self.select_odds).length >= 1){
                    for(var kaime in self.select_odds){
                        if(self.select_odds[kaime] == shikibetu){
                            delete self.select_odds[kaime];
                        }
                    }
                }
            }else{
                self.bet_count[shikibetu] = info['bet_count'];
                //選択中のオッズ一覧
                var ret = self.make_select_bet_odds(info, shikibetu);
                self.select_bet_odds[shikibetu] = ret['odds_list'];
                self.select_max_odds[shikibetu] = ret['max_odds'];
                self.select_min_odds[shikibetu] = ret['min_odds'];
                var select_odds_flg = false;
                if(Object.keys(self.select_odds).length >= 1){
                    for(var kaime in self.select_odds){
                        if(self.select_odds[kaime] == shikibetu){
                            select_odds_flg = true;
                            break;
                        }
                    }
                }
                if(!select_odds_flg){
                    self.select_kaime[shikibetu] = true;
                }
            }
        }

    }

    /*
     * 車番号選択
     */
    self.act_number = function(rix, uix, ev) {
        if (self.debug) console.log('self.act_number(%s,%s)', rix, uix);
        self.add_bet_item_event = false;

        if (undefined === self.btn_uno[rix]) {
            self.btn_uno[rix] = {};
        }

        // 選択->未選択(削除)、未選択->選択(追加)
        if (true == self.btn_uno[rix][uix]) {
            delete self.btn_uno[rix][uix];
        } else {
            self.btn_uno[rix][uix] = true;
        }

        var id = sprintf("%1d%1d", self.cur_shikibetu, self.cur_houshiki);
        var select_waku = self.waku_list[uix];
        //if(id == 33 || id == 43 || id == 44){
        //    //枠連ながし(33),枠単1着軸ながし(43),枠単2着軸ながし(44)
        //    select_waku = uix;
        //}

        if (undefined === self.btn_waku[rix]) {
            self.btn_waku[rix] = {};
        }

        // 選択->未選択(削除)、未選択->選択(追加)
        if (true == self.btn_waku[rix][select_waku]) {
            if(Object.keys(self.waku_horse[select_waku]).length <= 1){
                delete self.btn_waku[rix][select_waku];
            }else{
                //複数枠の時
                var waku_list = self.waku_horse[select_waku];
                var del = true;
                for(var select_syaban in self.btn_uno[rix]){
                    if(waku_list[select_syaban]){
                        del = false;
                        break;
                    }
                }
                if(del){
                    delete self.btn_waku[rix][select_waku];
                }
            }
        } else {
            self.btn_waku[rix][select_waku] = true;
        }

        var select_btn_list = [];
        for(var syaban in self.btn_uno[rix]){
            if(self.btn_uno[rix][syaban]){
                select_btn_list.push(syaban);
            }
        }

        if(id == 33 || id == 43 || id == 44){
            //枠連ながし(33),枠単1着軸ながし(43),枠単2着軸ながし(44)
            var waku_mark = self.make_waku_mark();
            var my_mark_waku = [];
            for(var syaban in waku_mark){
                if(waku_mark[syaban] == 1){
                    my_mark_waku.push(syaban)
                }
            }
            var tmp_my_mark = my_mark_waku.join();
            var active_btn = self.active_wakuban.join();
        }else{
            var tmp_my_mark = Object.keys(self.my_mark).join();
            var active_btn = self.active_syaban.join();
        }
        var select_btn = select_btn_list.join();

        //印のチェックボックス確認
        if(tmp_my_mark != '' && tmp_my_mark == select_btn){
            self.btn_func_stat['mark'][rix] = 1;
        }else{
            self.btn_func_stat['mark'][rix] = 0;
        }

        //全のチェックボックス確認
        if(active_btn == select_btn){
            self.btn_func_stat['all'][rix] = 1;
            self.btn_func_stat['mark'][rix] = 0;
        }else{
            self.btn_func_stat['all'][rix] = 0;
        }

        //枠系の取り消し対応
        if(self.cur_shikibetu == '3' || self.cur_shikibetu == '4'){
            if(self.ijyo_waku_list[uix]){
                if(rix == 0){
                    self.btn_uno_disable[rix + 1][uix] = true;
                }else if(rix == 1){
                    self.btn_uno_disable[rix - 1][uix] = true;
                }
                //初期化
                if(!self.btn_uno[rix][uix]){
                    if(rix == 0){
                        self.btn_uno_disable[rix + 1][uix] = false;
                    }else if(rix == 1){
                        self.btn_uno_disable[rix - 1][uix] = false;
                    }
                    self.btn_uno_disable[rix][uix] = false;
                }
            }
        }

	     var id = sprintf("%1d%1d", self.cur_shikibetu, self.cur_houshiki);
	     if (undefined === self.houshiki_attr[id]['check']) {
	         return;
	     }

	     // 点数を表示するため組合せを生成
	     for(var shikibetu in self.select_shikibetu){
	         var info = self.make_bet(100, shikibetu);
	         if(info < 0){
	             self.bet_count[shikibetu] = 0;
	             self.select_bet_odds[shikibetu] = {};
	             self.select_kaime[shikibetu] = {};
	         }else{
	             self.bet_count[shikibetu] = info['bet_count'];
	             //選択中のオッズ一覧
	             var ret = self.make_select_bet_odds(info, shikibetu);
	             self.select_bet_odds[shikibetu] = ret['odds_list'];
	             self.select_max_odds[shikibetu] = ret['max_odds'];
	             self.select_min_odds[shikibetu] = ret['min_odds'];
                 var select_odds_flg = false;
                 if(Object.keys(self.select_odds).length >= 1){
                     for(var kaime in self.select_odds){
                         if(self.select_odds[kaime] == shikibetu){
                             select_odds_flg = true;
                             break;
                         }
                     }
                 }
                 if(!select_odds_flg){
                     self.select_kaime[shikibetu] = true;
                 }
	         }
	     }

	     if(Object.keys(self.select_odds).length >= 1){
	     	self.select_kaime = {};
	     }

	     var rule = self.houshiki_attr[id]['check'][rix];
	     if (!rule) {
	         return;
	     }

	     var func = [];
	     if (rule.match(/&/)) {
	         func = rule.split(/&/);
	     } else {
	         func.push(rule);
	     }

	     for (var f = 0; f < func.length; f++) {
	         if (func[f].match(/max:/)) {
		         var val = func[f].split(/:/);
		         self.max_uno(rix, uix, val[1]);
	         }
	         if ('radio' == func[f]) {
		         self.radio_uno(rix, uix);
	         }
	         if ('nodupp' == func[f]) {
		         self.nodupp_uno(rix, uix);
	         }
	     }
    }

     //------------------------------------------------------------
     self.make_bet = function( bet_money, shikibetu, odds_flg = false )
     {
	     if(self.debug) console.log('self.make_bet(%s)',bet_money);

	     if (bet_money < 0) {
	         // 金額が未入力、あるいは正しくありません
	         return -1;
	     }
	     var btn_uno = self.btn_uno;
	     if(!odds_flg && (shikibetu == 3 || shikibetu == 4)){
	         btn_uno = self.btn_waku;
	     }

	     var ukey = Object.keys(btn_uno);
	     if(ukey.length < 1){
	         //	車番が正しく、選択されていません(未選択)
	         return -2;
	     }

	     if(shikibetu <= 0){
	     	return -2;
	     }

	     var err = self.check_umaban_selection(shikibetu);
	     if (err) {
	         //	車番が正しく、選択されていません
	         return -2;
	     }

	     var kaime = [];
	     var kaime_id = '';

	     // 選択中の車番ボタンから買い目を作成

	     for (var i in btn_uno) {
            if(i == 2 && shikibetu != 9 && shikibetu != 8){
                continue;
            }
            if(self.cur_houshiki == '2' && i > 0){
                //ボックスの時は1列目のみで買い目作成
                continue;
            }
	         var row = btn_uno[i];
	         var k = [];
	         for (var uno in row) {
		         if (true == row[uno]) {
		             k.push(uno);
		         }
	         }
	         if (k.length < 1) {

	         } else if (k.length > 1) {
		         if ('0' == self.cur_houshiki) {
		             kaime.push(k.join('_'));
		         } else {
		             kaime.push(k.join('-'));
		         }
	         } else {
		         kaime.push(k);
	         }
	     }
	     if('3' == shikibetu && '0' == self.cur_houshiki){
	         var w_chk = {};
	         for (var w in self.waku_horse) {
		         var num = Object.keys(self.waku_horse[w]).length;
		         if (num > 1) {
		             w_chk[w] = true;
		         }
	         }
	         var w1 = kaime[0][0] || 0;
	         var w2 = kaime[1][0] || 0;
	         //	     console.error('w_chk: ',w_chk);
	         //	     console.error('w1: %s w2: %s',w1,w2);
	         if(w1 == w2){
		         if(! w_chk[w1] || ! w_chk[w2]){
		             return -2;
		         }
	         }
	     }
        if(kaime.length < 1){
            // 車番が正しく、選択されていません(未選択)
            return -2;
        }
	     if (kaime.length > 1) {
	         kaime_id = kaime.join('_');
	     } else {
	         kaime_id = kaime.join('');
	     }


        //単複多点買対応(単複で買目が複数ある場合はkaime_id作り直し)
        var tanpuku_multi = [];
        if(kaime[0].length > 1){
            tanpuku_multi = kaime_id.split(',');
        }

	     // 17.12.3 枠連、３連複の通常買いが車番の昇順でない件
	     if( ('3' == shikibetu || '7' == self.cur_shikibetu)
	      && '0' == self.cur_houshiki ){
	         var val = kaime_id.split(/_/);
	         val.sort(function(a,b){
		         if( parseInt(a) < parseInt(b) ) return -1;
		         if( parseInt(a) > parseInt(b) ) return 1;
		         return 0;
	         });
	         kaime_id = val.join('_');
	         //	     console.error('kaime_id: %O',kaime_id);
	     }

	     // マルチ
	     if (self.multi) {
	         kaime_id += '_1';
	     }
	     if (self.debug) console.log('kaime: %O kaime_id: %s', kaime, kaime_id);

	     // 買い目コード作成
	     var year = self.cur_race_id.substr(0, 4);
	     var month = self.cur_race_id.substr(4, 2);
	     var day = self.cur_race_id.substr(6, 2);
	     var date = new Date(year, month - 1 , day);
	     var youbi_cd = date.getDay();
	     var jyo_cd = self.cur_race_id.substr(8, 2);

	     var race_no = parseInt(self.cur_race_id.substr(10, 2));
	     var houshiki = self.cur_houshiki;
	     //if(shikibetu == 1){
	     //	//単勝選択時は通常扱いにする
	     //	houshiki = 0;
	     //}
	     var bet_id = sprintf("a%1s-%1s-%1s_b%1s_c%s_%s", youbi_cd, jyo_cd, race_no, shikibetu, houshiki, kaime_id);
	     var bet_info =  self.bet_gen(bet_id, bet_money);
         console.log('bet_info: %O', bet_info);
         if(bet_info.comb != null && bet_info.comb.length == 1){
            // combの組み合わせから新しい買い目ID作成
            var split_comb = bet_info.comb[0].split('-');
            var temp_comb = split_comb.map(item => item.replace(/^0/, ''));
            var new_kaime_id = temp_comb.join('_');
            // 買い目が1件の時は通常に作り替える
            var bet_id = sprintf("a%1s-%1s-%1s_b%1s_c%s_%s", youbi_cd, jyo_cd, race_no, shikibetu, '0', new_kaime_id);
            var bet_info =  self.bet_gen(bet_id, bet_money);
         }
	     bet_info['open'] = 0;
	     return bet_info;
     }

     /*
      * 車番号選択  全選択・全解除('all'),印で選択('mark')
      */
     self.act_ext_func = function(mode, rix) {
	     if (self.debug) console.log('self.act_ext_func(%s,%s)', mode, rix);
         self.add_bet_item_event = false;

         var id = sprintf("%1d%1d", self.cur_shikibetu, self.cur_houshiki);
	     if ('all' == mode) {
	         // 全てを選択・クリア
	         for (var j = 1; j <= self.max_uma; j++) {
		         if (self.btn_uno_disable[rix][j])
		             continue;
		         if(self.ijyo_list[j]){
		         	continue
		         };

                 var select_waku = self.waku_list[j];
                 //if(id == 33 || id == 43 || id == 44){
                 //    //枠連ながし(33),枠単1着軸ながし(43),枠単2着軸ながし(44)
                 //    select_waku = j;
                 //}

		         if (undefined === self.btn_uno[rix]) {
		             self.btn_uno[rix] = {};
		             self.btn_waku[rix] = {};
		         }
		         if (0 == self.btn_func_stat['all'][rix]) {
		             self.btn_uno[rix][j] = 1;
		             self.btn_waku[rix][select_waku] = 1;
		         } else {
		             self.btn_uno[rix][j] = 0;
		             delete self.btn_waku[rix][select_waku];
		         }
	         }
	         // 全選択ボタンの状態
	         if (0 == self.btn_func_stat['all'][rix]) {
		         self.btn_func_stat['all'][rix] = 1;
		         self.btn_func_stat['mark'][rix] = 0;
	         } else {
		         self.btn_func_stat['all'][rix] = 0;
	         }
	     } else if ('mark' == mode) {
	         // 印で選択・クリア

	         var waku_mark = {};
	         // 枠連の場合、車番に印がついている枠を調べておく
	         // console.error('self.my_mark: %O',self.my_mark);
	         waku_mark = self.make_waku_mark();
	         if(self.debug) console.log('waku_mark: %O',waku_mark);

	         for (var j = 1; j <= self.max_uma; j++) {
		         if (self.btn_uno_disable[rix][j])
		             continue;
		         if (undefined === self.btn_uno[rix]) {
		             self.btn_uno[rix] = {};
		         }
		         if (undefined === self.btn_waku[rix]) {
		             self.btn_waku[rix] = {};
		         }

                 var select_waku = self.waku_list[j];
                 var tmp_my_mark = self.my_mark;

                 if(id == 33 || id == 43 || id == 44){
                     //枠連ながし(33),枠単1着軸ながし(43),枠単2着軸ながし(44)
                     //select_waku = j;
                     //tmp_my_mark = self.make_waku_mark();
                 }

		         if (0 == self.btn_func_stat['mark'][rix]) {
                    if (tmp_my_mark[j] && '99' != tmp_my_mark[j]) {
                        if(self.ijyo_list[j]){
                            continue
                        };
                    }
		             if(waku_mark[select_waku] > 0){
		                 self.btn_waku[rix][select_waku] = true;
		                 self.btn_uno[rix][j] = true;
		             }else{
		                 delete self.btn_waku[rix][select_waku];
		                 delete self.btn_uno[rix][j];
		             }

		             //var uma2seq = {};
		             //for(var key in self.race_horse){
		             //    uma2seq[ self.race_horse[key]['syaban'] ] = self.race_horse[key]['syaban'];
		             //}
		             //var seq = uma2seq[j];
		             if (tmp_my_mark[j] && '99' != tmp_my_mark[j]) {
                         if(self.ijyo_list[j]){
                             continue
                         };
		                 // 印がある('99':消以外)
		                 self.btn_uno[rix][j] = true;
		             } else {
		                 self.btn_uno[rix][j] = false;
		             }

		         } else {
		             self.btn_uno[rix][j] = false;
		             //self.btn_uno[rix][select_waku] = false;
		         }
	         }

	         // 印で選択ボタンの状態
	         if (0 == self.btn_func_stat['mark'][rix]) {
		         self.btn_func_stat['mark'][rix] = 1;
		         self.btn_func_stat['all'][rix] = 0;
	         } else {
		         self.btn_func_stat['mark'][rix] = 0;
	         }
	     } else if ('clear' == mode) {
		     self.btn_uno[rix] = {};
		     self.btn_waku[rix] = {};
			 self.btn_func_stat['mark'][rix] = 0;
			 self.btn_func_stat['all'][rix] = 0;
	     }
	     	 console.log('self.btn_func_stat: %O',self.btn_func_stat);

	     // 点数を表示するため組合せを生成
	     for(var shikibetu in self.select_shikibetu){
	         var info = self.make_bet(100, shikibetu);
	         if(info < 0){
	             self.bet_count[shikibetu] = 0;
	             self.select_bet_odds[shikibetu] = {};
	             self.select_kaime[shikibetu] = {};
	         }else{
	             self.bet_count[shikibetu] = info['bet_count'];
	             //選択中のオッズ一覧
	             var ret = self.make_select_bet_odds(info, shikibetu);
	             self.select_bet_odds[shikibetu] = ret['odds_list'];
	             self.select_max_odds[shikibetu] = ret['max_odds'];
	             self.select_min_odds[shikibetu] = ret['min_odds'];
                 var select_odds_flg = false;
                 if(Object.keys(self.select_odds).length >= 1){
                     for(var kaime in self.select_odds){
                         if(self.select_odds[kaime] == shikibetu){
                             select_odds_flg = true;
                             break;
                         }
                     }
                 }
                 if(!select_odds_flg){
                     self.select_kaime[shikibetu] = true;
                 }
	         }
	     }
     }

    self.make_waku_mark = function(){
        var waku_mark = {};
        var uma2waku = {};
        var uma2seq = {};
        for(var key in self.race_horse){
            uma2seq[ self.race_horse[key]['syaban'] ] = self.race_horse[key]['syaban'];
            uma2waku[ self.race_horse[key]['syaban'] ] = self.race_horse[key]['wakuban'];
        }
        //console.error('uma2seq: %O',uma2seq);
        //console.error('uma2waku: %O',uma2waku);

        for (var umaban in uma2waku) {
            waku_mark[uma2waku[umaban]] = 0;
        }
        for (var umaban in uma2waku) {
            var seq = uma2seq[umaban];
            if (self.my_mark[seq] && '99' != self.my_mark[seq]) {
                waku_mark[uma2waku[umaban]]++;
            }
        }
        return waku_mark;
    }

     /*
      * 車番選択、汎用関数(選択数上限あり)
      */
     self.max_uno = function(rix, uix, max) {
	     if (self.debug) console.log('self.max_uno(%s,%s,max)', rix, uix, max);

	     if (self.count_bet() > max) {
	         alert(sprintf("%d車以上は選択できません。", parseInt(max) + 1));
	         delete self.btn_uno[rix][uix];

	         self.update();
	         // 一度、再描画し、チェックを外す
	         var elm = document.getElementById(sprintf("uc-%d-%d", rix, uix));
	         elm.checked = false;
	     }
     }

     // 車番の選択数を調べる
     self.count_bet = function() {
	     var cnt = 0;
	     for (var r in self.btn_uno) {
	         for (var c in self.btn_uno[r]) {
		         cnt++;
	         }
	     }
	     //	 console.log('self.count_bet cnt: %s',cnt);
	     return cnt;
     }

     /*
      * 車番選択、汎用関数(単一選択)
      */
     self.radio_uno = function(rix, uix) {
	     if (self.debug)
	         console.log('self.radio_uno(%s,%s)', rix, uix);

	     var id = sprintf("%1d%1d", self.cur_shikibetu, self.cur_houshiki);
	     var b_uix = -1;
	     if (undefined !== self.btn_uno[rix]){
	         for (var u=0; u<=self.max_uma; u++){
		         if(u == uix)	continue;
		         if(self.btn_uno[rix][u]){
		             b_uix = u;
		             break;
		         }
	         }
	     }
	     //	 console.log('b_uix: %s',b_uix);
	     //	 console.log('self.btn_uno: %O',self.btn_uno);
	     // console.log('self.btn_uno_disable: %O',self.btn_uno_disable);
	     for(var i=0; i<3; i++){
	         if (! self.houshiki_attr[id]['in'][i])
		         continue;
	         if(rix != i && undefined !== self.btn_uno[i] && self.btn_uno[i][uix]) {
		         delete self.btn_uno[i][uix];
		         //		 console.log('delete(current) i: %s uix: %s',i,uix);
	         }
	         if(b_uix >0 && undefined !== self.btn_uno[i] && self.btn_uno[i][b_uix]) {
		         delete self.btn_uno[i][b_uix];
		         //		 console.log('delete(before) i: %s b_uix: %s',i,b_uix);
	         }
	         if(b_uix > 0){
		         self.btn_uno_disable[i][b_uix] = false;
	         }
	         if(rix != i && undefined !== self.btn_waku[i] && self.btn_waku[i][uix]) {
		         delete self.btn_waku[i][uix];
	         }
	         if(b_uix >0 && undefined !== self.btn_waku[i] && self.btn_waku[i][b_uix]) {
		         delete self.btn_waku[i][b_uix];
	         }
	         //if(b_uix > 0){
		     //    self.btn_waku_disable[i][b_uix] = false;
	         //}
	     }
     }

     /*
      * 車番選択、汎用関数(その他の軸の同一車番を選択解除、選択不可)
      */
     self.nodupp_uno = function(rix, uix) {
	     if (self.debug) console.log('self.nodupp_uno(%s,%s)', rix, uix);

	     // 選択不可を一旦クリア
	     var id = sprintf("%1d%1d", self.cur_shikibetu, self.cur_houshiki);
	     // その他の軸の同ー車番は、選択不可にする
	     for(var i=0; i<3; i++){
	         for (var u=1; u<=self.max_uma; u++) {
		         if (! self.houshiki_attr[id]['in'][i])
		             continue;
		         if(u == uix){
		             self.btn_uno_disable[i][u] = true;
		         }
	         }
	     }
	     //	 console.error('***: rix: %s uix: %s',rix,uix);
	     //	 console.error('***: %O',self.btn_uno_disable)
	     if (self.debug) console.log('self.btn_uno_disable: %O', self.btn_uno_disable);
     }

     /*
      * マルチ選択
      */
     self.act_multi = function(ev) {
	     if (self.debug) console.log('self.act_multi(%s)', ev.target.checked);

	     self.multi = ev.target.checked;

	     // 点数を表示するため組合せを生成
	     for(var shikibetu in self.select_shikibetu){
	         var info = self.make_bet(100, shikibetu);
	         if(info < 0){
	             self.bet_count[shikibetu] = 0;
	             self.select_bet_odds[shikibetu] = {};
	             self.select_kaime[shikibetu] = {};
	         }else{
	             self.bet_count[shikibetu] = info['bet_count'];
	             //選択中のオッズ一覧
	             var ret = self.make_select_bet_odds(info, shikibetu);
	             self.select_bet_odds[shikibetu] = ret['odds_list'];
	             self.select_max_odds[shikibetu] = ret['max_odds'];
	             self.select_min_odds[shikibetu] = ret['min_odds'];
                 var select_odds_flg = false;
                 if(Object.keys(self.select_odds).length >= 1){
                     for(var kaime in self.select_odds){
                         if(self.select_odds[kaime] == shikibetu){
                             select_odds_flg = true;
                             break;
                         }
                     }
                 }
                 if(!select_odds_flg){
                     self.select_kaime[shikibetu] = true;
                 }
	         }
	     }
     }

     /*
      * 買い目一覧表示
      */
     self.render_bet_list = function() {
	     if (self.debug) console.log('self.render_bet_list');

	     self.bet_view = [];
	     self.total_bet_money = 0;
	     self.bet_odds_list = [];
	     self.disply_bet_view = {};
	     // 買い目取得(local)
	     var ndisam = new NDIsam();
	     var list = ndisam.list(self.isam_domain);
	     if(false === list){
	         console.error('isam empty..');
	         return;
	     }

	     for (var bet_no in list) {
	         var bet_info = self.bet_gen(list[bet_no]['bet_id'], list[bet_no]['bet_money']);
	         // オッズ配当計算
	         if ('0' == bet_info['houshiki']) {
		         // 通常(バラ買い)
		         var key = '';
		         if ('1' == bet_info['shikibetu'] || '2' == bet_info['shikibetu']) {
		             key = sprintf("%02d", bet_info['kaime1']);
		         } else if ('3' == bet_info['shikibetu'] || '4' == bet_info['shikibetu'] || '5' == bet_info['shikibetu'] || '6' == bet_info['shikibetu'] || '7' == bet_info['shikibetu']) {
		             key = sprintf("%02d%02d", bet_info['kaime1'], bet_info['kaime2']);
		         } else if ('8' == bet_info['shikibetu'] || '9' == bet_info['shikibetu']) {
		             key = sprintf("%02d%02d%02d", bet_info['kaime1'], bet_info['kaime2'], bet_info['kaime3']);
		         }
		         var payback = 0;
		         if (undefined === self.odds[bet_info['shikibetu']]){
		             if(self.debug) console.error('empty odds shikibetu: %s',bet_info['shikibetu']);
		         }else if (undefined === self.odds[bet_info['shikibetu']][key]){
		             if(self.debug) console.error('unkown key : %s', key);
		             payback = 0;
		         } else {
		             var payback = self.odds[bet_info['shikibetu']][key][0] * bet_info['bet_money'];
		             payback = Math.round(payback);
		             if(self.bet_odds_list[bet_info['bet_id']] === undefined){
		                 self.bet_odds_list[bet_info['bet_id']] = [];
		             }
		             self.bet_odds_list[bet_info['bet_id']].push(self.odds[bet_info['shikibetu']][key][0]);
		         }
		         bet_info['payback'] = payback;
	         } else {
		         // 以外(組合せ買い)
		         bet_info['payback'] = [];
		         bet_info['comb_odds'] = [];
		         for (var i = 0; i < bet_info['comb'].length; i++) {
		             var val = bet_info['comb'][i].split(/-/);
		             var comb_odds = '';
		             var key = '';
		             for (var j = 0; j < val.length; j++) {
			             key += sprintf("%02d", val[j]);
		             }
		             if (undefined === self.odds[bet_info['shikibetu']]){
			             if(self.debug) console.error('empty odds shikibetu: %s',bet_info['shikibetu']);
		             }else if(undefined === self.odds[bet_info['shikibetu']][key]){
			             if(self.debug) console.error('unkown key : %s', key);
			             payback = 0;
			             comb_odds = '0.0';
		             } else {
			             payback = self.odds[bet_info['shikibetu']][key][0] * bet_info['bet_money'];
			             payback = Math.round(payback);
			             comb_odds = self.odds[bet_info['shikibetu']][key][0];
			             if(self.bet_odds_list[bet_info['bet_id']] === undefined){
			                 self.bet_odds_list[bet_info['bet_id']] = [];
			             }
			             self.bet_odds_list[bet_info['bet_id']].push(self.odds[bet_info['shikibetu']][key][0]);
		             }
		             //if (self.debug) console.log('payback: %s:', payback);
		             bet_info['payback'].push(payback);
			         bet_info['comb_odds'].push(comb_odds);
		         }
	         }
	         bet_info['bet_no'] = bet_no;
	         bet_info['open'] = 0;
	         self.bet_view.push(bet_info);
	         self.disply_bet_view = self.make_bet_view_obj();
	         // 総合計金額
	         self.total_bet_money += parseInt(bet_info['bet_money_total']);
	     }
         // フッターの状態更新update_tags
         self.args.obs.trigger('update_tag', {'update_tag_name': 'footer_fixed'}, query);

	     if (self.debug) console.log('self.total_bet_money: %s', self.total_bet_money);
	     if (self.debug) console.log('self.bet_view: %O', self.bet_view);
	     if (self.debug) console.log('self.bet_odds_list: %O', self.bet_odds_list);
     }

     /*
      * 式別・方式別の車番選択、妥当性チェック
      */
     self.check_umaban_selection = function(shikibetu) {
	     if (self.debug) console.log('self.check_umaban_selection');

	     var umaban_num = [0, 0, 0];
	     // 選択中の車番ボタンを行毎にカウント
	     for (var i in self.btn_uno) {
	         var row = self.btn_uno[i];
	         for (var uno in row) {
		         if (true == row[uno]) {
		             umaban_num[i]++;
		         }
	         }
	     }
	     var key = sprintf("%1d%1d", shikibetu, self.cur_houshiki);

	     if (self.debug) console.log('umaban_num: %O', umaban_num);
	     if (self.debug) console.log('key: %s', key);

	     var ary_rule = self.houshiki_check[key]['chk'];
	     //	 console.error('ary_rule: %O',ary_rule);
	     var err = false;
	     for (var i = 0; i < ary_rule.length; i++) {
	         var r = ary_rule[i].split(/:/);
	         // r[0] = ルール  'eq:1' １つのみ                'gt:1' １つ以上
	         if ('eq' == r[0]) {
		         if (umaban_num[i] != r[1]) {
		             err = true;
		         }
	         } else if ('gt' == r[0]) {
		         if (umaban_num[i] < r[1]) {
		             err = true;
		         }
	         }
	     }

	     if (self.debug) console.log('err: %s', err);
	     return err;
     }

     /*
      * 買い目追加
      */
    self.act_add_bet = function(ev) {
        if (self.debug) console.log('self.act_add_bet()');
        self.add_bet_item_event = true;

        //デフォルト100円
        self.bet_money = 100;
        // 18.6.1 小数点で入力可能な不具合
        var chk_money = self.bet_money / 100;
        if(Math.round(chk_money) !== chk_money || chk_money < 1){
             self.err_info_swal('金額が未入力、あるいは正しくありません。', false);
            //alert("\n金額が未入力、あるいは正しくありません。\n");
            return false;
        }

        self.set_bet_count = 0;

        //組み合わせ選択
        self.set_bet(false);
        if(Object.keys(self.select_odds).length >= 1){
             //各買い目のオッズを選択時
             self.set_bet_odds(self.select_odds);
        }else{
            //組み合わせ選択
//            self.set_bet();
        }

        //$(".SetListBtn").addClass("BetPlusClick");
        //setTimeout(function () {
        //    $(".SetListBtn").removeClass("BetPlusClick");
        //}, 1500);

        self.reset_uno(-1, 1); // 車番ボタンエリア初期化
        self.bet_select = {}; // 買い目選択
        self.bet_select_all = false; // 買い目選択(全選択・全解除)
        self.bet_money = -1; // 金額クリア
//        self.cur_houshiki = 1; // 方式クリア

        // 全選択・クリア、印で選択を初期化
        self.btn_func_stat = {all: [0, 0, 0], mark: [0, 0, 0]};

        // マルチが選択不可な場合は、非表示
        if (('6' == self.cur_shikibetu && ('3' == self.cur_houshiki || '4' == self.cur_houshiki))
            || ('9' == self.cur_shikibetu && ('3' == self.cur_houshiki || '4' == self.cur_houshiki || '5' == self.cur_houshiki || '6' == self.cur_houshiki || '7' == self.cur_houshiki || '8' == self.cur_houshiki))
                 || ('4' == self.cur_shikibetu && ('3' == self.cur_houshiki || '4' == self.cur_houshiki))
            ) {
            self.multi_attr = true;
        } else {
            self.multi_attr = false;
        }
        self.multi = false;	     // マルチon,offをクリア
        self.select_kaime = {}; //買い目選択on.offをクリア
        self.select_odds = {};
        //self.select_bet_odds = [];
        self.bet_count = {}; // 買い目点数クリア
        self.is_odds_open = {};
        self.btn_uno = {};
        self.btn_waku = {};
//        self.act_shikibetu(9);
        //$('.DeployYoso').hide(); //別タグのためjqueryで消す
/*
        var query = '?m=bet_list';
        for(var key in self.param){
            if(key == 'm'){
                continue;
            }
            query += sprintf("&%s=%s", key, self.param[key]);
        }
*/
//        self.render_bet_list();
        self.update();
        self.list_mark_check();
//        route(query);
    }

    self.set_bet = function(odds_flg){
        console.log('self.set_bet', self.select_kaime);
        for(var shikibetu in self.select_shikibetu){
            if(!odds_flg && !self.select_kaime[shikibetu]){
                continue;
            }
            var bet_info = self.make_bet(self.bet_money, shikibetu, odds_flg);
            if(-1 == bet_info){
                self.err_info_swal('金額が未入力、あるいは正しくありません。', false);
                return false;
            }else if(-2 == bet_info){
                //self.err_info_swal('車番が正しく、選択されていません。', false);
                //return false;
            }
            if(bet_info['bet_count'] < 1){
                self.err_info_swal('組み合わせがありません。', false);
                return false;
            }else{
                if (bet_info['bet_money'] <= 0) {
                    self.err_info_swal('金額が未入力、あるいは正しくありません。', false);
                    return false;
                }
            }
            if(bet_info != -2){
                var ndisam = new NDIsam();
                // 投票管理番号を生成 (キーは現在時刻、ミリ秒まで)
                var bet_no = sprintf("%s_%s_%s",self.cur_race_id,CybozuLabs.MD5.calc(Date.now()),self.set_bet_count);
                self.set_bet_count++;
                bet_info['bet_no'] = bet_no;
                var ret = ndisam.replace(self.isam_domain, bet_no, {
                    bet_id: bet_info['bet_id'],
                    bet_money: self.bet_money
                });
                if(ret){
                    self.bet_view.push(bet_info);
                }
            }
        }
    }

     //------------------------------------------------------------
     self.bet_gen = function(bet_id, bet_money) {
	     if (self.debug) console.log('self.bet_gen(%s,%s)', bet_id, bet_money)

	     if(undefined === bet_id){
	         return {};
	     }

	     var part = bet_id.split(/_/);
	     var s = part[1].substr(1, 1);
	     var h = part[1].substr(1, 1) + part[2].substr(1, 1);

	     var ipat = new IpatDataModel();
	     var info = [];
	     var waku_check = []; // 枠連の場合は、複数頭の枠番号を配列で渡す

	     for (var w in self.waku_horse) {
	         var num = Object.keys(self.waku_horse[w]).length;
	         if (num > 1) {
	         	for(var key in self.waku_horse[w]){
	         		var ijyo_check = false;
	         		if(self.waku_horse[w][key]['sales_sts'] == '1' || self.waku_horse[w][key]['sales_sts'] == '3'){
	         			ijyo_check = true;
	         			break;
	         		}
	         	}
	         	if(!ijyo_check){
		         	waku_check.push(w);
	         	}
	         }
	     }
	     if (self.debug) console.log('waku_check: %O',waku_check);
	     info = ipat.cvt_bet(bet_id, bet_money, waku_check);
console.log('bet_id: %O', bet_id);

	     // 競車場、レース番号
	     var p = part[0].split(/-/);

	     if ('0' == h.substr(1, 1)) {
	         var str = '';
	         if ('1' == info['shikibetu'] || '2' == info['shikibetu']) {
		         str = sprintf("%d", info['kaime1']);
	         } else if ('3' == info['shikibetu'] || '4' == info['shikibetu'] || '5' == info['shikibetu'] || '6' == info['shikibetu'] || '7' == info['shikibetu']) {
		         str = sprintf("%d-%d", info['kaime1'], info['kaime2']);
	         } else if ('8' == info['shikibetu'] || '9' == info['shikibetu']) {
		         str = sprintf("%d-%d-%d", info['kaime1'], info['kaime2'], info['kaime3']);
	         }
	         info['kumi_name'] = str;
	     }
console.log('info: %O', info);
	     // 17.10.28
	     info['ary_kaime'] = [];
	     for(var i=1; i<=3; i++){
	         if('' != info['kaime'+i] && undefined != info['kaime'+i]){
		         var val = info['kaime'+i].split(/-/);
		         info['ary_kaime'].push(val);
	         }
	     }
	     return info;
     }

     /*
      * swalの共通関数
      */
    self.err_info_swal = function(err_msg, fn) {
       if(!err_msg){
           return;
       }
       var option = {title: err_msg}

       if(fn){
           option['showCancelButton'] = true;
           option['cancelButtonText'] = 'やめる';
//           option['confirmButtonText'] = '展開する';
       }
        swal.fire(option).then(function(ret){
            if(true == ret.value && fn){
               fn();
            }else{
                if(self.before_money){
                    console.log(self.before_money);
                    $('.child_input').val(self.before_money);
                }
            }
        });
    }

     /*
      * 買い目を表示用のオブジェクトに変換
      */
    self.make_bet_view_obj = function(){
        console.log('self.make_bet_view_obj');
        var disply_bet_view = {};
        for(var i = 0; i < self.bet_view.length; i++){
            var shikibetu = self.bet_view[i]['shikibetu'];
            if(!disply_bet_view[shikibetu]){
                disply_bet_view[shikibetu] = [];
            }
            self.bet_view[i]['idx'] = i;
            disply_bet_view[shikibetu].push(self.bet_view[i]);
        }
        console.log('disply_bet_view: ', disply_bet_view);
        return disply_bet_view;
    }

    self.make_select_bet_odds = function(info, shikibetu){
        console.log('self.make_select_bet_odds', info);
        var tmp_odds = [];
        var odds_list = [];
        if(info['comb']){
            for(var i = 0; i < info['comb'].length; i++){
                var tmp_kaime = info['comb'][i].replace(/-/g, '');
                var odds = {};
                if(self.odds[shikibetu][tmp_kaime]){
                    odds[tmp_kaime] = self.odds[shikibetu][tmp_kaime][0];
                    tmp_odds.push(self.odds[shikibetu][tmp_kaime][0]);
                }else{
                    odds[tmp_kaime] = '0.0';
                    tmp_odds.push('0.0');
                }
                odds_list.push(odds);
            }
        }else{
            var tmp_kaime = info["kumi_name"].split("-").map(num => num.padStart(2, "0")).join("");
            console.log(info);
            console.log(self.odds[shikibetu]);
            console.log(tmp_kaime);
            var odds = {};
            if(self.odds[shikibetu][tmp_kaime]){
                odds[tmp_kaime] = self.odds[shikibetu][tmp_kaime][0];
                tmp_odds.push(self.odds[shikibetu][tmp_kaime][0]);
            }else{
                odds[tmp_kaime] = '0.0';
                tmp_odds.push('0.0');
            }
            odds_list.push(odds);
        }
        var max = 0;
        var min = 0;
        if(tmp_odds.length > 0){
            max = tmp_odds.reduce(function(a, b) {
                return Math.max(a, b);
            });
            min = tmp_odds.reduce(function(a, b) {
                return Math.min(a, b);
            });
        }
        var result = {
            'odds_list' : odds_list,
            'min_odds' : min,
            'max_odds' : max
        }
        return result;
    }

    //買い目一覧のオッズ開閉
    self.act_odds_open = function(shikibetu){
        console.log('self.act_odds_open : (%s)', shikibetu)
        if(self.is_odds_open[shikibetu]){
            self.is_odds_open[shikibetu] = false;
        }else{
            self.is_odds_open[shikibetu] = true;
        }
        console.log(self.is_odds_open);
    }

    self.act_select_odds_sort = function(odds_list, mode, shikibetu){
        console.log('self.act_select_odds_sort', odds_list, mode, shikibetu);
        if(self.select_odds_sort_mode == 'asc'){
              self.select_odds_sort_mode = 'desc';
        }else{
              self.select_odds_sort_mode = 'asc';
        }

        self.select_bet_odds[shikibetu] = odds_list.sort(function(a,b){
            if(mode == 'kaime'){
                var data_a = Object.keys(a)[0];
                var data_b = Object.keys(b)[0];
            }else{
                var data_a = Object.values(a)[0];
                var data_b = Object.values(b)[0];
            }
            if(self.select_odds_sort_mode == 'asc'){
                if( parseInt(data_a) < parseInt(data_b) ) return 1;
                if( parseInt(data_a) > parseInt(data_b) ) return -1;
            }else{
                if( parseInt(data_a) < parseInt(data_b) ) return -1;
                if( parseInt(data_a) > parseInt(data_b) ) return 1;
            }
            return 0;
        });
    }

    //買い目選択時
    self.act_select_kaime = function(shikibetu){
        console.log('self.act_select_kaime : ', shikibetu);
        if(Object.keys(self.select_odds).length >= 1){
            for(var kaime in self.select_odds){
                if(self.select_odds[kaime] == shikibetu){
                    delete self.select_odds[kaime];
                }
            }
        }
        //self.select_odds = {};
        if(self.select_kaime[shikibetu]){
            delete self.select_kaime[shikibetu];
        }else{
            self.select_kaime[shikibetu] = true;
        }
    }

    //オッズから選択時
    self.act_select_odds = function(kaime, shikibetu){
        console.log('self.act_select_odds', kaime, shikibetu);
        delete self.select_kaime[shikibetu];
        var tmp_kaime = sprintf('%s_%s', shikibetu, kaime);
        if(!self.select_odds[tmp_kaime]){
            self.select_odds[tmp_kaime] = shikibetu;
        }else if(self.select_odds[tmp_kaime] == shikibetu){
            delete self.select_odds[tmp_kaime];
        }
        console.log(self.select_odds);
    }

    //選択した買い目を追加
    self.set_bet_odds = function(select_odds){
        console.log('self.set_bet_odds', select_odds);
        //オッズから選択時の方式は通常
        self.cur_houshiki = 0;
        //ボタン初期化
        self.btn_uno = {};
//        self.select_shikibetu = {};
        for(var tmp_kaime in select_odds) {
            self.select_shikibetu = {};
            var shikibetu = select_odds[tmp_kaime];
            var kaime = tmp_kaime.split('_')[1];
            self.select_shikibetu[shikibetu] = true;
            var new_btn_uno = {};
            var select_syaban = kaime.split('0');
            for(var i = 0; i < select_syaban.length; i++){
                var syaban = select_syaban[i].replace(/^0/, '');
                if(syaban){
                    if(i == 1){
                        if(!new_btn_uno[0]){
                            new_btn_uno[0] = {};
                        }
                        new_btn_uno[0][syaban] = true;
                    }else if(i == 2){
                        if(!new_btn_uno[1]){
                            new_btn_uno[1] = {};
                        }
                        new_btn_uno[1][syaban] = true;
                    }else if(i == 3){
                        if(!new_btn_uno[2]){
                            new_btn_uno[2] = {};
                        }
                        new_btn_uno[2][syaban] = true;
                    }
                }
            }
            self.btn_uno = new_btn_uno;
            self.set_bet(true);
        }
    }

    self.set_storage = function(new_part, add_c){
        // 買い目取得(local)
        var ndisam = new NDIsam();
        var i = 0;
        for (var item_key in add_c) {
            // 10が1となるバグ、暫定
            //     new_part[3] = key.replace(/^0/g, '');
            //     new_part[3] = new_part[3].replace(/-/g, '_');
            var tmp_key = item_key.split(/_/);
            var ary_val = tmp_key[1].split(/-/);
            for(var x=0; x<ary_val.length; x++){
                ary_val[x] = parseInt(ary_val[x]);
            }
            new_part[1] = sprintf("b%s", tmp_key[0]);
            new_part[3] = ary_val.join('_');
            //	     console.error('new_part[3]: %s',new_part[3]);
            var bet_id = new_part.join('_');
            if (self.debug) console.log('bet_id: %s', bet_id);
               // 投票管理番号を生成 (キーは現在時刻、ミリ秒まで)
            var str_rand = Date.now() + i;
            if(self.debug) console.log('str_rand: %s',str_rand);
            var bet_no = sprintf("%s_%s",self.cur_race_id,CybozuLabs.MD5.calc(str_rand));
            console.log('bet_no: ',bet_no);
            // 買い目を保存(local)
            var bet_money = add_c[item_key];
            if (self.debug) console.log('bet_id: %s bet_money: %s bet_no: %s', bet_id, bet_money, bet_no);
            ndisam.replace(self.isam_domain, bet_no, {
                bet_id: bet_id,
                bet_money: bet_money
            });
            i++;
        }
    }


    self.charge = function() {
      //e.preventDefault();
      $.colorbox({
          iframe:true,
          width: "90%",
          maxWidth:'480px',
          height:"500px",
          maxHeight:"90%",
          speed:'200',
          open:true,
          fixed: true,
          speed: 200,
          href: self.args.money_api_url + '/pay/charge.html',
          className: 'addChargeColorbox',
          onComplete: function () {
              //setTimeout(function () {
              //    $('#cboxLoadedContent').contents().find('a').attr('target', '_blank');
              //}, 500);
          }
      });
    }

    //制作
    self.list_mark_check = function(){

    // 特定の要素が存在するかどうかを判定
    if ($('.fixedFooter').length) {
        $(".InputFixedArea01").css({
            "bottom": "51px"
        });
    }

	var BetHead = $('.BetRaceHead_Wrap');
	var offset = BetHead.offset();
	var floatBetHead = function() {
		if($(window).scrollTop() > offset.top) {
			BetHead.addClass('Fixed');
		} else {
			BetHead.removeClass('Fixed');
		}
	}
	$(window).scroll(floatBetHead);
	$('body').bind('touchmove', floatBetHead);

		$('.RaceOdds_HorseList_Table tbody tr').each(function(){
			if($(this).find('.MarkIcon').length){
				$(this).addClass('selected');
			}
		});
		$(window).scroll(function () {
			var footHeight = $('.Find_FootArea').outerHeight() + 100;
			var scrollHeight = $(document).height();
			var scrollPosition = window.innerHeight + $(window).scrollTop();
			if (scrollHeight - scrollPosition <= footHeight) {
				$(".InputFixedArea01").css({
					"position": "relative"
				});
			} else {
				$(".InputFixedArea01").css({
					"position": "fixed",
					"bottom": "51px"
				});
			}
		});


        // センターモーダルの閉じるボタン
        $(".CenterModal .modal-close").click(function () {
            // モーダルウィンドウとオーバーレイをフェードアウトさせる
            $(this).closest(".CenterModal").fadeOut();
            $(".CenterModal .centerModal-bg").fadeOut();
        });

        //エラーメッセージの開閉
        $(".errorMessageInBtn").off("click");
        $(".errorMessageInBtn").on("click", function(){
            console.log('errorMessageInBtnerrorMessageInBtnerrorMessageInBtn');
            $(this).closest('.errorMessageBox').toggleClass("isOpen");
            $(this).closest('.errorMessageBox').find('.errorMessageContents').slideToggle();
        });
//        $(".errorMessageInBtn").click(function () {
//            console.log('errorMessageInBtnerrorMessageInBtnerrorMessageInBtn');
//            $(this).closest('.errorMessageBox').toggleClass("isOpen");
//            $(this).closest('.errorMessageBox').find('.errorMessageContents').slideToggle();
//        });

        //制作
        $("#RaceChoiceBtn").off("click");
        $("#RaceChoiceBtn").on("click", function(){
            console.log('click');
            make_slide_modal();
        });

        // レース選択のモーダル表示
        function make_slide_modal(){
            var current_scrollY = $(window).scrollTop();
            $(".HalfModal.RaceChoiceArea").addClass("OpenDraw");
            $(".Wrap").addClass("HalfModalViewOut");
            $(".Wrap.HalfModalViewOut").css({
                top: -1 * current_scrollY,
                height:'auto'
            });
            $("footer.SpFooter,footer.PcFooter").css({visibility: 'hidden',});
            $(".Wrap").append("<div class='ModalOverlay HalfModalOver'></div>");
            $(document).on("touchend click", ".HalfModal_CloseBtn,.Disagree button,.ModalOverlay", function() {
                modal_slide_out();
            });
        }

        // レース選択のモーダル表示　閉じる
        function modal_slide_out(event){
            var current_scrollY = $(window).scrollTop();
            $(".HalfModal.RaceChoiceArea").addClass("SlideOut");
            setTimeout(function () {
                $(".HalfModal.RaceChoiceArea").removeClass("OpenDraw");
                $(".HalfModal.RaceChoiceArea").removeClass("SlideOut");
            }, 200);
            $(".Wrap.HalfModalViewOut").attr({ style: ''}).removeClass("HalfModalViewOut");
            $(".HalfModalOver").remove();
            $('body').css({'position':'static'});
            $("footer.SpFooter,footer.PcFooter").css({visibility: 'visible'});
            $( 'html, body' ).prop( { scrollTop: current_scrollY } );
            event.preventDefault();
        };


    }


    </script>

</mark_sheet>
