//#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
//
//   Subject:	Onware Calendar Javascript
//
//   Purpose:	Object Oriented Javascript Calendar
//
//   Author:    Ian Moon
//
//   Copyright:	Copyright (C) Onware Software Corporation 2002-2004
//
//#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
//
//   CVS Info:
//       $Author: moon $
//       $Date: 2004/07/28 23:14:46 $
//       $Locker:  $
//       $Revision: 1.5 $
//
//#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#

function Calendar(id, selected)
{
    this.id = id;

    this.today = new Date();
    this.selected = selected;
    this.show = selected 
        ? new Date( this.selected.toString() ) 
        : new Date(this.today.toString());

    this.Init = _initCalendar;
    this.SetSelected = _setselectedCalendar;
    this.ISO8601 = _iso8601Calendar;
    this.NextMonth = _nextmonthCalendar;
    this.PrevMonth = _prevmonthCalendar;
    
    this.AsHtml = _ashtmlCalendar;
    this.Paint = _paintCalendar;
}

function _initCalendar()
{
    document.write('<span id="' + this.id + '"/></span>');
    this.Paint();
}

function _setselectedCalendar(date)
{
    this.selected = date;
    this.Paint();
}

function _iso8601Calendar()
{
    var iso = "";
    iso += this.selected.getFullYear();
    iso += "-";
    
    var month = this.selected.getMonth()+ 1; 
    if(month < 10){ iso += '0'; }
    iso += month;
    iso += "-";
    if(this.selected.getDate() < 10){iso += '0';}
    iso += this.selected.getDate();
    
    return iso;
}


function _prevmonthCalendar()
{
    this.show.setMonth( this.show.getMonth() - 1);
    this.Paint();
}

function _nextmonthCalendar()
{
    this.show.setMonth( this.show.getMonth() + 1);
    this.Paint();
}

function _ashtmlCalendar()
{
    var day_of_week = new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
    var month_of_year = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
    
    var iDate = new Date( this.show.toString() );
    iDate.setDate(1);
    
    var DAYS_OF_WEEK = 7;
    var DAYS_OF_MONTH = 31;
    var cal = '';

    cal += '<table width="100%" height="100%"><tr><td align="center" valign="top">';
    cal +=  '<table id="calendar">';
    cal += '<tr>';
    cal += '<td colspan="7">';
    cal += '<table width="100%" id="header">';
    cal += '<tr>';
    cal += '<td style="text-align: left"><a href="javascript:'+this.id+'_PrevMonth();" class="nav">&lt;&lt;</a></td>';
    cal += '<td colspan="5" style="text-align:center; font-weight: bold;">';
    cal += month_of_year[iDate.getMonth()]  + '   ' + iDate.getFullYear();
    cal += '</td>';
    cal += '<td style="text-align:right"><a href="javascript:'+this.id+'_NextMonth()" class="nav">&gt;&gt;</a></td>';
    cal += '</tr>';
    
    cal += '</table>';
    cal += '</td>';
    cal += '</tr>';

    // Header: Mon, Tues, Wed...
    for(index=0; index < DAYS_OF_WEEK; index++) {
        cal += '<td>' + day_of_week[index] + '</td>';
    }

    cal += '</td></tr>';
    cal += '<tr>';

    // fill blank days until the 1st
    for(index=0; index < iDate.getDay(); index++)
    {
        cal += '<td></td>';
    }
    
    // For every day in the month!
    var month = iDate.getMonth(); 
    while( month == iDate.getMonth() )
    {
        // Sunday => open row
        if( iDate.getDay() == 0)
        {
            cal += '<tr>';
        }
        
        //Create the day entry
        //
        
        // Set the day style class
        if( (this.selected) && 
            (iDate.getFullYear() == this.selected.getFullYear()) && 
            (iDate.getMonth() == this.selected.getMonth()) && 
            (iDate.getDate() == this.selected.getDate()) )
        {
            cal += '<td class="selected">';
        }
        else if( 
            (iDate.getFullYear() == this.today.getFullYear()) && 
            (iDate.getMonth() == this.today.getMonth()) && 
            (iDate.getDate() == this.today.getDate()) )
        {
            cal += '<td class="today">';
        }
        else
        {
            cal += '<td class="date">';
        }
        
        // Populate the cell
        //var celldata = "<a href=\"javascript:alert(" + iDate.toString() + ");\">" + iDate.getDate() + "</a>";	      
        var celldata = iDate.getDate();

        celldata = '';
        celldata += '<a href=';
        celldata += '"javascript:';
        celldata += this.id+'_OnClickDay('+ "new Date('"+ iDate.toString() +"')"  +')';
        celldata += '">';
        celldata += iDate.getDate();
        celldata += "</a>";
        
        cal += iDate.getDay() == 0 
            ? '<span class="sunday">' + celldata + '</span></td>'
            : celldata;
        
        cal += '</td>';
  
        
        // Saturday => close row 
        if( iDate.getDay() == 6)
        {
            cal += '</tr>';
        }
        
        iDate.setDate( iDate.getDate() + 1 );
    }

    cal += '</td></tr></table>';
    return cal;
}

function _paintCalendar()
{
    var calspan = document.getElementById(this.id);
    calspan.innerHTML = this.AsHtml();
}

function ISO8601toDate(iso)
{
// This is the full regular expression... currently ignoring seconds and timezone
//    var pattern = /^(\d{1,4})[-. ]?((\d{1,2})[-. ]?((\d{1,2}) ([T -.]?(\d{1,2})[-.: ]?((\d{1,2})[-.: ]?(\d{1,2})?)?  \s*(Z|([-+])(\d{1,2})[-.: ]?(\d{2})?)?)?)?)?$/;
    var pattern = /^(\d{1,4})[-. ]?((\d{1,2})[-. ]?((\d{1,2}) ([T -.]?(\d{1,2})[-.: ]?((\d{1,2})[-.: ]?(\d{1,2})?)?)?)?)/;
    var result = iso.match(pattern);

    if( !result )
    {
        throw new Error('ISO8601toDate: argument not ISO8601 compatible.');
    }    

    var YYYY = result[1];
    var MM = result[3] || 1;
    var DD = result[5] || 1;
    var hh = result[7] || 0;
    var mm = result[9] || 0;
    var ss = result[10] || 0;

    var date = new Date();
    date.setFullYear(YYYY);
    date.setMonth(MM - 1);
    date.setDate(DD);
    date.setHours(hh);
    date.setMinutes(mm);
    date.setSeconds(ss);

    return date.toString();
}

