

/////////////////////////////////
///// NOA へ問い合わせて得る値 /////
///// parent() は親ウインドーすなわち NOA()　-- dataCenter.js

function patientId(){
    return (parent()) ? parent().patientId() : "";
}

function anotherId(){
    return (parent()) ? parent().anotherId() : "";
}

function patientName(){
    return (parent() && patientId()) ? parent().patientKanjiName() : "";
}

function owner(){
    return (parent()) ? parent().owner() : "";
}

///// NOA へ問い合わせて得る値 /////
////////////////////////////////

function isSame(st1, st2){
	return ((st1.length == st2.length) && (st1.indexOf(st2) == 0)) ? 1 : 0;
}

function dateOfDateTime(datetime){
	// "2010-01-30 17:07:02" のような文字列から "2010-01-30" を返す
	var array = datetime.split(" ");
	return array[0];
}
function yearOfDateTime(datetime){
	// "2010-01-30 17:07:02" のような文字列から "2010" を返す
	var date = dateOfDateTime(datetime);
	var array = date.split("-");
	return array[0] * 1;
}
function monthOfDateTime(datetime){
	// "2010-01-30 17:07:02" のような文字列から 1 を返す
	var date = dateOfDateTime(datetime);
	var array = date.split("-");
	return (array.length > 2) ? array[1] * 1 : 0;
}
function dayOfDateTime(datetime){
	// "2010-01-30 17:07:02" のような文字列から 30 を返す
	var date = dateOfDateTime(datetime);
	var array = date.split("-");
	return (array.length > 2) ? array[2] * 1 : 0;
}
function timeOfDateTime(datetime){
	// "2010-01-30 17:07:02" のような文字列から "17:07:02" を返す
	var array = datetime.split(" ");
	return (array.length > 1) ? array[1] : "00:00:00";
}
function hourOfDateTime(datetime){
	// "2010-01-30 17:07:02" のような文字列から 17 を返す
	var time = timeOfDateTime(datetime);
	var array = time.split(":");
	return array[0];
}
function minutesOfDateTime(datetime){
	// "2010-01-30 17:07:02" のような文字列から 7 を返す
	var time = timeOfDateTime(datetime);
	var array = time.split(":");
	return (array.length > 2) ? array[1] * 1 : 0;
}
function secondOfDateTime(datetime){
	// "2010-01-30 17:07:02" のような文字列から 2 を返す
	var time = timeOfDateTime(datetime);
	var array = time.split(":");
	return (array.length > 2) ? array[2] * 1 : 0;
}

var _year;
function setYear(yy){
	_year = yy;
}
function year(){
	// 現在選択されている年を返す
	return _year;
}

var _month;
function setMonth(mm){
	_month = mm;
}
function month(){
	// 現在選択されている月を返す
	return _month;
}

var _day;
function setDay(dd){
	_day = dd;
}
function day(){
	// 現在選択されている日を返す
	return _day;
}

var _week;
function setWeek(w){
	_week = w;
}
function week(){
	// 現在選択されている週を返す
	return _week;
}

var _changeBookingMode;
function setChangeBookingMode(status){
    // 「予約を変更モード」なら true を設定
    _changeBookingMode = status;
}
function changeBookingMode(){
    return _changeBookingMode;
}

function isConsultTime(hour, min){
	// hour min が診療時間内なら true を返す
	var time = hour * 100 + min * 1;
	var val = hospitalInfoForKey('診療時間');
    if (val){
        var array = val.split("^");
        for (num in array){
            // 診療時間帯内であれば true を返す
            var st = trim(array[num]);
            var ary = st.split(",");
            
            // array[0] は未使用
            var week = ary[1];
            var begin = ary[2] * 1;
            var end = ary[3] * 1;
            var zone = ary[4];
            if (week == '日') continue;
            if (zone != '時間内') continue;
            if ((begin <= time) && (time < end)) return 1;
        }
    }
	return 0;
}

var _records;
function setRecords(array){
	// [{patientId(10128401)name(伊藤 純子)entryDate(2010-02-06 10:30:00)}
	_records = array;
}
function addRecords(patientId, anotherId, patientName, entryDate){
	// _records に pid に相当するオブジェクトを上書き
	for(var i=0,ct=_records.length; i < ct; i++){
		var obj = _records[i];
		var pid = obj.patientId;
		if (pid == patientId){
			obj.anotherId = anotherId;
			obj.name = patientName;
			obj.entryDate = entryDate;
			return;
		}
	}
	var obj = new Object();
	obj.patientId = patientId;
	obj.anotherId = anotherId;
	obj.name = patientName;
	obj.entryDate = entryDate;
	_records.push(obj);
}
function removeRecordsForPatientId(patientId){
	// _records から pid に相当するオブジェクトを削除
	for(var i=0,ct=_records.length; i < ct; i++){
		var obj = _records[i];
		var pid = obj.patientId;
		if (pid == patientId){
			_records.splice(i, 1);
			return;
		}
	}
}
function records(){
	return _records;
}
function patientForEntryDate(name, date){
	// date に受診予定の患者オブジェクトを返す
	for(var i=0,ct=_records.length; i < ct; i++){
		var obj = _records[i];
		if ((obj.entryDate == date) && (obj.name == name))
			return obj;
	}
	return null;
}

var _selectedDate;
function setSelectedDate(val){
	_selectedDate = val;
}
function selectedDate(){
	return _selectedDate;
}

var _memoItems;
function setMemoItems(array){
	// obj="[{menu=freq},{menu=freq},,,]" 形式
	_memoItems = new Array();
	for (menuItem in array){
		//var freq = array[menuItem];
		_memoItems.push(menuItem);
	}
}
function memoItems(){
	// 予定項目のリストの配列
	return _memoItems;
}
function addMemoItems(val){
	_memoItems.push(val);
}
function removeMemoItem(val){
	// _memoItems から val を削除
	for (var i=0,ct=_memoItems.length; i < ct; i++){
		var item = _memoItems[i];
		if (item == val){
			_memoItems.splice(i, 1);
			return;
		}
	}
}

var _history;
function setHistory(obj){
	// 受診予定日 {"2010-04-12":"",,} のオブジェクト
	_history = obj;
}
function hasHistory(year, month, day){
	// この年月日に受診予定者があるかどうかを返す
	for (date in _history){
		var array = date.split("-");
		var yy = array[0] * 1;
		var mm = array[1] * 1;
		var dd = array[2] * 1;
		if ((yy == year) && (mm == month) && (dd == day))
			return true;
	}
	return false;
}

