$(function() {
	//変数宣言(DOM走査回数減らす)
	var elmForm            = $("#searchForm");					//検索条件を包含するForm(id=searchForm)
	var elmShupatuYM       = findNamedElm("shupatuYM");			//チェックイン日(年月)(select)
	var elmShupatuD        = findNamedElm("shupatuD");			//チェックイン日(日)(select)
	var elmShupatuDp       = findNamedElm("shupatuDp");			//チェックイン日(datepicker紐づけ用hidden)
	var elmImgCal          = findNamedElm("calendar");			//カレンダイメージ
	var elmNitei           = findNamedElm("niteiId");			//日程(name=niteiCd)(select,hidden)
	var elmShupatuti       = findNamedElm("shupatutiCd");		//出発地(name=shupatutiCd)(select,hidden)
	var elmTochakuti       = findNamedElm("tochakutiCd");		//到着地(name=tochakutiCd)(select,hidden)
	var elmOtokoNinzu      = findNamedElm("otokoNinzu");		//男人数(name=otokoNinzu)(select,text,hidden...)
	var elmOnnaNinzu       = findNamedElm("onnaNinzu");			//女人数(name=onnaNinzu)(select,text,hidden...)
	var elmShogakuseiNinzu = findNamedElm("shogakuseiNinzu");	//小学生人数(name=shogakuseiNinzu)(select,text,hidden...)
	var elmSubmitSearch    = findNamedElm("search");			//検索ボタン(name=search)

	//日付関連
	var today              = trimHms(new Date());	//本日
	var shupatuStartDtVal  = shupatuStartDt();		//チェックイン開始日
	var shupatuEndDtVal    = shupatuEndDt();		//チェックイン終了日
	var shupatuInitDtVal   = shupatuInitDt();		//チェックイン初期値

	//チェックイン日
	var shupatuYm = shupatuStartDtVal;	//start month
	var months = nMonthsBetween(shupatuStartDtVal,shupatuEndDtVal)+1;
	var ym = [];
	for ( var i = 0; i < months; i++ ) {
		var y = shupatuYm.getFullYear();
		var m = shupatuYm.getMonth();
		ym.push([toYyyymm(shupatuYm),fmtYyyymm(y,m+1)]);
		shupatuYm = new Date(y,m+1,1);	//next month
	}
	fillSelect(elmShupatuYM,ym);

	elmShupatuYM.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(elmShupatuD,d,"01",true);
	});
	selectVal(elmShupatuYM,toYyyymm(shupatuInitDtVal)).change();
	selectVal(elmShupatuD,toDd(shupatuInitDtVal));

	//チェックイン日カレンダ
	elmShupatuDp.datepicker({
		beforeShow:function(tag) {
			return {defaultDate : elmShupatuYM.val() && elmShupatuD.val() ? toDate((elmShupatuYM.val() + elmShupatuD.val())) : shupatuInitDtVal,
					minDate     : shupatuStartDtVal,
					maxDate     : shupatuEndDtVal,
					yearRange   : shupatuStartDtVal.getFullYear() + ":" +shupatuEndDtVal.getFullYear(),
					speed       : 'fast'
			};
		},
		onSelect:function(date,ui) {
			if ( date == '') {
				elmShupatuYM.val('');
				elmShupatuD.val('');
				return false;
			}
			var dt = elmShupatuDp.datepicker('getDate');
			elmShupatuYM.val(dt.getFullYear()*100+dt.getMonth()+1);
			elmShupatuD.val(dt.getDate());
		}
	});
	elmImgCal.click(function(){elmShupatuDp.datepicker('show');});

	//日程コンボ
	if ( isVarDefined(dpsNS.niteiList) ) {
		fillSelect(elmNitei,dpsNS.niteiList,true);
	} else {
		//JSで定義なければAjaxで全件取得
		elmNitei.empty();
		$('<option></option>').val('').text('---').appendTo(elmNitei);
		$.getJSON(
			dpsNS.ctxPath + '/pc/'+getRKaishaId()+'/common/hotel/selectNitei/',
			function(messages) {
				$.each(messages,function(idx,obj){
					$('<option></option>').val(obj.value).text(obj.label).appendTo(elmNitei);
				});
			}
		);
		if ( jQuery.browser.msie ) {
			elmNitei.width();	//for IE
		}
		elmNitei.val('');
	}

	//出発地県コンボ作成
	if ( elmShupatuti && isSelect(elmShupatuti) ) {
		fillSelect(elmShupatuti,findFromKenList(),true);
	}
	//到着地県コンボ作成
	elmTochakuti.val(dpsNS.toKenList[0]);
	//検索ボタン押下
	elmSubmitSearch.click(function(e) {return isValidForm() ? prepareSubmit(val2(findIdElm("actionPath"))) : false;});

	//詳細検索用にパラメータを整形
	function prepareSubmit(actionPath) {
		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 ( !elmShupatuYM.val() || !elmShupatuD.val() ) {
			alert(getMessage('shupatuDtRequired'));
			return false;
		}
		var shupatuDt = toDate((elmShupatuYM.val() + elmShupatuD.val()));
		if ( shupatuStartDtVal > shupatuDt ) {
			alert(getMessage('shupatuDtTooEarly',fmtDt(shupatuStartDtVal)));
			return false;
		}
		if ( shupatuEndDtVal < shupatuDt ) {
			alert(getMessage('shupatuDtTooLate',fmtDt(shupatuEndDtVal)));
			return false;
		}
		if ( !elmNitei.val() ) {
			alert(getMessage('niteiRequired'));
			return false;
		}
		if ( Number(val2(elmOtokoNinzu)) + Number(val2(elmOnnaNinzu)) < 1 ) {
			alert(getMessage('otonaNinzuBeGtZero'));
			return false;
		}
		if ( Number(val2(elmOtokoNinzu)) + Number(val2(elmOnnaNinzu)) + Number(val2(elmShogakuseiNinzu)) > 9 ) {
			alert(getMessage('goriyoNinzuBeLeNine'));
			return false;
		}
		return true;
	}

	//
	//JS utils
	//
	function isVarDefined(v) {return typeof v != 'undefined'}			//変数定義済み？

	//
	//ui utils
	//
	//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) {
		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 findFromKenList()            {return convIdArrToKenList(dpsNS.fromKenList);}
	//PKで都道府県名取得
	function findKenNameByPk(kenId)       {return dpsNS.mstKenList[kenId];}
	//都道府県ＩＤ配列を都道府県配列に変換
	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;
	}

	//
	//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.propShupatuDt.startMargin  || 0;}
	function dispNMonthes()     {return dpsNS.propShupatuDt.dispNMonthes || 6;}	//指定なし―>半年？
	function shupatuStartDt()   {return dpsNS.propShupatuDt.startDt ? (startDtLaterThanToday() ? toDate(dpsNS.propShupatuDt.startDt) : today ) : today;}
	function shupatuEndDt()     {return dpsNS.propShupatuDt.endDt ? toDate(dpsNS.propShupatuDt.endDt) : addNMonths(shupatuStartDtVal,dispNMonthes());}
	function shupatuInitDt()    {
		var nDaysLater = addNDays(today,startMargin());
		var initDay = shupatuStartDtVal > nDaysLater ? shupatuStartDtVal : nDaysLater;
		return initDay < shupatuEndDtVal ? initDay : shupatuEndDtVal;
	}
	function startDtLaterThanToday() {return dpsNS.propShupatuDt.startDt && toDate(dpsNS.propShupatuDt.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 );}

	function getNowDateTime() {
		var objDate = new Date;
		return objDate.getFullYear()
			+ fmtMdhmsElm(objDate.getMonth() +1)
			+ fmtMdhmsElm(objDate.getDate())
			+ fmtMdhmsElm(objDate.getHours())
			+ fmtMdhmsElm(objDate.getMinutes())
			+ fmtMdhmsElm(objDate.getSeconds());
	}

	//
	//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 RegExp.$1;
	}

	//
	//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("shosaiSearchSessionDate",getNowDateTime());
	appendHidden("kensakuKekaItiranShukuhakuJohoSentakuSessionDate",getNowDateTime());
	appendHidden("kensakuKekaItiranRyoteiJohoSentakuSessionDate",getNowDateTime());

	//任意指定項目設定(未定義ならデフォルト値指定用)
	appendHiddenUnlessDefined("goriyoninzu","1");				//大人(1)
	appendHiddenUnlessDefined("shogakuseiNinzu","0");			//小学生(0)
	appendHiddenUnlessDefined("yojiNinzu","0");					//幼児(0)
	appendHiddenUnlessDefined(
			"actionPath","/hotel/threeDaysKensaku/index");		//検索ボタン押下時の起動Action(デフォルト＝詳細検索)
	appendHiddenUnlessDefined(
			"staticPageUrl",document.location.pathname);		//戻り先(自URL)
});

