// Cityのオートコンプリート機能をセットアップ
function setUpCityAutoCmpl() {
	// /json_server/cityAutoCmpl.php からCity一覧を取得、オートコンプリートにセット
	YAHOO.util.Connect.asyncRequest('GET','/json_server/cityAutoCmpl.php',{
		success : function(o) {
			var d = document;
			YAHOO.util.Dom.addClass(d.body,'yui-skin-sam');
			
			var input = d.getElementById('City');
			if(input) {
				//YAHOO.util.Dom.setStyle('_position','absolute');
			}
			
			var container = d.getElementById('CityAutoCompleteContainer');
			if(!container) {
				//<div id="CityAutoCompleteContainer"></div>
				var container = d.createElement('div');
				container.id = 'CityAutoCompleteContainer';
				input.parentNode.appendChild(container);
				//input.parentNode.removeChild(input);
				//container.appendChild(input);
			}
			// IEのハックに必要？
			// see. http://developer.yahoo.com/yui/examples/autocomplete/ac_states_jsarray.html
			//YAHOO.util.Dom.setStyle(input,'_position','absolute');
			//YAHOO.util.Dom.setStyle(input.parentNode,'width','100%');
			//YAHOO.util.Dom.setStyle(input.parentNode,'z-index','9000');
			
			// An XHR DataSource   
			//var cityAutoCmplServer = "/json_server/cityAutoCmpl.php";   
			//var cityAutoCmplSchema = ["ResultItem", "KeyDataField"];   
			//var cityAutoCmplDataSource = new YAHOO.widget.DS_XHR(cityAutoCmplServer, cityAutoCmplSchema);
			//var cityAutoCmplDataSource = new YAHOO.widget.DS_XHR(cityAutoCmplServer);
			//cityAutoCmplDataSource.responseType = TYPE_JSON;
			var cityAutoCmplDataSource = new YAHOO.widget.DS_JSArray(eval('('+o.responseText+')'));
			var cityAutoCmpl = new YAHOO.widget.AutoComplete(input,container, cityAutoCmplDataSource);
			cityAutoCmpl.prehighlightClassName = "yui-ac-prehighlight";   
			cityAutoCmpl.typeAhead = true;   
			cityAutoCmpl.useShadow = true;   
			cityAutoCmpl.useIFrame = true;   
			cityAutoCmpl.minQueryLength = 0; 
		},
		failed : function(o) {
		},
		arguments : {}
	});
}

var calCheckIn,calCheckOut;

// チェックインのカレンダーをセットアップ
function setUpCheckInCalendar() {
	calCheckIn = PSINC.util.setUpCalendar('Check-in','CheckInCalendarContainer');
	// 今日+7日目から選択可能
	calCheckIn.cfg.setProperty('mindate',new Date((new Date()).getTime()+5*YAHOO.widget.DateMath.ONE_DAY_MS));
	return calCheckIn;
}

// チェックアウトのカレンダーをセットアップ
function setUpCheckOutCalendar() {
	calCheckOut = PSINC.util.setUpCalendar('Check-out','CheckOutCalendarContainer');
	return calCheckOut;
}

function getValue(el) {
	if(el) {
		if(el.type == 'select-one') {
			return el.options[el.selectedIndex].value;
		} else if(el.type == 'text' || el.type == 'hidden') {
			return el.value;
		}
	}
	return null;
}
function setValue(el,value) {
	if(el) {
		if(el.type == 'select-one') {
			var i,l = el.options.length;
			for(i = 0; i < l; ++ i) {
				if(el.options[i].value == value) {
					el.selectedIndex = i;
					break;
				}
			}
		} else if(el.type == 'text' || el.type == 'hidden') {
			el.value = value;
		}
	}
}