function years(){
	// 西暦年の配列を２０年分返す
	var array = new Array();
	for (var i=0; i < 20; i++){
		array.push(2010 + i);
	}
	return array;
}
function months(){
	// 月の配列を返す
	var array = new Array();
	for (var i=1; i <= 12; i++){
		array.push(i);
	}
	return array;
}
function days(){
	// 日の配列を返す
	var array = new Array();
	for (var i=1; i <= 31; i++){
		array.push(i);
	}
	return array;
}
function hours(){
	// 時刻の配列を返す
	var array = new Array();
	for (var i=0; i < 24; i++){
		array.push(i);
	}
	return array;
}
function minutes(){
	// 分の配列を返す
	var array = new Array();
	for (var i=0; i < 60; i += minutesInterval()){
		array.push(i);
	}
	return array;
}

var _interval;
function setMinutesInterval(val){
	_interval = (val) ? val * 1 : 10;
}
function minutesInterval(){
	// 分単位による予約枠の幅を返す
	// この分数の幅で予約枠が設定される
	return _interval;
}

var _holidays;
function setHolidays(val){
	// _holidays = "1/2改行1/3" 形式 -- 区切りは改行
	if (val){
		val = trim(val);

        // 改行による区切りは encode/decode の影響でエラー発生することあり
        if (val.indexOf(",") > 0)
            var array = val.split(","); 
        else
            var array = val.split("\n"); // 旧スタイルへ対応
		_holidays = (array.length > 1) ? array : new Array();
	} else
		_holidays = new Array();
}
function holidays(){
	return _holidays;
}

var _comment1;
var _comment2;
function setComment1(val){
	_comment1 = val;
}
function comment1(){
	return _comment1;
}
function setComment2(val){
	_comment2 = val;
}
function comment2(){
	return _comment2;
}

var _hospitalInfo;
function setHospitalInfo(array){
	_hospitalInfo = array;
}
function hospitalInfoForKey(key){
	return _hospitalInfo[key];
}

var _userInfo;
function setUserInfo(array){
	_userInfo = array;
}
function userNameForLoginName(name){
	for (num in _userInfo){
		var obj = _userInfo[num];
		if (obj.loginName == name)
			return obj.kanjiName;
	}
	return "";
}
function userKanjiNames(){
	var array = new Array();
	for (num in _userInfo){
		var obj = _userInfo[num];
		array.push(obj.kanjiName);
	}
	return array;
}

///////////////////////////
/// Ajax による処理 /////////

function gotBooking(){
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		//alert("=== gotBooking ===\n"+value); //##
		var array = value.split("<SEPARATOR>");
		if (array.length > 1){
			var ary = eval('(' + array[1] + ')');
			//var ary = JSON.parse(array[1]);
			_debug("== gotBooking->"+encodeObject(ary)); //##
            
			setRecords(ary);
            
            if (changeBookingMode()){
                // 予約を変更モード
                for (num in ary){
                    var rec = ary[num];
                    if (rec.patientId == patientId()){
                        var patName = rec.name;
                        var entryDate = rec.entryDate;
                        //alert("gotBooking->"+patName+"->"+entryDate); //##
                        
                        setChangeBookingMode(false);
                        openBookingEditor(patName, entryDate, 1);
                    }
                }
            } else {
                // 通常の予約モード
                showBookingMatrix();
            }
		} else
			alert("予約はありません");
        
        // 古い OS では localStorage を扱えずコケるので最後に実行
        putWindowSize();
	}
}
function getBooking(yy, mm, dd, w){
	// yy, mm, dd の予約患者をサーバへ照会
    //alert("getBooking->"+yy+"/"+mm+"/"+dd+"->"+w); //##
    
	setYear(yy);
	setMonth(mm);
	setDay(dd);
	setWeek(w);
	setSelectedDate(yy+"-"+mm+"-"+dd+" 00:00:00");
	
    _debug("== getBooking -> "+yy+"/"+mm+"/"+dd+"->"+w); //##
    
	xmlHttpObject = createXMLHttpRequest(gotBooking);
	if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
		// サーバとの約束事
		var array = new Array();
		array["year"] = yy;
		array["month"] = mm;
		array["day"] = dd;
		
		//_receiver = receiver; // 結果を受け付けるメソッドを記憶
		// FRONT など他のアプリからも使えるよう server.php はフルパス指定
		var st = "./server.php?command=GET_BOOKING"
		+ "&value=" + encodeObject(array);
        
        _debug("GET_BOOKING -> "+st); //##
        
		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
}

function removedBooking(answer){
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		//alert("removedBooking-> "+value); //##
		var array = value.split("<SEPARATOR>");
		if (array.length > 1){
			if (array.length > 1){
				var ary = eval('(' + array[1] + ')');
				//alert(encodeObject(ary)); //##
				setRecords(ary);
                getCalendars();
				showBookingMatrix();
				closeFloatPanel();
			}
		}
	}
}
function removeBooking(){
	// 予約を削除
	var patientId = document.getElementById("ed_pid").value;
	if (patientId.length == 0){
		alert("カルテID が入力されていません");
		return;
	}
    
	if (confirm(patientId + " の予約を削除していいですか")){
		xmlHttpObject = createXMLHttpRequest(removedBooking);
		if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
		//	var entrydate = document.getElementById("ed_entrydate").value;
            var entrydate = newEntryDate();
			
			// サーバとの約束事
			var array = new Array();
			array["patientId"] = patientId;
			array["entryDate"] = entrydate;
			
			// records() から patientId 相当オブジェクトを削除
			removeRecordsForPatientId(patientId);
			
			//_receiver = receiver; // 結果を受け付けるメソッドを記憶
			// FRONT など他のアプリからも使えるよう server.php はフルパス指定
			var st = "./server.php?command=REMOVE_BOOKING"
			+ "&value=" + encodeObject(array);
			//alert(st); return; //##
			xmlHttpObject.open("GET", encodeURI(st), true);
			xmlHttpObject.send(null);
		}
	}
}

