var o_navigator = navigator.userAgent.toLowerCase();

var isOpera = o_navigator.indexOf("opera")>-1 ? true : false;	// オペラ判定
var isKHTML = o_navigator.indexOf("khtml")>-1 ? true : false;	// khtml判定？
var isNetScape = o_navigator.indexOf("netscape")>-1 ? true : false;	// ネスケ判定
var isFireFox = o_navigator.indexOf("firefox")>-1 ? true : false;	// FireFox判定

// 以下設定部分 ----------------------------
var mArray		= new Array("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月");
var dArray		= new Array("日","月","火","水","木","金","土");
var datesArray	= new Array(31,28,31,30,31,30,31,31,30,31,30,31);
//var prevMess	= "<< 前月";
//var nextMess	= "次月 >>";
var prevMess	= "<img src='/images/basis_ciao/retail/common/arrow_left.gif' />";
var nextMess	= "<img src='/images/basis_ciao/retail/common/arrow_right.gif' />";
var selectMess	= "";
var closeMess	= "<img src='/images/basis_ciao/retail/common/cal_close.gif' style='vertical-align: bottom;' />";
var dateDelimitor = ""; // 区切り文字

var yearMax = 2; // 何年表示するか
var monthMax = 0; // 何ヶ月表示するか
// -----------------------------------------

var today 			= new Date();			// 今日
var cD 				= today.getDay();		// 今日の日(曜日 0-6)
var cT				= today.getDate() + 1;		// 今日の日(1-31)
var cM				= today.getMonth();		// 今日の月

var cY				= today.getFullYear();	// 今日の年

var newM			= cM;	// 今回描画中の月
var newY			= cY;	// 今回描画中の年

var numCalendars	= 2;	// 表示するカレンダーの数
var calopen 		= 0;	// 現在カレンダーが表示されてるか否か
var o_inputs = 0;	// 対象のインプットタグ(配列)
var b_enableYears = true; // 年月リンクの使用有無

var i_firstMonth = cM;
var i_ofirstYear = cY;
var i_ofirstMonth = cM;
var b_calinit = 0;
var o_calbody = null;	// カレンダーのオブジェクト
var o_calbody_text = "";	// カレンダーのオブジェクトの内部
var b_dateMax = 0;		// 今から一年間を超えてるときはTrue

var dayMax = Math.floor(((new Date(cY+yearMax,cM+monthMax,cT)) - today)/86400000);	// 表示する最大の日を、年月の定義から自動取得

// タイマイベント
var t_calcloser = null;

// フォームセット時に発生するイベント。
// 処理はカレンダー実装先で記述
function onFormSet() {};

// 選択可能な開始日を設定
function setEnableChoiceDay(enableChoiceDay) {
  cT = today.getDate() + enableChoiceDay;
}

// オペラとかkhtml(？)のときは必要
//  ・ないと次・前などをクリックしても、枠が閉じてしまう
function preventClose(evt){
	if(isKHTML||isOpera||isFireFox)
		evt.stopPropagation();
}

// カレンダーのナビゲーション部分取得
function getNavi() {
	var navi = "";
	var prev = ""
	var next = ""
	navi += "<table border='0' cellpadding='0' cellspacing='0' width='100%'>";
	navi += "<tr><td width='100'>&nbsp;</td><td width='80'>" + prev + "</td>";
	navi += "<td align='center' width='120' style='color:#ffffff;'>" + selectMess + "</td>";
	navi += "<td width='80' align='right'>" + next + "</td>";
	navi += "<td width='20'>";
	//navi += "<div class='calClose'><a href='#' onclick='top.closeCal();return false;'>" + closeMess + "</a></div>";
	navi += "<a href='#' onclick='closeCal();return false;'>" + closeMess + "</a>";
	navi += "</td></tr></table>";

	return navi;
}