// カレンダーと宿泊日数の協調動作をセットアップ
function setUpCalendarCombination(cal1,cal2,nights) {
	if(YAHOO.lang.isString(nights)) {
		nights = document.getElementById(nights);
	}
	cal1.selectEvent.subscribe(function(type,args,obj){
		// cal1の選択日取得
		var selectedDates = cal1.getSelectedDates();
		if (selectedDates.length > 0) {
			var firstDate = selectedDates[0];
		} else {
			var firstDate = new Date();
		}

		// cal2の選択日取得
		var selectedDates2 = cal2.getSelectedDates();
		if (selectedDates.length > 0) {
			var firstDate2 = selectedDates2[0];
		} else {
			var firstDate2 = new Date();
		}

		if(YAHOO.widget.DateMath.after(firstDate,firstDate2)
			|| YAHOO.widget.DateMath.clearTime(firstDate) == YAHOO.widget.DateMath.clearTime(firstDate2)) {
			//alert('<=');
			// checkin が checkout より後ならcheckoutをcheckin+nightsにする
			
			//var n = getValue(nights);
			//var d = new Date(firstDate.getTime()+n*3600*24*1000);
			//alert(n);
			//cal2.select((d.getMonth()+1)+'/'+d.getDate()+'/'+d.getYear());
			var n = getValue(nights);
			if(n == '30+') {
				n = 30;
			}
			var t = new Date(firstDate.getTime()+YAHOO.widget.DateMath.ONE_DAY_MS*n);
			cal2.select(t);
			cal2.render();
		} else {
			//alert('>');
			// checkin が checkout より前なら nights を checkout-checkin にする
			var diffD = (firstDate2.getTime() - firstDate.getTime()) / (YAHOO.widget.DateMath.ONE_DAY_MS);
			if(diffD > 30) {
				diffD = '30+';
			}
			setValue(nights,diffD);
		}
		/*
			var n = getValue(nights);
			var d = new Date(firstDate.getTime()+n*3600*24*1000);
			alert(n);
			cal2.select((d.getMonth()+1)+'/'+d.getDate()+'/'+d.getYear());
			cal2.render();
		}
		*/
		
		// checkout の選択可能な日をcheckin以降にする
		cal2.cfg.setProperty('mindate',new Date(firstDate.getTime()+YAHOO.widget.DateMath.ONE_DAY_MS));
		
	},cal1,true);

	cal2.selectEvent.subscribe(function(type,args,obj){
		//cal2を選択すると、nightsを checkout - checkin に変更
		// cal1の選択日取得
		var selectedDates = cal1.getSelectedDates();
		if (selectedDates.length > 0) {
			var firstDate = selectedDates[0];
		} else {
			var firstDate = new Date();
		}

		// cal2の選択日取得
		var selectedDates2 = cal2.getSelectedDates();
		if (selectedDates.length > 0) {
			var firstDate2 = selectedDates2[0];
		} else {
			var firstDate2 = new Date();
		}

		var diffD = (firstDate2.getTime() - firstDate.getTime()) / (YAHOO.widget.DateMath.ONE_DAY_MS);
		if(diffD > 30) {
			diffD = '30+';
		}
		setValue(nights,diffD);
	},cal1,true);
	
	// nightsを変更するとcheckoutを変更する
	YAHOO.util.Event.addListener(nights,'change',function(event){
		// cal1の選択日取得
		var selectedDates = cal1.getSelectedDates();
		if (selectedDates.length > 0) {
			var firstDate = selectedDates[0];
		} else {
			var firstDate = new Date();
		}

		var n = getValue(nights);
		if(n == '30+') {
			n = 30;
		}
		var t = new Date(firstDate.getTime()+YAHOO.widget.DateMath.ONE_DAY_MS*n);
		cal2.select(t);
		cal2.render();
	},nights,true);

	// checkout の選択可能な日をcheckin以降にする
	cal2.cfg.setProperty('mindate',new Date(cal1.getSelectedDates()[0].getTime()+YAHOO.widget.DateMath.ONE_DAY_MS));
	
	// nights を補正する
	var diffD = (cal2.getSelectedDates()[0].getTime() - cal1.getSelectedDates()[0].getTime()) / (YAHOO.widget.DateMath.ONE_DAY_MS);
	if(diffD > 30) {
		diffD = '30+';
	}
	setValue(nights,diffD);
}

var MAX_ROOMS = 8;
var MAX_CHILDREN_PER_ROOM = 6;

// 部屋人数、部屋数表示制御関連
function showRoom(n) {
	var d = document;
	YAHOO.util.Dom.setStyle('Room'+n+'_ROW','display','');
	updateRoomChildAge(n);
	
	/*
    <tr id="Room{$smarty.section.ROOM_C.index}_C_age_row1">
      <td rowspan="4" class="search_text_bg">Room{$smarty.section.ROOM_C.index}</td>
      <td><span id="Room{$smarty.section.ROOM_C.index}_C_age_head1">Child1：</span></td>
      <td><span id="Room{$smarty.section.ROOM_C.index}_C_age_head2">Child2：</span></td>
      <td><span id="Room{$smarty.section.ROOM_C.index}_C_age_head3">Child3：</span></td>
    </tr>
    <tr id="Room{$smarty.section.ROOM_C.index}_C_age_row2">
      <td><span id="Room{$smarty.section.ROOM_C.index}_C_age_select1"><select name="Room_C_age[][]" id="Room{$smarty.section.ROOM_C.index}_C_age1">
        <option value="" selected="selected">?</option>
	*/
}

function hideRoom(n) {
	var d = document;
	YAHOO.util.Dom.setStyle('Room'+n+'_ROW','display','none');
	hideRoomChildAge(n);
}