var _newDateTime;
function savedBooking(answer){
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		//alert("=== savedBooking ===\n"+value); //##
		var array = value.split("<SEPARATOR>");
		if (array.length > 1){
			if (array.length > 1){
				var ary = eval('(' + array[1] + ')');
				//alert(encodeObject(ary)); //##
				setRecords(ary);
				closeFloatPanel();
                
                getCalendars(null, null); // Ajax
			}
		}
	}
}
function saveBooking(){
	// 変更された予約日をサーバへ記録
	xmlHttpObject = createXMLHttpRequest(savedBooking);
	if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
		var pid = document.getElementById("ed_pid").value;
		var aid = document.getElementById("ed_anotherId").innerHTML;
		var name = document.getElementById("ed_patientName").innerHTML;
        _newDateTime = newEntryDate();
		var memo = document.getElementById("ed_memo").value;
		
		// patientId が実態なので records() に格納
		addRecords(pid, aid, name, _newDateTime);
        
		// サーバとの約束事
		var array = new Array();
		array["patientId"] = pid; //patientId();
		array["anotherId"] = aid; //anotherId
		array["name"] = name; //patientName();
		array["entryDate"] = oldEntryDate(); // 予約パネルが開いた時の日時
		array["newEntryDate"] = _newDateTime; // 予約パネルで変更された日時
		array["plan"] = memo;
		
		//_receiver = receiver; // 結果を受け付けるメソッドを記憶
		// FRONT など他のアプリからも使えるよう server.php はフルパス指定
		var st = "./server.php?command=CHANGE_BOOKING"
		+ "&value=" + encodeObject(array);
		//alert("saveBooking->"+st); return; //##
        
		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
}

var _pref_editMode;
function gotPreference(){
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		//alert("=== gotPreference ===\n"+value); //##
		var array = value.split("<SEPARATOR>");
		if (array.length > 1){
			if (array.length > 1){
				var objct = eval('(' + array[1] + ')');
				if (objct){
                    //alert("gotPreference->"+encodeObject(objct)); //##
                    
					// メモ項目ポップアップを記憶
					// [{menu=freq},{menu=freq},,,]
                    setMemoItems(objct.planMenu);
                    
					// interval(5)
					if (objct.preference){
						var obj = decodeObject(objct.preference);
						setMinutesInterval(obj.interval);
						setHolidays(obj.holiday);
					} else {
						setMinutesInterval(5);
						setHolidays("1/1\n1/2\n1/3");
					}
					
					// 予約票のコメントを記憶
					if (objct.comment){
						var obj = decodeObject(objct.comment);
						setComment1(obj.comment1);
						setComment2(obj.comment2);
					} else {
						setComment1("予約時間に来院できない場合はご連絡ください");
						setComment2("日曜・祝日：休診");
					}
					
					// hospitalInfo を記憶
					setHospitalInfo(objct.hospitalInfo);
					
					// userInfo を記憶
					setUserInfo(objct.userInfo);
                    
                    if (_pref_editMode){
                        // 現在の年月日のマトリックスを再表示
                        initBooking();
                   //     clickedCalendar(year(),month(),day(),week());
                        
                        //alert("->"+year()+"/"+month()+"/"+day()+"->"+week()); //##
                        
                        // 初期設定パネルを開く
                        openPreference();
                        _pref_editMode = false;
                    }
				}
				
				// カレンダーを表示
                getCalendars();
			}
		}
	}
}
function getPreference(){
	// 初期設定をサーバへリクエスト
	xmlHttpObject = createXMLHttpRequest(gotPreference);
	if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
		// FRONT など他のアプリからも使えるよう server.php はフルパス指定
		var array = new Array();
		array['hospitalId'] = window.opener.hospitalId();
		array['owner'] = owner();
		array['groupCode'] = "doctor"; // ドクターのリストのみをリクエスト
		var st = "./server.php?command=GET_BOOKING_PREFERENCE"
		+ "&value=" + encodeObject(array);
        
		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
}

function savePreference(){
	// 初期設定をサーバへ保存
	xmlHttpObject = createXMLHttpRequest(gotPreference);
    //	xmlHttpObject = createXMLHttpRequest(savedPreference);
	if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
		// サーバとの約束事
		var prefObj = new Object();
        prefObj['owner'] = owner();

		var obj = new Object();
		obj['interval'] = document.getElementById("pr_min").value;
		var buff = document.getElementById("pr_holiday").value;
        
		var val = document.getElementById("pr_holiday").value;
		obj['holiday'] = replaceAll(val, "\n", ",");
        
        prefObj['minAndHolidays'] = encodeObject(obj);
        
		var obj = new Object();
        obj['comment1'] = document.getElementById("pr_comment1").value;
		obj['comment2'] = document.getElementById("pr_comment2").value;
        prefObj['comments'] = encodeObject(obj);
		prefObj['hospitalId'] = window.opener.hospitalId();
		prefObj['groupCode'] = "doctor"; // ドクターのリストのみをリクエスト
        var val = JSON.stringify(prefObj);
        
        // 一旦空欄にする：サーバの返事を待ち再表示
        document.getElementById("pr_holiday").value = "";
        document.getElementById("pr_comment1").value = "";
        document.getElementById("pr_comment2").value = "";

		// FRONT など他のアプリからも使えるよう server.php はフルパス指定
		var st = "./server.php?command=PUT_BOOKING_PREFERENCE"
		+ "&value=" + encodeSTRING(val);
        
		//alert("savePreference->"+st); //return; //##
        
        // 初期設定パネルを一旦閉じる：サーバからの返事を待ち再曽開く
        closeFloatPanel();
        _pref_editMode = true;
        
		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
}

function gotPatients(){
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		//alert("=== gotPatients ===\n"+value); //##
		var array = value.split("<SEPARATOR>");
		if (array.length > 1){
			var objct = eval('(' + array[1] + ')');
			if (objct){
				showPatientList(objct);
			}
		}
	}
}
function searchPatient(){
	// 患者を検索
	var patientId = document.getElementById("ed_pid").value;
	if (patientId.length > 0){
		var ch = patientId.charAt(0);
		var array = patientId.split("/");
		if (array.length > 2){ // 生年月日 "s17/3/23","1942/3/23" 形式
			var yst = array[0];
			var yy = yst * 1;
			var mm = array[1] * 1;
			mm = (mm < 10) ? "0" + mm : mm;
			var dd = array[2] * 1;
			dd = (dd < 10) ? "0" + dd : dd;
			var nengou = yst.charAt(0);
			if ((nengou < '0') || ('9' < nengou)){
				// "s17/3/23" 形式の場合
				var warekiYear = yst.substr(1) * 1;
				if (isSame(nengou, "h"))
					yy = warekiYear + 1988;
				else if (isSame(nengou, "s"))
					yy = warekiYear + 1925;
				else if (isSame(nengou, "t"))
					yy = warekiYear + 1911;
				else if (isSame(nengou, "m"))
					yy = warekiYear + 1867;
			}
			if (yy < 1000){
				alert("西暦の入力間違い: " + patientId);
				return;
			}
			mode = "id";
			patientId = "" + mm + dd + (yy % 100);
		} else if (('0' <= ch) && (ch <='9')){
			mode = "id";
		} else if (('a' <= ch) && (ch <='z'))
			var mode = "kana";
		else
			var mode = "kanji";
		
		// serchKey に一致する患者リストを返す
		// 検索キーにマッチしたカルテのリストを表示
		xmlHttpObject = createXMLHttpRequest(gotPatients);
		if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
			var array = new Array();
			array["key"] = mode;
			array["val"] = patientId;
			
			var st = "/NOA/server.php?command=GET_PATIENTS"
			+"&value=" + encodeObject(array);
			//alert("searchPatient ====\n"+st); //return; //##
			xmlHttpObject.open("GET", encodeURI(st), true);
			xmlHttpObject.send(null);
		}
	}
}

