$(function() {
	//変数宣言(DOM走査回数減らす)
	var elmForm            = $("#searchForm");					//検索条件を包含するForm(id=searchForm)
	var elmCheckinYM       = findNamedElm("checkinYM");			//チェックイン日(年月)(select)
	var elmCheckinD        = findNamedElm("checkinD");			//チェックイン日(日)(select)
	var elmCheckinDp       = findNamedElm("checkinDp");			//チェックイン日(datepicker紐づけ用hidden)
	var elmImgCal          = findNamedElm("calendar");			//カレンダイメージ
	var elmGoshukuhakutiKb = findNamedElm("goshukuhakutiKb");	//都道府県地域・ランドマーク切り分け(radio,hidden)
	var elmKen             = findNamedElm("kenCd");				//都道府県指定(select,hidden)
	var elmTk              = findNamedElm("tikuCd");			//地区指定セレクト(select,hidden)
	var elmLm              = findNamedElm("landmarkId");		//ランドマーク指定セレクト(select,hidden)
	var elmRiyohohoKb      = findNamedElm("riyohohoKb");		//ご利用方法(往復、往路のみ、復路のみ)(radio,hidden)
	var elmOroShupatuti    = findNamedElm("oroShupatutiCd");	//往路出発地(name=oroShupatutiCd)(select,hidden)
	var elmOroTochakuti    = findNamedElm("oroTochakutiCd");	//往路到着地(name=oroTochakutiCd)(select,hidden)
	var elmFukShupatuti    = findNamedElm("fukuroShupatutiCd");	//復路出発地(name=fukuroShupatutiCd)(select,hidden)
	var elmFukTochakuti    = findNamedElm("fukuroTochakutiCd");	//復路到着地(name=fukuroTochakutiCd)(select,hidden)
	var elmSubmitSearch    = findNamedElm("search");			//検索ボタン(name=search)
	var elmDivTk           = findIdElm("kenTiku");				//都道府県・地区セレクト表示領域(ランドマークのみ指定なら非表示領域となる)(div,span...)
	var elmDivLm           = findIdElm("landmark");				//ランドマークセレクト表示領域(都道府県のみ指定なら非表示領域となる)(div,span...)
	var elmDivOro          = findIdElm("oro");					//往路セレクト表示領域(復路のみなら非表示となる)(div,span...)
	var elmDivFuk          = findIdElm("fukuro");				//復路セレクト表示領域(往路のみなら非表示となる)(div,span...)
	var elmChild           = findIdElm("childT");				//「子供人数・詳細条件を追加したい方はこちら」リンク

	//日付関連
	var today              = trimHms(new Date());	//本日
	var checkInStartDtVal  = checkInStartDt();		//チェックイン開始日
	var checkInEndDtVal    = checkInEndDt();		//チェックイン終了日
	var checkInInitDtVal   = checkInInitDt();		//チェックイン初期値

	//キャンペーン毎の都道府県、ランドマーク指定有？
	var targetTkDefined   = isVarDefined(dpsNS.targetKenList);		//都道府県指定あり？
	var targetLmDefined   = isVarDefined(dpsNS.targetLandmarkList);	//ランドマーク指定あり？
	var targetTkLmDefined = targetTkDefined && targetLmDefined;		//都道府県＆ランドマーク指定あり？

	//往路・復路の出発・到着県固定指定？
	var oroFukuroKenFixed = (
			isVarDefined(dpsNS.busOroFromKenList)    &&
			isVarDefined(dpsNS.busOroToKenList)      &&
			isVarDefined(dpsNS.busFukuroFromKenList) &&
			isVarDefined(dpsNS.busFukuroToKenList));

	//チェックイン日
	var checkInYm = checkInStartDtVal;	//start month
	var months = nMonthsBetween(checkInStartDtVal,checkInEndDtVal)+1;
	var ym = [];
	for ( var i = 0; i < months; i++ ) {
		var y = checkInYm.getFullYear();
		var m = checkInYm.getMonth();
		ym.push([toYyyymm(checkInYm),fmtYyyymm(y,m+1)]);
		checkInYm = new Date(y,m+1,1);	//next month
	}
	fillSelect(elmCheckinYM,ym);

	elmCheckinYM.change(function() {
		var d = [];
		var yyyymm = $(this).val();
		if ( !yyyymm ) return false;
		var lastDay = getLastDayOfMonth(yyyymm.substring(0,4),yyyymm.substring(4));
		for ( var day = 1; day <= lastDay; day++ ) {
			d.push([fmtMdhmsElm(day),fmtDd(day)]);
		}
		fillSelect(elmCheckinD,d,"01",true);
	});
	selectVal(elmCheckinYM,toYyyymm(checkInInitDtVal)).change();
	selectVal(elmCheckinD,toDd(checkInInitDtVal));

	//チェックイン日カレンダ
	elmCheckinDp.datepicker({
		beforeShow:function(tag) {
			return {defaultDate : elmCheckinYM.val() && elmCheckinD.val() ? toDate((elmCheckinYM.val() + elmCheckinD.val())) : checkInInitDtVal,
					minDate     : checkInStartDtVal,
					maxDate     : checkInEndDtVal,
					yearRange   : checkInStartDtVal.getFullYear() + ":" +checkInEndDtVal.getFullYear(),
					speed       : 'fast'
			};
		},
		onSelect:function(date,ui) {
			if ( date == '') {
				elmCheckinYM.val('');
				elmCheckinD.val('');
				return false;
			}
			var dt = elmCheckinDp.datepicker('getDate');
			elmCheckinYM.val(dt.getFullYear()*100+dt.getMonth()+1);
			elmCheckinD.val(dt.getDate());
		}
	});
	elmImgCal.click(function(){elmCheckinDp.datepicker('show');});

	//都道府県コンボ作成(キャンペーン毎都道府県データあれば)
	if ( targetTkDefined ) {fillSelect(elmKen,findTargetKenList(),true).ready(kenChanged).change(kenChanged).change();}

	//都道府県コンボ変更時
	function kenChanged() {
		fillSelect(elmTk,findTikuListByKenId(val2(elmKen)),true);			//地域コンボ
		setOroTochakuFukShupatu(findKenListByShukuhakuKen(val2(elmKen)));	//往路到着地・復路出発地
	}

	//ランドマークコンボ作成(キャンペーン毎ランドマークデータあれば)
	if ( targetLmDefined ) {fillSelect(elmLm,findTargetLmList(),true);}

	//ランドマーク要素存在(Select,Hidden)なら往路到着地・復路出発地変更
	if ( elmLm ) {
		if      (isSelect(elmLm)) {elmLm.change(landmarkChanged);elmLm.change();}
		else if (isHidden(elmLm)) {landmarkChanged();}
	}

	//ランドマークコンボ変更時(往路到着地・復路出発地変更)
	function landmarkChanged() {setOroTochakuFukShupatu(findKenListByLm(val2(elmLm)));}
	//往路到着地・復路出発地コンボを指定の都道府県一覧で更新
	function setOroTochakuFukShupatu(kenList) {
		if ( !oroFukuroKenFixed ) {
			//往路到着地・復路出発地
			fillSelect(elmOroShupatuti);
			fillSelect(elmFukTochakuti);
			fillSelect(elmOroTochakuti,kenList,isTkSelected() ? val2(elmKen) : null).change();
			fillSelect(elmFukShupatuti,kenList,isTkSelected() ? val2(elmKen) : null).change();
		}
	}

	if ( oroFukuroKenFixed ) {
		//往路・復路県固定なら出発・到着県を固定指定
		fillSelect(elmOroShupatuti, convIdArrToKenList(dpsNS.busOroFromKenList));
		fillSelect(elmOroTochakuti, convIdArrToKenList(dpsNS.busOroToKenList));
		fillSelect(elmFukShupatuti, convIdArrToKenList(dpsNS.busFukuroFromKenList));
		fillSelect(elmFukTochakuti, convIdArrToKenList(dpsNS.busFukuroToKenList));
	}

	//ご宿泊地ラジオ(キャンペーン毎都道府県＆ランドマークデータあれば)
	if ( targetTkLmDefined ) {
		elmGoshukuhakutiKb.val(["01"]);
		elmGoshukuhakutiKb.ready(goshukuhakutiKbChanged).click(goshukuhakutiKbChanged);
	}

	//宿泊地区分ラジオ変更時
	function goshukuhakutiKbChanged() {
		selectVal(elmKen);
		selectVal(elmTk);
		selectVal(elmLm);
		if (isTkSelected()) {	//地区選択
			elmDivTk.show();
			elmDivLm.hide();
			elmKen.change();
		} else {				//ランドマーク選択
			elmDivLm.show();
			elmDivTk.hide();
			elmLm.change();
		}
	}

	//ご利用方法ラジオ(往復・往路のみ・復路のみ)
	if ( isRadio(elmRiyohohoKb) ) {
		elmRiyohohoKb.val(["01"]);
		elmRiyohohoKb.ready(riyohohoKbChanged).click(riyohohoKbChanged);
	}

	function riyohohoKbChanged() {
		switch(val2(elmRiyohohoKb)) {
			case  '01':	//往復
				elmDivOro.show();
				elmDivFuk.show();
				break;
			case  '02':	//往路のみ
				elmDivOro.show();
				elmDivFuk.hide();
				break;
			case  '03':	//復路のみ
				elmDivOro.hide();
				elmDivFuk.show();
				break;
	    }
	    //往路到着＆復路出発県コンボを再設定
	    setOroTochakuFukShupatu(
	    	isTkSelected() ? findKenListByShukuhakuKen(val2(elmKen)) : findKenListByLm(val2(elmLm)));
    }

	if ( !oroFukuroKenFixed ) {
		//往路到着地
		elmOroTochakuti.ready(oroTochakutiChanged).change(oroTochakutiChanged);
		//復路出発地
		elmFukShupatuti.ready(fukuroShupatutiChanged).change(fukuroShupatutiChanged);
		//往路出発地コンボ変更時(復路出発地の値を往路出発地に合わせる)
		elmOroShupatuti.change(function() {selectVal(elmFukTochakuti,(val2(elmOroShupatuti)));});
		//往路到着地コンボ変更時(復路到着地の値を往路到着地に合わせる)
		elmOroTochakuti.change(function() {selectVal(elmFukShupatuti,(val2(elmOroTochakuti))).change();});
	}
	//往路到着地コンボ変更時(往路出発地のコンボをセット)
	function oroTochakutiChanged()    {fillSelect(elmOroShupatuti,findToKenListByFrom(val2(elmOroTochakuti)));}
	//復路出発地コンボ変更時(復路到着地のコンボをセット)
	function fukuroShupatutiChanged() {fillSelect(elmFukTochakuti,findToKenListByFrom(val2(elmFukShupatuti)));}

	//料金コンボ作成
	createRyokinSelect("minRyokoRyokin");
	createRyokinSelect("maxRyokoRyokin");
	function createRyokinSelect(name) {
		if ( isElmDefined(name) && isSelect(findNamedElm(name))) {
			var selElm = findNamedElm(name);
			var options = [];
			for ( var i = 0; i < dpsNS.ryokoRyokinArr.length; i++ ) {
				var kin = dpsNS.ryokoRyokinArr[i];
				options.push([kin,fmtNumber(kin)]);
			}
			fillSelect(selElm,options,true);
		}
	}

	//検索ボタン押下
	elmSubmitSearch.click(function(e) {return isValidForm() ? prepareSubmit(val2(findIdElm("actionPath"))) : false;});
	//「子供人数・詳細条件を追加したい方はこちら」リンククリック
	elmChild.click(function(e) {prepareSubmit("/hotel/shosaiKensaku/");elmForm.submit();});

	//詳細検索用にパラメータを整形
	function prepareSubmit(actionPath) {
		if ( isTkSelected() ) {
			//地区用の出発到着地パラメータを設定
			findIdElm("oroShupatutiCdTiku").val(val2(elmOroShupatuti));
			findIdElm("oroTochakutiCdTiku").val(val2(elmOroTochakuti));
			findIdElm("fukuroShupatutiCdTiku").val(val2(elmFukShupatuti));
			findIdElm("fukuroTochakutiCdTiku").val(val2(elmFukTochakuti));
		} else {
			//ランドマーク用の出発到着地パラメータを設定
			findIdElm("oroShupatutiCdLandmark").val(val2(elmOroShupatuti));
			findIdElm("oroTochakutiCdLandmark").val(val2(elmOroTochakuti));
			findIdElm("fukuroShupatutiCdLandmark").val(val2(elmFukShupatuti));
			findIdElm("fukuroTochakutiCdLandmark").val(val2(elmFukTochakuti));
		}
		var shupatuDt = addNDays(
							toDate(elmCheckinYM.val()+elmCheckinD.val()),
							Number(findNamedElmVal("goshukuhakuSu")));
		findIdElm("tochakuYM").val(elmCheckinYM.val());
		findIdElm("tochakuD").val(elmCheckinD.val());
		findIdElm("shupatuYM").val(toYyyymm(shupatuDt));
		findIdElm("shupatuD").val(toDd(shupatuDt));
		findIdElm("yojiNinzu").val(
							Number(findNamedElmVal("yojiShokujiFutonAriNinzu")) +
							Number(findNamedElmVal("yojiShokujiAriNinzu")) +
							Number(findNamedElmVal("yojiFutonAriNinzu")) +
							Number(findNamedElmVal("yojiFutonNashiNinzu")));
		elmForm.attr({method : "post", action : dpsNS.ctxPath+"/pc/"+getRKaishaId()+actionPath});
		elmForm.submit(function(){$.blockUI(
			'<div><img src="/x/bus/share/img/ajax-loader.gif" /><b>' + getMessage('blockingMsg') + '</b></div>');});
		return true;
	}

	//エラーチェック
	function isValidForm() {
		if ( !elmCheckinYM.val() || !elmCheckinD.val() ) {
			alert(getMessage('checkInDtRequired'));
			return false;
		}
		var checkInDt = toDate((elmCheckinYM.val() + elmCheckinD.val()));
		if ( checkInStartDtVal > checkInDt ) {
			alert(getMessage('checkInDtTooEarly',fmtDt(checkInStartDtVal)));
			return false;
		}
		if ( checkInEndDtVal < checkInDt ) {
			alert(getMessage('checkInDtTooLate',fmtDt(checkInEndDtVal)));
			return false;
		}
		if ( isTkSelected() && (!val2(elmKen) || !val2(elmTk))) {
			alert(getMessage('kenCdRequired'));
			return false;
		}
		if ( isLmSelected() && !val2(elmLm)) {
			alert(getMessage('landmarkCdRequired'));
			return false;
		}
		if ((elmOroShupatuti.size() != 0 || elmOroTochakuti.size() != 0)
				&& isOroVisible() && (!val2(elmOroShupatuti)||!val2(elmOroTochakuti))) {
			alert(getMessage('oroRequired'));
			return false;
		}
		if ((elmFukShupatuti.size() != 0 || elmFukTochakuti.size() !=0)
				&& isFukVisible() && (!val2(elmFukShupatuti)||!val2(elmFukTochakuti))) {
			alert(getMessage('fukuroRequired'));
			return false;
		}
		return true;
	}

	//
	//JS utils
	//
	function isVarDefined(v) {return typeof v != 'undefined'}			//変数定義済み？

	//
	//ui utils
	//
	function isTkSelected() {return val2(elmGoshukuhakutiKb) == '01';}	//地域選択？
	function isLmSelected() {return !isTkSelected();}					//ランドマーク選択？
	function isOroVisible() {return val2(elmRiyohohoKb) != '03';}		//往路表示？
	function isFukVisible() {return val2(elmRiyohohoKb) != '02';}		//復路表示？
	function isShupatutiFixed() {return isHidden(elmOroShupatuti);}		//出発地(往路出発地・復路到着地)固定？
	function isTochakutiFixed() {return isHidden(elmOroTochakuti);}		//行先(復路出発地・往路到着地)固定？

	//Selectに値を設定
	function fillSelect(elm,data,init,empty) {
		if ( isImmutableSelect(elm) ) return elm;
		var lastArg = arguments[arguments.length-1];
		var hasEmptyOption = isBoolean(lastArg) ? lastArg : false;
		elm.empty();
		if ( hasEmptyOption ) $('<option></option>').val('').text('---').appendTo(elm);
		if ( data && !isBoolean(data))
			for ( var i = 0; i < data.length; i++ ) $('<option></option>').val(data[i][0]).text(data[i][1]).appendTo(elm);
		selectVal(elm,isBoolean(init) ? undefined : init)
		return elm;
	}

	//Selectに選択値を設定
	function selectVal(elm,val) {
		if ( isImmutableSelect(elm) ) return elm;
		val = val || $("option:first",elm).val();
		if ( jQuery.browser.msie ) {
			elm.width();	//for IE
		}
		elm.val(val);
		return elm;
	}

	//内容編集不可なコンボ？
	function isImmutableSelect(elm) {
		//往路非表示＆(往路出発｜到着コンボ)
		if ( !isOroVisible()    && (elm == elmOroShupatuti || elm == elmOroTochakuti)) return true;
		//復路非表示＆(復路出発｜到着コンボ)
		if ( !isFukVisible()    && (elm == elmFukShupatuti || elm == elmFukTochakuti)) return true;
		//出発地固定＆(往路出発地｜復路到着地)
		if ( isShupatutiFixed() && (elm == elmOroShupatuti || elm == elmFukTochakuti)) return true;
		//行先固定　＆(往路到着地｜復路出発地)
		if ( isTochakutiFixed() && (elm == elmOroTochakuti || elm == elmFukShupatuti)) return true;
		//その他編集可能
		return false;
	}

	//select,hidden,text,radioなど異なるウィジェットから汎用的に値を取得
	function val2(elm) {
		if (!elm) return null;
		switch(elm.attr("type")) {
			case "radio"     : return elm.filter(":checked").val()
			default          : return elm.val();
		}
	}
	function isHidden(elm)          {return (elm.attr("type") == "hidden");}
	function isRadio(elm)           {return (elm.attr("type") == "radio"); }
	function isSelect(elm)          {return (elm.is && elm.is("select"));  }
	function isText(elm)            {return (elm.attr("type") == "text");  }
	function isBoolean(val)         {return typeof val == 'boolean';       }
	//指定ID要素を取得
	function findIdElm(id)          {return $("#" + id,elmForm);}
	//指定名要素を取得
	function findNamedElm(name)     {return $("*[name=" + name + "]",elmForm);}
	//指定名要素値を取得
	function findNamedElmVal(name)  {return val2(findNamedElm(name));}
	//指定名要素が定義済？
	function isElmDefined(name)     {return findNamedElm(name).length > 0;}
	//hidden要素を生成する
	function hiddenElm(name,val)    {return '<input type="hidden" name="'+name+'" id="'+name+'" value="'+(val ? val : "")+'" />';}
	//hidden要素をFormに追加する
	function appendHidden(name,val) {elmForm.append(hiddenElm(name,val));}
	//要素が未定義ならhidden要素をFormに追加する
	function appendHiddenUnlessDefined(name,val) {if (!isElmDefined(name)) elmForm.append(hiddenElm(name,val));}

	//
	//dao
	//
	//当該キャンペーン対象都道府県一覧取得
	function findTargetKenList() {return convIdArrToKenList(dpsNS.targetKenList);}

	//当該キャンペーン対象ランドマーク一覧取得
	function findTargetLmList() {
		var ret = [];
		for ( var i = 0; i < dpsNS.targetLandmarkList.length; i++ ) {
			var landmarkNm = findLandmarkNameByPk(dpsNS.targetLandmarkList[i]);
			if ( landmarkNm ) ret.push([dpsNS.targetLandmarkList[i],landmarkNm]);
		}
		return ret;
	}

	//都道府県で地域一覧取得
	function findTikuListByKenId(kenId) {
		var ret = [];
		var tikuIdArr = findTikuIdArrByKen(kenId);
		if (!tikuIdArr) return ret;
		for ( var i = 0; i < tikuIdArr.length; i++ ) {
			var tikuNm = findTikuNameByPk(tikuIdArr[i]);
			if ( tikuNm ) ret.push([tikuIdArr[i],tikuNm]);
		}
		return ret;
	}

	//宿泊ランドマークで到着都道府県一覧取得
	function findKenListByLm(id)          {return convIdArrToKenList(findKenIdArrByLm(id));}
	//宿泊都道府県で到着都道府県一覧取得
	function findKenListByShukuhakuKen(id){return convIdArrToKenList(findKenIdArrByShukuhaku(id));}
	//出発地都道府県に紐づく到着地都道府県一覧を取得
	function findToKenListByFrom(from)    {return convIdArrToKenList(dpsNS.mstRelFromToList[from]);}
	//都道府県ＩＤ配列を都道府県配列に変換
	function convIdArrToKenList(kenIdArr) {
		var ret = [];
		if ( kenIdArr ) {
			for ( var i = 0; i < kenIdArr.length; i++ ) {
				var kenNm = findKenNameByPk(kenIdArr[i]);
				if ( kenNm ) ret.push([kenIdArr[i],kenNm]);
			}
		}
		return ret;
	}

	//PKで都道府県名取得
	function findKenNameByPk(kenId)         {return dpsNS.mstKenList[kenId];}
	//PKでランドマーク名取得
	function findLandmarkNameByPk(lmId)     {return dpsNS.mstLandmarkList[lmId];}
	//PKで地域名取得
	function findTikuNameByPk(tikuId)       {return dpsNS.mstTikuList[tikuId];}
	//ランドマーク検索で都道府県取得
	function findKenIdArrByLm(lmId)         {return dpsNS.mstSasLandmarkList[lmId];}
	//宿泊都道府県検索で都道府県取得
	function findKenIdArrByShukuhaku(kenId) {return dpsNS.mstSasKenList[kenId];}
	//都道府県で紐付く地区取得
	function findTikuIdArrByKen(kenId)      {return dpsNS.mstRelKenTikuList[kenId];}

	//
	//date utils
	//
	function fmtYyyymmdd(y,m,d) {return fmtYyyymm(y,m)+fmtDd(d);}
	function fmtYyyymm(y,m)     {return getMessage('yyyymmFmt',y,fmtMdhmsElm(m));}
	function fmtDd(d)           {return getMessage('ddFmt',fmtMdhmsElm(d));}
	function fmtDt(date)        {return fmtYyyymmdd(date.getFullYear(),date.getMonth()+1,date.getDate());}
	function toYyyymmdd(date)   {return toYyyymm(date)+toDd(date);}
	function toYyyymm(date)     {return toYyyy(date)+toMm(date);}
	function toYyyy(date)       {return date.getFullYear();}
	function toMm(date)         {return fmtMdhmsElm(date.getMonth()+1);}
	function toDd(date)         {return fmtMdhmsElm(date.getDate());}
	function toDate(yyyymmdd)   {return trimHms(new Date(Number(yyyymmdd.substring(0,4)),Number(yyyymmdd.substring(4,6))-1,Number(yyyymmdd.substring(6))));}
	function addNMonths(date,n) {return trimHms(new Date(date.getFullYear(),date.getMonth()+n,date.getDate()));}
	function addNDays(date,n)   {return trimHms(new Date(date.getFullYear(),date.getMonth(),date.getDate()+n));}
	function nMonthsBetween(s,e){return (e.getFullYear()-s.getFullYear())*12+e.getMonth()-s.getMonth();}

	function startMargin()      {return dpsNS.propCheckIn.startMargin  || 0;}
	function dispNMonthes()     {return dpsNS.propCheckIn.dispNMonthes || 6;}	//指定なし―>半年？
	function checkInStartDt()   {return dpsNS.propCheckIn.startDt ? (startDtLaterThanToday() ? toDate(dpsNS.propCheckIn.startDt) : today ) : today;}
	function checkInEndDt()     {return dpsNS.propCheckIn.endDt ? toDate(dpsNS.propCheckIn.endDt) : addNMonths(checkInStartDtVal,dispNMonthes());}
	function checkInInitDt()    {
		var nDaysLater = addNDays(today,startMargin());
		var initDay = checkInStartDtVal > nDaysLater ? checkInStartDtVal : nDaysLater;
		return initDay < checkInEndDtVal ? initDay : checkInEndDtVal;
	}
	function startDtLaterThanToday() {return dpsNS.propCheckIn.startDt && toDate(dpsNS.propCheckIn.startDt) > today;}
	function fmtMdhmsElm(d)     {return ( d < 10 ? "0" : "") + d;}
	function trimHms(date)      {
		date.setHours(0);
		date.setMinutes(0);
		date.setSeconds(0);
		date.setMilliseconds(0);
		return date;
	}

	//月末日を取得
	function getLastDayOfMonth(y,m) {
		switch(Number(m)) {
			case  1: return 31;
			case  2: return isLeapYear(y) ? 29 : 28;
			case  3: return 31;
			case  4: return 30;
			case  5: return 31;
			case  6: return 30;
			case  7: return 31;
			case  8: return 31;
			case  9: return 30;
			case 10: return 31;
			case 11: return 30;
			case 12: return 31;
	    }
	}

	function isLeapYear(y) {return ( y % 4 == 0 && y % 100 != 0 || y % 400 == 0 );}

	//
	//number utils
	//
	function fmtNumber(nStr) {
		nStr += '';
		x = nStr.split('.');
		x1 = x[0];
		x2 = x.length > 1 ? '.' + x[1] : '';
		var rgx = /(\d+)(\d{3})/;
		while (rgx.test(x1)) {
			x1 = x1.replace(rgx, '$1' + ',' + '$2');
		}
		return x1 + x2;
	}

	//
	//path utils
	//
	function getRKaishaId() {
		document.location.pathname.match(/^\/x\/bus\/dynamic\/(\d+?)\/.+$/);	//rKaishaId
		return 3;
	}

	//
	//message utils
	//
	function getMessage(key,args) {
		var msg = dpsNS.messages[key];
		for (var i = 0; i < arguments.length-1; i++ ) { msg = msg.replace("{"+i+"}", arguments[i+1]);}
		return msg;
	}

	//
	//locale utils
	//
	function getLocale() {
		document.location.pathname.match(/^\/x\/bus\/dynamic\/\d+?\/(\w+?)\/.+$/);	//locale
		return RegExp.$1;
	}

	//共通の初期処理
	//遷移制御用パラメータ設定
	appendHidden("dateFlag","0");
	appendHidden("beforeGoriyoHoho","01");
	appendHidden("quicSeachSessionDate");
	appendHidden("shosaiSearchSessionDate");
	appendHidden("kensakuKekaItiranShukuhakuJohoSentakuSessionDate");
	appendHidden("kensakuKekaItiranRyoteiJohoSentakuSessionDate");
	appendHidden("kensakuKekaItiranBusShosaiSentakuSessionDate");
	appendHidden("shisetuShosaiSessionDate");
	appendHidden("packageShosaiSessionDate");
	appendHidden("yoyakuJohoNyuryokuSessionDate");
	appendHidden("yoyakuNaiyoKakuninSessionDate");
	appendHidden("yoyakuKanryoSessionDate");

	//詳細検索パラメータ設定
	appendHidden("oroShupatutiCdTiku");
	appendHidden("oroTochakutiCdTiku");
	appendHidden("fukuroShupatutiCdTiku");
	appendHidden("fukuroTochakutiCdTiku");
	appendHidden("oroShupatutiCdLandmark");
	appendHidden("oroTochakutiCdLandmark");
	appendHidden("fukuroShupatutiCdLandmark");
	appendHidden("fukuroTochakutiCdLandmark");
	appendHidden("tochakuYM");
	appendHidden("tochakuD");
	appendHidden("shupatuYM");
	appendHidden("shupatuD");
	appendHidden("yojiNinzu");

	//任意指定項目設定(未定義ならデフォルト値指定用)
	appendHiddenUnlessDefined("goriyoninzu","1");				//大人(1)
	appendHiddenUnlessDefined("shogakuseiNinzu","0");			//小学生(0)
	appendHiddenUnlessDefined("yojiShokujiFutonAriNinzu","0");	//幼児A(0)
	appendHiddenUnlessDefined("yojiShokujiAriNinzu","0");		//幼児B(0)
	appendHiddenUnlessDefined("yojiFutonAriNinzu","0");			//幼児C(0)
	appendHiddenUnlessDefined("yojiFutonNashiNinzu","0");		//幼児D(0)
	appendHiddenUnlessDefined("goshukuhakuSu","1");				//宿泊数(1)
	appendHiddenUnlessDefined("goriyoheyaSu","1");				//利用部屋数(1)
	appendHiddenUnlessDefined("riyohohoKb","01");				//利用方法(往復01)
	appendHiddenUnlessDefined("oroBusType","01");				//往路バスタイプ(指定なし01)
	appendHiddenUnlessDefined("fukuroBusType","01");			//復路バスタイプ(指定なし01)
	appendHiddenUnlessDefined("mode","01");						//宿泊あり(01)
	appendHiddenUnlessDefined(
		"actionPath","/hotel/shosaiKensaku/staticSearch");		//検索ボタン押下時の起動Action(デフォルト＝詳細検索)
});

