

/////////////////////////////////
///// 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 _history[date] * 1; // 予約者数を返す
        }
	}
	return 0;
}

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){
    //alert("setHospitalInfo->"+encodeObject(array)); //##
    
	_hospitalInfo = array;
}
function hospitalInfoForKey(key){
    // dataCenter の ものとは違う
	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 NR_Call(command, args, receiver){
	// server に command を送る
    _callServer(command, "./server.php", args, receiver);
}

function gotBooking(answer){
    if (answer && answer.length){
        var ary = eval('(' + answer + ')');
        //var ary = JSON.parse(answer);
        //alert("== 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("予約はありません");
    }
}
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");
	    
    var args = new Object();
    args["year"] = yy;
    args["month"] = mm;
    args["day"] = dd;
    
    //alert("== getBooking -> "+yy+"/"+mm+"/"+dd+"->"+w); //##
    
    NR_Call("GET_BOOKING", args, gotBooking);
}

function removedBooking(answer){
    var ary = eval('(' + answer + ')');
    //var ary = JSON.parse(answer);
    //alert("removedBooking->"+encodeObject(ary)); //##
    setRecords(ary);
    getCalendars();
    showBookingMatrix();
    closeFloatPanel();
}
function removeBooking(){
	// 予約を削除
	var patientId = elmFor("ed_pid").value;
	if (patientId.length == 0){
		alert("カルテID が入力されていません");
		return;
	}
    
	if (confirm(patientId + " の予約を削除していいですか")){
        var args = new Object();
        args["patientId"] = patientId;
        args["entryDate"] = newEntryDate();
        
        // records() から patientId 相当オブジェクトを削除
        removeRecordsForPatientId(patientId);
        
        NR_Call("REMOVE_BOOKING", args, removedBooking);
	}
}

var _newDateTime;
function savedBooking(answer){
    var ary = eval('(' + answer + ')');
    //var ary = JSON.parse(answer);
    //alert("savedBooking->"+encodeObject(ary)); //##
    setRecords(ary);
    closeFloatPanel();
    
    getCalendars(null, null); // Ajax
}
function saveBooking(){
	// 変更された予約日をサーバへ記録
    var pid = elmFor("ed_pid").value;
    var inPatient = (elmFor("inPatientBox").checked) ? "on" : "";
    var aid = elmFor("ed_anotherId").innerHTML;
    var name = elmFor("ed_patientName").innerHTML;
    _newDateTime = newEntryDate();
    var memo = elmFor("ed_memo").value;
    
    // patientId が実態なので records() に格納
    addRecords(pid, aid, name, _newDateTime);
    
    // サーバとの約束事
    var args = new Object();
    args["patientId"] = pid;
    args["inPatient"] = inPatient;
    args["anotherId"] = aid;
    args["name"] = name; //patientName();
    args["entryDate"] = oldEntryDate(); // 予約パネルが開いた時の日時
    args["newEntryDate"] = _newDateTime; // 予約パネルで変更された日時
    args["plan"] = memo;
        
    //alert("CHANGE_BOOKING"); //##
    
    NR_Call("CHANGE_BOOKING", args, savedBooking);
}

var _pref_editMode;
function gotPreference(answer){
    var objct = eval('(' + answer + ')');
    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();
            
            // 初期設定パネルを開く
            openPreference();
            _pref_editMode = false;
        }
    }
    
    // カレンダーを表示
    getCalendars();
}
function getPreference(){
	// 初期設定をサーバへリクエスト
    var args = new Object();
    args["hospitalId"] = parent().hospitalId();
    args["owner"] = owner();
    args["groupCode"] = "doctor"; // ドクターのリストのみをリクエスト
    
    NR_Call("GET_BOOKING_PREFERENCE", args, gotPreference);
}

function savePreference(){
	// 初期設定をサーバへ保存
    var prefObj = new Object();
    prefObj['owner'] = owner();
    
    var obj = new Object();
    obj['interval'] = elmFor("pr_min").value;
    var buff = elmFor("pr_holiday").value;
    
    var val = elmFor("pr_holiday").value;
    obj['holiday'] = replaceAll(val, "\n", ",");
    
    prefObj['minAndHolidays'] = encodeObject(obj);
    
    var obj = new Object();
    obj['comment1'] = elmFor("pr_comment1").value;
    obj['comment2'] = elmFor("pr_comment2").value;
    prefObj['comments'] = encodeObject(obj);
    prefObj['hospitalId'] = parent().hospitalId();
    prefObj['groupCode'] = "doctor"; // ドクターのリストのみをリクエスト
    
    // 一旦空欄にする：サーバの返事を待ち再表示
    elmFor("pr_holiday").value = "";
    elmFor("pr_comment1").value = "";
    elmFor("pr_comment2").value = "";

    NR_Call("PUT_BOOKING_PREFERENCE", prefObj, gotPreference);
}