function changedMemo(){
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		//alert("=== changedMemo ===\n"+value); //##
		var array = value.split("<SEPARATOR>");
		if (array.length > 1){
			var objct = eval('(' + array[1] + ')');
			if (objct){
				//alert("changedMemo ===\n"+encodeObject(objct)); //##
				// メモ項目ポップアップを記憶
				var records = new Array();
				for (title in objct){
					if (isSame(title, "menuAction")) continue;
					if (isSame(title, "menuType")) continue;
					if (isSame(title, "fieldType")) continue;
					
					var ary = objct[title];
					var freq = ary[3];
					records[title] = freq;
				}
				setMemoItems(records);
				
				// メモ・ポップアップを再表示
				showMemoPopup(); // メモ・ポップアップを再表示
			}
		}
	}
}
function addMemo(item){
	// 実施予定ポップアップに item を追加
	xmlHttpObject = createXMLHttpRequest(changedMemo);
	if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
		// すでに同じメニューアイテムが存在すれば頻度をインクリメント
		var array = new Array();
		array["owner"] = owner();
		array["tag"] = "FrontTable.plan";
		array["menuItem"] = item;
		array["public"] = "1";
		array["freq"] = "0";
		//array["menuAction"] = action;
		//array["val"] = encodeSTRING(value);
		
		var st = "/NOA/server.php?command=PUT_MENU"
		+ "&value=" + encodeObject(array);
		//alert("NRPutMenu ==\n"+st); return;//===
		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
}
function removeMemo(){
	// メモ項目を削除
	var item = document.getElementById("ed_memo_popup").value;
	if (confirm("ポップアップメニューから「"+item+"」を削除していいですか")){
		//xmlHttpObject = createXMLHttpRequest(NR_debug);
		xmlHttpObject = createXMLHttpRequest(changedMemo);
		if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
			var array = new Array();
			array["owner"] = owner();
			array["tag"] = "FrontTable.plan";
			array["menuItem"] = item;
			
			var st = "/NOA/server.php?command=REMOVE_MENU"
			+ "&value=" + encodeObject(array);
			//alert("removeMemo ==\n"+st); return;//===
			xmlHttpObject.open("GET", encodeURI(st), true);
			xmlHttpObject.send(null);
		}
	}
}

function gotCalendars(){
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		//alert("=== gotCalendars ===\n"+value); //##
		var array = value.split("<SEPARATOR>");
		if (array.length > 1){
			var obj = eval('(' + array[1] + ')');
			if (obj){
				_debug("== gotCalendars -> "+encodeObject(obj)); //##
                
				var year = obj.year;
				var month = obj.month;
				var history = obj.history;
				setHistory(history);
                
				// カレンダーを表示
				showCalendars(year, month);
                
                if (_newDateTime){
                    // 現在の年月日のマトリックスを再表示
                    var ary = dateTimeArray(_newDateTime);
                    var year = ary[0];
                    var month = ary[1]; 
                    var day = ary[2];
                    // Date() に設定する場合んの月は 0..11 の範囲
                    var aDate = new Date(year, (month * 1 -1), day);
                    var week = aDate.getDay();
                    
                    _newDateTime = null;
                    getBooking(year, month, day, week);
                }
			}
		}
	}
}
function getCalendars(yy, mm){
	// カレンダーを３連装で表示するに当たり予約状況を問い合わせ
    _debug("== getCalendars->"+yy+"/"+mm); //##
    
	xmlHttpObject = createXMLHttpRequest(gotCalendars);
	if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
        if (!yy || !mm){
            // yy や mm が指定されていなければ本日の年月を使う
            var date = new Date();
            yy = date.getYear();
            if (yy < 2000) { yy += 1900; }
            mm = date.getMonth() + 1;
        }
        //alert("->"+yy+"/"+mm); //##
        
		// サーバとの約束事
		var array = new Array();
		array['year'] = yy;
		array['month'] = mm;
		
		var st = "./server.php?command=GET_BOOKING_HISTORY"
		+ "&value=" + encodeObject(array);
        
		_debug("GET_BOOKING_HISTORY ==\n"+st); //return;//===
        
		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
}

function gotBookingDate(){
	if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)){
		var value = xmlHttpObject.responseText;
		//alert("=== gotBookingDate ===\n"+value); //##
		var array = value.split("<SEPARATOR>");
		if (array.length > 1){
			var records = eval('(' + array[1] + ')');
			//var records = JSON.parse(array[1]);
			if (records && (records.length > 0)){
				//alert("gotBookingDate -> "+encodeObject(records)); //##
                var date = records[0];
                
                // yy, mm, dd の予約患者をサーバへ照会
                var array = dateTimeArray(date);
                var yy = array[0];
                var mm = array[1];
                var dd = array[2];
                var w = 1; //##
                getBooking(yy, mm, dd, w);
			} else {
                alert(patientName() + " さんの予約はありません");
            }
		}
	}
}
function getBookingDate(patientId){
	// patientId の予約日をサーバへ問合せ
    setChangeBookingMode(true);
    
	xmlHttpObject = createXMLHttpRequest(gotBookingDate);
	if (xmlHttpObject){ // GETパラメータ付きでリクエスト送信
		// サーバとの約束事
		var array = new Array();
		array['patientId'] = patientId;
		
		var st = "./server.php?command=GET_BOOKING_DATE"
		+ "&value=" + encodeObject(array);
		//alert("getBookingDate ==\n"+st); //return;//===
        
		xmlHttpObject.open("GET", encodeURI(st), true);
		xmlHttpObject.send(null);
	}
}