// カレンダーの「前月」ナビゲーション部分取得
function getNaviPrev() {
	var navi = "";
	var prev = ""
	if (i_ofirstMonth == cM && i_ofirstYear == cY) {
		prev = "<span class='calNavA'>&nbsp;</span>";
	} else {
		prev = "<a href='#' onclick='ty_changeMonths("+i_firstMonth+"-2);preventClose(event);return false;' class='calNavA'>" + prevMess + "</a>"; // i_firstMongh-2で2ヶ月移動
	}
	navi += "<table border='0'><tr>";
	navi += "<td height='90'>" + prev + "</td></tr>";
	navi += "</table>";

	return navi;
}
// カレンダーの「次月」ナビゲーション部分取得
function getNaviNext() {
	var navi = "";
	var next = ""
	if (b_dateMax) {
		next = "<span class='calNavA'>&nbsp;</span>";
	} else {
		next = "<a href='#' onclick='ty_changeMonths("+i_firstMonth+"+2);preventClose(event);return false;' class='calNavA'>" + nextMess + "</a>"; // i_firstMongh+2で2ヶ月移動
	}
	navi += "<table border='0'><tr>";
	navi += "<td height='90'>" + next + "</td></tr>";
	navi += "</table>";

	return navi;
}

// 一日分描画
function makeDay(which,no){
	if((cT > which && cM == newM && cY == newY) || b_dateMax){
		if (no == 0) {
			s_makeDate = "<td class='calDateOff'>";
		}else if (no == 6) {
			s_makeDate = "<td class='calDateOff'>";
		}else{
			s_makeDate = "<td class='calDateOff'>";
		}
		s_makeDate = "<td class='calDateOff'>";
		s_makeDate+= which;
	}else{
		
		s_makeDate = "<td class='calDate'>";
		if (no == 0) {
			//s_makeDate = "<td class='calDateSun'>";
			s_makeDate+= "<a href='#' onclick='ty_setDate("+newM+","+which+",this.parentNode,"+newY+");return false;' class='calDateASun'>";
		}else if (no == 6) {
			//s_makeDate = "<td class='calDateSat'>";
			s_makeDate+= "<a href='#' onclick='ty_setDate("+newM+","+which+",this.parentNode,"+newY+");return false;' class='calDateASat'>";
		}else{
			//s_makeDate = "<td class='calDate'>";
			s_makeDate+= "<a href='#' onclick='ty_setDate("+newM+","+which+",this.parentNode,"+newY+");return false;' class='calDateA'>";
		}
		//s_makeDate+= "<a href='#' onclick='self.ty_setDate("+newM+","+which+",this.parentNode,"+newY+");return false;' class='calDateA'>";
		s_makeDate+= which;
		s_makeDate+="</a>";
	}
	s_makeDate+="</td>\n";

	return s_makeDate;
}

// ページ遷移時に呼ばれる
function ty_changeMonths(which){
	o_calbody_text="";
	if(which < 0){
		if(which == -1) {
			which=11;
		}
		else {
			which=10;
		}
		newY--;
	}
	// 最後じゃない
	b_dateMax = false;
	// 新しい月で再描画
	vm_makeCal(which, 0);
}

