 /***************************************************************************
 * cal.js
 *  Functions to highlight entries in calendars
 *
 *  The required <body onLoad="..."> call is 'markToday();'
 *
 *  Simon Hunt
 *  May 2007
 ***************************************************************************/

var monthNames = [
        "January", "February", "March", "April", "May", "June",
        "July", "August", "September", "October", "November", "December"
        ];

function buildMiniCalendar() {
    var spacer = '<div class="MiniCalSpacer"></div>\n';
    var html = '';

    for (var m=0; m<pinpointData.length; m++) {
        if (m > 0) html += spacer;

        var perfHash = matchPerfDates(pinpointData[m].year,
                                      pinpointData[m].month,
                                      perfDates); // perfDates in show HTML

        var mName = monthNames[pinpointData[m].month - 1];
    	var tm = pinpointData[m].month;
    	if( tm < 10 ) {
    	    tm = '0' + tm;
    	}
    	var mHref = '/cal/' + pinpointData[m].year + '-' + tm + '.html';

        // start the table
        html += '<table id="M'+m+'_tbl" class="DP_monthtable" ' +
                    'cols="7" cellspacing="0" cellpadding="3" ' +
                    'style="-moz-user-select: none; cursor: default;">\n';
        html += '<tbody>\n';

        // month name (and link to master calendar)
        html += '<tr id="M'+m+'_header" class="DP_heading">\n';
        html += '<td id="M'+m+'_title" class="DP_title" ' +
                'unselectable="on" colspan="7">\n';
        html += '<a href="' + mHref + '">' + mName + ' ' + pinpointData[m].year + '</a>\n';
        html += '</td>\n';
        html += '</tr>\n\n';

        // day of week headers
        html += '<tr id="M'+m+'_dow" class="DP_days">\n';
        html += '<td id="M'+m+'_day_0" class="DP_dayh" unselectable="on">S</td>\n';
        html += '<td id="M'+m+'_day_1" class="DP_dayh" unselectable="on">M</td>\n';
        html += '<td id="M'+m+'_day_2" class="DP_dayh" unselectable="on">T</td>\n';
        html += '<td id="M'+m+'_day_3" class="DP_dayh" unselectable="on">W</td>\n';
        html += '<td id="M'+m+'_day_4" class="DP_dayh" unselectable="on">T</td>\n';
        html += '<td id="M'+m+'_day_5" class="DP_dayh" unselectable="on">F</td>\n';
        html += '<td id="M'+m+'_day_6" class="DP_dayh" unselectable="on">S</td>\n';
        html += '</tr>\n\n';

// ------------------------------------------------------------------------
        // now one line for each week
        // ...
        var noDate = " ";
        var weekNum = 1;
        var offCount = pinpointData[m].offset;
        var done = 0;
        var date = 0;

        while (!done) {
            var weekId = 'M'+m+'_week_'+weekNum;
            var dayIdPrefix = 'M'+m+'_day_'+weekNum+'_';
            var wHtml = '<tr id="'+weekId+'">\n';

            for (var d=0; d<7; d++) {
                var clsStr = (d==0||d==6) ? "DP_weekend" : "DP_weekday";
                if (offCount>0||date>=pinpointData[m].days) clsStr+="_offmonth";

                if (d==0) clsStr += " DP_day_left";
                if (d==6) clsStr += " DP_day_right";
                if (weekNum==1) clsStr += " DP_day_top";

                var dateStr = noDate;

                // so, what is the date?
                if (offCount > 0) {
                    offCount--;
                } else {
                    date++;
                    if (date>pinpointData[m].days) {
                        dateStr = noDate;
                    } else {
                        dateStr = ""+date;
                    } // if
                } // if

                if (offCount==0 && perfHash['p'+date]) clsStr += " DP_event";

                wHtml += '<td id="' + dayIdPrefix + d + '" class="' + clsStr +
                         '" unselectable="on">' + dateStr + '</td>\n';

                if (date >= pinpointData[m].days) done = 1; // finished


            } // for each day

            wHtml += '</tr>\n';

            // copy the week row to the main assemblage
            html += wHtml;

            weekNum++;
        } // while not done



// ------------------------------------------------------------------------
        // finally, finish off the table
        html += '</tbody>\n';
        html += '</table> <!-- M'+m+'_tbl -->\n';

    } // for

    // insert the HTML into the correct spot...
    var mcdiv = document.getElementById("MiniCal");
    if (mcdiv) {
        mcdiv.innerHTML = html;
    } else {
        alert("failed to find MiniCal div");
    } // if found div


} // buildMiniCalendar

/*
        var perfDates = [
              { y: 2007, m: 4, d: 28, time: "14:00" },
              { y: 2007, m: 5, d: 5, time: "14:00" },
              { y: 2007, m: 5, d: 12, time: "14:00" },
              { y: 2007, m: 5, d: 19, time: "14:00" },
              { y: 2007, m: 5, d: 26, time: "14:00" },
              { y: 2007, m: 6, d: 2, time: "14:00" },
              { y: 2007, m: 6, d: 9, time: "14:00" }
            ];
*/


function matchPerfDates(year, month, perfs) {
    var myhash = { };
    for (var i=0; i<perfs.length; i++) {
        if (perfs[i].y == year && perfs[i].m == month) {
            myhash['p'+perfs[i].d] = 1;
        } // if right month
    } // for each performance date
    return myhash;
} // matchPerfDates



function markToday() {
    var today = new Date();
    var year = today.getFullYear();
    var month = today.getMonth()+1;
    var data = null;
    for (var m=0; m<pinpointData.length; m++) {
        if (pinpointData[m].year == year &&
            pinpointData[m].month == month) {
                data = pinpointData[m];
                break;
        } // if match found
    } // for

    if (data) {
        var x = today.getDate() + data.offset - 1;
        var wk = Math.ceil((x+1) / 7);
        var dy = x % 7;
        var id = data.id + "_day_" + wk + "_" + dy;
        //alert("ID: " + id);
        var cell = document.getElementById(id);
        if (cell) {
            if (data.id == "Cal") {
                // it's the main calendar
                var what = "";
                for (var i=0; i<cell.childNodes.length; i++) {
                    var node = cell.childNodes[i];
                    if (node.nodeType == 1 && node.tagName == "DIV") {
                        node.className += "_today";
                    } // if
                } // for
            } else {
                // it's a date-picker calendar
                var todayClass = (cell.className.indexOf("DP_event")>0) ?
                        "DP_todayEvent" : "DP_today";
                cell.className += " " +todayClass;
            } // if
        } // located cell
    } // if data

} // markToday


function getCalendarMonthURL()
{
    var today = new Date();
    var year = today.getFullYear();
    var month = today.getMonth()+1;
    if (month < 10) month = "0" + month;
    var url = "/cal/" + year + "-" + month + ".html";
    return url;
}