/// Ajax による処理 /////////
///////////////////////////



////////////////////////////////////////////
/// localStorage ///////////////////////////

function getWindowSize(){
	// Booking のウインドー位置とサイズをサーバへリクエスト
    var size = window.localStorage["bookingWindowSize"];
    
	// サーバから得られたサイズにウインドーを調整する
	if (size){
		var args = size.split(",");
		var x = args[0] * 1;
		var y = args[1] * 1;
		var w = args[2] * 1;
		var h = args[3] * 1;
        
		// resize を先にしておかないと元が大きいサイズだった場合 moveTo しよう
		// としてもウインドー境界の制限で移動できない場合がある
		window.resizeTo(w, h);
		window.moveTo(x, y);
        
        //alert("getWindowSize->"+x+"->"+y); //##
	}
}
function putWindowSize(){
	// Booking のウインドー位置とサイズをサーバへ記憶
	var x = window.screenLeft;
	var y = window.screenTop - 22;
	var w = window.outerWidth;
	var h = window.outerHeight;
    var array = [x, y, w, h];
    
    window.localStorage["bookingWindowSize"] = array.join(",");
    
    //alert("putWindowSize->"+array.join(",")); //##
}

/// localStorage ///////////////////////////
////////////////////////////////////////////



///////////////////////////
/// 初期設定 ////////////////

function openPreference(){
	// 初期設定パネル
	var obj = new Object();
	obj.interval = minutesInterval();

    var panelW = 320;
    var elm = openSeeThroughPanel("_floatPanel", 5, 10, panelW, "初期設定パネル");
    elm.style.fontSize = "10pt";
    
    // preference panel の内容を生成
    var div = newDIV(elm, "/clearfix");
    var dv = newDIV(div, "/left-side");
	dv.innerHTML = "予約枠の幅";
    dv.style.color = "#833";
    var dv = newDIV(div, "/valCol");
    var array = [5,10,15,20,30];
    var pu = newPopupMenu(dv, "pr_min", array, obj.interval);
    var tx = newTEXT(dv, " 分");

    // 予約表レイアウト設定ボタン
    var div = newDIV(elm, "/clearfix");
    div.innerHTML = "予約票に表示するコメントを入力してください";
    div.innerHTML += "<br>内容は入力欄に収まる程度にとどめてください";
    div.style.paddingLeft = "5px";
    div.style.color = "#833";
    div.style.fontSize = "9pt";
    var div = newDIV(elm, "/clearfix");
    var fd = newTEXTAREA(div, "pr_comment1", 40, 7, st);
    fd.style.fontSize = "9pt";
    if (comment1())
        document.getElementById("pr_comment1").value = comment1();

    // 診療受付時間の入力
    var div = newDIV(elm, "/clearfix");
    var dv = newDIV(div, "/left-side");
	dv.innerHTML = "予約票に表示する受付時刻などを入力してください";
    dv.style.color = "#833";
    dv.style.fontSize = "9pt";
    var dv = newDIV(div, "/valCol");
    var st = "診療受付時間などを入力";
    var fd = newTEXTAREA(dv, "pr_comment2", 40, 5, st);
    fd.style.fontSize = "9pt";
    if (comment2())
        document.getElementById("pr_comment2").value = comment2();
    
    // 休診日を入力するテキストエリア
    var div = newDIV(elm, "/clearfix");
    var dv = newDIV(div, "/left-side");
    dv.innerHTML = "休診日を「12/23」形式で<br/>一行ずつ記入してください";
    dv.style.padding = "3px 5px";
    dv.style.color = "#833";
    dv.style.fontSize = "9pt";
    var dv = newDIV(div, "/right-side");
    var st = holidays().join("\n");
    var fd = newTEXTAREA(dv, "pr_holiday", 15, 15, st);
    fd.style.fontSize = "9pt";
    fd.style.marginBottom = "5px";

    // 確定ボタン
    var div = newDIV(elm, "/clearfix");
    var dv = newDIV(div, "/right-side");
    var bt = newDIV(dv, "/whiteButton");
	bt.innerHTML = "確定";
    bt.setAttribute("onclick", "savePreference()");
    bt.style.padding = "5px 10px 3px 10px";
}

/// 初期設定 ////////////////
///////////////////////////


/////////////////////////////
///// 予約票の印刷 ////////////

var _printArgs;
function printPDF(){
	// 予約票を印刷
	var array = _printArgs;
	array['doctorName'] = document.getElementById("ed_doctor").value;
    
    // doctorName を取得してからパネルを消去
	closeFloatPanel();
    
	// encodeURI() しないと改行などが正しく印刷されない
	var url = "./printBooking.php?value="+encodeObject(array);
	open(encodeURI(url), "PrintBooking", "");
}

function doctorSelected(elm){
	// ドクター名のポップアップメニューが選択された
	document.getElementById("ed_doctor").value = elm.value;
}

function printBooking(){
	// 担当医氏名を選択するパネルを開く
	setPrintArgs(); // 予約編集パネルが消える前にパラメータを取得
    closeFloatPanel();
    
    var panelW = 260;
    var elm = openSeeThroughPanel("_floatPanel", 5, 10, panelW, "予約票印刷");
    elm.style.fontSize = "10pt";

    // confirm パネルの内容を生成
    var div = newDIV(elm, "/clearfix");
    var dv = newDIV(div, "/left-side");
	dv.innerHTML = "予約日に診療を行う担当医を選択し<br/>印刷ボタンを押してください";
    dv.style.color = "#833";
    // 医師名を選択
    var doctors = userKanjiNames();
	var defaoultDoctor = userNameForLoginName(owner());
    var div = newDIV(elm, "/clearfix");
    var dv = newDIV(div, "/labelCol");
    dv.innerHTML = "担当医";
    dv.style.marginLeft = "5px";
    dv.style.position = "relative";
    dv.style.top = "1px";
    var dv = newDIV(div, "/valCol");
	var pu = newPopupMenu(dv, "", doctors, defaoultDoctor);
	pu.setAttribute("onchange", "doctorSelected(this)");
	var fd = newFIELD(dv, "ed_doctor", "", 18, defaoultDoctor);
    
    var div = newDIV(elm, "/clearfix");
    var dv = newDIV(div, "/right-side");
	var bt = newDIV(dv, "/whiteButton");
    bt.innerHTML = "印刷";
	bt.setAttribute("onclick", "printPDF()");
    
	function setPrintArgs(){
		var array = new Array();
		array['patientId'] = document.getElementById("ed_pid").value;
		array['anotherId']
		= document.getElementById("ed_anotherId").innerHTML;
		array['patientName']
		= document.getElementById("ed_patientName").innerHTML;
        
		var ary = _weeks; // lib.js
		var weekSt = "(" + ary[week()] + ") ";
        
        var date = getDatePopUpValue("ed_entryDate");
        var ary = dateTimeArray(date);
		array['date'] = ary[0]+"年"+ary[1]+"月"+ary[2]+"日"+weekSt;
        
		var hour = document.getElementById("ed_hour").value;
		var min = document.getElementById("ed_min").value;
		array['time'] = amPmOf(hour) + "時" + min + "分";
        		
		array['comment1'] = comment1();
		array['comment2'] = comment2();
		
		array['address'] = hospitalInfoForKey("住所");
		array['phone'] = hospitalInfoForKey("電話番号");
		array['hospitalName'] = hospitalInfoForKey("施設名");
        
		_printArgs = array;
	}
	
	function amPmOf(hour){
		// ２４時間表記を１２時間表記に変更
		if (hour * 1 >= 12)
			return "午後" + (hour * 1 - 12);
		else
			return "午前" + hour * 1;
	}
}