// 指定月のカレンダーを作る
function vm_makeCal(whichMonth, count){
	b_calinit = 1;
	o_cal = "";
	o_caltr = "";
	newM = whichMonth;
	if(newM < cM)
		newY = cY+(newY-cY);
	if (newM >= 12){
		newM = whichMonth-12;
		newY++;
	}
	if(count==0){
		i_firstMonth = newM;

		i_ofirstMonth  = newM;
		i_ofirstYear = newY;
	}
	else {
		o_cal+="</td><td>";
	}
	newDs = datesArray[newM];
	// ２月のときはうるう年の算出もする。
	if (newM == 1){
		isLeap 	= (newY % 4 == 0 && (newY % 100 !=0 || newY % 400 ==0 )) ? 1:0
		newDs+=isLeap;
	}
	newD = new Date(newY,newM,1).getDay();
	countDay = newD;
	s_calclass = "calTableH";
	o_cal+="<table month='"+newM+"' year='"+newY+"' cellpadding='0' cellspacing='0' border='0' class='"+s_calclass+"'>\n";
	o_cal+= "<tr class='calRowHighlight'>\n";
	o_cal+= "<td colspan='7' class='calLabel'>";
	if(b_enableYears) {
		o_cal+= "<a href='#' onclick='ty_setYearMonth("+newY+","+newM+");return false;' class='calDateA'>";
		//o_cal+= mArray[newM]+"&nbsp;"+newY;
		o_cal+= newY + "年&nbsp;" + mArray[newM];
		o_cal+= "</a>";
	}
	else {
		o_cal+= mArray[newM]+"&nbsp;"+newY;
	}
	o_cal+= "</td>";
	o_cal+="</tr>\n";
	o_cal+=o_caltr;

	o_caltd = "";
	o_caltd += "<tr>\n";

	for(i=0;i < dArray.length;i++){
		if (i == 0) {
			o_caltd += "<td class='calDayNameSun'>";
		} else if (i == 6) {
			o_caltd += "<td class='calDayNameSat'>";
		} else {
			o_caltd += "<td class='calDayName'>";
		}
		o_caltd += dArray[i];
		o_caltd += "</td>\n";
	}

	o_caltd += "</tr>\n";

	o_cal += o_caltd;
	o_caltd = "";
	i_calRows = 0;

	// 1日目まで空白でつぶす
	for(bd = 0;bd < newD;bd++)
		o_caltd += "<td class='calDate'>&nbsp;</td>\n";

	for (d = 1;d <= newDs;d++){
		if (!b_dateMax){
			// 最大日数を超えているか(ミリ秒差分を日数に変換して比較)
			b_dateMax = (Math.floor(((new Date(newY,newM,d))-today)/86400000)>dayMax) ? 1 : 0;
		}
		o_caltd += makeDay(d, countDay);
		countDay++;
		if(countDay == 7){
			countDay = 0;

			o_cal += "<tr>\n";
			o_cal += o_caltd;
			o_cal += "</tr>\n";
			o_caltd = "";
			i_calRows++;
		}
		if((d == newDs) && (countDay != 0)){
			for (bd = countDay;bd < 7;bd++) 
				o_caltd += "<td class='calDate'>&nbsp;</td>\n";

			o_cal += "<tr>\n";
			o_cal += o_caltd;
			o_cal += "</tr>\n";
			o_caltd = "";
			i_calRows++;
		}
	}
	// 5週目以内のときは、足りない分空白でつぶす
	if(i_calRows < 6){
		o_caltd = "";
		for(bd = 0;bd < 7;bd++) {
			//o_caltd += "<td class='calDate'>&nbsp;</td>\n";
			o_caltd += "<td class='No_calDate'>&nbsp;</td>\n";
		}
		o_cal += "<tr>\n";
		o_cal += o_caltd;
		o_cal += "</tr>\n";
	}
	o_cal+="</table>";

	o_calbody_text += o_cal;
	count++;

	if(count < numCalendars){
		vm_makeCal(newM+1, count);
	}else if (i_firstMonth > newM){
		newY--;
	}

	if(count == numCalendars) {
		o_calbody.innerHTML = "<table><tbody><tr><td>" 
					+ getNavi() + "</td></tr>"
					+ "<table border='0'><tbody><tr>" 
					+ "<td>" + getNaviPrev() + "</td>" 
					+ "<td>" + o_calbody_text + "</td>" 
					+ "<td>" + getNaviNext() + "</td>" 
					+ "</tr></tbody></table>"
					+ "</td></tr></tbody></table>";
	}
}