function updateRoomChildAge(n) {
	var d = document;
	var c = getValue(d.getElementById('Room'+n+'_C'));
	if( c > 0){
		showRoomChildAge(n,c);
	} else {
		hideRoomChildAge(n);
	}
}

function showRoomChildAge(n,c) {
	YAHOO.util.Dom.setStyle('Room'+n+'_C_age_row1','display','');
	YAHOO.util.Dom.setStyle('Room'+n+'_C_age_row2','display','');
	YAHOO.util.Dom.setStyle('Room'+n+'_C_age_row3','display','');
	YAHOO.util.Dom.setStyle('Room'+n+'_C_age_row4','display','');
	var i;
	for(i = 1; i <= c; ++ i) {
		YAHOO.util.Dom.setStyle('Room'+n+'_C_age_head'+i,'display','');
		YAHOO.util.Dom.setStyle('Room'+n+'_C_age_select'+i,'display','');
	}
	for(; i <= MAX_CHILDREN_PER_ROOM; ++ i) {
		YAHOO.util.Dom.setStyle('Room'+n+'_C_age_head'+i,'display','none');
		YAHOO.util.Dom.setStyle('Room'+n+'_C_age_select'+i,'display','none');
	}
	updateChildNotice(n,true);
}

function hideRoomChildAge(n) {
	YAHOO.util.Dom.setStyle('Room'+n+'_C_age_row1','display','none');
	YAHOO.util.Dom.setStyle('Room'+n+'_C_age_row2','display','none');
	YAHOO.util.Dom.setStyle('Room'+n+'_C_age_row3','display','none');
	YAHOO.util.Dom.setStyle('Room'+n+'_C_age_row4','display','none');
	updateChildNotice(n,false);
}

// 子供年齢選択注意書き表示制御関連
var DISPLAY_NOTICE = 0;
function updateChildNotice(n,display) {
	var org = DISPLAY_NOTICE;
	if(display) {
		DISPLAY_NOTICE |= (1 << n);
	} else {
		DISPLAY_NOTICE |= (1 << n);
		DISPLAY_NOTICE ^= (1 << n);
	}
	if(org != DISPLAY_NOTICE) {
		if(DISPLAY_NOTICE) {
			YAHOO.util.Dom.setStyle('Room_C_notice','display','');
		} else {
			YAHOO.util.Dom.setStyle('Room_C_notice','display','none');
		}
	}
}

function updateRoomsDisplay() {
	var d = document;
	var nRooms = getValue(d.getElementById('Rooms'));
	// 9+選択時は問い合わせフォームに飛ばすために
	// 部屋数の選択を消す
	if(nRooms == '9+') {
		YAHOO.util.Dom.setStyle('Room1_A','display','none');
		YAHOO.util.Dom.setStyle('Room1_C','display','none');
		YAHOO.util.Dom.setStyle('Room1_title','display','none');
		hideRoomChildAge(1);
		var i;
		for(i = 2; i <= MAX_ROOMS; ++ i) {
			hideRoom(i);
			//YAHOO.util.Dom.setStyle('Room'+i+'_ROW','display','');
		}
		YAHOO.util.Dom.setStyle('Search_Option_Hotel','display','none');
		YAHOO.util.Dom.setStyle('Search_submit_search','display','none');
		YAHOO.util.Dom.setStyle('Search_submit_request','display','');
	} else {
		YAHOO.util.Dom.setStyle('Room1_A','display','');
		YAHOO.util.Dom.setStyle('Room1_C','display','');
		YAHOO.util.Dom.setStyle('Room1_title','display','');
		updateRoomChildAge(1);
		var i;
		for(i = 2; i <= nRooms; ++ i) {
			showRoom(i);
			//YAHOO.util.Dom.setStyle('Room'+i+'_ROW','display','');
			
		}
		for(;i <= MAX_ROOMS; ++ i) {
			hideRoom(i);
			//YAHOO.util.Dom.setStyle('Room'+i+'_ROW','display','none');
		}

		YAHOO.util.Dom.setStyle('Search_Option_Hotel','display','');
		YAHOO.util.Dom.setStyle('Search_submit_search','display','');
		YAHOO.util.Dom.setStyle('Search_submit_request','display','none');
	}
}

function setUpRoom() {
	// 子供年齢選択注意をとりあえず隠す
	YAHOO.util.Dom.setStyle('Room_C_notice','display','none');

	// 部屋を変更された場合に部屋人数表示切替
	updateRoomsDisplay();
	YAHOO.util.Event.addListener('Rooms','change',updateRoomsDisplay);

	// 子供人数変更時に子供年齢表示切替
	var i,d = document;
	for(i = 1; i <= MAX_ROOMS; ++ i) {
		var target = d.getElementById('Room'+i+'_C');
		target._room_n = i;
		YAHOO.util.Event.addListener(target,'change',function(event){
			updateRoomChildAge(this._room_n);
		},target,true);
	}
}

