

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)){
            if (entryDate.indexOf("START") >= 0)
                return 1;
            else
                return 2;
        }
    }
    return 0;
}
function isStartDate(date){
    // _counter に記憶した日付に "START" が入っていれば true を返す
    for (num in _counter){
        var entryDate = _counter[num];
        if (isSameDate(date, entryDate)){
            if (entryDate.indexOf("START") >= 0)
                return true;
        }
    }
    return false;
}

function pageScrollUp(date){
    // ページを画面上端にスクロール
    var array = history();
    for (num in array){
        var entryDate = array[num];
        if (isSameDate(date, entryDate)){
            pageScrollTo(entryDate);
            return; // 受診歴があったのでそのページにスクロール
        }
    }
    
    // 受診歴がなかった：すなわち予約日
    for (num in _bookingArray){
        var entryDate = _bookingArray[num];
        if (isSameDate(date, entryDate)){
            // 予約日の場合、そのページはまだ存在しないので
            // 代わりに予約ツールを開く
            window.open("../Booking","tools");
        }
    }
}

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);
    elm.style.paddingLeft = "10px";
    
    var counter = 0;
    var ct = _counter.length;
    for (var num=ct-1; num >= 0; num--){
        var entryDate = _counter[num];
        if (entryDate.indexOf("START") > 0)
            counter = 1;
        else
            counter++;
        if (isSameDate(date, entryDate)){
            elm.innerHTML = counter + " 回目";
        }
    }
}
function showMonth(year, month){
    // その月のカレンダーを表示
    //_debug("== showMonth->"+year+"/"+month); //##
    
    var cal = elmFor(year + "_" + month + ".calendar");
    if (cal && cal.innerHTML.length){
        // すでにカレンダーが開いていれば閉じて終了
        cal.innerHTML = "";
        return;
    }
    
    // 年月ラベルを再構築
    makeYearMonthLabel(year, month);
    
    // カレンダー本体
    var dv = elmFor(year + "_" + month + ".calendar");
    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";
    }
    
    // DAY
    var lastDay = getLastDate(year, month);
    
    var w = 0;
    if (calendarIsReverse() > 0){
        // 毎月のカレンダーを逆順に表示
        var lastWeek = weekOfDate(year + "-" + month + "-" + lastDay);
        var lastW = last_W(lastWeek);
        var day = lastDay * 1 - lastW * 1 - lastWeek;
        var weekBeginDay = day; // 週開始の日付
        
        while (day > -7){
            if (w == 0)
                var tr = newTR(tbl, "", "");
            
            if (day > lastDay){
                var td = newTD(tr, "/dateTip", ""); // 空欄日付を表示
            } else if (day <= 0){
                var td = newTD(tr, "/dateTip", ""); // 空欄日付を表示
                day++;
            } else {
                var td = newTD(tr, "/dateTip", "" + day);
                var dd = (day * 1 < 10) ? "0" + day : day;
                var date = year + "-" + month + "-" + dd;
                td.setAttribute("onclick", "pageScrollUp('" + date + "')");
                day++;
            }
            
            // 日付にカラー・マーキング
            if (isVisitDate(date)){ // 受診した日付
                if (td.innerHTML.length == 0){
                    // do nothing
                } else {
                    // 2013-04-22 16:35:00 は 130422 形式で比較しないとうまくいかない
                    var status = hasCouner(date) * 1;
                    if (status == 1){ // カウント開始日
                        td.setAttribute("class", "orangeDateTip");
                        td.setAttribute("onmouseover", "showCount('" + date + "')");
                        td.setAttribute("onmouseout", "hideCount('" + date + "')");
                    } else if (status == 2){ // カウントのある受診日
                        td.setAttribute("class", "yellowDateTip"); //##
                        td.setAttribute("onmouseover", "showCount('" + date + "')");
                        td.setAttribute("onmouseout", "hideCount('" + date + "')");
                    } else { // カウントのない受診日
                        td.setAttribute("class", "greenDateTip");
                    }
                }
            }
            
            if ((date > today()) && isBookingDate(date))
                td.setAttribute("class", "pinkDateTip");
            
            if (++w == 7){
                if (day <= 8) break;
                
                w = 0;
                day = weekBeginDay - 7;
                weekBeginDay = day;
            }
        }
    } else {
        var firstWeek = weekOfDate(year + "-" + month + "-01");
        var day = 0;
        
        while (day <= lastDay){
            if (w == 0)
                var tr = newTR(tbl, "", "");
            
            if (day == 0){
                if (firstWeek == w){
                    // 曜日が月初の曜日と一致したなら１日に設定
                    day = 1;
                } else {
                    // そうでなければ空欄日付を表示
                    w++;
                    var td = newTD(tr, "/dateTip", "");
                    continue;
                }
            }
            var td = newTD(tr, "/dateTip", "" + day);
            var dd = (day * 1 < 10) ? "0" + day : day;
            var date = year + "-" + month + "-" + dd;
            td.setAttribute("onclick", "pageScrollUp('" + date + "')");
            
            // 日付にカラー・マーキング
            if (isVisitDate(date)){ // 受診した日付
                if (td.innerHTML.length == 0){
                    // do nothing
                } else {
                    var status = hasCouner(date) * 1;
                    if (status == 1){ // カウント開始日
                        td.setAttribute("class", "orangeDateTip");
                        td.setAttribute("onmouseover", "showCount('" + date + "')");
                        td.setAttribute("onmouseout", "hideCount('" + date + "')");
                    } else if (status == 2){ // カウントのある受診日
                        td.setAttribute("class", "yellowDateTip"); //##
                        td.setAttribute("onmouseover", "showCount('" + date + "')");
                        td.setAttribute("onmouseout", "hideCount('" + date + "')");
                    } else { // カウントのない受診日
                        td.setAttribute("class", "greenDateTip");
                    }
                }
            }

            if ((date > today()) && 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 setMarkAttribute(td, date){
        // 日のエレメントにカウント・マークを設定
        if (!_markStartDate){
            // カウント開始マークがなければカウントのない受診日
            td.setAttribute("class", "greenDateTip");
            return;
        }
        
        var dt = shortDate(date);
        var sdt = shortDate(_markStartDate);
        var gdt = shortDate(_markGoalDate);
        if (dt == sdt){ // カウント開始日
            td.setAttribute("class", "orangeDateTip");
            td.setAttribute("onmouseover", "showCount('" + date + "')");
            td.setAttribute("onmouseout", "hideCount('" + date + "')");
        } else if ((dt <= gdt) && (dt > sdt)){ // カウントのある受診日
            td.setAttribute("class", "yellowDateTip");
            td.setAttribute("onmouseover", "showCount('" + date + "')");
            td.setAttribute("onmouseout", "hideCount('" + date + "')");
        } else { // カウントのない受診日
            td.setAttribute("class", "greenDateTip");
        }
    }
    
    function isVisitDate(date){
        // year, month, day が受診日なら true を返す
        var array = history();
        for (num in array){
            var entryDate = array[num];
            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 last_W(weekSt){
        // 曜日に対応する数値を返す
        var array = _weeks;
        for (num in array){
            if (array[num] == weekSt)
                return num;
        }
        return 0;
    }
}

function makeYearMonthLabel(year, month){
    // 年月 ラベル
    var div = elmFor(year + "_" + month + ".bar");
    div.innerHTML = year + " " + month;
    div.setAttribute("onclick", "showMonth('"+year+"','"+month+"')");
}

function showMonthlyCalendar(){
    // 各月のカレンダーを表示
    //_debug("== showMonthlyCalendar =="); //##
    
	var elm = document.getElementById("contentsArea");
	elm.innerHTML = "";
    
    // 予約日があればそれをマージ
    var dateArray = history();
    if (_bookingArray){
        dateArray = _bookingArray.concat(dateArray);
    }
    
    if (calendarIsReverse() == 0){
        // 正順にソート
        dateArray = dateArray.reverse();
    }
    
    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(elm, year + "_" + month + ".bar");
            div.setAttribute("class", "calYearMonthLabel");
            makeYearMonthLabel(year, month); // float:left
            
            newDIV(elm, year + "_" + month + ".calendar");
       
            // calendarToExpand か 参照中の受診日と同月なら カレンダーを開く
            if ((calendarToExpand()) || (isSameMonth(entryDate,currentDate()))){
               showMonth(year, month);
            }
        }
    }
}

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

var _markStartDate;
var _markGoalDate;
function getCounter(){
    // [candida治療] などの印のついた受診日の配列を返す
    var counter = new Array();
    var array = history();
    for (num in array){
        var dateTime = array[num];
        if (dateTime == "0000-00-00 00:00:00") continue;
        
        var id = dateTime + ".ProgressSection.subject.val";
        var elm = document.getElementById(id);
        if (!elm) continue; // subject 欄が空だった

        var val = elm.innerHTML;
        if (! hasCountForm(val)) continue; // [...] 型式でなければスキップ
        
        if (val.indexOf(":開始]") >= 0)
            // "[...:開始]" があれば起点とする
            counter.push(dateTime + "START");
        else if (val.indexOf(":終了]") >= 0){
            // "[...:終了]" があれば終点とする
            counter.push(dateTime + "END");
        } else {
            counter.push(dateTime);
        }
    }
    return counter;
    
    
    function hasCountForm(buff){
        // buff に "[...]" が含まれれば true を返す
        if (buff == null) return false;
        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 showCheckBox(){
    // 逆順チェックボックスを表示
    alert("showCheckBox"); //##
    
    var elm = elmFor("checkBoxArea");
    elm.innerHTML = "";
    elm.style.paddingLeft = "5px";
    var cb = newCHECKBOX(elm, "", "逆順", calendarIsReverse());
    cb.setAttribute("onchange", "checkReverse(this)");
}

function expandCalendar(){
    // calendar を展開する
	var elm = document.getElementById("arrowArea");
    elm.innerHTML = "";
    
	var img = newIMAGE(elm, "", "./reduce.png", "reduce");
	img.style.height = "12px";
    img.setAttribute("class", "expandIcon");
    img.setAttribute("onclick", "foldCalendar()");
    setCalendarToExpand(true); // localStorage.js に記憶

    var sp = newSPAN(elm, "checkBoxArea");

    showMonthlyCalendar();
}
function foldCalendar(){
    // calendar を折畳む
	var elm = document.getElementById("arrowArea");
    elm.innerHTML = "";
	var img = newIMAGE(elm, "", "./expand.png", "expand");
	img.style.height = "12px";
    img.setAttribute("class", "expandIcon");
    img.style.position = "relative";
    img.style.top = "2px";
    img.setAttribute("onclick", "expandCalendar()");
    setCalendarToExpand(false); // localStorage.js に記憶
    
    var sp = newSPAN(elm, "checkBoxArea");
    
    showMonthlyCalendar();
}

function changeOrder(){
    // カレンダーの表示を逆順にする
    if (calendarIsReverse()) // localStorage.js
        setCalendarIsReverse(false);
    else
        setCalendarIsReverse(true);
    
    // 各月のカレンダーを表示
    if (calendarToExpand())
        expandCalendar();
    else
        foldCalendar();
}

function showCalendar(){
    // カレンダーを 開/閉
    var elm = document.getElementById("calendarArea");
    var postIt = elmFor("postIt");
    //console.log("noCalendar", noCalendar()); //##
    
    if (noCalendar() == 0){
        elm.style.display = "block";
        if (postIt) postIt.style.left = "-30px";
    } else {
        elm.style.display = "none";
        if (postIt) postIt.style.left = "0";
    }
}
function toggleCalenar(){
    // カレンダーを開閉する
    if (noCalendar() == 0){
        setNoCalendar(true);
        showCalendar();
    } else {
        setNoCalendar(false);
        showCalendar();
    }
}

function openCalendar(array){
    _bookingArray = array;

	var elm = document.getElementById("calendarArea");
	elm.innerHTML = "";
    elm.style.width = "110px";
    
    // HEADER
    var div = newDIV(elm, "/clearfix");
    // --- LEFT SIDE ----------
    var dv = newDIV(div, "/left-side");
    dv.style.width = "60px"; // left-side は width を指定しておく必要あり
    dv.style.height = "23px";
    dv.style.width = "90px";
    dv.style.paddingTop = "3px";
    dv.style.paddingLeft = "3px";
    //dv.style.border = "thin solid #00f"; //##
    // ARROW ICON AREA
    var bt = newSPAN(dv, "arrowArea");
    bt.style.width = "15px";
    // 
    var bt = newSPAN(dv, "calTab/calendarTab");
    bt.innerHTML = "逆順に表示";
    bt.setAttribute("onclick", "changeOrder()");
    
    // --- RIGHT SIDE ----------
    var dv = newDIV(div, "/right-side");
    dv.style.paddingRight = "0";
    var img = newIMAGE(dv, "", "help.png", "icon");
    img.setAttribute("onclick", "openHelp('./calendarHelp.html')");
    img.setAttribute("class", "expandIcon");
    img.style.height = "17px";
    img.style.position = "relative";
    img.style.top = "3px";
    
    // CONTENTS
    var div = newDIV(elm, "contentsArea");

    // [candida治療] などの印をカウントし配列に記憶
    setCounter(getCounter());
    
    // 各月のカレンダーを表示
    if (calendarToExpand())
        expandCalendar();
    else
        foldCalendar();
}


