function renderCalendar(data)
{
	var now = new Date();
	var min_y = now.getFullYear();
	var min_m = now.getMonth() + 1;
	var min_d = now.getDate() + 1;
	var max_y = min_y;
	var max_m = min_m + 6;
	var max_d = min_d;
	if (max_m > 12) {
		max_m -= 12;
		max_y += 1;
	}
	var mindate = min_m + '/' + min_d + '/' + min_y;
	var maxdate = max_m + '/' + max_d + '/' + max_y;
	var option = {
		'mindate': mindate,
		'maxdate': maxdate
	};

	var lcalendar = new YAHOO.widget.Calendar("lcalendar", "lcalendar", option);
	var rcalendar = new YAHOO.widget.Calendar("rcalendar", "rcalendar", option);
	var list = [lcalendar, rcalendar];
	for (var i = 0, l = list.length; i < l; i++) {
		var cal = list[i];
		cal.d = null;
		cal.changePageEvent.subscribe(
			function(type, args, obj) {
				refresh(this, data);
			}, cal, true
		);
		cal.reset = function() {
			var m = this.cfg.getProperty("pagedate").getMonth();
			this.clear();
			this.setMonth(m);
			refresh(this, data, true);
			this.d = null;
			setItem('diff', 0);
			setItem('price', 0);
			setItem('priceh', 0);
			setItem('total_price', 0);
			setItem(this.id.charAt(0) + 'date', '');
			if (this.id.charAt(0) == 'l') {
				setItem('meet_d', '');
				setItem('dst_d', '');
			} else {
				setItem('ret_d', '');
			}
		};
		cal.selectEvent.subscribe(
			function(type, args, obj) {
				var d = args.toString().split(",");
				this.d = new Date(d[0] + '/' + d[1] + '/' + d[2]);
				if (!compdate(lcalendar, rcalendar)) {
					this.reset();
					return;
				}
				var w = this.cfg.getProperty("WEEKDAYS_1CHAR")[this.d.getDay()];
				var v = d[0] + "年" + d[1] + "月" + d[2] + "日" + '(' + w + ')';
				// modified at 2009.04.14
				if (this == lcalendar) {
					setItem(this.id.charAt(0) + 'date', v);
					setItem('meet_d', v);
					setItem('dst_d', v);
				} else {
					setItem(this.id.charAt(0) + 'date', v);
					setItem('ret_d', v);
				}

				var list = dateList(lcalendar.d, rcalendar.d);
				var diff = list.length;
				var price;
				if (diff == 2) {
					price = parseInt(data.price1);
				} else if (diff == 3) {
					price = parseInt(data.price2);
				} else {
					price = parseInt(data.price2) + (data.price3 * (diff - 3));
				}
				setItem('diff', diff);
				setItem('price', price);

				// 料金計算
				var full_list = data['full_list'];
				var priceh = 0;
				var pricep = parseInt(YAHOO.util.Dom.get('plan').value);
				for (var i = 0, l = list.length; i < l; i++) {
					var d = list[i];
					var w = d.getDay();
					var t = d.getTime();
					var st = d / 1000;

					// 満車日
					if (typeof full_list[st] != 'undefined' && full_list[st] == 0) {
						alert('満車日を避けて選択して下さい。');
						this.reset();
						return;
					}
					// 金土日祝
					if (w == 5 || w == 6 || w == 0 || isHoliday(d.getFullYear(), d.getMonth() + 1, d.getDate())) {
						priceh += parseInt(data.priceh);
					}
					// 繁忙期
					for (var j = 0, k = busy_date_list.length; j < k; j++) {
						var li = busy_date_list[j];
						for (var o = 0, p = li.length; o < p; o++) {
							if (t == li[o]) priceh += parseInt(data.priceb);
						}
					}
				}
				setItem('priceh', priceh);
				setItem('total_price', price + priceh + pricep);
			}, cal, true
		);
		customize(cal);
		refresh(cal, data, true);
	}

	var manager = new CookieManager({shelfLife:1});
	var ldate = manager.getCookie('ldate') || '';
	var rdate = manager.getCookie('rdate') || '';
	if (/^[\d\/]+$/.test(ldate) && /^[\d\/]+$/.test(rdate)) {
		var ld = new Date(ldate);
		var rd = new Date(rdate);
		lcalendar.d = ld;
		rcalendar.d = rd;
		var w = lcalendar.cfg.getProperty("WEEKDAYS_1CHAR")[ld.getDay()];
		ldate = ld.getFullYear() + "年" + (ld.getMonth()+1) + "月" + ld.getDate() + "日" + '(' + w + ')';
		var w = rcalendar.cfg.getProperty("WEEKDAYS_1CHAR")[rd.getDay()];
		rdate = rd.getFullYear() + "年" + (rd.getMonth()+1) + "月" + rd.getDate() + "日" + '(' + w + ')';
		var el = YAHOO.util.Dom.get('name_kana');
		Element.scrollTo(el);
		el.focus();
	}
	setItem('ldate', ldate);
	setItem('rdate', rdate);
	setItem('diff', manager.getCookie('diff') || 0);
	setItem('price', manager.getCookie('price') || 0);
	setItem('priceh', manager.getCookie('priceh') || 0);
	setItem('pricep', manager.getCookie('pricep') || 0);
	setItem('total_price', manager.getCookie('total_price') || 0);
	var plan = YAHOO.util.Dom.get('plan');
	var index = manager.getCookie('planindex') || 0;
	plan.selectedIndex = index;
	var planname = index > 0 ? data['plan_' + index] : '';
	setItem('planname', planname);
	setItem('planindex', index);

	manager.clearCookie('ldate');
	manager.clearCookie('rdate');
	manager.clearCookie('diff');
	manager.clearCookie('price');
	manager.clearCookie('priceh');
	manager.clearCookie('pricep');
	manager.clearCookie('total_price');
	manager.clearCookie('planindex');

	var form = YAHOO.util.Dom.get('inputform');
	form.onsubmit = function() {
		if (lcalendar.d == null) return true;
		var ld = lcalendar.d;
		var rd = rcalendar.d;
		var ldate = ld.getFullYear() + '/' + (ld.getMonth()+1) + '/' + ld.getDate();
		var rdate = rd.getFullYear() + '/' + (rd.getMonth()+1) + '/' + rd.getDate();
		manager.setCookie('ldate', ldate);
		manager.setCookie('rdate', rdate);
		manager.setCookie('diff', YAHOO.util.Dom.get('diff').value || 0);
		manager.setCookie('price', YAHOO.util.Dom.get('price').value || 0);
		manager.setCookie('priceh', YAHOO.util.Dom.get('priceh').value || 0);
		manager.setCookie('pricep', YAHOO.util.Dom.get('pricep').value || 0);
		manager.setCookie('total_price', YAHOO.util.Dom.get('total_price').value || 0);
		manager.setCookie('planindex', plan.selectedIndex);
		return true;
	}
}
function refresh(calendar, data, is_render)
{
	var cur_y = calendar.cfg.getProperty("pagedate").getFullYear();
	var cur_m = calendar.cfg.getProperty("pagedate").getMonth();
	if (typeof is_render != 'undefined' || cur_m == 0 || cur_m == 11) {
		// 1年分の祝日
		for (var m = 1; m <= 12; m++) {
			for (var d = 1; d <= 31; d++) {
				if (isHoliday(cur_y, m, d)) {
					calendar.addRenderer(cur_y + '/' + m + '/' + d, function(calendar, cell) {YAHOO.util.Dom.addClass(cell, 'holiday');});
				}
			}
		}
		// 満車日
		var full_list = data['full_list'];
		var date = new Date();
		for (var t in full_list) {
			if (full_list[t] == 0) {
				date.setTime(t * 1000);
				var y = date.getFullYear();
				var m = date.getMonth() + 1;
				var d = date.getDate();
				calendar.addRenderer(y + '/' + m + '/' + d, function(calendar, cell) {YAHOO.util.Dom.addClass(cell, 'full');});
				calendar.addRenderer(y + '/' + m + '/' + d, calendar.renderBodyCellRestricted);
			}
		}
		calendar.render();
	}
	// 描画後にスタイル設定
	var min_m = calendar.cfg.getProperty('mindate').getMonth();
	var max_m = calendar.cfg.getProperty('maxdate').getMonth();
	calendar.linkLeft.style.display = cur_m == min_m ? "none" : "inline";
	calendar.linkRight.style.display = cur_m == max_m ? "none" : "inline";
}
function initialize(data)
{
	busy_date_list = [];
	for (var i = 1; i < 6; i++) {
		var n = data['busy_to_y_' + i];
		if (n != '') {
			busy_date_list.push(dateList(
				new Date(data['busy_from_y_' + i] + '/' + data['busy_from_m_' + i] + '/' + data['busy_from_d_' + i]),
				new Date(data['busy_to_y_' + i] + '/' + data['busy_to_m_' + i] + '/' + data['busy_to_d_' + i])
			));
		}
	}
	for (var i = 0, l = busy_date_list.length; i < l; i++) {
		var list = busy_date_list[i];
		for (var j = 0, k = list.length; j < k; j++) {
			busy_date_list[i][j] = busy_date_list[i][j].getTime();
		}
	}

	var onload = function() {
		var plan = YAHOO.util.Dom.get('plan');
		if (plan == null) {
			return;
		}
		setItem('airport', data.airport);
		plan.onchange = function() {
			var price = YAHOO.util.Dom.get('price');
			var priceh = YAHOO.util.Dom.get('priceh');
			if (typeof price.value == 'undefined') price.value = 0;
			if (typeof priceh.value == 'undefined') priceh.value = 0;
			var total = parseInt(price.value) + parseInt(priceh.value) + parseInt(this.value);
			setItem('total_price', total);
			setItem('pricep', this.value);
			var index = this.selectedIndex;
			setItem('planindex', index);
			setItem('planname', index > 0 ? data['plan_' + index] : '');
		};
		for (var i = 1; i < 6; i++) {
			var text = data['plan_' + i];
			var value = data['plan_price_' + i];
			if (text != '' && value != '') {
				plan.length++;
				plan.options[plan.length - 1] = new Option(text, value);
			}
		}
		if (plan.length > 1) {
			plan.style.display = 'inline';
		}
		renderCalendar(data);
	};

	var form = YAHOO.util.Dom.get('inputform');
	if (form == null) {
		YAHOO.util.Event.addListener(window, 'load', onload);
	} else {
		onload();
	}
}
function execute(key)
{
	var callback = {
		success: function(o) {
			try {
				var data = YAHOO.lang.JSON.parse(o.responseText);
			} catch (x) {
				alert("JSON Parse failed!");
				return;
			}
			if (typeof data[key] == 'undefined') {
				return;
			}
			data = data[key];
			data.airport = key;
			initialize(data);
		},
		failure: function(o) {
			// HXRプロセスが生きているかどうか確かめる。
			if (!YAHOO.util.Connect.isCallInProgress(o)) {
				alert("Async call failed!");
			}
		},
		// 5秒待って帰ってこなかったらTimeoutしてcallbacks.failureへ
		timeout: 5000
	};
	return YAHOO.util.Connect.asyncRequest('GET', '/reserve/app/etc/data.json?' + new Date().getTime(), callback);
	return YAHOO.util.Connect.asyncRequest('GET', './app/etc/data.json?' + new Date().getTime(), callback);
}
function customize(calendar)
{
	calendar.cfg.setProperty("MONTHS_SHORT", ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]);
	calendar.cfg.setProperty("MONTHS_LONG",  ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]);
	calendar.cfg.setProperty("WEEKDAYS_1CHAR", ["日", "月", "火", "水", "木", "金", "土"]);
	calendar.cfg.setProperty("WEEKDAYS_SHORT", ["日", "月", "火", "水", "木", "金", "土"]);
	calendar.cfg.setProperty("WEEKDAYS_MEDIUM",["日", "月", "火", "水", "木", "金", "土"]);
	calendar.cfg.setProperty("WEEKDAYS_LONG", ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]);
	calendar.cfg.setProperty("MY_YEAR_POSITION", 1);
	calendar.cfg.setProperty("MY_MONTH_POSITION", 2);
	calendar.cfg.setProperty("MDY_YEAR_POSITION", 1);
	calendar.cfg.setProperty("MDY_MONTH_POSITION", 2);
	calendar.cfg.setProperty("MDY_DAY_POSITION", 3);
	calendar.cfg.setProperty("MY_LABEL_YEAR_POSITION", 1);
	calendar.cfg.setProperty("MY_LABEL_MONTH_POSITION", 2);
	calendar.cfg.setProperty("MY_LABEL_YEAR_SUFFIX", "\u5E74");
	calendar.cfg.setProperty("MY_LABEL_MONTH_SUFFIX", "");
	calendar.addWeekdayRenderer(7, function(calendar, cell) {YAHOO.util.Dom.addClass(cell, 'saturday');});
	// calendar.addWeekdayRenderer(1, function(calendar, cell) {YAHOO.util.Dom.addClass(cell, 'sunday');});
}
function setItem(id, item)
{
	var el = YAHOO.util.Dom.get(id);
	var format_item = /^\d+$/.test(item) ? num4mat(item) : item;
	if (el != null) {
		el.value = item;
		el.innerHTML = format_item;
	}

	var el = YAHOO.util.Dom.get('hidden_' . id);
	if (el == null) {
		el = document.createElement('input');
		el.type = 'hidden';
		el.name = id;
		el.id = 'hidden_' + id;
		var form = YAHOO.util.Dom.get('inputform');
		form.appendChild(el);
	}
	el.value = format_item;
}
function compdate(lcal, rcal)
{
	if (lcal.d == null || rcal.d == null) return true;
	if (lcal.d >= rcal.d) {
		alert('出発日とお戻り日を正しく選択して下さい。');
		return false;
	}
	return true;
}
function dateList(ld, rd)
{
	var lt = ld.getTime();
	var rt = rd.getTime();
	var t = 24 * 3600 * 1000;
	var list = [];
	if (lt < rt) {
		while (true) {
			list.push(new Date(lt));
			if (lt == rt) break;
			lt += t;
		}
	}
	return list;
}
function num4mat(num)
{
	return num.toString().replace(/(\d+?)(?=(?:\d{3})+$)/g, '$1,');
}