// 対象オブジェクトに、選択された値を設定
function ty_setDate(whatMonth,whatDate,whatTD,whatYear){
	whatTD.className = "calDateSel";

	if(o_inputs.length == 1) {
		o_inputs[0].value = whatYear + dateDelimitor + (((""+(whatMonth+1)).length == 1)?"0":"") + (whatMonth + 1) + dateDelimitor + (((""+whatDate).length == 1)?"0":"") + whatDate;
	}
	else {
		o_inputs[0].value = whatYear;
		o_inputs[1].value = whatMonth + 1;
		o_inputs[2].value = whatDate;
	}

	//if(!isFireFox) onFormSet();
	onFormSet();
	closeCal();
}
// 対象オブジェクトに、選択された年月を設定
function ty_setYearMonth(whatYear,whatMonth){

	if(o_inputs.length == 1) {
		o_inputs[0].value = whatYear + dateDelimitor + (((""+(whatMonth+1)).length == 1)?"0":"") + (whatMonth + 1);
	}
	else {
		o_inputs[0].value = whatYear;
		o_inputs[1].value = whatMonth + 1;
		o_inputs[2].value = "";
	}

	//if(!isFireFox) onFormSet();
	onFormSet();
	closeCal();
}

// xxxx/xx/xx 形式を分割
function splitDate(s_input){
	this.delimitor = (s_input.indexOf("/")>-1) ? "/" : (s_input.indexOf(".")>-1) ? "." : (s_input.indexOf("-")>-1) ? "-" : (s_input.indexOf(",")>-1) ? "," : "/";
	a_input = s_input.split(this.delimitor);
	this.date = -1;this.month = -1;this.year = -1;
	if(a_input.length==3&&!isNaN(a_input[0])&&!isNaN(a_input[1])&&!isNaN(a_input[2])){
		this.month = parseInt(a_input[1],10)-1;
		this.date = parseInt(a_input[2],10);
		this.year = a_input[0];
		if(this.month>11||this.month<0)this.month=-1;
		if(this.date>31||this.month<0)this.date=-1;
		i_yrlength = this.year.toString().length;
		if(i_yrlength==2)this.year = "20"+this.year;//fix this in the next 96 years...
		if(i_yrlength<1||i_yrlength==3||this.year<cY)this.year=-1;
	}
	this.day = new Date(this.year, this.month, this.date).getDay();
}

// カレンダーを作る
function makeCalendar(v_inputs){
	o_inputs = v_inputs;
	// カレンダーをクリア
	o_calbody_text = "";
	// 入力値取得
	o_udate = new splitDate(v_inputs[0].value);

	switch(b_calinit){
		case 0:	// ページが開かれてから一回目
			if(o_udate.month != -1 && o_udate.year != -1 && o_udate.date != -1){
				newY = o_udate.year;
				newM = o_udate.month;
				newD = o_udate.date;
				vm_makeCal(o_udate.month, 0);
			}else{
				newY = cY;
				newM = cM;
				newD = cD;
				vm_makeCal(cM, 0);
			}
			break;
		default:	// それ以外
			newM = i_ofirstMonth;
			newY = i_ofirstYear;
			vm_makeCal(newM, 0);
	}
}