function gotPatients(answer){
    var objct = eval('(' + answer + ')');
    //var objct = JSON.parse(answer);
    //alert("gotPatients->"+encodeObject(objct)); //##
    
    if (objct) showPatientList(objct);
}
function searchPatient(){
	// 患者を検索
	var patientId = elmFor("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 に一致する患者リストを返す
		// 検索キーにマッチしたカルテのリストを表示
        var args = new Object();
        args["key"] = mode;
        args["val"] = patientId;
        
        //alert("GET_PATIENTS"); //##
        
        NRCall("GET_PATIENTS", args, gotPatients);
	}
}

function changedMemo(answer){
    var records = eval('(' + answer + ')');
    //var records = JSON.parse(answer);
    if (records){
        //alert("changedMemo ===\n"+encodeObject(records)); //##
        // メモ項目ポップアップを記憶
        var obj = new Object();
        for (num in records){
            var rec = records[num];

            obj[rec.menu] = rec.freq;
        }
        
        setMemoItems(obj);
        
        // メモ・ポップアップを再表示
        showMemoPopup(); // メモ・ポップアップを再表示
    }
}
function addMemo(item){
	// 実施予定ポップアップに item を追加
    var args = new Object();
    args["owner"] = owner();
    args["tag"] = "FrontTable.plan";
    args["menuItem"] = item;
    args["public"] = "1";
    args["freq"] = "0";
    
   // alert("PUT_MENU"); //##
    
    NRCall("PUT_MENU", args, changedMemo);
}
function removeMemo(){
	// メモ項目を削除
    var item = elmFor("ed_memo_popup").value;
	if (confirm("ポップアップメニューから「"+item+"」を削除していいですか")){
        var args = new Object();
        args["owner"] = owner();
        args["tag"] = "FrontTable.plan";
        args["menuItem"] = item;
        
        NRCall("REMOVE_MENU", args, changedMemo);
    }
}

function gotCalendars(answer){
    //alert("== gotCalendars -> "+answer); //##
    var obj = eval('(' + answer + ')');
    //var obj = JSON.parse(answer);
    if (obj){
        //alert("gotCalendars: obj -> "+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); //##
    
    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 args = new Object();
    args['year'] = yy;
    args['month'] = mm;
    
    //alert("GET_BOOKING_HISTORY"); //##
    
    NR_Call("GET_BOOKING_HISTORY", args, gotCalendars);
}

function gotBookingDate(answer){
    //alert("gotBookingDate -> "+answer); //##
    var records = eval('(' + answer + ')');
    //var records = JSON.parse(answer);
    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);
    
    var args = new Object();
    args["patientId"] = patientId;
    
    NR_Call("GET_BOOKING_DATE", args, gotBookingDate);
}