function setUpFormAction() {
	// 注意非表示
	YAHOO.util.Dom.setStyle('Search_Icscramation','display','none');
	YAHOO.util.Dom.setStyle('Search_Icscramation_City','display','none');
	YAHOO.util.Dom.setStyle('Search_Icscramation_Room','display','none');

	var form = document.getElementById('Form_Search');
	YAHOO.util.Event.addListener(form,'submit',function(){
		YAHOO.util.Dom.setStyle('Search_Icscramation_City','display','none');
		YAHOO.util.Dom.setStyle('Search_Icscramation_Room','display','none');

		// フォームのバリデーションを行う
		var d = document;

		// check City
		if(getValue(d.getElementById('City')) == '' 
			&& getValue(d.getElementById('Hotelname')) == ''){
			// 注意表示
			YAHOO.util.Dom.setStyle('Search_Icscramation','display','');
			YAHOO.util.Dom.setStyle('Search_Icscramation_City','display','');
			YAHOO.util.Event.stopEvent(event);
			return false;
		}

		// check children
		var nRoom = getValue(d.getElementById('Rooms'));
		if(nRoom == '9+') {
			form.action = '/contact.php';
			form.method = 'post';
		} else {
			var i,errRoom = false;
			for(i = 1; i <= nRoom; ++ i) {
				var nRoomChild = getValue(d.getElementById('Room'+i+'_C'));
				if(nRoomChild > 0) {
					var j;
					for(j = 1; j <= nRoomChild; ++ j) {
						if(getValue(d.getElementById('Room'+i+'_C_age'+j)) == '') {
							errRoom = true;
							break;
						}
					}
				}
				if(errRoom) {
					break;
				}
			}
			
			if(errRoom) {
				// 注意表示
				YAHOO.util.Dom.setStyle('Search_Icscramation','display','');
				YAHOO.util.Dom.setStyle('Search_Icscramation_Room','display','');
				YAHOO.util.Event.stopEvent(event);
				return false;
			}
		}
		
		
		// 必要なパラメータのみをGETで送信するようにする
		// 新しくフォームを作成し、hiddenでパラメータを作成し、自動転送する。
		var form2 = document.createElement('form');
		form2.action = form.action;
		form2.method = form.method;
		// 必要なフォームの値をコピー
		form2.appendChild(PSINC.util.createHiddenElement('City',PSINC.util.getFormElementValue(form.elements['City'])));
		form2.appendChild(PSINC.util.createHiddenElement('hotelname',PSINC.util.getFormElementValue(form.elements['hotelname'])));
		form2.appendChild(PSINC.util.createHiddenElement('class',PSINC.util.getFormElementValue(form.elements['class'])));
		form2.appendChild(PSINC.util.createHiddenElement('check_in',PSINC.util.getFormElementValue(form.elements['check_in'])));
		form2.appendChild(PSINC.util.createHiddenElement('check_out',PSINC.util.getFormElementValue(form.elements['check_out'])));
		form2.appendChild(PSINC.util.createHiddenElement('nights',PSINC.util.getFormElementValue(form.elements['nights'])));
		var rooms = PSINC.util.getFormElementValue(form.elements['rooms']);
		form2.appendChild(PSINC.util.createHiddenElement('rooms',rooms));
		
		for(i = 1; i <= rooms; ++i) {
			var adults = PSINC.util.getFormElementValue(d.getElementById('Room'+i+'_A')),
				children = PSINC.util.getFormElementValue(d.getElementById('Room'+i+'_C'));
				
				form2.appendChild(PSINC.util.createHiddenElement('adults[]',adults));
				form2.appendChild(PSINC.util.createHiddenElement('childs[]',children));
				
				for(j = 1; j <= children; ++ j) {
					form2.appendChild(PSINC.util.createHiddenElement('Room_C_age['+(i-1)+'][]',PSINC.util.getFormElementValue(d.getElementById('Room'+i+'_C_age'+j))));
				}
				
		}
		
		// 現在のsubmitを中止。その後に新しいフォームをsubmit。
		window.setTimeout(function(){d.body.appendChild(form2);form2.submit();},100);
		YAHOO.util.Event.stopEvent(event);
		
		return false;
		
		//return true;
	},form,true);
}
	
function init() {
	setUpFormAction();
	setUpCityAutoCmpl();
	var c1 = setUpCheckInCalendar();
	var c2 = setUpCheckOutCalendar();
	setUpCalendarCombination(c1,c2,'Nights');
	setUpRoom();
}
YAHOO.util.Event.onDOMReady(init);

