﻿/*
 * @include "DDP_Framework.js"
 * @include "DDP.SearchConfig.js"
 */
/**
 * @fileoverview 検索系システムで使用するJavaScriptが記述されています。
 */
if (typeof(console) == 'undefined' || console == null){ console = { 'log' : function(){} } };
// デバッグモード設定
if (typeof(DDP.DEBUG_MODE) == 'undefined' || DDP.DEBUG_MODE == null) {
	DDP.DEBUG_MODE = false;
}
console.log('load DDP_Search.js ...');

(function() {
///////////////////////// DDP.Search 共通クラス START /////////////////////////
// local symbol
var _win = window, _doc = document;

/**
 * 親クラス
 */
if (typeof(DDP.Search) == 'undefined') DDP.Search = {};
/**
 * 定数クラス定義
 */
DDP.Search.Const = function() { };

/** WebMethodからExceptionが返ってきた場合のデフォルトメッセージ */
DDP.Search.Const.DEFAULT_ERROR_ALERT_MESSAGE =
	'現在処理中です。OKボタンを押してクリックして、しばらくお待ちください。';
/** UpdatePanelの更新で、何らかの理由でエラーが返ってきた場合のメッセージ */
DDP.Search.Const.UPDATE_PANEL_ERROR_ALERT_MESSAGE =
	'ただいま混み合っております。恐れ入りますが、しばらくしてからお試しください。';
/** 航空検索時、エラーが返ってきた場合のメッセージ */
DDP.Search.Const.AIR_SEARCH_ERROR_ALERT_MESSAGE =
	'ただいま混み合っております。恐れ入りますが、しばらくしてからお試しください。';

/** WebMethod成功時 結果コード */
DDP.Search.Const.WEB_METHOD_RESULT_CODE_SUCCESS = 'success';
/** WebMethod失敗時 結果コード */
DDP.Search.Const.WEB_METHOD_RESULT_CODE_ERROR = 'error';

/** プラン詳細表示用モード */
DDP.Search.Const.UPDATE_PANEL_RESPONSE_MODE_PLAN_DETAIL = 'planDetail';
/** 検索結果表示用モード */
DDP.Search.Const.UPDATE_PANEL_RESPONSE_MODE_SEARCH_RESULT = 'searchResult';

/** 検索パネルプルダウンの無効項目スタイル */
DDP.Search.Const.DISABLE_PULL_DOWN_ITEM_STYLE = 'sel_ds';

/** ボタンリンク無効スタイル */
DDP.Search.Const.DISABLE_BUTTON_LINK_STYLE = 'limit btn_up btn_ds';
/** ボタンリンク有効（未選択）スタイル */
DDP.Search.Const.ABLE_BUTTON_LINK_STYLE = 'limit btn_up';
/** ボタンリンク有効（選択）スタイル */
DDP.Search.Const.SELECTED_BUTTON_LINK_STYLE = 'limit btn_dw';

/** こだわり条件解除ボタンDisable時付加スタイル */
DDP.Search.Const.CLEAR_SPECIFIC_BUTTON_DISALBE_STYLE = 'disabletext mesh_unlink';
/** こだわり条件hiddenのvalueの区切り文字 */
DDP.Search.Const.SPECIFIC_VALUE_SEPARATOR = ':';

/** Trueを表す文字列 */
DDP.Search.Const.FLAG_TRUE = 'true';
/** Falseを表す文字列 */
DDP.Search.Const.FLAG_FALSE = 'false';

/** サブエリア 未選択項目 文字列 */
DDP.Search.Const.SUB_AREA_NO_SELECTED_TEXT = '選択してください';
/** サブエリア 未選択項目 スタイル */
DDP.Search.Const.SUB_AREA_NO_SELECTED_STYLE = 'noselect';
/** サブエリア 未選択項目（指定なし可） 文字列 */
DDP.Search.Const.SUB_AREA_NO_SELECTED_TEXT_UNSELECTABLE = '指定なし';

/** MeshListを生成する際に使用するテンプレート */
DDP.Search.Const.MESH_LIST_TEMPLATE =
	'<p class="mt2" id="mesh_{0}">\n{1}{2}\n</p>';
/** MeshListを生成する際に使用するHidden部のテンプレート */
DDP.Search.Const.MESH_LIST_HIDDEN_TEMPLATE =
	'<input id="mesh_value_{0}" type="hidden" value="{1}" />';
/** MeshListを生成する際に使用するリンク部のテンプレート */
DDP.Search.Const.MESH_LIST_LINK_TEMPLATE =
	'<a id="mesh_anchor_{0}" href="javascript:;">{1}</a>';

/** Disableスタイル */
DDP.Search.Const.DISABLE_STYLE = 'disable';

/** メッシュ 未選択項目 スタイル */
DDP.Search.Const.MESH_LIST_LINK_STYLE = '';
/** メッシュ 選択不可項目 スタイル */
DDP.Search.Const.MESH_LIST_NOLINK_STYLE = 'mesh_unlink';
/** メッシュ 選択中項目 スタイル */
DDP.Search.Const.MESH_LIST_SELECTED_STYLE = 'mesh_em mesh_unlink';
/** メッシュDisableスタイル */
DDP.Search.Const.MESH_LIST_DISABLE_STYLE = 'mt2 disabletext mesh_unlink';

/** 地図から選択する 選択不可スタイル */
DDP.Search.Const.MAP_SELECT_LINK_DISABLE = 'disabletext mesh_unlink'

/** 航空検索区分：往路検索 */
DDP.Search.Const.AIR_REFERENCE_TYPE_GO = 'go';
/** 航空検索区分：復路検索 */
DDP.Search.Const.AIR_REFERENCE_TYPE_RETURN = 'return';
/** 航空検索区分：往復検索 */
DDP.Search.Const.AIR_REFERENCE_TYPE_ROUND_TRIP = 'roundTrip';
/** 航空検索結果片道表示件数 */
DDP.Search.Const.AIR_RESULT_LENGTH = 3;

/** 往路接頭語 */
DDP.Search.Const.GO_PREFIX = 'go_';
/** 復路接頭語 */
DDP.Search.Const.RETURN_PREFIX = 'return_';
/** 結果接頭語 */
DDP.Search.Const.RESULT_PREFIX = 'result_';

/** マルチ空港リストを生成する際に使用するリンク部のテンプレート */
DDP.Search.Const.MULTI_LIST_LINK_TEMPLATE =
	'<a id="{0}multi_airport_{1}" href="javascript:;">{2}{3}便</a>';
/** マルチ空港リストを生成する際に使用するリンク部のテンプレート */
DDP.Search.Const.MULTI_LIST_HALF_ROUND_TRIP_MESSAGE_TEMPLATE =
	'&nbsp;{0}（{1}）&nbsp;'
/** マルチ空港リストを生成する際に使用するリンク部のテンプレート */
DDP.Search.Const.MULTI_LIST_MESSAGE_TEMPLATE =
	'他に{0}{1}の候補があります。';

/** 航空検索条件シートプルダウン：普通席以外 Value */
DDP.Search.Const.AIR_SEARCH_OTHER_SEAT_VALUE = 2;
/** 航空検索条件通常時テーブルセルスタイル */
DDP.Search.Const.AIR_SEARCH_CONDTION_NORMAL_TABLE_CELL_STYLE = ';';
/** 航空検索条件入力エラー時テーブルセルスタイル */
DDP.Search.Const.AIR_SEARCH_CONDTION_ERROR_TABLE_CELL_STYLE = 'plus_search_result_error';

/** 宿泊検索結果 選択時 ボタンセル スタイル */
DDP.Search.Const.HOTEL_RESULT_RADIO_TD_SELECTED_STYLE = 'label_focus taCenter';
/** 宿泊検索結果 選択時 写真セル スタイル */
DDP.Search.Const.HOTEL_RESULT_PHOTO_TD_SELECTED_STYLE = 'photo focus tac';
/** 宿泊検索結果 選択時 コンテンツセル スタイル */
DDP.Search.Const.HOTEL_RESULT_CONTENT_TD_SELECTED_STYLE = 'content focus';

/** 宿泊検索結果 通常時 ボタンセル スタイル */
DDP.Search.Const.HOTEL_RESULT_RADIO_TD_NORMAL_STYLE = 'label taCenter';
/** 宿泊検索結果 通常時 写真セル スタイル */
DDP.Search.Const.HOTEL_RESULT_PHOTO_TD_NORMAL_STYLE = 'photo tac';
/** 宿泊検索結果 通常時 コンテンツセル スタイル */
DDP.Search.Const.HOTEL_RESULT_CONTENT_TD_NORMAL_STYLE = 'info';

/** 航空検索結果 Radioボタンテンプレート */
DDP.Search.Const.AIR_RESULT_RADIO_BUTTON_TEMPLATE =
	'<label for="public"><input id="{0}_check_{1}" type="radio" name="{0}" value="{1}" /></label>';
/** 航空検索結果 選択時 ラジオボタンセル スタイル */
DDP.Search.Const.AIR_RESULT_RADIO_CELL_SELECTED_STYLE = 'focuslabel';
/** 航空検索結果 選択時 その他セル スタイル */
DDP.Search.Const.AIR_RESULT_OTHER_CELL_SELECTED_STYLE = 'focus';
/** 航空検索結果 通常時 ラジオボタンセル スタイル */
DDP.Search.Const.AIR_RESULT_RADIO_CELL_NORMAL_STYLE = 'label';
/** 航空検索結果 通常時 その他セル スタイル */
DDP.Search.Const.AIR_RESULT_OTHER_CELL_NORMAL_STYLE = '';

/** 選択内容確認：プラン未選択 */
DDP.Search.Const.ERROR_MSG_NON_SELECT_PLAN = '宿・ホテル／プランを再検索する場合は日程を指定ください';
/** 選択内容確認：飛び石プラン */
DDP.Search.Const.ERROR_MSG_JUMP_STAYDATE_PLAN = '選択した日程では再検索できません。連続した日程を設定してください';

/** 往路出発日を変更したときに自動で設定される復路宿泊日のn日後 **/
DDP.Search.Const.DATE_BACK_AFTER_DATE_GO = 1;

/** 検索条件補助入力 空港未選択スタイル **/
DDP.Search.Const.NO_SELECT_PULLDOWN_STYLE = 'noselect';

/** 予約区分(航空＋宿・ホテル＋レンタカー) **/
DDP.Search.Const.RSV_KBN_AIR_HOTEL_CAR = 1;
/** 予約区分(航空＋宿・ホテル) **/
DDP.Search.Const.RSV_KBN_AIR_HOTEL = 0;
/** 予約区分(宿・ホテル＋レンタカー) **/
DDP.Search.Const.RSV_KBN_HOTEL_CAR = 2;
DDP.Search.Const.RSV_KBN_JAL = 3;
DDP.Search.Const.RSV_KBN_ANA = 4;
DDP.Search.Const.RSV_KBN_HOTEL = 5;
DDP.Search.Const.RSV_KBN_CAR = 6;
DDP.Search.Const.RSV_KBN_TOUR = 8;
DDP.Search.Const.RSV_KBN_CAR_SINGLE = 9;

/** 貸出接頭語 */
DDP.Search.Const.RENTAL_START_PREFIX = 'rental_start_';
/** 返却接頭語 */
DDP.Search.Const.RENTAL_END_PREFIX = 'rental_end_';
/** レンタカー検索結果 選択時 ラジオボタンセル スタイル */
DDP.Search.Const.CAR_RESULT_RADIO_CELL_SELECTED_STYLE = 'label_focus';
/** レンタカー検索結果 選択時 その他セル スタイル */
DDP.Search.Const.CAR_RESULT_OTHER_CELL_SELECTED_STYLE = 'focus';
/** レンタカー検索結果 通常時 ラジオボタンセル スタイル */
DDP.Search.Const.CAR_RESULT_RADIO_CELL_NORMAL_STYLE = 'label';
/** レンタカー検索結果 通常時 その他セル スタイル */
DDP.Search.Const.CAR_RESULT_OTHER_CELL_NORMAL_STYLE = '';
/** レンタカー検索条件入力エラー時テーブルセルスタイル */
DDP.Search.Const.CAR_SEARCH_CONDTION_ERROR_TABLE_CELL_STYLE =
	'plus_search_result_error';
/** 航空検索時、エラーが返ってきた場合のメッセージ */
DDP.Search.Const.CAR_SEARCH_ERROR_ALERT_MESSAGE =
	'ただいま混み合っております。恐れ入りますが、しばらくしてからお試しください。';
/** ボタン文言 航空+宿泊+レンタカー */
DDP.Search.Const.BUTTON_MSG_AIR_HOTEL_CAR = 'JAL航空+宿・ホテル+レンタカーを一括検索する';
/** ボタン文言 航空+宿泊 */
DDP.Search.Const.BUTTON_MSG_AIR_HOTEL = 'JAL航空+宿・ホテルを一括検索する';
/** ボタン文言 宿泊+レンタカー */
DDP.Search.Const.BUTTON_MSG_HOTEL_CAR = 'レンタカー+宿・ホテルを一括検索する';
/** レンタカー会社ID 1 */
DDP.Search.Const.RENTACAR_COMPANY_ID_TOYOTA = '1'
/** 未選択リンクのスタイル */
DDP.Search.Const.UNLINK_STYLE = 'unlink';

/* 検索補助画面遷移区分*/
/** 航空＋宿・ホテル*/
DDP.Search.Const.ASSIST_SEARCH_TYPE_AIR_HOTEL = '0';
/** レンタカー＋宿・ホテル*/
DDP.Search.Const.ASSIST_SEARCH_TYPE_CAR_HOTEL = '1';
/** ステップ予約 宿泊*/
DDP.Search.Const.ASSIST_SEARCH_TYPE_STEP_HOTEL = '2';
/** ステップ予約 航空*/
DDP.Search.Const.ASSIST_SEARCH_TYPE_STEP_AIR = '3';
/** ステップ予約 レンタカー*/
DDP.Search.Const.ASSIST_SEARCH_TYPE_STEP_CAR = '4';
/** ステップ予約 レンタカー*/
DDP.Search.Const.ASSIST_SEARCH_TYPE_TOUR = '5';

/** キャリアJAL*/
DDP.Search.Const.CARRIER_JAL = 'JAL';
/** キャリアANA*/
DDP.Search.Const.CARRIER_ANA = 'ANA';
//ANAサイト遷移用のname
DDP.Search.Const.ANA_DATA_CONNECTION_KIND = 'CONNECTION_KIND';
DDP.Search.Const.ANA_DATA_ACTIBITY_ID = 'activityId';
DDP.Search.Const.ANA_DATA_RETURN_URL = 'returnURL';
DDP.Search.Const.ANA_DATA_SCREEN_ID = 'screenId';
DDP.Search.Const.ANA_DATA_SELECTED_EMD_MONTH = 'segConditionForm.selectedEmbMonth';
DDP.Search.Const.ANA_DATA_SELECTED_EMD_DAY = 'segConditionForm.selectedEmbDay';
DDP.Search.Const.ANA_DATA_SELECTED_DEP_APO = 'segConditionForm.selectedDepApo';
DDP.Search.Const.ANA_DATA_SELECTED_ARR_APO = 'segConditionForm.selectedArrApo';
DDP.Search.Const.ANA_DATA_SELECTED_SEAT_KIND = 'segConditionForm.seatKind';
DDP.Search.Const.ANA_DATA_SELECTED_DEP_TIME = 'segConditionForm.selectedDepTime';
DDP.Search.Const.ANA_DATA_TTW_CAL_FLG = 'segConditionForm.ttwCalFlg';
DDP.Search.Const.ANA_DATA_NOW_SEG_INDEX = 'segConditionForm.nowSegIndex';
DDP.Search.Const.ANA_DATA_BUTTON = 'btnSubmit:mapping=success';

// 航空TOPイメージボタン
DDP.Search.Const.AIR_TOP_SEARCH_BUTTON_PATH = '/plus/images/airtop/';
DDP.Search.Const.AIR_TOP_SEARCH_BUTTON_JAL_ENABLE = 'airsearch_btn_jal.gif';
DDP.Search.Const.AIR_TOP_SEARCH_BUTTON_JAL_DISABLED = 'airsearch_btn_disabled_jal.gif';
DDP.Search.Const.AIR_TOP_SEARCH_BUTTON_ANA_ENABLE = 'airsearch_btn_ana.gif';
DDP.Search.Const.AIR_TOP_SEARCH_BUTTON_ANA_DISABLED = 'airsearch_btn_disabled_ana.gif';

/**
 * Idを管理する連想配列オブジェクト
 */
DDP.Search.idManager = {};
/**
 * 連想配列の値からキーを取得します。取得できない場合は false を返します。
 * @param value 連想配列の値
 */
DDP.Search.idManager.findKeyByValue = function(value) {
	for(var key in DDP.Search.idManager) {
		if (DDP.Search.idManager[key] == value) {
			return key;
		}
	}
	return false;
};
////////////////////////// DDP.Search 共通クラス END //////////////////////////

//////////////////////// 共通系ユーティリティ関数 START ////////////////////////
/**
 * エラー内容をalertを使用し画面に表示します。
 */
DDP.Search.showErrorAlert = function(errorResult, errorMessage) {
	console.log('DDP.Search.showErrorAlert', errorResult);
	if (errorMessage) {
		alert(errorMessage);
	} else {
		if (errorResult && errorResult.get_statusCode() == 0) return;
		alert(DDP.Search.Const.DEFAULT_ERROR_ALERT_MESSAGE);
	}
	if (typeof(DDP.DEBUG_MODE) != 'undefined' && DDP.DEBUG_MODE && errorResult) {
		var arrMsg = [''], idx = 1;
		arrMsg[idx++] = '[ExceptionType]\r\n' + errorResult.get_exceptionType() + '\r\n\r\n';
		arrMsg[idx++] = '[Message]\r\n' + errorResult.get_message() + '\r\n\r\n';
		arrMsg[idx++] = '[StackTrace]\r\n' + errorResult.get_stackTrace() + '\r\n\r\n';
		arrMsg[idx++] = '[StatusCode]\r\n' + errorResult.get_statusCode() + '\r\n\r\n';
		arrMsg[idx++] = '[TimedOut]\r\n' + errorResult.get_timedOut() + '\r\n\r\n';
		var alertMessage = arrMsg.join('');
		console.log(alertMessage);
		alert(alertMessage);
	}
};
/**
 * 選択ボックスのインデックス0の項目の未選択時のStyleClassに設定します
 * @param select 選択ボックスエレメント
 */
DDP.Search.setPullDownNoSelectStyleClass = function(select) {
	select.options[0].className = DDP.Search.Const.NO_SELECT_PULLDOWN_STYLE;
};
/**
 * 未選択PullDownのStyleClassに初期化します。
 * @param selects 選択ボックスエレメントまたはその配列
 */
DDP.Search.initNonSelectPullDownClass = function(selects) {
	if (!selects) return;
	var arr = DDP.toArray(selects);
	for(var i = 0, len = arr.length; i < len; i++) {
		DDP.Search.setPullDownNoSelectStyleClass(arr[i]);
		DDP.changePullDownStyleClass(arr[i]);
	}
};
/**
 * 未選択PullDownのStyleClassに初期化します。
 * @param selects 選択ボックスエレメントまたはその配列
 * @param nonSelectClassName 未選択時のCSSクラス名。未指定の場合はDDP.Search.Const.NO_SELECT_PULLDOWN_STYLE。
 * @param nonSelectValue 未選択時の値。未指定の場合は空の文字列。
 */
DDP.Search.updateNonSelectPullDownClass = function(selects, nonSelectClassName, nonSelectValue) {
	if (!selects) return;
	(!nonSelectClassName && (nonSelectClassName = DDP.Search.Const.NO_SELECT_PULLDOWN_STYLE));
	(!nonSelectValue && (nonSelectValue = ''));
	var select, existNoSelectClass, isNonSlect, arr = DDP.toArray(selects);
	for(var i = 0, l = arr.length; i < l; i++) {
		select = arr[i], existNoSelectClass = DDP.existClass(select, nonSelectClassName);
		isNonSlect = (DDP.getSelectedValue(select) == nonSelectValue);
		if (isNonSlect && !existNoSelectClass) {
			// 未選択で未選択CSSが適用されていない場合は追加
			DDP.addClass(select, nonSelectClassName);
		} else if (!isNonSlect && existNoSelectClass) {
			// 選択されており未選択CSSが適用されている場合は削除
			DDP.removeClass(select, nonSelectClassName);
		}
	}
};
/* 日付の加算を行います */
DDP.Search.addDate = function(year, month, day, addDays) {
	var date = new Date(year, month, day);
	// 日数 * 1日のミリ秒数
	date.setTime(date.getTime() + (addDays * 86400000));
	return date;
};
/**
 * 開始日、終了日より 泊数を取得します。
 */
DDP.Search.getDateSpan = function(startDate, endDate){
	var spanTime = endDate.getTime() - startDate.getTime();
	// 差分のミリ秒÷1日のミリ秒数
	var dateCount = spanTime != 0 ? (spanTime / 86400000) : 0;
	return dateCount;
}
///////////////////////// 共通系ユーティリティ関数 END /////////////////////////

//////////////////////// 業務共通系ユーティリティ関数 START ////////////////////
/**
 * 往路出発日変更時に復路出発日を往路出発日+DATE_BACK_AFTER_DATE_GOに変更する
 * @param dateGo 往路出発日のIDまたはNode
 * @param dateBack 復路出発日のIDまたはNode
 */
DDP.Search.changeDateGo = function(dateGo, dateBack) {
	var goList = DDP.getNode(dateGo), backList = DDP.getNode(dateBack);
	var index = goList.selectedIndex + DDP.Search.Const.DATE_BACK_AFTER_DATE_GO;
	if (index >= backList.options.length) {
		index = backList.options.length - 1;
	}
	backList.selectedIndex = index;
};
/**
 * サブエリアプルダウンの値を県プルダウンの内容にあったものに変更
 * @param ken 県プルダウンのIDまたはNode
 * @param subArea サブエリアプルダウンのIDまたはNode
 * @param excludeSelectedOption 「選択してください」を追加しない場合は true。それ以外は全て false 。
 */
DDP.Search.changeSubAreaByKenArea = function(ken, subArea, excludeSelectedOption) {
	var excluding = !!excludeSelectedOption;
	var conf = ScriptResource.SubAreaList, ddlKen = DDP.getNode(ken), ddlSubArea = DDP.getNode(subArea);
	// 初期値を保持
	if (ddlSubArea.selectedIndex == -1) {
		ddlSubArea.selectedIndex = 0;
	}
	var prevValue = ddlSubArea.options[ddlSubArea.selectedIndex].value;
	ddlSubArea.options.length = 0;
	if (ddlKen.selectedIndex == -1) {
		ddlKen.selectedIndex = 0;
	}
	var kenCd = ddlKen.options[ddlKen.selectedIndex].value, selectedIndex = -1;
	if (kenCd != '' && conf[kenCd]) {
		var kConf = conf[kenCd];
		for(var subAreaCd in kConf.subAreas) {
			var sConf = kConf.subAreas[subAreaCd];
			if (ddlSubArea.options.length == 0 && !excluding) {
				DDP.addOption(ddlSubArea, DDP.Search.Const.SUB_AREA_NO_SELECTED_TEXT, '', DDP.Search.Const.SUB_AREA_NO_SELECTED_STYLE, '#cc6600');
			}
			DDP.addOption(ddlSubArea, sConf.name, subAreaCd);
			if (prevValue != '' && prevValue == subAreaCd) {
				selectedIndex = ddlSubArea.options.length - 1;
			}
		}
	} else {
		if (!excluding) {
			DDP.addOption(ddlSubArea, DDP.Search.Const.SUB_AREA_NO_SELECTED_TEXT, '', DDP.Search.Const.SUB_AREA_NO_SELECTED_STYLE, '#cc6600');
		}
	}
	// 初期値以外が設定されている場合はサブエリア(宿泊地区)の1件目をデフォルト表示
	if (ddlSubArea.options.length == 1) {
		ddlSubArea.selectedIndex = 0;
	} else if (selectedIndex > -1) {
		// 選択していた値が存在すれば、選択しなおす
		ddlSubArea.selectedIndex = selectedIndex;
	} else {
		ddlSubArea.selectedIndex = !excluding ? 1 : 0;
	}
	// 前回選択Indexも現在のものを入れておく
	ddlSubArea.prevIndex = ddlSubArea.selectedIndex;
};
/**
 * 県プルダウンの値を往路到着空港が所属する県に変更する
 * @param airport 往路到着空港プルダウンのIDまたはNode
 * @param ken 県エリアプルダウンのIDまたはNode
 */
DDP.Search.changeKenAreaByAirportCode = function(airport, ken, supportMap) {
	// 変更された空港プルダウンの内容を取得
	var ddlAirport = DDP.getNode(airport), ddlKen = DDP.getNode(ken);
	var airportCd = ddlAirport.options[ddlAirport.selectedIndex].value;
	// configより往路到着空港に一致する県コードを取得する
	var kenCode = '', conf = ScriptResource.AirportArea.setting;
	for(var i = 0, cLen = conf.length; i < cLen; i++) {
		var tConf = conf[i];
		// configに一致する空港コードが存在する場合県コードの値を保持
		if (tConf.airportCode != airportCd) continue;
		kenCode = tConf.kenCode;
		break;
	}
	// 県プルダウンの値を空港コードに対応する県に変更する
	for(var j=0,kLen=ddlKen.length; j<kLen; j++) {
		if (ddlKen[j].value != kenCode) continue;
		ddlKen.selectedIndex = j;
		break;
	}
	if (supportMap) {
		supportMap.write();
	}
};
/**
 * 飛び石プランの存在をチェックします。
 * @return エラーが発生している場合メッセージを返却。エラーが無い場合はnullを返却。
 * @type String
 */
DDP.Search.checkPlan = function() {
	var flag = false, idMgr = DDP.Search.idManager;
	// ヘッダと最終行はボタンが出力されるため終了条件を-2とする
	var l = _doc.getElementById('plan_table').rows.length - 2;
	var retArray = new Array(l);
	// 結果を配列に格納
	for(var i = 0; i < l; i++){
		retArray[i] = DDP.getNode(idMgr['stay_checkbox_' + (i + 1)]).checked;
	}
	var firstChecked = firstUnChecked = secondChecked = false;
	// 飛び石プランを検索
	for(var i = 0, rLen = retArray.length; i < rLen; i ++) {
		var ret = retArray[i];
		//チェックBOXがON、OFF、ONの順番があったらNG
		if (ret && !firstChecked) {
			// 最初のチェックBOXがON
			firstChecked = true;
		} else if (!ret && firstChecked && !firstUnChecked) {
			// 最初のチェックBOXがOFF
			firstUnChecked = true;
		} else if (ret && firstChecked && firstUnChecked) {
			// 飛び石プランが発生している場合
			return DDP.Search.Const.ERROR_MSG_JUMP_STAYDATE_PLAN;
		}
	}
	// チェックBOXが選択されてない場合
	if (!firstChecked){
		return DDP.Search.Const.ERROR_MSG_NON_SELECT_PLAN;
	}
	return null;
};
/**
 * 指定した時間帯に画面を移動させる
 * @param n 移動する時間対のindex
 */
DDP.Search.scrollTargetFlightTime = function(n) {
	_win.location.hash='time' + n.options[n.selectedIndex].value;
};
/**
 * エリアの値を一時保存用の隠しフィールドに一時保存します。
 * @param stayArea サブエリアプルダウンのID
 * @param stayAreaTempValue 一時保存用隠しフィールドのID
 */
DDP.Search.saveArea = function(area,areaTempValue) {
	DDP.getNode(areaTempValue).value = DDP.getNode(area).value;
};
/**
 * エリアを保存してある値に変更します。
 * @param stayArea サブエリアプルダウンのIDまたはNode
 * @param stayAreaTempValue 一時保存用隠しフィールドのIDまたはNode
 */
DDP.Search.setAreaByTempValue = function(area,areaTempValue) {
	var value = DDP.getNode(areaTempValue).value;
	if (value) {
		DDP.getNode(area).value = value;
	}
};
//////////////////////// 業務共通系ユーティリティ関数 END //////////////////////

//////////////////////// DDP.Search.PhotoList START //////////////////////
/**
 * 施設・プランなどの写真一覧
 */
DDP.Search.PhotoList = {};
/**
 * 縮小写真から拡大写真へのフォーカス移動を行います。
 * @param item フォーカス移動先
 */
DDP.Search.PhotoList.Link_Large_OnClientClick = function(item) {
	DDP.setVisible(DDP.getNode('small_div'), false);
	DDP.setVisible(DDP.getNode('large_div'), true);
	_win.location.href = item;
};
/**
 * 拡大写真から縮小写真へのフォーカス移動を行います。
 * @param item フォーカス移動先
 */
DDP.Search.PhotoList.Link_Small_OnClientClick = function(item) {
	DDP.setVisible(DDP.getNode('small_div'), true);
	DDP.setVisible(DDP.getNode('large_div'), false);
	_win.location.href = item;
};
/**
 * 拡大写真:次の写真/前の写真へのフォーカス移動を行います。
 * @param item フォーカス移動先
 */
DDP.Search.PhotoList.Link_OnClientClick = function(item) {
	_win.location.href = item;
};
//////////////////////// DDP.Search.PhotoList END //////////////////////

//////////////////////// DDP.Search.Element START //////////////////////
/**
 * 要素を表すクラスです。
 * @constructor
 * @param {String} id 要素のID
 */
DDP.Search.Element = function(id) {
	this.initialize.apply(this, arguments);
};
/**
 * prototypeを上書き。
 */
DDP.Search.Element.prototype = new DDP.Element();
/**
 * 初期化します。
 * @constructor
 * @param {String} id 要素のID
 */
DDP.Search.Element.prototype.initialize = function(id) {
	DDP.Element.prototype.initialize.apply(this, [id]);
};
//////////////////////// DDP.Search.Element START //////////////////////

//////////////////////// DDP.Search.PullDown START //////////////////////
/**
 * コンストラクタ
 * @class 検索パネルで使用するプルダウンを操作する為の親クラス
 * @constructor
 * @param idKey サーバ上でのコントロールID
 * @param notUseIdManager DDP.Search.idManagerを使用しない場合は true。
 */
DDP.Search.PullDown = function(idKey, notUseIdManager) {
	this.idKey = idKey;
	this.uniqueId = (notUseIdManager === true) ? idKey : DDP.Search.idManager[this.idKey];
};
/**
 * 指定したIDのプルダウンに指定したvalue値を設定して、現在の選択値を返します。
 * @param id select要素のID
 * @param value 取得するoptionのvalue属性値
 */
DDP.Search.PullDown.selectedValue = function(node, value) {
	if (!node) return null;
	if (node.options.length == 0) return null;
	if (!value) return node.options[node.selectedIndex].value;
	for(var i = 0, l = node.options.length; i < l; i++) {
		if (node.options[i].value != value) continue;
		node.selectedIndex = i;
		break;
	}
	return node.options[node.selectedIndex].value;
};
/**
 * 指定したIDのプルダウンから指定したvalueの項目のOptionNodeを取得します。
 * @param id select要素のID、または要素
 * @param value 取得するoptionのvalue属性値
 */
DDP.Search.PullDown.getOption = function(id, value) {
	var select = DDP.getNode(id);
	if (!select) return null;
	var op = select.options[DDP.Search.PullDown.getValueIndex(value)];
	return op.value == value ? op : null;
};
/**
 * Pull-Downで指定したValueの項目のIndexを取得します
 * @param id select要素のID、または要素
 * @param value 欲しいIndexのValue
 */
DDP.Search.PullDown.getValueIndex = function(id, value) {
	var select = DDP.getNode(id);
	if (!select) return -1;
	for(var i = 0, l = select.options.length; i < l; i++) {
		if (select.options[i].value != value) continue;
		return i;
	}
	return 0;
};
/**
 * 初期化メソッド
 * プルダウンが変更された際のイベントを登録します。
 */
DDP.Search.PullDown.prototype.init = function() {
	this.node = DDP.getNode(this.uniqueId);
	this.node.prevIndex = this.node.selectedIndex;
	this.category = this.idKey;
	var __this = this;
	// イベントの登録 : PullDown
	DDP.addEvent(__this.node, 'change', function() {
		__this.onChangeEvent();
		return false;
	});
};
/**
 * changeイベントが発生した場合の処理を記述
 * 継承したクラスによってオーバーライドされることを想定しています
 */
DDP.Search.PullDown.prototype.onChangeEvent = function() {
};
/**
 * Pull-Downで選択されている項目のValue値を取得します。
 * @return 選択されている項目のValue値
 */
DDP.Search.PullDown.prototype.getSelectedValue = function() {
	return this.getSelectedOption().value;
};
/**
 * Pull-Downで指定したValueの項目のOptionNodeを取得します。
 * @return 指定したValueの項目のOptionNode
 */
DDP.Search.PullDown.prototype.getOption = function(value) {
	var op = this.node.options[this.getValueIndex(value)];
	return op.value == value ? op : null;
};
/**
 * Pull-Downで選択されている項目のOptionNodeを取得します。
 * @return 選択されている項目のOptionNode
 */
DDP.Search.PullDown.prototype.getSelectedOption = function() {
	return this.node.options[this.getSelectedIndex()];
};
/**
 * Pull-Downで選択されている項目のインデックスを取得します。
 * @return 選択されている項目のインデックス
 */
DDP.Search.PullDown.prototype.getSelectedIndex = function() {
	return this.node.selectedIndex;
};
/**
 * Pull-Downで指定したValueの項目を選択項目とします
 * @param selectValue 選択したい項目のValue
 */
DDP.Search.PullDown.prototype.select = function(selectValue) {
	this.node.selectedIndex = this.getValueIndex(selectValue);
};
/**
 * Pull-Downで指定したIndexを選択項目とします
 * @param {Number} selectIndex 選択したい項目のIndex
 */
DDP.Search.PullDown.prototype.selectIndex = function(selectIndex) {
	this.node.selectedIndex = selectIndex;
};
/**
 * Pull-Downで指定したValueの項目のIndexを取得します
 * @param value 欲しいIndexのValue
 */
DDP.Search.PullDown.prototype.getValueIndex = function(value) {
	return DDP.Search.PullDown.getValueIndex(this.node, value);
};
/**
 * コントロールを使用不可に設定します
 */
DDP.Search.PullDown.prototype.disable = function() {
	this.node.disabled = true;
};
/**
 * コントロールを使用可能に設定します
 */
DDP.Search.PullDown.prototype.enable = function() {
	this.node.disabled = false;
};
///////////////////////// DDP.Search.PullDown END ///////////////////////

//////////////////////// DDP.Search.UnselectablePullDown START //////////////////////
/**
 * コンストラクタ
 * @class 未選択項目があるプルダウンを表現するクラスです。
 * @constructor
 * @param idKey サーバ上でのコントロールID
 */
DDP.Search.UnselectablePullDown = function(){
	// 親クラスとしての初期化
	DDP.Search.PullDown.apply(this, arguments);
	this.onChangeEventFuncList = [];
};
// プロトタイプをコピー
DDP.Search.UnselectablePullDown.prototype = new DDP.Search.PullDown();
// デフォルトスタイルあり
DDP.Search.UnselectablePullDown.prototype.noSelectItemStyle = DDP.Search.Const.NO_SELECT_PULLDOWN_STYLE;
/**
 * 初期化メソッド
 * プルダウンが変更された際のイベントを登録します。
 */
DDP.Search.UnselectablePullDown.prototype.init = function() {
	var __this = this;
	// 親クラスとしての初期化
	DDP.Search.PullDown.prototype.init.apply(this, arguments);
	this.node.options[0].className = this.noSelectItemStyle;
	// スタイル設定
	this.setStyle();
	this.onChangeEvent = function() {
		for(var key in __this.onChangeEventFuncList) {
			__this.onChangeEventFuncList[key].apply(__this, arguments);
		}
		return false;
	};
	this.addOnChangeEvent(function() { __this.setStyle(); });
};
/**
 * 現在の選択項目に合わせてスタイルを設定します。
 */
DDP.Search.UnselectablePullDown.prototype.setStyle = function() {
	if (this.getSelectedIndex() == 0) {
		DDP.addClass(this.node, this.noSelectItemStyle);
	} else {
		DDP.removeClass(this.node, this.noSelectItemStyle);
	}
};
/**
 * 指定したValueを持つ項目を選択します。
 * @param selectValue 選択する値
 */
DDP.Search.UnselectablePullDown.prototype.select = function(selectValue) {
	DDP.Search.PullDown.prototype.select.apply(this, arguments);
	this.setStyle();
};
/**
 * changeイベントで処理するfunctionを追加します。
 */
DDP.Search.UnselectablePullDown.prototype.addOnChangeEvent = function(func) {
	this.onChangeEventFuncList.push(func);
};
/**
 * 指定したlistで、プルダウンの内容を置き換えます。
 * @param list 置き換えるプルダウンの内容
 */
DDP.Search.UnselectablePullDown.prototype.shiftAll = function(list) {
	// データが存在しない場合、空を設定する
	list = list || {};
	var n = this.node, options = n.options;
	// 「選択してください」以外を削除
	options.length = 1;
	// listの中身をoptionsに設定する
	for(var code in list) {
		DDP.addOption(n, list[code], code);
	}
	// デフォルト一つ目を選択
	n.selectedIndex = (options.length <= 1) ? 0 : 1;
};
//////////////////////// DDP.Search.UnselectablePullDown END //////////////////////

////////////////////// DDP.Search.FromToPullDowns START //////////////////////
/**
 * コンストラクタ
 * @class 連動する2組の開始・終了プルダウンを表現するクラスです。
 * @constructor
 * @param sFromNode 連動元開始プルダウン
 * @param sToNode 連動元終了プルダウン
 * @param dFromNode 連動先開始プルダウン
 * @param dToNode 連動先終了プルダウン
 */
DDP.Search.FromToPullDowns = function(sFromNode, sToNode, dFromNode, dToNode) {
	this.sFromNode = sFromNode;
	this.sToNode = sToNode;
	this.dFromNode = dFromNode;
	this.dToNode = dToNode;
	return this;
};
/**
 * 更新処理を行います。
 */
DDP.Search.FromToPullDowns.prototype.update = function() {
	var sv = DDP.Search.PullDown.selectedValue;
	var fromSelected = sv(this.dFromNode), toSelected = sv(this.dToNode);
	var fromYmd = sv(this.sFromNode), toYmd = sv(this.sToNode);
	var fromDt = new DDP.DateTime(fromYmd.substr(0, 4), fromYmd.substr(4, 2), fromYmd.substr(6, 2));
	var toDt = new DDP.DateTime(toYmd.substr(0, 4), toYmd.substr(4, 2), toYmd.substr(6, 2));
	var dt = fromDt, len = 0, idx, fromSelectedIdx = -1, toSelectedIdx = -1;
	this.dFromNode.options.length = len;
	this.dToNode.options.length = len;
	while(true) {
		len++;
		idx = len - 1;
		this.dFromNode.options.length = len;
		this.dToNode.options.length = len;
		var fromOption = this.dFromNode.options[idx];
		var toOption = this.dToNode.options[idx];
		fromOption.value = toOption.value = dt.toString('yyyyMMdd');
		fromOption.text = toOption.text = dt.toString('M月d日');
		if (dt.compareTo(toDt) >= 0) {
			break;
		}
		dt = dt.addDays(1);
	}
	this.dFromNode.selectedIndex = 0;
	this.dToNode.selectedIndex = idx;
}
//////////////////////// DDP.Search.FromToPullDowns END //////////////////////

////////////////////// DDP.Search.RadioButton START //////////////////////
/**
 * コンストラクタ
 * @class ラジオボタンを操作する為の親クラス
 * @constructor
 * @param node 対象のノード
 */
DDP.Search.RadioButton = function (node) {
	this.node = node;
	this.label = null;
	return this;
};
/**
 * 初期化メソッド
 */
DDP.Search.RadioButton.prototype.init = function () {
	var __this = this;
	var next = DDP.Element.next(this.node);
	if (next && next.nodeName.toUpperCase() == 'LABEL') {
		this.label = next;
	}
	// イベントの登録 : Radioボタン
	DDP.addEvent(__this.node, 'click', function() {
		if (!__this.node.disabled) {
			__this.onClickEvent();
		}
	});
};
/**
 * スタイル設定メソッド
 * 選択済みの場合は、選択済みスタイルを、通常時は、通常スタイルを設定します。
 */
DDP.Search.RadioButton.prototype.setStyle = function() {
	if (this.node.checked) {
		this.setSelectedStyle();
	} else {
		this.setNormalStyle();
	}
};
/**
 * ラジオボタンを選択にします。
 */
DDP.Search.RadioButton.prototype.select = function() {
	this.node.checked = true;
};
/**
 * ラジオボタンの選択解除します。
 */
DDP.Search.RadioButton.prototype.unselect = function() {
	this.node.checked = false;
};
/**
 * 選択されているかどうかを示す値を取得します。
 * @return {Boolean}
 */
DDP.Search.RadioButton.prototype.selected = function() {
	return this.node.checked;
};
/**
 * 選択済み項目 スタイル設定抽象メソッド
 * 継承したクラスによってオーバーライドされることを想定しています
 */
DDP.Search.RadioButton.prototype.setSelectedStyle = function() {
	// 実装なし
};
/**
 * 通常項目 スタイル設定抽象メソッド
 * 継承したクラスによってオーバーライドされることを想定しています
 */
DDP.Search.RadioButton.prototype.setNormalStyle = function() {
	// 実装なし
};
/**
 * クリック時イベント抽象メソッド
 * 継承したクラスによってオーバーライドされることを想定しています
 */
DDP.Search.RadioButton.prototype.onClickEvent = function() {
	// 実装なし
};
/*
 * 値を取得します。
 * @return {String}
 */
DDP.Search.RadioButton.prototype.getValue = function() {
	return this.node.value;
};
/**
 * コントロールを使用不可に設定します
 */
DDP.Search.RadioButton.prototype.disable = function() {
	this.node.disabled = true;
	if (this.label) {
		DDP.addClass(this.label, DDP.Search.Const.DISABLE_STYLE);
	}
};
/**
 * コントロールを使用可能に設定します
 */
DDP.Search.RadioButton.prototype.enable = function() {
	this.node.disabled = false;
	if (this.label) {
		DDP.removeClass(this.label, DDP.Search.Const.DISABLE_STYLE);
	}
};
/////////////////////// DDP.Search.RadioButton END ///////////////////////

////////////////////// DDP.Search.SyncCondition START //////////////////////
/**
 * @class 同期コントロールをまとめるクラスです。
 */
DDP.Search.SyncCondition = function(config) {
	var isNotNull = !!config;
	var fnc = function(val) {
		return !!val ? val : null;
	};
	// 必要なIDを格納
	this.rentalStartArea = isNotNull ? fnc(config.rentalStartArea) : null;
	this.rentalStartSubArea = isNotNull ? fnc(config.rentalStartSubArea) : null;
	this.rentalStartOffice = isNotNull ? fnc(config.rentalStartOffice) : null;
	this.rentalEndArea = isNotNull ? fnc(config.rentalEndArea) : null;
	this.rentalEndSubArea = isNotNull ? fnc(config.rentalEndSubArea) : null;
	this.rentalEndOffice = isNotNull ? fnc(config.rentalEndOffice) : null;
	this.airportGoDeparture = isNotNull ? fnc(config.airportGoDeparture) : null;
	this.airportGoArrive = isNotNull ? fnc(config.airportGoArrive) : null;
	this.airportBackDeparture = isNotNull ? fnc(config.airportBackDeparture) : null;
	this.airportBackArrive = isNotNull ? fnc(config.airportBackArrive) : null;
	this.hotelArea = isNotNull ? fnc(config.hotelArea) : null;
	this.hotelSubArea = isNotNull ? fnc(config.hotelSubArea) : null;
	/** * 航空＋宿泊＋レンタカー */
	this.searchKbn1 = isNotNull ? fnc(config.searchKbn1) : null;
	/** * 航空＋宿泊 */
	this.searchKbn2 = isNotNull ? fnc(config.searchKbn2) : null;
	/** * 宿泊＋レンタカー */
	this.searchKbn3 = isNotNull ? fnc(config.searchKbn3) : null;
	/** 宿泊サブエリアのテーブルメニュー @type {DDP.TableMenu} */
	this.hotelSubAreaTableMenu = isNotNull ? fnc(config.hotelSubAreaTableMenu) : null;
	return this;
};
DDP.Search.SyncCondition.prototype.hasKbn = function() {
	return (
		this.searchKbn1 != null &&
		this.searchKbn2 != null &&
		this.searchKbn3 != null);
};
////////////////////// DDP.Search.SyncCondition END //////////////////////

////////////////////// DDP.Search.SyncManager START //////////////////////
/**
 * コンストラクタ
 * @class 検索条件の同期処理をとりまとめるクラスです。
 * @constructor
 * @param {DDP.Search.SyncCondition} syncCondition 同期コントロール
 */
DDP.Search.SyncManager = function(syncCondition) {
	/** 同期コントロール @property @type {DDP.Search.SyncCondition} */
	this.syncCondition = syncCondition;
	return this;
};
/*
 * 日付プルダウンを同期します。
 * @param source 設定元プルダウンエレメントまたはID
 * @param destination 設定先プルダウンエレメントまたはID
 * @param addIndex このパラメータが設定されている場合は、source.selectedIndex+addIndexをdescription.selectedIndexに設定します。
 */
DDP.Search.SyncManager.syncDatePullDown = function(source, description, addIndex) {
	if (addIndex === undefined) {
		DDP.syncPullDownSelectedValue(source, description);
	} else {
		var sn = DDP.getNode(source), dn = DDP.getNode(description), idx = sn.selectedIndex + addIndex;
		dn.selectedIndex = (idx >= dn.options.length ? dn.options.length - 1 : idx);
	}
};
/**
 * DDP.Search.SyncCondition オブジェクトを取得する。
 * @return {DDP.Search.SyncCondition}
 */
DDP.Search.SyncManager.prototype.getCondition = function() {
	return this.syncCondition;
};
/**
 * DDP.Search.SyncCondition オブジェクトを取得する。
 * @param {DDP.Search.SyncCondition} condition DDP.Search.SyncCondition オブジェクト
 */
DDP.Search.SyncManager.prototype.setCondition = function(condition) {
	this.syncCondition = condition;
};
/**
 * 往路到着地からレンタカー貸出条件のシンクロを行います
 */
DDP.Search.SyncManager.prototype.syncRentalStartOfficeByGoArriveAirport = function() {
	var c = this.syncCondition;
	this.syncRentalOfficeByAirport(c.airportGoArrive, c.rentalStartArea, c.rentalStartSubArea, c.rentalStartOffice);
};
/**
 * 店舗プルダウンの値をサブエリアプルダウンの内容にあったものに変更
 * @param subAreaId サブエリアプルダウンのID
 * @param office 店舗プルダウンのID
 * @param excludeSelectedOption 「選択してください」を追加しない場合は true。それ以外は全て false 。
 */
DDP.Search.SyncManager.prototype.changeOfficeBySubArea= function(subArea, office, excludeSelectedOption) {
	var excluding = !!excludeSelectedOption, selectedIndex = -1;
	if (!ScriptResource.RentalOffice.hashedSettings) {
		var itm, setting = ScriptResource.RentalOffice.setting, hashed = {};
		for(var i = 0, l = setting.length; i < l; i++) {
			itm = setting[i];
			if (!hashed[itm.subAreaCode]) {
				hashed[itm.subAreaCode] = [];
			}
			hashed[itm.subAreaCode][hashed[itm.subAreaCode].length] =
				{ officeCode: itm.officeCode, officeName: itm.officeName };
		}
		ScriptResource.RentalOffice.hashedSettings = hashed;
	}
	var conf = ScriptResource.RentalOffice.hashedSettings, ddlSubArea = DDP.getNode(subArea), ddlOffice = DDP.getNode(office);
	// 初期値を保持
	if (ddlOffice.selectedIndex == -1) {
		ddlOffice.selectedIndex = 0;
	}
	var prevValue = ddlOffice.length == 0 ? '' : ddlOffice.options[ddlOffice.selectedIndex].value;
	ddlOffice.options.length = 0;
	if (ddlSubArea.selectedIndex == -1) {
		ddlSubArea.selectedIndex = 0;
	}
	var strOffice2 = ddlSubArea.options[ddlSubArea.selectedIndex].value;
	if (!excluding) {
		// 1レコード目は選択してください
		DDP.addOption(ddlOffice, DDP.Search.Const.SUB_AREA_NO_SELECTED_TEXT, '', DDP.Search.Const.SUB_AREA_NO_SELECTED_STYLE, '#cc6600');
	}
	if (strOffice2 != '' && conf[strOffice2]) {
		var saConf = conf[strOffice2];
		for(var i = 0, l = saConf.length; i < l; i++) {
			var tConf = saConf[i];
			DDP.addOption(ddlOffice, tConf.officeName, tConf.officeCode, null, 'black');
			if (prevValue != '' && prevValue == tConf.officeCode) {
				selectedIndex = ddlOffice.options.length - 1;
			}
		}
	}
	// 初期値以外が設定されている場合はサブエリア(宿泊地区)の1件目をデフォルト表示
	if (ddlOffice.options.length == 1) {
		ddlOffice.selectedIndex = 0;
	} else if (selectedIndex > -1) {
		ddlOffice.selectedIndex = selectedIndex;
	} else {
		ddlOffice.selectedIndex = !excluding ? 1 : 0;
	}
	// 前回選択Indexも現在のものを入れておく
	ddlOffice.prevIndex = ddlOffice.selectedIndex;
};
/**
 * 往路到着地からレンタカー返却条件のシンクロを行います
 */
DDP.Search.SyncManager.prototype.syncRentalEndOfficeByGoArriveAirport = function() {
	var c = this.syncCondition;
	this.syncRentalOfficeByAirport(c.airportGoArrive, c.rentalEndArea, c.rentalEndSubArea, c.rentalEndOffice);
};
/**
 * 復路出発地からレンタカー返却条件のシンクロを行います
 */
DDP.Search.SyncManager.prototype.syncRentalEndOfficeByGoArriveAirport = function() {
	var c = this.syncCondition;
	this.syncRentalOfficeByAirport(c.airportBackDeparture, c.rentalEndArea, c.rentalEndSubArea, c.rentalEndOffice);
};
/**
 * 復路出発地からレンタカー返却条件のシンクロを行います
 */
DDP.Search.SyncManager.prototype.syncRentalEndOfficeByBackDepartureAirport = function() {
	var c = this.syncCondition;
	this.syncRentalOfficeByAirport(c.airportBackDeparture, c.rentalEndArea, c.rentalEndSubArea, c.rentalEndOffice);
};
/**
 * 空港からレンタカー条件のシンクロを行います
 * @param airportListId 空港リスト
 * @param rentalAreaId レンタカー地域
 * @param rentalSubAreaId レンタカー地区
 * @param rentalOfficeId レンタカー店舗
 */
DDP.Search.SyncManager.prototype.syncRentalOfficeByAirport = function(
	airportListId, rentalAreaId, rentalSubAreaId, rentalOfficeId) {
	var _airportList = DDP.getNode(airportListId);
	var _rentalAreaList = DDP.getNode(rentalAreaId);
	var _rentalSubAreaList = DDP.getNode(rentalSubAreaId);
	var _rentalOfficeList = DDP.getNode(rentalOfficeId);
	_airportList.selectedIndex = _airportList.selectedIndex == -1 ? 0 : _airportList.selectedIndex;
	var _airportCd = _airportList.options[_airportList.selectedIndex].value;
	var _areaCode = '', _subAreaCode = '', _officeCode = '';
	// configより空港に一致する県コードを取得する
	var conf = ScriptResource.AirportRentalOffice.setting;
	for(var i = 0, l = conf.length; i < l; i++) {
		var tConf = conf[i];
		// configに一致する空港コードが存在する場合県コードの値を保持
		if (tConf.airPortCd != _airportCd) continue;
		_areaCode = tConf.areaCd;
		_subAreaCode = tConf.subAreaCd;
		_officeCode =  tConf.officeCd;
		break;
	}
	// 県プルダウンの値を空港コードに対応する県に変更する
	for(var j=0, l=_rentalAreaList.length; j<l; j++) {
		if (_rentalAreaList[j].value != _areaCode) continue;
		// サブエリアの更新
		_rentalAreaList.selectedIndex = j;
		DDP.Search.changeSubAreaByKenArea(rentalAreaId, rentalSubAreaId);
		break;
	};
	// サブエリアプルダウンの値を空港コードに対応する県に変更する
	for(var k=0, l=_rentalSubAreaList.length; k<l; k++) {
		if (_rentalSubAreaList[k].value != _subAreaCode) continue;
		// 店舗の更新
		_rentalSubAreaList.selectedIndex = k;
		this.changeOfficeBySubArea(rentalSubAreaId, rentalOfficeId);
		break;
	};
	for(var n=0,l=_rentalOfficeList.length; n<l; n++) {
		if (_rentalOfficeList[n].value != _officeCode) continue;
		_rentalOfficeList.selectedIndex = n;
		break;
	}
};
/**
 * 貸出エリアと返却エリアの同期を取ります。
 */
DDP.Search.SyncManager.prototype.syncRentalEndAreaByRentalStartArea = function(){
	var c = this.syncCondition;
	DDP.syncPullDownSelectedValue(c.rentalStartArea, c.rentalEndArea);
	DDP.Search.changeSubAreaByKenArea(c.rentalEndArea, c.rentalEndSubArea);
	this.changeOfficeBySubArea(c.rentalEndSubArea, c.rentalEndOffice);
};
/**
 * 貸出エリアと地区の同期をとります。
 */
DDP.Search.SyncManager.prototype.syncRentalStartAreaConditionByKenArea = function() {
	var c = this.syncCondition;
	if (c.hasKbn() && this.getRsvKbn() != DDP.Search.Const.RSV_KBN_HOTEL_CAR) return;
	DDP.syncPullDownSelectedValue(c.hotelArea, c.rentalStartArea);
	DDP.Search.changeSubAreaByKenArea(c.rentalStartArea, c.rentalStartSubArea);
	this.changeOfficeBySubArea(c.rentalStartSubArea, c.rentalStartOffice);
};
/**
 * 貸出エリアと地区の同期をとります。
 */
DDP.Search.SyncManager.prototype.syncRentalEndAreaConditionByKenArea = function() {
	var c = this.syncCondition;
	if (c.hasKbn() && this.getRsvKbn() != DDP.Search.Const.RSV_KBN_HOTEL_CAR) return;
	DDP.syncPullDownSelectedValue(c.hotelArea, c.rentalEndArea);
	DDP.Search.changeSubAreaByKenArea(c.rentalEndArea, c.rentalEndSubArea);
	this.changeOfficeBySubArea(c.rentalEndSubArea, c.rentalEndOffice);
};
/**
 * 貸出エリアとレンタカー貸出地区の同期をとります。
 */
DDP.Search.SyncManager.prototype.syncRentalStartCarConditionBySubArea = function() {
	var c = this.syncCondition;
	if (c.hasKbn() && this.getRsvKbn() != DDP.Search.Const.RSV_KBN_HOTEL_CAR) return;
	DDP.syncPullDownSelectedValue(c.hotelSubArea, c.rentalStartSubArea);
	this.changeOfficeBySubArea(c.rentalStartSubArea, c.rentalStartOffice);
};
/**
 * 返却エリアと宿泊地区の同期をとります。
 */
DDP.Search.SyncManager.prototype.syncRentalEndCarConditionBySubArea = function() {
	var c = this.syncCondition;
	if (c.hasKbn() && this.getRsvKbn() != DDP.Search.Const.RSV_KBN_HOTEL_CAR) return;
	DDP.syncPullDownSelectedValue(c.hotelSubArea, c.rentalEndSubArea);
	this.changeOfficeBySubArea(c.rentalEndSubArea, c.rentalEndOffice);
};
/**
 * 貸出地区と返却地区の同期を取ります
 */
DDP.Search.SyncManager.prototype.syncRentalEndSubAreaByRentalStartArea = function() {
	var c = this.syncCondition;
	DDP.syncPullDownSelectedValue(c.rentalStartSubArea, c.rentalEndSubArea);
	this.changeOfficeBySubArea(c.rentalEndSubArea, c.rentalEndOffice);
};
/**
 * 貸出店舗と返却店舗の同期を取ります
 */
DDP.Search.SyncManager.prototype.syncRentalEndOfficeByRentalStartOffice = function() {
	var c = this.syncCondition;
	DDP.syncPullDownSelectedValue(c.rentalStartOffice, c.rentalEndOffice);
};
/**
 * 予約区分を取得します
 * @param {} airHotelCar 航空＋宿泊＋レンタカー
 * @param {} airHotel 航空＋宿泊
 * @param {} hotelCar 宿泊＋レンタカー
 * @return {Number} 予約区分
 */
DDP.Search.SyncManager.prototype.getRsvKbn = function(airHotelCar,airHotel,hotelCar) {
	var c = this.syncCondition;
	airHotelCar = airHotelCar ? airHotelCar : c.searchKbn1;
	airHotel = airHotel ? airHotel : c.searchKbn2;
	hotelCar = hotelCar ? hotelCar : c.searchKbn3;
	if (DDP.getNode(airHotelCar).checked) {
		return DDP.Search.Const.RSV_KBN_AIR_HOTEL_CAR;
	}else if (DDP.getNode(airHotel).checked) {
		return DDP.Search.Const.RSV_KBN_AIR_HOTEL;
	}
	return DDP.Search.Const.RSV_KBN_HOTEL_CAR;
};
/**
 * レンタカー貸出地域から貸出地区を設定します
 */
DDP.Search.SyncManager.prototype.syncRentalStartSubAreaByRentalStartArea = function(){
	var c = this.syncCondition;
	DDP.Search.changeSubAreaByKenArea(c.rentalStartArea, c.rentalStartSubArea);
};
/**
 * レンタカー返却地域から返却地区を設定します
 */
DDP.Search.SyncManager.prototype.syncRentalEndSubAreaByRentalEndArea = function(){
	var c = this.syncCondition;
	DDP.Search.changeSubAreaByKenArea(c.rentalEndArea, c.rentalEndSubArea);
};
/**
 * レンタカー貸出地区から貸出店舗を設定します
 */
DDP.Search.SyncManager.prototype.syncRentalStartOfficeByRentalStartSubtArea = function(){
	var c = this.syncCondition;
	this.changeOfficeBySubArea(c.rentalStartSubArea, c.rentalStartOffice);
};
/**
 * レンタカー返却地区から返却店舗を設定します
 */
DDP.Search.SyncManager.prototype.syncRentalEndOfficeByRentalEndSubtArea = function(){
	var c = this.syncCondition;
	this.changeOfficeBySubArea(c.rentalEndSubArea, c.rentalEndOffice);
};
/**
 * サブエリアのキーを元にメッシュ情報を取得しドロップダウンに設定する
 * @param subArea サブエリアのID
 * @param mesh サブエリアのID
 */
DDP.Search.SyncManager.prototype.syncMeshBySubArea = function(subArea, mesh, unselect){
	var subAreaPullDown = new DDP.Search.UnselectablePullDown(subArea);
	var meshPullDown = new DDP.Search.UnselectablePullDown(mesh);
	//subAreaPullDown.noSelectItemStyle = '';
	meshPullDown.noSelectItemStyle = '';
	meshPullDown.init();
	subAreaPullDown.init();
	 //  サブエリアのデータよりメッシュデータを取得しの再設定する
	meshPullDown.shiftAll(ScriptResource.MeshList[subAreaPullDown.getSelectedValue()]);
	if (!!unselect && unselect) {
		meshPullDown.selectIndex(0);
	}
	meshPullDown.onChangeEvent();
};
/**
 * 出発日の同期を取ります
 */
DDP.Search.SyncManager.prototype.syncGoDate = function(rdo) {
	var getN = DDP.getNode, c = this.syncCondition;
	getN(c.goDate).value = getN(c.stepGoDate).value = getN(c.stepAirGoDate).value = getN(c.stepCarGoDate).value = rdo.value;
};
/**
 * 出発時間の同期を取ります
 */
DDP.Search.SyncManager.prototype.syncTimeGo = function(rdo) {
	var c = this.syncCondition;
	DDP.getNode(c.timeGo).value = DDP.getNode(c.stepAirTimeGo).value = rdo.value;
};
/**
 * 出発空港の同期を取ります
 */
DDP.Search.SyncManager.prototype.syncAirportGoDeparture = function(rdo) {
	var c = this.syncCondition;
	DDP.getNode(c.airportGoDeparture).value = DDP.getNode(c.stepAirAirportGoDeparture).value = rdo.value;
};
/**
 * 到着空港の同期を取ります
 */
DDP.Search.SyncManager.prototype.syncAirportGoArrive = function(rdo) {
	var c = this.syncCondition;
	DDP.getNode(c.airportGoArrive).value = DDP.getNode(c.stepAirAirportGoArrive).value = rdo.value;
};
/**
 * 帰着日より泊数の同期を取ります
 */
DDP.Search.SyncManager.prototype.syncStayCountByBackDate = function() {
	var c = this.syncCondition;
	//  出発日取得
	var goDateStr = DDP.getNode(c.goDate).value;
	var year = goDateStr.substring(0, 4), month = goDateStr.substring(4, 6), day = goDateStr.substring(6, 8);
	var startDate = new Date(year,month, day);
	//  帰着日取得
	var backDateStr = DDP.getNode(c.backDate).value;
	var bYear = backDateStr.substring(0, 4), bMonth = backDateStr.substring(4, 6), bDay = backDateStr.substring(6, 8);
	var endDate = new Date(bYear, bMonth, bDay);
	//  泊数の算出
	var stayCount = DDP.Search.getDateSpan(startDate, endDate);
	//  帰着日算出用
	var backDate;
	if (stayCount <= 0){
		//  泊数が0以下の場合は1泊とする
		DDP.getNode(c.stepStayCount).value = '1';
		backDate = DDP.Search.addDate(year, month, day, '1');
	} else if (stayCount > 7){
		//  7泊より多い場合は7泊とする
		DDP.getNode(c.stepStayCount).value = '7';
		backDate = DDP.Search.addDate(year, month, day, '7');
	} else {
		//  泊数を設定する
		DDP.getNode(c.stepStayCount).value = stayCount.toString();
		backDate = DDP.Search.addDate(year, month, day, stayCount);
	}
	//  ステップ予約：宿泊の帰着日を隠し項目に設定
	DDP.getNode(c.stepStayCountCalcHidden).value =
		  backDate.getFullYear().toString()
		+ backDate.getMonth().toString()
		+ backDate.getDate().toString();
};
/**
 * 人数、部屋定員の同期を取ります
 */
DDP.Search.SyncManager.prototype.syncCapacityRoomMax = function(rdo) {
	var c = this.syncCondition,
		roomMax_ = DDP.getNode(c.roomMax), stepRoomMax_ = DDP.getNode(c.stepRoomMax);
	//  6名以上の場合、人数は連動しない
	if (rdo.value > '6') {
		roomMax_.value = stepRoomMax_.value = rdo.value;
	} else {
		DDP.getNode(c.capacity).value = roomMax_.value = stepRoomMax_.value = rdo.value;
	}
};
/**
 * 泊数より帰着日を計算しHidden項目へ設定します。
 */
DDP.Search.SyncManager.prototype.calcBackDate = function() {
	var c = this.syncCondition;
	//  出発日取得
	var goDateStr = DDP.getNode(c.stepGoDate).value;
	var year = goDateStr.substring(0, 4), month = goDateStr.substring(4, 6), day = goDateStr.substring(6, 8);
	var addDays = parseInt(DDP.getNode(c.stepStayCount).value);
	//  帰着日の算出
	var bD = DDP.Search.addDate(year, month, day, addDays);
	//  ステップ予約：宿泊の帰着日を隠し項目に設定
	DDP.getNode(c.stepStayCountCalcHidden).value =
		bD.getFullYear().toString() + bD.getMonth().toString() + bD.getDate().toString();
};
/**
 * 泊数より帰着日を計算しHidden項目へ設定します。
 */
DDP.Search.SyncManager.prototype.syncStayCountDisable = function() {
	var c = this.syncCondition;
	var stepStayCount_ = DDP.getNode(c.stepStayCount);
	if (DDP.getNode(c.stepGoDate).value == '') {
		stepStayCount_.disabled = true;
		stepStayCount_.selectedIndex = 0;
	} else {
		stepStayCount_.disabled = false;
	}
};
/**
 * 貸出エリアと地区の同期をとります。
 */
DDP.Search.SyncManager.prototype.syncRentalStartAreaConditionByStepKenArea = function() {
	var c = this.syncCondition;
	DDP.syncPullDownSelectedValue(c.hotelArea, c.rentalStartArea);
	DDP.Search.changeSubAreaByKenArea(c.rentalStartArea, c.rentalStartSubArea);
	this.changeOfficeBySubArea(c.rentalStartSubArea, c.rentalStartOffice);
};
/**
 * 返却エリアと地区の同期をとります。
 */
DDP.Search.SyncManager.prototype.syncRentalEndAreaConditionByStepKenArea = function() {
	var c = this.syncCondition;
	DDP.syncPullDownSelectedValue(c.hotelArea, c.rentalEndArea);
	DDP.Search.changeSubAreaByKenArea(c.rentalEndArea, c.rentalEndSubArea);
	this.changeOfficeBySubArea(c.rentalEndSubArea, c.rentalEndOffice);
};
/**
 * 貸出エリアとレンタカー貸出地区の同期をとります。
 */
DDP.Search.SyncManager.prototype.syncRentalStartCarConditionByStepSubArea = function() {
	var c = this.syncCondition;
	DDP.syncPullDownSelectedValue(c.hotelSubArea, c.rentalStartSubArea);
	this.changeOfficeBySubArea(c.rentalStartSubArea, c.rentalStartOffice);
};
/**
 * 返却エリアと宿泊地区の同期をとります。
 */
DDP.Search.SyncManager.prototype.syncRentalEndCarConditionByStepSubArea = function() {
	var c = this.syncCondition;
	DDP.syncPullDownSelectedValue(c.hotelSubArea, c.rentalEndSubArea);
	this.changeOfficeBySubArea(c.rentalEndSubArea, c.rentalEndOffice);
};
/**
 * リストで選択された空港によってキャリアによってボタンのdisabledを切り替える
 * @param {Boolean} changingImg 明示的に指定された場合にsearchBttnJal,searchBttnAnaのsrc要素を変更します。
 */
DDP.Search.SyncManager.prototype.searchBttnCheck = function(
	airportDeparture, airportArrive, searchBttnJal, searchBttnAna, changingImg) {
	var DSC = DDP.Search.Const, jalBttnFlg = true, anaBttnFlg = true;
	//JAL検索ボタンの切り替え
	if (this.searchAiportCarrierCheck(airportDeparture.value, DSC.CARRIER_JAL) &&
		this.searchAiportCarrierCheck(airportArrive.value, DSC.CARRIER_JAL)) {
		jalBttnFlg = false;
	}
	//ANA検索ボタンの切り替え
	if (this.searchAiportCarrierCheck(airportDeparture.value, DSC.CARRIER_ANA) &&
		this.searchAiportCarrierCheck(airportArrive.value, DSC.CARRIER_ANA)) {
		anaBttnFlg = false;
	}
	searchBttnJal.disabled = jalBttnFlg;
	searchBttnAna.disabled = anaBttnFlg;
	if (!!changingImg) {
		if (searchBttnJal.src) {
			searchBttnJal.src = DSC.AIR_TOP_SEARCH_BUTTON_PATH + (jalBttnFlg ?
				DSC.AIR_TOP_SEARCH_BUTTON_JAL_DISABLED :
				DSC.AIR_TOP_SEARCH_BUTTON_JAL_ENABLE);
		}
		if (searchBttnAna.src) {
			searchBttnAna.src = DSC.AIR_TOP_SEARCH_BUTTON_PATH + (anaBttnFlg ?
				DSC.AIR_TOP_SEARCH_BUTTON_ANA_DISABLED :
				DSC.AIR_TOP_SEARCH_BUTTON_ANA_ENABLE);
		}
	}
};
/**
 * 指定された空港が指定されたキャリアで使用されているかをチェックします
 */
DDP.Search.SyncManager.prototype.searchAiportCarrierCheck = function(value, carrierKbn){
	//空港とキャリアの情報の取得
	//キャリアが運航しているかどうかのフラグ
	var conf = ScriptResource.AirportCarrier.setting, carrierFlg = false;
	for(var i = 0, cLen = conf.length; i < cLen; i++) {
		var tConf = conf[i];
		if (tConf.airportCode != value) continue;
		if (carrierKbn == DDP.Search.Const.CARRIER_JAL) {
			//JALが運航している場合、フラグを更新
			if (tConf.jal == '1') {
				carrierFlg = true;
			}
		} else if (carrierKbn == DDP.Search.Const.CARRIER_ANA) {
			//ANAが運航している場合、フラグを更新
			if (tConf.ana == '1') {
				carrierFlg = true;
			}
		}
		break;
	}
	return carrierFlg;
};
////////////////////// DDP.Search.SyncManager END //////////////////////

////////////////////// DDP.Search.MapSearchType START //////////////////////
DDP.Search.MapSearchType = {
	Unknown           : '',
	AirGoDeparture    : '00',
	AirGoArrival      : '01',
	AirReturnDeparture: '02',
	AirReturnArrival  : '03',
	HotelSubArea      : '04',
	CarRentalStart    : '05',
	CarRentalEnd      : '06'
};
////////////////////// DDP.Search.MapSearchType END //////////////////////

////////////////////// DDP.Search.DefaultValuesElements START //////////////////////
/**
 * 既定値を設定する要素を格納するオブジェクト。
 * @param {DDP.Search.DefaultValuesElements.Common} common 既定値を設定する共通要素
 * @param {DDP.Search.DefaultValuesElements.Air} air 既定値を設定する航空要素
 * @param {DDP.Search.DefaultValuesElements.Hotel} hotel 既定値を設定する宿泊要素
 * @param {DDP.Search.DefaultValuesElements.Car} car 既定値を設定するレンタカー要素
 */
DDP.Search.DefaultValuesElements = function(common, air, hotel, car) {
	this.common = common;
	this.air = air;
	this.hotel = hotel;
	this.car = car;
};
/**
 * IDからPullDownのインスタンスを作成して返します。
 * IDがnullの場合は、 null を返します。
 * @param {String} id PullDownのID。
 * @return {DDP.Search.PullDown}
 */
DDP.Search.DefaultValuesElements.getPullDownInstance = function(id) {
	var pullDown = null;
	if (id != null) {
		pullDown = new DDP.Search.PullDown(id);
		pullDown.init();
	}
	return pullDown;
};
////////////////////// DDP.Search.DefaultValuesElements END //////////////////////

////////////////////// DDP.Search.DefaultValuesElements.Common START //////////////////////
/**
 * 既定値を設定する共通要素を格納するオブジェクト。
 */
DDP.Search.DefaultValuesElements.Common = function(per, goDate, goTime, reDate, reTime) {
	var gi = DDP.Search.DefaultValuesElements.getPullDownInstance;
	this.per = gi(per);
	this.goDate = gi(goDate);
	this.goTime = gi(goTime);
	this.reDate = gi(reDate);
	this.reTime = gi(reTime);
};
////////////////////// DDP.Search.DefaultValuesElements.Common END //////////////////////

////////////////////// DDP.Search.DefaultValuesElements.Air START //////////////////////
/**
 * 既定値を設定する航空要素を格納するオブジェクト。
 * @param {String} goDep 往路出発空港
 * @param {String} goArr 往路到着空港
 * @param {String} goSeat 往路座席
 * @param {String} goFee 往路運賃
 * @param {String} reDep 復路出発空港
 * @param {String} reArr 復路到着空港
 * @param {String} reSeat 復路座席
 * @param {String} reFee 復路運賃
 * @param {String} airline 航空会社
 */
DDP.Search.DefaultValuesElements.Air = function(goDep, goArr, goSeat, goFee, reDep, reArr, reSeat, reFee, airline) {
	var gi = DDP.Search.DefaultValuesElements.getPullDownInstance;
	this.goDep = gi(goDep);
	this.goArr = gi(goArr);
	this.goSeat = gi(goSeat);
	this.goFee = gi(goFee);
	this.reDep = gi(reDep);
	this.reArr = gi(reArr);
	this.reSeat = gi(reSeat);
	this.reFee = gi(reFee);
	this.airline = gi(airline);
};
////////////////////// DDP.Search.DefaultValuesElements.Air END //////////////////////

////////////////////// DDP.Search.DefaultValuesElements.Hotel START //////////////////////
/**
 * 既定値を設定する宿泊要素を格納するオブジェクト。
 * @param {String} pn
 * @param {String} feeMin
 * @param {String} feeMax
 * @param {String} roomType
 * @param {String} mealType
 * @param {String} ken
 * @param {String} subArea
 * @param {DDP.TableMenu} subAreaTableMenu
 */
DDP.Search.DefaultValuesElements.Hotel = function(pn,feeMin,feeMax,roomType,mealType,ken,subArea,subAreaTableMenu) {
	var gi = DDP.Search.DefaultValuesElements.getPullDownInstance;
	this.pn = gi(pn);
	this.feeMin = gi(feeMin);
	this.feeMax = gi(feeMax);
	this.roomType = gi(roomType);
	this.mealType = gi(mealType);
	this.ken = gi(ken);
	this.subArea = gi(subArea);
	/**  @type {DDP.TableMenu} */
	this.subAreaTableMenu = subAreaTableMenu;
};
////////////////////// DDP.Search.DefaultValuesElements.Hotel END //////////////////////

////////////////////// DDP.Search.DefaultValuesElements.Car START //////////////////////
/**
 * 既定値を設定するレンタカー要素を格納するオブジェクト。
 * @param {String} carCnt
 * @param {String} carClass
 * @param {String} smoke
 * @param {String} transmission
 * @param {String} drive
 * @param {String} startArea
 * @param {String} startSubArea
 * @param {String} startOffice
 * @param {String} endArea
 * @param {String} endSubArea
 * @param {String} endOffice
 * @param {String} company
 */
DDP.Search.DefaultValuesElements.Car = function(carCnt,carClass,smoke,transmission,drive,startArea,startSubArea,startOffice,endArea,endSubArea,endOffice,company) {
	var gi = DDP.Search.DefaultValuesElements.getPullDownInstance;
	this.carCnt = gi(carCnt);
	this.carClass = gi(carClass);
	this.smoke = gi(smoke);
	this.transmission = gi(transmission);
	this.drive = gi(drive);
	this.startArea = gi(startArea);
	this.startSubArea = gi(startSubArea);
	this.startOffice = gi(startOffice);
	this.endArea = gi(endArea);
	this.endSubArea = gi(endSubArea);
	this.endOffice = gi(endOffice);
	this.company = gi(company);
};
////////////////////// DDP.Search.DefaultValuesElements.Car END //////////////////////

////////////////////// DDP.Search.DefaultValuesManager START //////////////////////
/**
 * @class 既定値を操作する為のクラスです。
 * @param {DDP.Search.DefaultValuesManager.Mode} mode 動作モード
 * @param {DDP.Search.DefaultValuesElements} 既定値を設定する要素オブジェクト
 * @param {DDP.Search.SyncManager} syncManager 同期制御オブジェクト
 */
DDP.Search.DefaultValuesManager = function(mode,elements,syncManager) {
	this.initialize.apply(this, arguments);
};
/**
 * 既定値を操作する動作モード
 * @type {Number} 既定値を操作する動作モード
 */
DDP.Search.DefaultValuesManager.Mode = {
	/**  TOP画面での動作。 @type Number */
	Top : 0
};
/**
 * コンストラクタ
 * @constructor
 * @param {DDP.Search.DefaultValuesManager.Mode} mode 動作モード
 * @param {DDP.Search.DefaultValuesElements} 既定値を設定する要素オブジェクト
 * @param {DDP.Search.SyncManager} syncManager 同期制御オブジェクト
 */
DDP.Search.DefaultValuesManager.prototype.initialize = function(mode,elements,syncManager) {
	/** 動作モード @type {DDP.Search.DefaultValuesManager.Mode} */
	this.mode = mode;
	/** 既定値を設定する要素オブジェクト @type {DDP.Search.DefaultValuesElements} */
	this.elements = elements;
	/** 同期制御オブジェクト @type {DDP.Search.SyncManager} */
	this.syncManager = syncManager;
	/** 既定値オブジェクト */
	this.settings = null;
	if (this.mode == DDP.Search.DefaultValuesManager.Mode.Top) {
		this.settings = TopConditionDefaultValues;
	}
	/** 初回かどうか @type {Boolean} */
	this.isFirst = true;
};
/**
 * 指定された予約区分で既定値を設定します。
 * @param {Number} reservationKbn 予約区分
 */
DDP.Search.DefaultValuesManager.prototype.setDefault = function(reservationKbn) {
	var setting = this.getSetting(reservationKbn);
	this.setCommonDefault(setting);
	switch(reservationKbn) {
		case DDP.Search.Const.RSV_KBN_AIR_HOTEL:
			this.setAirDefault(setting);
			this.setHotelDefault(setting);
			break;
		case DDP.Search.Const.RSV_KBN_AIR_HOTEL_CAR:
			this.setAirDefault(setting);
			this.setHotelDefault(setting);
			this.setCarDefault(setting);
			break;
		case DDP.Search.Const.RSV_KBN_HOTEL_CAR:
			this.setHotelDefault(setting);
			this.setCarDefault(setting);
			break;
	}
	this.isFirst = false;
};
/**
 * 共通の既定値を設定します。
 * @param {} setting 既定値設定。
 */
DDP.Search.DefaultValuesManager.prototype.setCommonDefault = function(setting) {
	var c = this.elements.common, sc = setting.Common, sv = this.setPullDownValue, si = this.setPullDownIndex;
	sv(c.per, sc.Per);
	si(c.goDate, sc.GoDate);
	si(c.reDate, sc.ReDate);
	if (this.mode != DDP.Search.DefaultValuesManager.Mode.Top) {
		var a = this.elements.air, sa = setting.Air;
		sv(a.goTime, sa.GoTime);
		sv(a.reTime, sa.ReTime);
	}
};
/**
 * 航空の既定値を設定します。
 * @param {} setting 既定値設定。
 */
DDP.Search.DefaultValuesManager.prototype.setAirDefault = function(setting) {
	var a = this.elements.air, sa = setting.Air, sv = this.setPullDownValue, si = this.setPullDownIndex;
	if (!this.isFirst) {
		//sv(a.goDep, sa.GoDep);
		//sv(a.reArr, sa.ReArr);
	}
	sv(a.goArr, sa.GoArr);
	sv(a.reDep, sa.ReDep);
	if (this.mode != DDP.Search.DefaultValuesManager.Mode.Top) {
		sv(a.goSeat, sa.GoSeat);
		si(a.goFee, sa.GoFeeIndex);
		sv(a.reSeat, sa.ReSeat);
		si(a.reFee, sa.ReFeeIndex);
		sv(a.airline, sa.Airline);
	}
};
/**
 * 宿泊の既定値を設定します。
 * @param {} setting 既定値設定。
 */
DDP.Search.DefaultValuesManager.prototype.setHotelDefault = function(setting) {
	var h = this.elements.hotel, sh = setting.Hotel, sv = this.setPullDownValue;
	sv(h.pn, sh.Pn);
	sv(h.ken, sh.Ken);
	DDP.Search.changeSubAreaByKenArea(h.ken.uniqueId, h.subArea.uniqueId);
	if (h.subAreaTableMenu) {
		h.subAreaTableMenu.update();
	}
	sv(h.subArea, sh.SubArea);
	if (this.mode != DDP.Search.DefaultValuesManager.Mode.Top) {
		sv(h.feeMin, sh.FeeMin);
		sv(h.feeMax, sh.FeeMax);
		sv(h.roomType, sh.RoomType);
		sv(h.mealType, sh.MealType);
	}
};
/**
 * レンタカーの既定値を設定します。
 * @param {} setting 既定値設定。
 */
DDP.Search.DefaultValuesManager.prototype.setCarDefault = function(setting) {
	var c = this.elements.car, sc = setting.Car, sv = this.setPullDownValue, sm = this.syncManager;
	sv(c.carClass, sc.CarClass);
	sv(c.smoke, sc.Smoke);
	sv(c.startArea, sc.StartArea);
	sm.syncRentalStartSubAreaByRentalStartArea();
	sv(c.startSubArea, sc.StartSubArea);
	sm.syncRentalStartOfficeByRentalStartSubtArea();
	sv(c.startOffice, sc.StartOffice);
	sv(c.endArea, sc.EndArea);
	sm.syncRentalEndSubAreaByRentalEndArea();
	sv(c.endSubArea, sc.EndSubArea);
	sm.syncRentalEndOfficeByRentalEndSubtArea();
	sv(c.endOffice, sc.EndOffice);
	if (this.mode != DDP.Search.DefaultValuesManager.Mode.Top) {
		sv(c.carCnt, sc.CarCnt);
		sv(c.transmission, sc.Transmission);
		sv(c.drive, sc.Drive);
		sv(c.dompany, sc.Company);
	}
};
/**
 * 指定された予約区分の既定値設定を取得します。
 * @param {Number} reservationKbn 予約区分
 */
DDP.Search.DefaultValuesManager.prototype.getSetting = function(reservationKbn) {
	switch(reservationKbn) {
		case DDP.Search.Const.RSV_KBN_AIR_HOTEL:
			return this.settings.AirHotel;
		case DDP.Search.Const.RSV_KBN_AIR_HOTEL_CAR:
			return this.settings.AirHotelCar;
		case DDP.Search.Const.RSV_KBN_HOTEL_CAR:
			return this.settings.HotelCar;
	}
};
/**
 * 指定したプルダウンに値を設定します。
 * @param {DDP.Search.PullDown} pullDown プルダウン
 * @param {String} selectedValue 選択値
 */
DDP.Search.DefaultValuesManager.prototype.setPullDownValue = function(pullDown, selectedValue) {
	if (pullDown == null) return;
	pullDown.select(selectedValue);
};
/**
 * 指定したプルダウンに値を設定します。
 * @param {DDP.Search.PullDown} pullDown プルダウン
 * @param {Number} selectedIndex 選択Index
 */
DDP.Search.DefaultValuesManager.prototype.setPullDownIndex = function(pullDown, selectedIndex) {
	if (pullDown == null) return;
	pullDown.selectIndex(selectedIndex);
};
////////////////////// DDP.Search.DefaultValuesManager END //////////////////////

////////////////////// DDP.Search.Map START //////////////////////
/**
 * DDP.Search.Map コンストラクタの定義
 * @class 入力補助地図を操作する為のクラスです。
 * @constructor
 * @param mapElementId 地図表示エレメントID
 * @param kenListId 県リストボックスエレメントID
 * @param subAreaListId サブエリアリストボックスエレメントID
 * @param linkButtonId 地図選択リンクのエレメントID
 */
DDP.Search.Map = function (mapElementId, kenListId, subAreaListId, linkButtonId) {
	this.mapElementId = mapElementId;
	this.kenListId = kenListId;
	this.subAreaListId = subAreaListId;
	this.linkButtonId = linkButtonId;
	// 地図表示欄エレメント
	this.__dispelem = null;
	// サブエリアリストエレメント
	this.__listelem = null;
	// 無効かされているかどうか
	this.disabled = false;
	this.kenCd = null;
	// タグのClickイベント等から呼び出せるように、
	// ルートに参照用変数を用意
	this.globalId = '__supportMap_' + this.kenListId;
	_win[this.globalId] = this;
	this.mapImageId = '__map_image_' + this.mapElementId;
	return this;
};
/** zindexの定義 */
DDP.Search.Map.prototype.zindex = 10;
/** イメージファイルのディレクトリprefix */
DDP.Search.Map.prototype.mapImageDirPrefix = '/plus/images/map';
/** 閉じるボタンイメージURL */
DDP.Search.Map.prototype.closeImage = '/plus/images/map/btn_top_favi_close.gif';
/** 地図を消すかどうかのフラグ */
DDP.Search.Map.prototype.deleteflag = false;
/** version */
DDP.Search.Map.prototype.version = '201111';
/**
 * ページ表示時の初期処理を行ないます。
 */
DDP.Search.Map.prototype.init = function () {
	var __this = this;
	// ページ表示時のイベント登録
	var mapChoiceLink = DDP.getNode(this.linkButtonId);
	var mapdiv = this.getMapElement();
	var kenSelectNode = DDP.getNode(this.kenListId);
	var onMapMouseOverEvent = function() {
		__this.deleteflag = false;
	};
	var onMapMouseOutEvent = function() {
		__this.deleteflag = true;
	};
	var onDocMouseDownEvent = function() {
		// 地図を消してもいいよフラグがtrueならば地図を消す
		if (__this.deleteflag == true) {
			__this.hide();
			DDP.removeEvent(_doc, 'mousedown', onDocMouseDownEvent);
		}
	};
	var onMapClickEvent = function() {
		if (!__this.disabled) {
			__this.show();
			// 地図の選択できない部分のクリックの挙動①
			DDP.addEvent(mapdiv, 'mouseover', onMapMouseOverEvent);
			// 地図の選択できない部分のクリックの挙動②
			DDP.addEvent(mapdiv, 'mouseout', onMapMouseOutEvent);
			// documentにマウス押下
			DDP.addEvent(_doc, 'mousedown', onDocMouseDownEvent);
		}
	};
	var onKenChangeEvent = function() {
		// 画像を読み込むために一度読み込む
		__this.write();
	};
	DDP.addEvent(mapChoiceLink, 'click', onMapClickEvent);
	// 県プルダウン変更時
	DDP.addEvent(kenSelectNode, 'change', onKenChangeEvent);
	// 画面の初期表示時用処理
	this.write();
	var subAreaNode = DDP.getNode(this.subAreaListId);
	if (subAreaNode.disabled) {
		this.disable();
	}
};
/**
 * 地図表示欄のエレメントを返します。
 */
DDP.Search.Map.prototype.getMapElement = function () {
	if (this.__dispelem) return this.__dispelem;
	this.__dispelem = DDP.getNode(this.mapElementId);
	return this.__dispelem;
};
/**
 * サブエリアリストボックスのエレメントを返します。
 */
DDP.Search.Map.prototype.getFormElement = function () {
	if (this.__listelem) return this.__listelem;
	this.__listelem = DDP.getNode(this.subAreaListId);
	return this.__listelem;
};
/**
 * 地図表示欄を表示します。
 */
DDP.Search.Map.prototype.show = function () {
	this.getMapElement().style.display = '';
	this.deleteflag = true;
};
/**
 * 地図表示欄を即座に隠します。
 */
DDP.Search.Map.prototype.hide = function () {
	this.getMapElement().style.display = 'none';
	// 表示フラグを'0:非表示'に変更
	this.deleteflag = false;
};
/**
 * 地図を描画します。
 */
DDP.Search.Map.prototype.write = function () {
	console.log('DDP.Search.Map.prototype.write');
	var kenSelectNode = DDP.getNode(this.kenListId);
	// 未選択の場合はwriteしない
	if (kenSelectNode.value == '') {
		return ;
	}
	var mapNode = this.getMapElement();
	mapNode.innerHTML = '';
	// 県CD、サブエリアCDなどを取得する
	var conf = ScriptResource.SubAreaList, coordConf = DDP.SubAreaCoordConf;
	this.kenCd = kenSelectNode.options[kenSelectNode.selectedIndex].value;
	// HTML作成用変数
	var closeButtonId = '__' + this.mapElementId + '_btn_close';
	var screenId = '__' + this.mapElementId + '_screen';
	var kenImageSrc = this.mapImageDirPrefix + '/' + this.kenCd + '/' + this.kenCd + '.gif' + this.getVersionParam();
	var areaMapId = '__area_map_' + this.kenCd + this.mapElementId;

	// HTMLソースを生成する
	// 地図の部分の生成
	var mapHtmlArray = [''], idx = 1;
	// z-indexをデフォルトの2倍にしておく。IEの場合iframeのより上にくる必要がある為の対応
	mapHtmlArray[idx++] = '<div id="' + screenId + '" style="position:relative;z-index:'+ this.zindex * 2 +';">';
	mapHtmlArray[idx++] = '<table class="supportMap">';
	mapHtmlArray[idx++] = '<tr>';
	mapHtmlArray[idx++] = '  <td style=""><img id="' + closeButtonId + '" class="closeButton" src="' + this.closeImage +'" alt="閉じる"></td>'
	mapHtmlArray[idx++] = '</tr>';
	mapHtmlArray[idx++] = '<tr><td style="">';
	mapHtmlArray[idx++] = '<img id="' + this.mapImageId + '" class="mapImage" src="' + kenImageSrc + '" alt="入力補助地図" usemap="#' + areaMapId + '">';
	mapHtmlArray[idx++] = '<map id="' + areaMapId + '" name="' + areaMapId + '">';

	// エリア情報を設定する
	var targetKenCode = kenSelectNode.options[kenSelectNode.selectedIndex].value;
	if (targetKenCode != '' && conf && coordConf && conf[targetKenCode]) {
		var kConf = conf[targetKenCode];
		for(var subCd in kConf.subAreas) {
			var sConf = kConf.subAreas[subCd], sCoord = coordConf[subCd], coordsArray = sCoord.area.coords;
			// 座標データを使用し、Areaタグを作成する
			for(var j = 0, l = coordsArray.length; j < l; j++) {
				mapHtmlArray[idx++] = "<area ";
				mapHtmlArray[idx++] = "value=\"" + subCd + "\" ";
				mapHtmlArray[idx++] = "shape=\"poly\" ";
				mapHtmlArray[idx++] = "coords=\"" + coordsArray[j] + "\" ";
				mapHtmlArray[idx++] = "href=\"javascript:;\" ";
				mapHtmlArray[idx++] = "onClick=\"" + this.globalId + ".selectMap(\'" + subCd + "\');\" ";
				mapHtmlArray[idx++] = "onMouseOver=\"" + this.globalId + ".focusMap(\'" + subCd + "\');\" ";
				mapHtmlArray[idx++] = "onMouseOut=\"" + this.globalId + ".blurMap();\" ";
				mapHtmlArray[idx++] = "alt=\"" + sConf.name + "\">";
			}
		}
	}
	mapHtmlArray[idx++] = '</map>';
	mapHtmlArray[idx++] = '</td></tr></table>';
	mapHtmlArray[idx++] = '</div>';
	var mapHtml = mapHtmlArray.join('');

	// 地図を書き換える
	mapNode = this.getMapElement();
	if (!mapNode) return;
	var mapNodeStyle = mapNode.style;
	mapNodeStyle.position = 'absolute';
	mapNodeStyle.zIndex = 1000;
	mapNodeStyle.display = 'none';
	mapNode.innerHTML = mapHtml;

	// <select>への応急処置
	// カレンダーと全く同じサイズのIFRAMEを生成し、座標を一致させて下位レイヤに描画する
	// IFRAME対応が可能なバージョンのみ処置を施す
	var ua = navigator.userAgent;
	if (ua.indexOf('MSIE 5.5') >= 0 || ua.indexOf('MSIE 6') >= 0){
		// 縦幅固定
		var screenHeight = '197px';
		// 横幅固定
		var screenWidth = '334px';
		var mapIFrameHtml = '';
		mapIFrameHtml += '<div style="position:absolute;z-index:'+ this.zindex +';top:0px;left:0px;">';
		mapIFrameHtml += '  <iframe src="javascript:false;" frameborder="0" scrolling="no" width="'+screenWidth+'" height="'+screenHeight+'"></iframe>';
		mapIFrameHtml += '</div>\n';
		// IFrameを挿入する
		mapNode.innerHTML = mapIFrameHtml + mapHtml;
	}
	// 閉じるボタン
	var __this = this;
	var closeButton = DDP.getNode(closeButtonId);
	DDP.addEvent(closeButton, 'click', function(){ __this.hide(); });
};
/**
 * 地図のクリックした際の動作を処理します。
 * 選択されたサブエリアの値でサブエリアプルダウンの値を変更し、地図を隠します。
 * @param subCd 選択したサブエリアコード
 */
DDP.Search.Map.prototype.selectMap = function (subCd) {
	var subAreaNode = DDP.getNode(this.subAreaListId);
	for(var j=0,sLen=subAreaNode.length; j<sLen; j++) {
		if (subAreaNode[j].value != subCd) continue;
		subAreaNode.selectedIndex = j;
		break;
	}
	this.hide();
	this.onSelected();
};
/**
 * versionを付与するgetパラメータを取得します。
 */
DDP.Search.Map.prototype.getVersionParam = function () {
	return this.version == '' ? '' : ('?v=' + this.version);
};
/**
 * 指定されたエリアをハイライト表示します。
 * @param subAreaCd サブエリアコード
 */
DDP.Search.Map.prototype.focusMap = function (subAreaCd) {
	DDP.getNode(this.mapImageId).src = this.mapImageDirPrefix + '/' + this.kenCd + '/' + subAreaCd + '.gif' + this.getVersionParam();
};
/**
 * ハイライト表示されていない状態に戻します。
 */
DDP.Search.Map.prototype.blurMap = function () {
	DDP.getNode(this.mapImageId).src = this.mapImageDirPrefix + '/' + this.kenCd + '/' + this.kenCd + '.gif' + this.getVersionParam();
};
/**
 * コントロールを使用不可に設定します。
 */
DDP.Search.Map.prototype.disable = function() {
	this.hide();
	// 地図選択リンクのdisable化
	var mapSelectLinkNode = DDP.getNode(this.linkButtonId);
	DDP.addClass(mapSelectLinkNode, DDP.Search.Const.MAP_SELECT_LINK_DISABLE);
	mapSelectLinkNode.removeAttribute('href');
	this.disabled = true;
};
/**
 * コントロールを使用可能に設定します。
 */
DDP.Search.Map.prototype.enable = function() {
	// 地図選択リンクのenable化
	var mapSelectLinkNode = DDP.getNode(this.linkButtonId);
	DDP.removeClass(mapSelectLinkNode, DDP.Search.Const.MAP_SELECT_LINK_DISABLE);
	DDP.addHrefJs(mapSelectLinkNode);
	this.disabled = false;
};
/**
 * 選択後イベント抽象メソッドです。
 * <pre>
 * 継承したクラスによってオーバーライドされることを想定しています
 * exp)検索パネルで使用する場合：Ajax呼び出しを行う等
 * </pre>
 */
DDP.Search.Map.prototype.onSelected = function () {
	// デフォルトでは処理なし
};
/////////////////////// DDP.Search.Map END ///////////////////////

/**
 * ANA検索条件。
 * @class
 * @constructor
 */
DDP.Search.AnaSearchCondition = function() {
	this.anaSiteUrl = null;
	this.connectionKind = null;
	this.activityId = null;
	this.returnURL = null;
	this.screenId = null;
	this.selectedEmbMonth = null;
	this.selectedEmbDay = null;
	this.selectedDepApo = null;
	this.selectedArrApo = null;
	this.seatKind = null;
	this.selectedDepTime = null;
	this.ttwCalFlg = null;
	this.nowSegIndex = null;
};
/**
 * ANA検索クラス
 * @class
 * @constructor
 */
DDP.Search.AnaSearch = function(condition) {
	/** 検索条件 */
	this.condition = condition;
};
/**
 * ANA検索条件を取得します。
 * @return {ANA検索条件}
 * @type DDP.Search.AnaSearchCondition
 */
DDP.Search.AnaSearch.prototype.getCondition = function(){
	return this.condition;
};
DDP.Search.AnaSearch.prototype.post = function() {
	var formName = 'anaSiteUrlForm';
	//ANAサイト遷移用のformを作成する
	this.createAnaSiteForm(formName);
	//ANAサイトへ遷移する
	var submitButton = DDP.getNode('anaSubmitButton');
	submitButton.click();
};
/**
 * ANAサイト遷移用form作成
 * @param formName フォームのid・name属性値に仕様する文字列
 */
DDP.Search.AnaSearch.prototype.createAnaSiteForm = function(formName) {
	//formを作成
	var __this = this, c = this.getCondition(), form = _doc.createElement('form'), DSC = DDP.Search.Const;
	form.action = c.anaSiteUrl;
	form.method = 'post';
	form.id = formName;
	form.name = formName;
	_doc.getElementsByTagName('body').item(0).appendChild(form);
	var createAnaFormEl = function(type, id, name, value) { __this.createAnaSiteFormElement(form, type, id ? id : '', name, value) };
	// 各パラメータ設定
	//接続識別子を作成
	createAnaFormEl('hidden', '', DSC.ANA_DATA_CONNECTION_KIND, c.connectionKind);
	//アクティビティIDを作成
	createAnaFormEl('hidden', '', DSC.ANA_DATA_ACTIBITY_ID, c.activityId);
	//戻りURLを作成
	createAnaFormEl('hidden', '', DSC.ANA_DATA_RETURN_URL, c.returnURL);
	//遷移元画面IDを作成
	createAnaFormEl('hidden', '', DSC.ANA_DATA_SCREEN_ID, c.screenId);
	//搭乗月を作成
	createAnaFormEl('hidden', '', DSC.ANA_DATA_SELECTED_EMD_MONTH, c.selectedEmbMonth);
	//搭乗日を作成
	createAnaFormEl('hidden', '', DSC.ANA_DATA_SELECTED_EMD_DAY, c.selectedEmbDay);
	//出発空港コードを作成
	createAnaFormEl('hidden', '', DSC.ANA_DATA_SELECTED_DEP_APO, c.selectedDepApo);
	//到着空港コードを作成
	createAnaFormEl('hidden', '', DSC.ANA_DATA_SELECTED_ARR_APO, c.selectedArrApo);
	//搭乗クラスを作成
	createAnaFormEl('hidden', '', DSC.ANA_DATA_SELECTED_SEAT_KIND, c.seatKind);
	//出発時刻指定を作成
	createAnaFormEl('hidden', '', DSC.ANA_DATA_SELECTED_DEP_TIME, c.selectedDepTime == '' ? '-' : c.selectedDepTime);
	//照会種別を作成
	createAnaFormEl('hidden', '', DSC.ANA_DATA_TTW_CAL_FLG, c.ttwCalFlg);
	//AW結果表示用インデックスを作成
	createAnaFormEl('hidden', '', DSC.ANA_DATA_NOW_SEG_INDEX, c.nowSegIndex);
	//検索ボタン用inputを作成
	createAnaFormEl('submit', 'anaSubmitButton', DSC.ANA_DATA_BUTTON, '');
};
/**
 * ANAサイト遷移用FormにPOSTデータを設定する
 */
DDP.Search.AnaSearch.prototype.createAnaSiteFormElement = function(form, type, id, name, value){
	var element = _doc.createElement('input');
	element.type = type;
	if (type.toLowerCase() == 'submit') {
		element.style.display = 'none';
	}
	if (id != '') {
		element.id = id;
	}
	if (name != '') {
		element.name = name;
	}
	element.value = value;
	form.appendChild(element);
};

})();

