/***************************************************************
    SYSTEM   : 新田塚スポーツクラブ アーク
    TITLE    : 営業カレンダーの表示
    SCRIPT   : calendar.js
    VERSION  : Ver1.1.6
    LANGUAGE : JavaScript1.3
    CODESET  : UTF-8
    EXPLAIN  : 休業日を明示した営業カレンダーを表示します。
    AUTHOR   : yap
    CREATED  : 2006/11/09 as Ver1.0.1
    UPDATED  : 2008/11/25 as Ver1.1.6
***************************************************************/

//リンク先の定義  Insert on 2008.11.08 by yap
var linkurl = 'program/schedule.html';

/***************************************************************
    営業カレンダー初期値の設定
***************************************************************/

//デフォルト値の設定
if (holidays == undefined) {var holidays = '';}  //特別休業日
if (flgHol   == undefined) {var flgHol   = 1;}   //祝日を休みとするフラグ
if (arrReg   == undefined) {var arrReg   = new Array(  //定休日
    new Array(1, 1, 1, 1, 1),  //日曜(第1週,第2週,第3週,第4週,第5週)
    new Array(0, 0, 0, 0, 0),  //月曜(　〃　)
    new Array(0, 0, 0, 0, 0),  //火曜(　〃　)
    new Array(0, 0, 0, 0, 0),  //水曜(　〃　)
    new Array(0, 0, 0, 0, 0),  //木曜(　〃　)
    new Array(0, 0, 0, 0, 0),  //金曜(　〃　)
    new Array(1, 1, 1, 1, 1)); //土曜(　〃　)
}
if (numCal   == undefined) {var numCal   = 1;}   //表示するカレンダー数
if (numCol   == undefined) {var numCol   = 0;}   //１行に表示するカレンダー数
if (offset   == undefined) {var offset   = 0;}   //表示開始年月オフセット
if (styleCur == undefined) {var styleCur = 'color:#009900; font-weight:bold;';}  //今日
if (styleHol == undefined) {var styleHol = 'background-color:#FFCCCC;';}  //休業日
if (styleOpn == undefined) {var styleOpn = 'background-color:#FFFFFF;';}  //営業日
if (styleInv == undefined) {var styleInv = 'background-color:#ECECEC;';}  //無効日
if (styleFes == undefined) {var styleFes = 'color:#FF00FF;';}  //祝日
if (styleSun == undefined) {var styleSun = 'color:#FF0000;';}  //日曜
if (styleSat == undefined) {var styleSat = 'color:#0000FF;';}  //土曜
if (styleWee == undefined) {var styleWee = 'color:#000000;';}  //平日
if (styleDay == undefined) {var styleDay = 'font-size:9pt; border:solid 1px #CCCCCC;';}  //日付部
if (styleCap == undefined) {var styleCap = 'font-size:9pt; border:solid 1px #CCCCCC; background-color:#E0E0FF;';}  //見出し(曜日)
if (styleBtn == undefined) {var styleBtn = 'color:#FFFFFF; font-size:9pt; background-color:#9999FF;';}  //タイトル(<>ボタン)
if (styleTtl == undefined) {var styleTtl = 'color:#FFFFFF; font-size:9pt; background-color:#9999FF;';}  //タイトル(年月)
if (styleTbl == undefined) {var styleTbl = 'width:160px; border:solid 1px #666666; border-collapse:collapse;';}  //カレンダー
if (styleDiv == undefined) {var styleDiv = 'float:left; padding:4px;';}  //枠
if (arrWeek  == undefined) {var arrWeek  = new Array('日', '月', '火', '水', '木', '金', '土');}  //曜日名
if (formTtl  == undefined) {var formTtl  = '%Y年%m月';}  //年月フォーマット
if (idCal    == undefined) {var idCal    = 'calendar';}  //カレンダーを表示する位置(ID名)