///// 予約票の印刷 ////////////
/////////////////////////////


function selectPatient(pid, aid, name){
	// 検索結果から患者が選択された
	document.getElementById("ed_pid").value = pid;
	document.getElementById("ed_anotherId").innerHTML = aid;
	document.getElementById("ed_patientName").innerHTML = name;
    
	// 確定ボタンを表示
	var sp = document.getElementById("ed_ok_button");
	sp.innerHTML = "";
	var bt = newBUTTON(sp, "", "確定");
	bt.setAttribute("onclick", "saveBooking()");
	
	// 検索結果を消去
	document.getElementById("ed_patientListArea").innerHTML = "";
}
function showPatientList(objct){
	// キーにマッチした患者リストを表示
	var elm = document.getElementById("ed_patientListArea");
	elm.innerHTML = "";
    
	var tbl = newTABLE(elm, "");
	tbl.style.width = "100%";
	tbl.style.fontSize = "10pt";
	tbl.style.border = "thin solid #aaa";
    
	var tr = newTR(tbl, "", "");
	var td = newTD(tr, "", "以下の検索結果から選択してください");
	td.setAttribute("colspan","3");
    
	var tr = newTR(tbl, "", "");
	tr.style.backgroundColor = "#fc0";
	var td = newTD(tr, "", "カルテID");
	var td = newTD(tr, "", "氏名");
	var td = newTD(tr, "", "最終受診日");
    
	for (num in objct){
		var obj = objct[num];
		
		var tr = newTR(tbl, "/patientList", "");
		tr.style.backgroundColor = "#fff";
		var action = "selectPatient('"+obj.patientId+"','"+obj.anotherId+"','"+obj.patientKanjiName+"')";
		tr.setAttribute("onclick", action);
		var td = newTD(tr, "", obj.patientId);
		var td = newTD(tr, "", obj.patientKanjiName);
		var td = newTD(tr, "", obj.lastVisitDate);
	}
}

function openInfoPanel(patientName, entryDate){
	// 情報を表示するパネルを開く
	obj = patientForEntryDate(patientName, entryDate);
    var panelW = 200;
    
    //alert("openInfoPanel->"+patientName+"->"+entryDate+"->"+encodeObject(obj)); //##
    
    var elm = openSeeThroughPanel("_floatPanel", 5, 10, panelW, "", null);
    elm.style.fontSize = "9pt";
    
    // patientID 検索
    var div = newDIV(elm, "/clearfix");
    var dv = newDIV(div, "/labelCol");
    dv.innerHTML = "受診日";
    var dv = newDIV(div, "/valCol");
    dv.innerHTML = obj.entryDate;

    var div = newDIV(elm, "/clearfix");
    var dv = newDIV(div, "/labelCol");
    dv.innerHTML = "ID";
    var dv = newDIV(div, "/valCol");
    dv.innerHTML = obj.patientId;
    
    var div = newDIV(elm, "/clearfix");
    var dv = newDIV(div, "/labelCol");
    dv.innerHTML = "氏名";
    var dv = newDIV(div, "/valCol");
    dv.innerHTML = obj.name;
    
    var div = newDIV(elm, "/clearfix");
    var dv = newDIV(div, "/labelCol");
    dv.innerHTML = "実施予定";
    var dv = newDIV(div, "/valCol");
    dv.innerHTML = obj.plan;
    dv.style.paddingTop = "2px";
    
    /*
	obj = patientForEntryDate(patientName, entryDate);
	openInfo(5, 5);
	
	// confirm パネルの内容を生成
	makeInfoContents(obj);
	
	function makeInfoContents(obj){
		// _conrirmContets は confirm パネル内の予約語
		var elm = document.getElementById("_conrirmContets");
		elm.innerHTML = "";
		var tbl = newTABLE(elm, "");
		tbl.style.width = "100%";
		tbl.style.fontSize = "10pt";
		tbl.style.backgroundColor = "#ff0";
		
		var tr = newTR(tbl, "", "");
		var td = newTD(tr, "", "");
		var im = newIMAGE(td, "", "./close.png", "x");
		im.setAttribute("onclick", "closeFloatPanel()");
		im.style.height = "12px";
		var td = newTD(tr, "", "");
		
		var tr = newTR(tbl, "", "");
		var td = newTD(tr, "", "受診日");
		var td = newTD(tr, "", obj.entryDate);
		
		var tr = newTR(tbl, "", "");
		var td = newTD(tr, "", obj.patientId);
		var td = newTD(tr, "", obj.name);
	}
     */
}

function clickedMemo(elm){
	// メモポップアップが選択された
	if (elm.value == "...その他"){
		var item = prompt("実施予定項目を登録してください");
		if (item){
			// menuItems をサーバに保存し、メモ・ポップアップを再表示
			addMemo(item);
			return;
		}
	} else if (elm.value.length == 0){
        return ;
    }
    
	var buff = document.getElementById("ed_memo").value;
	if (buff.length)
		buff += "\n" + elm.value;
	else
		buff = elm.value;
	document.getElementById("ed_memo").value = buff;
}

function clearMemo(){
	// 実施予定欄を空欄にする
	document.getElementById("ed_memo").value = "";
}