/// 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); //##
	}
}

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



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

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

    var panelW = 320;
    var panel = new FloatPanel("_floatPanel", 5,10, panelW, "初期設定パネル");
    if (!panel) return;
    var elm = panel.contents;
    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())
        elmFor("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())
        elmFor("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");
    div.style.margin = "10px 0 10px 0";
    var dv = newDIV(div, "/right-side");
    var bt = newDIV(dv, "/fixButton");
	bt.innerHTML = "確定";
    bt.setAttribute("onclick", "savePreference()");
    bt.style.padding = "5px 10px 3px 10px";
}

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


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

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

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

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

    // confirm パネルの内容を生成
    var div = newDIV(elm, "");
	div.innerHTML = "予約日に診療を行う担当医を選択し、印刷ボタンを押してください";
    div.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, "");
    div.style.textAlign = "right";
	var bt = newDIV(div, "/whiteButton");
    bt.innerHTML = "印刷";
	bt.setAttribute("onclick", "printPDF()");
    
	function setPrintArgs(){
		var array = new Array();
		array['patientId'] = elmFor("ed_pid").value;
		array['anotherId']
		= elmFor("ed_anotherId").innerHTML;
		array['patientName']
		= elmFor("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 = elmFor("ed_hour").value;
		var min = elmFor("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){
	// 検索結果から患者が選択された
	elmFor("ed_pid").value = pid;
	elmFor("ed_anotherId").innerHTML = aid;
	elmFor("ed_patientName").innerHTML = name;
    
	// 確定ボタンを表示
	var sp = elmFor("ed_ok_button");
	sp.innerHTML = "";
	var bt = newBUTTON(sp, "", "確定");
	bt.setAttribute("onclick", "saveBooking()");
	
	// 検索結果を消去
	elmFor("ed_patientListArea").innerHTML = "";
}
function showPatientList(objct){
	// キーにマッチした患者リストを表示
	var elm = elmFor("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;
    var panel = new FloatPanel("_floatPanel", 5, 10, panelW, "");
    if (!panel) return;
    var elm = panel.contents;
    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 = elmFor("_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 = elmFor("ed_memo").value;
	if (buff.length)
		buff += "\n" + elm.value;
	else
		buff = elm.value;
	elmFor("ed_memo").value = buff;
}

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

function showMemoPopup(){
	// メモ用ポップアップ・メニューを生成
	var elm = elmFor("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 = elmFor("ed_pid").value;
    //var name = elmFor("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 = elmFor(cid);
		td.style.color = _oldColor;
		td.style.backgroundColor = _oldBGColor;
	}
	
	// 選択された日付の色を選択色にする
	var td = elmFor(cellIdFor(yy, mm, dd));
	_oldColor = td.style.color;
	_oldBGColor = td.style.backgroundColor;
	td.style.color = "#ff0";
	td.style.backgroundColor = "#00f";
    
    // Booking のウインドー位置とサイズをサーバへ記憶
    put_windowSize(0, -22, "bookingWindowSize");
    
	// 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 = elmFor("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 = "#a7e6d7";
		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){
	// カレンダーを３連装で表示    
    if (patientId()){
        var elm = elmFor("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 = elmFor("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";
					
                    // 予約者数を取得
                    var count = hasHistory(yy, mm, d);
					if (count > 0){
						// 予約者の存在する日付：予約者数に応じた色をつける
                        //td.innerHTML = count; //##
						td.style.backgroundColor = colorCode(count);
						td.style.borderBottom = "thin solid #888";
						td.style.borderRight = "2px solid #ccc";
					}
				}
			}
		}
	}
}

function colorCode(num){
    // 数値に従い色を黄色から赤へ段階的に変色
    if (num == 0)  return "#fff";
    if (num <= 5)  return "#ffc";
    if (num <= 10) return "#ff6";
    if (num <= 15) return "#fd8";
    if (num <= 20) return "#fc3";
    if (num <= 25) return "#fa0";
    if (num <= 30) return "#f80";
    if (num <= 35) return "#f65";
    return "#f00";
}

function showColorSample(elm){
    // 予約人数による色の変化を示す
    elm.innerHTML = "";
    elm.style.fontSize = "9pt";
    
    var div = newDIV(elm, "");
    div.innerHTML = "色は予約人数により変化：数値は人数";
    div.style.color = "#888";
    div.style.margin = "5px 0";
    var div = newDIV(elm, "/clearfix");
    for (num=0; num <= 40; num+=5){
        var box = newDIV(div, "");
        box.innerHTML = (num < 10) ? "0"+num : ""+num;
        box.style.display = "inline";
        box.style.padding = "2px";
        box.style.width = "30px";
        box.style.border = "thin solid #ccc";
        box.style.marginRight = "3px";
        box.style.backgroundColor = colorCode(num);
    }
}

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(){
	var elm = elmFor("base");
    var pframe = new PictureFrame(elm, "80%", "70%");
    
    // === HEADER =============================
    // LEFT-SIDE
    pframe.headerLeft.setAttribute("id", "idAndNameArea");
    pframe.headerLeft.style.paddingLeft = "8px";
    pframe.headerLeft.style.fontSize = "9pt";
    // RIGHT-SIDE
    var im = newIMAGE(pframe.headerRight, "", "./help.png", "?");
    im.setAttribute("onclick", "help()");
    im.style.height = "18px";
    im.style.verticalAlign = "bottom";
    im.style.position = "relative";
    im.style.top = "3px";
    // === BODY ==============================
    var tbl = newTABLE(pframe.body, "bodyTable");
    var tr = newTR(tbl, "", "");
    var td = newTD(tr, "calendarArea", "calendar");
    var td = newTD(tr, "editorArea", "");
    td.style.width = "1000px";
    // === FOOTER ============================
    // LEFT-SIDE
    var im = newIMAGE(pframe.footerLeft, "", "./hammer.png", "?");
    im.setAttribute("onclick", "openPreference()");
    im.style.height = "15px";
    // RIGHT-SIDE
    pframe.footerRight.innerHTML = version();

    // color code
    var div = newDIV(elm, "");
    showColorSample(div);
    
    // iFrame なら toggleButton にツール名を表示
    var bt = tools().elmFor("toggleButton");
    if (bt) bt.innerHTML = "診療予約ツール";
    
    // 初期設定値を読み込むとともにカレンダーを表示
    getPreference();
    
    // ウインドー・サイズを localStorage から読み込みサイズ調整
    // 古い OS では localStorage を扱えずコケるので最後に実行
    getWindowSize();
}

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