/***************************************************************
    CAPTION  : 営業カレンダー表示関数
    FUNCTION : calendar
    IN       : curDate=表示開始年月(年/月)(空の時:今月)
    OUT      : なし
    RETURN   : なし
    EXPLAIN  : 休業日を表す営業カレンダーを表示します。
***************************************************************/
function calendar()
{
    //カレンダー数の調整
    if (numCal < 1)  {numCal = 1;}
    if (numCal > 36) {numCal = 36;}

    //休日の設定
    var arrHol = new Array();
    if (holidays) {
        var arrTemp = new Array();
        arrTemp = holidays.split(',');
        for (i = 0; i < arrTemp.length; i++) {
            ret = arrTemp[i].match(/^\s*(-?)\s*(\d{1,2})\s*\/\s*(\d{1,2})\s*$/g);
            if (ret) {
                key = eval(RegExp.$2) + '/' + eval(RegExp.$3);
                arrHol[key] = (RegExp.$1 == '-')? 2: 1;
            }
        }
    }

    //カレンダーの作成
    var strHTML = '';
    for (var mm = 0; mm < numCal; mm++) {

        //初期設定
        var arrMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); //月テーブル定義
        var myDate = new Date();              //今日の日付を取得
        var curToday = myDate.getDate();      //今日を取得
        var curMonth = myDate.getMonth();     //今月を取得(0～11)
        var curYear  = myDate.getFullYear();  //今年を取得
        myDate.setDate(1);                    //日付を１日に変更
        myDate.setMonth(myDate.getMonth() + offset + mm);  //表示月の設定
        var myYear = myDate.getFullYear();    //西暦年を取得
        if (myYear < 1900) {myYear += 1900;}  //西暦の調整
        if (((myYear % 4) == 0 && (myYear % 100) != 0) || (myYear % 400) == 0) {arrMonth[1] = 29;}  //うるう年の調整
        var myMonth = myDate.getMonth();      //月を取得(0～11)
        var myWeek = myDate.getDay();         //１日の曜日を取得
        var myLine = Math.ceil((myWeek + arrMonth[myMonth]) / 7);  //カレンダーの行数
        var arrCal = new Array(myLine * 7);   //表のセル数分定義

        //カレンダーの計算
        for (var i = 0; i < myLine * 7; i++) {arrCal[i] = '　';}  //カレンダーの初期化
        for (var i = 0; i < arrMonth[myMonth]; i++) {arrCal[i + myWeek] = i + 1;}  //日付の設定

        //カレンダーヘッダの表示
        strHTML += '<div style="' + styleDiv + '">';
        strHTML += '<table cellspacing="0" cellspacing="0" style="' + styleTbl + '">';
        strHTML += '<tr><td title="前月" style="text-align:center; cursor:pointer; ' + styleBtn + '" onclick="chgMonth(-1);">&lt;</td>';
        strHTML += '<td colspan="5" style="text-align:center; ' + styleTtl + '">';
        strHTML += formTtl.replace('%Y', myYear).replace('%m', myMonth + 1) + '</td>';
        strHTML += '<td title="翌月" style="text-align:center; cursor:pointer; ' + styleBtn + '" onclick="chgMonth(1);">&gt;</td></tr>';

        //カレンダー見出しの表示
        strHTML += '<tr>';
        for (var i = 0; i < 7; i++) {
            strHTML += '<td style="text-align:center; ' + styleCap;
            if (i == 0)      {strHTML += styleSun;}  //日曜スタイルの設定
            else if (i == 6) {strHTML += styleSat;}  //土曜スタイルの設定
            else             {strHTML += styleWee;}  //平日スタイルの設定
            strHTML += '">' + arrWeek[i] + '</td>';
        }
        strHTML += '</tr>';

        //カレンダー日付の表示
        for (var i = 0; i < myLine; i++) {
            strHTML += '<tr>';
            for (var j = 0; j < 7; j++) {
                var myDay = arrCal[(i * 7) + j];
                var myNum = parseInt((myDay - 1) / 7);
                var myStrDate = myYear + '/' + (myMonth + 1) + '/' + myDay;
                var strHolName = ktHolidayName(myStrDate);
                if (strHolName) {
                    var strTitleTag = ' title="' + strHolName + '"';
                } else {var strTitleTag = '';}
                strHTML += '<td' + strTitleTag + ' style="text-align:center; ' + styleDay + ' ';
                if (myDay != '　') {
                    var myStrMD = (myMonth + 1) + '/' + myDay;
                    if (arrHol[myStrMD] == 1)      {strHTML += styleHol;}  //休業日スタイルの設定
                    else if (arrHol[myStrMD] == 2) {strHTML += styleOpn;}  //営業日スタイルの設定
                    else if (strHolName && flgHol) {strHTML += styleHol;}  //祝日スタイルの設定
                    else if (arrReg[j][myNum])     {strHTML += styleHol;}  //定休日スタイルの設定
                    else                           {strHTML += styleOpn;}  //通常日スタイルの設定
                } else                             {strHTML += styleInv;}  //無効日スタイルの設定
                strHTML += '"><a href="' + linkurl + '?date=' + myYear
                        + ('0' + (myMonth + 1)).slice(-2) + ('0' + myDay).slice(-2) + '"><span style="';  //Correct on 2008.11.08 by yap
                if (strHolName)  {strHTML += styleFes;}  //祝日スタイルの設定
                else if (j == 0) {strHTML += styleSun;}  //日曜スタイルの設定
                else if (j == 6) {strHTML += styleSat;}  //土曜スタイルの設定
                else             {strHTML += styleWee;}  //平日スタイルの設定
                if (myYear == curYear && myMonth == curMonth && myDay == curToday)
                    {strHTML += styleCur;}  //今日スタイルの設定
                strHTML += '">' + myDay + '</span></a></td>';
            }
            strHTML += '</tr>';
        }
        strHTML += '</table></div>';
        if ((mm + 1) % numCol == 0) {strHTML += '<br style="clear:both;" />';}
    }
    if (mm % numCol != 0) {strHTML += '<br style="clear:both;" />';}

    //HTMLの書き換え
    document.getElementById(idCal).innerHTML = strHTML;
}

/***************************************************************
    CAPTION  : カレンダー年月変更関数
    FUNCTION : chgMonth
    IN       : num=今月と表示開始年月との差(空の時:今月)
    OUT      : なし
    RETURN   : なし
    EXPLAIN  : 過去または未来の営業カレンダーを表示します。
***************************************************************/
function chgMonth(num)
{
    offset += num;
    calendar();
}