function showMemoPopup(){
	// メモ用ポップアップ・メニューを生成
	var elm = document.getElementById("ed_memo_popupArea");
	elm.innerHTML = "";
	var items = [""];
	var array = memoItems();
	for (key in array){
		items.push(array[key]);
	}
	items.push("...その他");
	var pu = newPopupMenu(elm, "ed_memo_popup", items, "");
	pu.setAttribute("onchange", "clickedMemo(this)");
}

function openChart(){
    // このカルテを開く
    var pid = document.getElementById("ed_pid").value;
    //var name = document.getElementById("ed_patientName").innerHTML;
    
    parent().openChart(pid);
}

function isPast(){
	// 選択された日付が過去なら true を返す
	var date = dateOfDateTime(selectedDate());
	var today = dateOfDateTime(todayAndTime());
    
	return (date < today) ? true : false;
}

function cellIdFor(yy, mm, dd){
	// カレンダー日付セルの ID を返す
	if ((mm * 1) < 10) mm = "0" + (mm * 1);
	if ((dd * 1) < 10) dd = "0" + (dd * 1);
	
	return "day" + yy + mm + dd;
}

var _oldColor;
var _oldBGColor;
function clickedCalendar(yy, mm, dd, w){
	// カレンダー日付がクリックされると、その日の予約状況を表示
    if ((mm * 1) < 10) mm = "0" + (mm * 1);
	if ((dd * 1) < 10) dd = "0" + (dd * 1);
	setSelectedDate(yy+"-"+mm+"-"+dd+" 00:00:00");
	
	// カレンダーの選択部分を移動
	if (day()){
		// 以前に選択されていた日付の色を非選択色に戻す
		var cid = cellIdFor(year(), month(), day());
		var td = document.getElementById(cid);
		td.style.color = _oldColor;
		td.style.backgroundColor = _oldBGColor;
	}
	
	// 選択された日付の色を選択色にする
	var td = document.getElementById(cellIdFor(yy, mm, dd));
	_oldColor = td.style.color;
	_oldBGColor = td.style.backgroundColor;
	td.style.color = "#ff0";
	td.style.backgroundColor = "#00f";
    
	//alert(yy+"/"+mm+"/"+dd); //##
    
	// yy, mm, dd の予約患者をサーバへ照会
	getBooking(yy, mm, dd, w);
}

function showBookingMatrix(){
	// 予約マトリックスを表示
	var mm = month() * 1;
	var dd = day() * 1;
	
    //alert("showBookingMatrix->"+mm+"->"+dd); //##
    
	var bgcolor = "#fff";
	if (isPast())
		bgcolor = "#eee";
	else if (week() == 0)
		bgcolor = "#fcc";
	else if (isHoliday(mm, dd))
		bgcolor = "#fcc";
    
	// マトリックス・エリアを生成
	var base = document.getElementById("editorArea");
	base.innerHTML = "";
	var table = newTABLE(base, "matrixTable");
	
	// 分ヘッダー
	var tr = newTR(table, "", "");
	var td = newTD(tr, "", "");
	td.innerHTML = mm + "月<br/>" + dd + "日";
	td.style.width = "60px";
	td.style.fontSize = "15pt";
	td.style.textAlign = "right";
	td.style.padding = "0px 2px";
	td.style.backgroundColor = bgcolor;
    
    // タイトル
	for (var i=0; i < 60; i += minutesInterval()){
		var td = newTD(tr, "", i + "分");
		td.style.backgroundColor = "#aec";
		td.style.textAlign = "center";
	}
	
	// 時間マトリックス
	var begin = 7;
	var end = 22;
	for (var hour=begin; hour <= end; hour++){
		// 時刻行を生成
		var tr = newTR(table, "", "");
		tr.style.borderTop = "1px solid #eee";
		var td = newTD(tr, "timeTD", hour + "時 ");
		td.style.backgroundColor = bgcolor;
		td.style.textAlign = "right";
		for (var min=0; min < 60; min += minutesInterval()){
			// 分カラムを生成
			// 割り当てられた「年月日・時刻・分範囲」に相当する予約患者を表示
			var td = newTD(tr, "", "");
			setContents(td, hour, min);
		}
	}
	
	function setContents(elm, hour, min){
		// records() 中の指定時刻枠にあてはまる患者名を割り当てて返す
		var table = newTABLE(elm, "simpleTable");
		var isActive = isConsultTime(hour, min);
		if (isActive == 0)
			table.style.backgroundColor = "efe";
		
		var hasBooking = false;
		var array = records();
		for (var i=0,ct=array.length; i < ct; i++){
			var obj = array[i];
			var edate = obj.entryDate;
			var hr = hourOfDate(edate);
			var mn = minutesOfDate(edate);
			if (hour*1 == hr*1){
				if ((min <= mn) && (mn < min + minutesInterval())){
					var tr = newTR(table, "", "");
					var td = newTD(tr, "cell", obj.name);
					td.style.textAlign = "center";
					if (isPast()){
						var action = "openInfoPanel('"+obj.name+"','"+edate+"')";
					} else {
						var action = "openBookingEditor('"+obj.name+"','"+edate+"','" + isActive + "')";
					}
					td.setAttribute("onclick",action);
					hasBooking = true;
				}
			}
		}
		if (isPast() || hasBooking) return;
		
		// 空枠を生成
		var tr = newTR(table, "", "");
		if (isActive == 1)
			var td = newTD(tr, "cell", "　");
		else
			var td = newTD(tr, "", "　");
		var action = "openBookingEditor('','"+hour+":"+min+":00','" + isActive + "')";
		td.setAttribute("onclick",action);
	}
}

function hourOfDate(date){
	// "2010-02-06 10:30:00" 形式から時刻 "10" を返す
	var array = date.split(" ");
	if (array.length > 1){
		var st = array[1];
		var ary = st.split(":");
		return ary[0];
	}
	return "0";
}
function minutesOfDate(date){
	// "2010-02-06 10:30:00" 形式から分 "30" を返す
	var array = date.split(" ");
	if (array.length > 1){
		var st = array[1];
		var ary = st.split(":");
		if (ary.length > 1)
			return ary[1];
	}
	return "0";
}

function isHoliday(month, day){
	// preference で設定された休診日なら true を返す
	var array = holidays();
	for (var i=0,ct=array.length; i < ct; i++){
		var st = array[i]; // "3/23" 形式
		var ary = st.split("/");
		if (ary.length > 1){
			var mm = ary[0];
			var dd = ary[1];
			if ((mm == month) && (dd == day)) return true;
		}
	}
	return false;
}

