
/////////////////////////
///// カルテからの継承値 ///

function noa(){
    if (window.opener.name == "noa"){
        return window.opener;
    } else if (window.opener.name == "tools"){
        return window.opener.top.noa;
    } else if (window.top.noa){
        return window.top.noa;
    } else {
        alert("ERROR *** calendar.js: window.opener としての NOA が見つかりません");
        return null;
    }
}

function patientId(){
	return noa().patient_id();
}

///// カルテからの継承値 ///
/////////////////////////


var _counter;
function setCounter(array){
    // "[...]" 印のあるページの受診日の配列
    _counter = array;
}
function counter(){
    return _counter;
}
function hasCouner(date){
    // _counter に date が含まれれば true を返す
    for (num in _counter){
        var entryDate = _counter[num];
        if (isSameDate(date, entryDate))
            return true;
    }
    return false;
}

function pageScrollUp(date){
    // ページを画面上端にスクロール
    var obj = noa().structure();
    for (entryDate in obj){
        if (isSameDate(date, entryDate)){
            noa().pageScrollTo(entryDate);
            return; // 受診歴があったのでそのページにスクロール
        }
    }
    
    // 受診歴がなかった：すなわち予約日
    for (num in _bookingArray){
        var entryDate = _bookingArray[num];
        if (isSameDate(date, entryDate)){
            // 予約年月日に一致した予約日時を得、そのページを追加
            if (confirm("予約日："+entryDate + " のページをカルテに追加しますか")){
                // ## 同じ年月日に２つ以上予約があった場合（それはないはずだが）最初のものをゲット
                noa().addPage(entryDate);
            }
        }
    }
}

function hideCount(date){
    // マウスで指した日付の count を消す
    var array = date.split("-");
    var year = array[0];
    var month = array[1];
    var day = array[2];
    
	var elm = document.getElementById("calMessage"+year+month);
    elm.innerHTML = "";
}
function showCount(date){
    // マウスで指した日付の count を表示
    var array = date.split("-");
    var year = array[0];
    var month = array[1];
    var day = array[2];
    
	var elm = document.getElementById("calMessage"+year+month);
    
    for (num in _counter){
        var entryDate = _counter[num];
        if (isSameDate(date, entryDate)){
            elm.innerHTML = _counter.length - num + " 回目";
            elm.style.paddingLeft = "10px";
        }
    }
}
function showMonth(year, month){
    // その月のカレンダーを表示
    var cal = document.getElementById(year + "_" + month + ".calendar");
    if (cal && cal.innerHTML.length){
        // すでにカレンダーが開いていれば閉じて終了
        cal.innerHTML = "";
        return;
    }
    
    var div = document.getElementById(year + "_" + month + ".bar");
    div.innerHTML = "";
    
    // div.innerHTML = "" を行うので、年月ラベルを再構築
    makeYearMonthLabel(div, year, month);
    
    // カレンダー本体
    var dv = newDIV(div, year + "_" + month + ".calendar");
    dv.setAttribute("class", "calTableArea");
    
    var tbl = newTABLE(dv, "calendarTable");
    
    // WEEK
    var tr = newTR(tbl, "", "");
    var array = weeks(); // lib.js
    for (num in array){
        var td = newTD(tr, "", array[num]);
        td.style.textAlign = "right";
        td.style.padding = "0px 5px";
    }
    
    // DAY
    var firstWeek = weekOfDate(year + "-" + month + "-01");
    var lastDay = getLastDate(year, month);
    var w = 0;
    var day = 0;
    
    while (day <= lastDay){
        if (w == 0)
            var tr = newTR(tbl, "", "");
        
        if (day == 0){
            if (firstWeek == weeks()[w]){
                // 曜日が月初の曜日と一致したなら１日に設定
                day = 1;
            } else {
                // そうでなければ空欄日付を表示
                w++;
                var td = newTD(tr, "/dateTip", "");
                continue;
            }
        }
        var st = (day > 0) ? "" + day : "";
        
        var td = newTD(tr, "/dateTip", st);
        var dd = (day * 1 < 10) ? "0" + day : day;
        var date = year + "-" + month + "-" + dd;
        td.setAttribute("onclick", "pageScrollUp('" + date + "')");

        if (isVisitDate(date)){
            if (hasCouner(date)){
                // subject に "[...]" 形式のマークが存在
                td.setAttribute("class", "yellowDateTip");
                td.setAttribute("onmouseover", "showCount('" + date + "')");
                td.setAttribute("onmouseout", "hideCount('" + date + "')");
            } else {
                td.setAttribute("class", "greenDateTip");
            }
        } else if (isBookingDate(date)){
            td.setAttribute("class", "pinkDateTip");
        }
        
        day++;
        if (day > lastDay) break;
        if (++w > 6) w = 0;
    }
    
    // keyCount モードのカウント数を表示するエリア
	var tr = newTR(tbl, "", "");
	var td = newTD(tr, "calMessage"+year+month, "");
	td.setAttribute("colspan", "7");
	td.style.color = "#00f"; //blue
    
    function isVisitDate(date){
        // year, month, day が受診日なら true を返す
        var obj = noa().structure();
        for (entryDate in obj){
            if (isSameDate(date, entryDate)) return true;
        }
        return false;
    }
    function isBookingDate(date){
        // year, month, day が予約日なら true を返す
        for (num in _bookingArray){
            var entryDate = _bookingArray[num];
            if (isSameDate(date, entryDate)) return true;
        }
        return false;
    }
}