// メイン
function openCal(v_inputs,s_cal,enableYears,position){
/*	try{        */
		b_dateMax = false;

		// タイマイベントクリア
		clearTimeout(t_calcloser);
		// ウインドウは閉じられている
		calopen = 0;
		// カレンダーオブジェクト取得
		o_calbody = document.getElementById(s_cal);

		// 表示
		o_calbody.style.display = "block";
		o_calbody.className = "calboxon";	

		// 年月のリンクを表示するかどうかのフラグを保持
		b_enableYears = enableYears;

		// カレンダー作成
		makeCalendar(v_inputs)

		// テキストボックス位置取得
		v_inputs[0].style.position = "relative";

		if(position != null && position != void(0)) {
			switch(position) {
				case "top":
					// テキストボックスの上にあわせる
					i_calx = parseInt(v_inputs[0].offsetLeft)+parseInt(v_inputs[0].offsetWidth - 365);
					i_caly = parseInt(v_inputs[0].offsetTop);
					break;
				case "bottom":
					// テキストボックスの下にあわせる
					i_calx = parseInt(v_inputs[0].offsetLeft)+parseInt(v_inputs[0].offsetWidth + 150);
					i_caly = parseInt(v_inputs[0].offsetTop)+parseInt(v_inputs[0].offsetHeight)-parseInt(o_calbody.offsetHeight);
					break;
				case "c2_a":
					// テキストボックスの下にあわせる
					i_calx = parseInt(v_inputs[0].offsetLeft)+parseInt(v_inputs[0].offsetWidth ) + 280;
					i_caly = parseInt(v_inputs[0].offsetTop) + 330;
					break;
				case "c1":
					// テキストボックスの下にあわせる
					i_calx = parseInt(v_inputs[0].offsetLeft)+parseInt(v_inputs[0].offsetWidth ) + 0;
					i_caly = parseInt(v_inputs[0].offsetTop) + 410;
					break;
				case "ci1":
					// テキストボックスの下にあわせる
					i_calx = parseInt(v_inputs[0].offsetLeft)+parseInt(v_inputs[0].offsetWidth ) + 0;
					i_caly = parseInt(v_inputs[0].offsetTop) + 120;
					break;
			}
		}
		else {
			// テキストボックスの下にあわせる
			i_calx = parseInt(v_inputs[0].offsetLeft)+parseInt(v_inputs[0].offsetWidth + 150);
			i_caly = parseInt(v_inputs[0].offsetTop)+parseInt(v_inputs[0].offsetHeight)-parseInt(o_calbody.offsetHeight) + 10;
		}

		// カレンダー取得
		o_cal = document.getElementById(s_cal);
		// カレンダー位置設定
		o_cal.style.top = i_caly+"px";
		o_cal.style.left = i_calx+"px";

		// 0.5秒後に表示状態にする
		setTimeout("calopen = 1",500);
/*	}catch(ex){
		alert("openCal:" + ex.message + "\n")
	}*/
}

// ウインドウを閉じる
function closeCal(){
	// 開かれていたら0.5秒後に閉じる
	if(o_calbody && calopen)
		t_calcloser = setTimeout("o_calbody.style.display = 'none';",500);
	// ウインドウは閉じられている
	calopen=0;
}

// 各イベントを設定する
// ウインドウがクリックされた
window.onclick = closeCal;
// ドキュメントがクリックされた
window.document.onclick = closeCal;

function setStayDt(value) {
		var format = "泊数:" + value + "泊";
	
		if(document.getElementsByName("stay_dt") != void(0)) {
			if(document.getElementsByName("stay_dt").length > 0) {
				document.getElementsByName("stay_dt")[0].innerHTML = format;
			}
			else if(document.getElementById("stay_dt") != void(0)) {
				document.getElementById("stay_dt").innerHTML = format;
			}
		}
	}

	function calcStayDt() {
		var in_y = document.form.check_in_y.value;
		var in_m = document.form.check_in_m.value;
		var in_d = document.form.check_in_d.value;
		var out_y = document.form.check_out_y.value;
		var out_m = document.form.check_out_m.value;
		var out_d = document.form.check_out_d.value;

		if(in_y != "" && in_m != "" && in_d != "" && out_y != "" && out_m != "" && out_d != "") {
			if(!isNaN(in_y) && !isNaN(in_m) && !isNaN(in_d) && !isNaN(out_y) && !isNaN(out_m) && !isNaN(out_d)) {

				var in_dt = new Date(in_y, in_m - 1, in_d);
				var out_dt = new Date(out_y, out_m - 1, out_d);

				if(compare(in_dt, out_dt) < 0) {
					var diffDt = dateDiff(in_dt, out_dt);
					setStayDt(diffDt);
				}
				else {
					setStayDt(0);
				}
			}
			else {
				setStayDt(0);
			}
		}
		else {
			setStayDt(0);
		}
	}