function prevMonth(yy, mm){
	if (--mm < 1){
		--yy;
		mm = 12;
	}
	getCalendars(yy, mm);
}

function nextMonth(yy, mm){
	if (++mm > 12){
		++yy;
		mm = 1;
	}
	getCalendars(yy, mm);
}

function showCalendars(yy, mm){
	// カレンダーを３連装で表示
    _debug("== showCalendars ->"+yy+"->"+mm); //##
    
    if (patientId()){
        var elm = document.getElementById("idAndNameArea");
		var st = patientId()+" "+patientName()+" さんの予約";
        elm.innerHTML = st;
        var sp = newSPAN(elm, "");
        sp.style.marginLeft = "10px";
        var a = newA(sp, "予約を変更", "#", "");
        a.setAttribute("onclick", "getBookingDate('" + patientId() + "')");
    }
    
	var elm = document.getElementById("calendarArea");
	elm.innerHTML = "";
	var table = newTABLE(elm, "table");
	
	// １段目のカレンダー
	var tr = newTR(table, "", "");
	var td = newTD(tr, "", "");
	showCalendar(td, yy, mm, true);
	
	// ２段目のカレンダー
	var tr = newTR(table, "", "");
	var td = newTD(tr, "", "");
	if (++mm > 12){
		++yy;
		mm = 1;
	}
	showCalendar(td, yy, mm);
	
	//　３段目のカレンダー
	var tr = newTR(table, "", "");
	var td = newTD(tr, "", "");
	if (++mm > 12){
		++yy;
		mm = 1;
	}
	showCalendar(td, yy, mm);
}

function showCalendar(elm, yy, mm, hasButton){
	// yy, mm, dd のカレンダーを表示
	var weeks = new Array("日","月","火","水","木","金","土");
	
	// １日の曜日を得る
	date = new Date(yy, mm-1, 1);
	var firstWeek = date.getDay();
	// 月の日数を得る
	date = new Date(yy, mm, 0);
	var lastday = date.getDate();
	
	// カレンダーのフレームを表示
	var table = newTABLE(elm, "calendarTable");
	
	// タイトルを表示
	var tr = newTR(table, "", "");
	var td = newTD(tr, "label", "");
	td.setAttribute("colspan","7");
	if (hasButton){
		// 月後戻りボタンを表示
		var bt = newBUTTON(td, "", "＜");
		var action = "prevMonth("+yy+","+mm+")";
		bt.setAttribute("onclick", action);
		// 年月を表示
		var tx = newTEXT(td, " " + yy + " / " + mm + " ");
		// 月先送りボタンを表示
		var bt = newBUTTON(td, "", "＞");
		var action = "nextMonth("+yy+","+mm+")";
		bt.setAttribute("onclick", action);
	} else {
		// 年月を表示
		var tx = newTEXT(td, " " + yy + " / " + mm + " ");
	}
    
	// 曜日を表示
	var tr = newTR(table, "week", "");
	for (var w=0; w < 7; w++){
		var td = newTD(tr, "", weeks[w]);
		td.style.textAlign = "center";
	}
	
	// カレンダーの日付を表示
	for (var i=0, d=0; d < lastday; ){
		if (i % 7 == 0){
			// １週間分を表示
			var tr = newTR(table, "", "");
			for (w=0; w < 7; w++){
				if (i++ < firstWeek){
					// 空白を表示
					var td = newTD(tr, "day", "");
				} else if (d >= lastday){
					// 空白を表示
					var td = newTD(tr, "day", "");
				} else {
					// 日付を表示
					d++;
					// 日付エレメントを特定出来るよう年月日による ID を振る
					var cid = cellIdFor(yy, mm, d);
					var td = newTD(tr, cid, d+"");
					var action
                    = "clickedCalendar("+yy+","+mm+","+d+","+w+")";
					td.setAttribute("onmouseup", action);
					td.style.textAlign = "center";
					if (w == 0)
						td.style.backgroundColor = "#fdd";
					else if (isHoliday(mm, d))
						td.style.backgroundColor = "#fdd";
					else
						td.style.backgroundColor = "#fff";
					
					if (hasHistory(yy, mm, d)){
						// 予約者の存在する日付
						td.style.backgroundColor = "#ffa";
						td.style.borderBottom = "thin solid #888";
						td.style.borderRight = "2px solid #ccc";
					}
				}
			}
		}
	}
}

function help(){
	// 別途ヘルプをパネル表示
	window.open("./bookingHelp.html","Help"
				,"width=450,height=700,scrollbars=yes,resizable=yes");
}
function editorHelp(){
	// 別途ヘルプをパネル表示
	window.open("./bookingEditorHelp.html","Help"
				,"width=450,height=700,scrollbars=yes,resizable=yes");
}

function initBooking(){
    _initDebug(false); //##
    _debug("== initBooking =="); //##
    
	var elm = document.getElementById("base");
    elm.innerHTML = "";
    
	// header
    var div = newDIV(elm, "/tool-header");
    var dv = newDIV(div, "/left-side");
    dv.style.width = "80%";
    dv.style.paddingLeft = "0px";
    var sp = newSPAN(dv, "idAndNameArea");
    sp.style.paddingLeft = "8px";
    sp.style.fontSize = "9pt";
    var dv = newDIV(div, "/right-side");
	var im = newIMAGE(dv, "", "./help.png", "?");
	im.setAttribute("onclick", "help()");
	im.style.height = "18px";
	im.style.verticalAlign = "bottom";
    im.style.position = "relative";
    im.style.top = "3px";
    
	// カレンダー表示エリア
    var div = newDIV(elm, "");
	var tbl = newTABLE(elm, "bodyTable");
	var tr = newTR(tbl, "", "");
	var td = newTD(tr, "calendarArea", "calendar");
	var td = newTD(tr, "editorArea", "");
	td.style.width = "1000px";
	
	// footer
    var div = newDIV(elm, "/tool-footer");
    var dv = newDIV(div, "/left-side");
	var im = newIMAGE(dv, "", "./hammer.png", "?");
	im.setAttribute("onclick", "openPreference()");
	im.style.height = "15px";
    var dv = newDIV(div, "/right-side");
    dv.innerHTML = version();
    
    // 初期設定値を読み込むとともにカレンダーを表示
    getPreference();
    
    // ウインドー・サイズを localStorage から読み込みサイズ調整
    // 古い OS では localStorage を扱えずコケるので最後に実行
    getWindowSize();
}

function version(){
	return "Ver.131111";
}