function makeYearMonthLabel(div, year, month){
    // 年月 ラベル
    var dv = newDIV(div, "/yearMonthLabel");
    dv.innerHTML = year + "・" + month;
    dv.setAttribute("onclick", "showMonth('"+year+"','"+month+"')");
}

function showMonthlyCalendar(){
    // 各月のカレンダーを表示
	var elm = document.getElementById("contentsArea");
	elm.innerHTML = "";
    
    var calbg = newDIV(elm, ""); // カレンダー背景
    
    // structure() から受診日の配列を生成
    var dateArray = new Array();
    var obj = noa().structure();
    for (entryDate in obj){
        dateArray.push(entryDate);
    }
    
    // 予約日があればそれをマージ
    if (_bookingArray){
        dateArray = _bookingArray.concat(dateArray);
    }
    
    var year;
    var month;
    for (num in dateArray){
        // rec は ProgressSection と NameSection のデータを保有
        var entryDate = dateArray[num];
        var st = entryDate.substr(0,10);
        var ary = st.split("-");
        
        if ((year != ary[0]) || (month != ary[1])){
            year = ary[0];
            month = ary[1];
            var div = newDIV(calbg, year + "_" + month + ".bar");
            div.setAttribute("class", "yearMonthRow");
            
            // 年月 ラベル
            makeYearMonthLabel(div, year, month); // float:left
 
            // _expandMode か 参照中の受診日と同月なら カレンダーを開く
            if (_expandMode || (isSameMonth(entryDate, noa().currentDate()))){
               showMonth(year, month);
            }
        }
    }
}

var _bookingArray;
function gotBooking(answer){
    // 予約日リストが answer として返される
    //alert("gotBooking->"+answer); //##
    _bookingArray = JSON.parse(answer);
    //alert("records->"+encodeObject(array)); //##
    
    // 各月のカレンダーを表示
    showMonthlyCalendar();
}

var _expandMode;
function expandAll(){
    // 全カレンダーを収縮・展開
    _expandMode = (_expandMode) ? false : true;
    showMonthlyCalendar();
}

function getCounter(){
    // [candida治療] などの印のついた受診日の配列を返す
    var counter = new Array();
    var obj = noa().structure();
    var key;
    var hasBegin;
    for (entryDate in obj){
        var fields = obj[entryDate];
        var rec = fields['ProgressSection.subject'];
        var val = rec.trimValue; // 主訴欄の value
        
        if (val.length == 0) continue;
        if (! hasCountForm(val)) continue;
        
        // "[..." を key にする
        if (!key) key = getCountKey(val);
        
        // key が val に含まれれば配列に追加処理
        if (val.indexOf(key) >= 0){
            // 起点を見つけた以後 ":開始]" なくなれば配列生成終了
            if (hasBegin && (val.indexOf(":開始]") < 0))
                return counter;
            
            // key がみつかるごと配列に記憶
            counter.push(entryDate);
            
            // "[...:終了]" があれば、そこまでの配列は消去
            if (val.indexOf(":終了]") >= 0){
                counter = new Array();
                counter.push(entryDate);
            }
            
            // "[...:開始]" があれば起点とする
            if (val.indexOf(":開始]") >= 0)
                hasBegin = true;
        }
    }
    return counter;
    
    function hasCountForm(buff){
        // buff に "[...]" が含まれれば true を返す
        if (buff.indexOf("[") < 0) return false;
        if (buff.indexOf("]") < 0) return false;
        return true;
    }
    
    function getCountKey(buff){
        // buff 中の "[..." を key として返す
        var array = buff.split("[");
        var st = array[1];
        array = st.split("]");
        st = array[0];
        array = st.split(":");
        
        return "[" + array[0];
    }
}

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

function initCalendar(){
	var elm = document.getElementById("base");
	elm.innerHTML = "";
    elm.style.backgroundColor = "#cfe";
    
    // HEADER
    var div = newDIV(elm, "title-bar");
    var bt = newDIV(div, "left-side/greenButton");
    bt.innerHTML = "CALENDAR";
    bt.style.marginLeft = "5px";
    bt.setAttribute("onclick", "expandAll()"); // 全カレンダーを収縮・展開
    var dv = newDIV(div, "right-side");
    var img = newIMAGE(dv, "", "Help.png", "icon");
    img.style.height = "15px";
    img.style.verticalAlign = "middle";
    img.setAttribute("onclick", "calendarHelp()");
    
    // CONTENTS
    var dv = newDIV(elm, "contentsArea");
    
    // FOOTER
    var dv = newDIV(elm, "title-bar");
    dv.style.padding = "2px 10px";
    dv.style.color = "#555";
    dv.innerHTML = version();
    
    // [candida治療] などの印をカウントし配列に記憶
    setCounter(getCounter());
    
    // ### FrontTable の本日以後から、この patientId の予約年月日をスキャン
    // ### そのリストを得た上で showMonthlyCalendar() を実行
    NRGetBooking(patientId(), noa().currentDate(), gotBooking);
}

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

