/*
 *  Cal.monthCal( [month , year] )
 *  Cal.yearCal( [year] )
 *  Cal.setMonth( [month [, year] )
 *  Cal.setYear( [year] )
 *
 *    month = 0...11 | 'today' | 'next' | 'prev' | 'now' 
 *    year  = number | 'today' | 'next' | 'prev' | 'now' 
 */

function Calendar(name,year,month) {
    this.Month = Today.getMonth();
    this.Year = Today.Year;    
    this.ThisDate = 0;
    this.weekHeadYear = new Array("Su","Mo","Tu","We","Th","Fr","Sa"),
    this.weekHeadMonth = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
    this.monthNames = new Array("January","February","March","April","May","June","July", 
                                "August","September","Oktober","November","December");
    this.firstDay = 0;
    this.weekColor = "black";
    this.weekendColor = "red";
    this.bgColor = "";
    this.borderMonth = 2;
    this.spacingMonth = 1;
    this.paddingMonth = 2;
    this.borderYear = 3;
    this.spacingYear = 2;
    this.paddingYear = 7;
    this.cellWidth = 0;
    this.fontFamily = "times,adobe";
    this.fontSize = 3;
    this.fontWeight = "plain";
    this.todayFontColor = "";
    this.todayFontSize = 3;
    this.todayFontWeight = "strong";
    this.headFontColor = "black";
    this.headFontSize = 3;
    this.headFontWeight = "strong";
	this.links = new Array("5","http://www.yahoo.com");

    this.monthLen = Calendar.monthLen;
    this.monthName = Calendar.monthName;
    this.setMonthNames = Calendar.setMonthNames;
    this.setYearWeek = Calendar.setYearWeek;
    this.setMonthWeek = Calendar.setMonthWeek;
    this.monthCal = Calendar.monthCal;
    this.setMonth = Calendar.setMonth;
    this.setYear = Calendar.setYear;
    this.yearCal = Calendar.yearCal;
    this.setLinks = Calendar.setLinks;
	
    if (!window.calendars)  window.calendars = new Array();
    this.name = name  || "Calendar"+ window.calendars.length;
    window.calendars[this.name] = this;
    window.calendars[window.calendars.length] = this;
    
    this.setMonth(month,year);
}

Calendar.monthLen = function() {
    var len = ((this.Month % 7) % 2 == 1)?  30 : 31;
    if (this.Month == 1)  len = (this.Year % 4 == 0)?  29 : 28;
    return len;
}

Calendar.monthName = function() {
    return this.monthNames[this.Month];
}

Calendar.setLinks = function() {
    var args = Calendar.setLinks.arguments;
    for (var i = 0; i<args.length; i++) 
      this.links[i] = args[i];
}

Calendar.setMonthNames = function() {
    var args = Calendar.setMonthNames.arguments;
    for (var i = 0; i<args.length; i++) 
      this.monthNames[i] = args[i];
}

Calendar.setYearWeek = function(su,mo,tu,we,th,fr,sa) {
    var args = Calendar.setYearWeek.arguments;
    for (var i = 0; i<args.length; i++) 
      this.weekHeadYear[i] = args[i];
}

Calendar.setMonthWeek = function(su,mo,tu,we,th,fr,sa) {
    var args = Calendar.setMonthWeek.arguments;
    for (var i = 0; i<args.length; i++) 
      this.weekHeadMonth[i] = args[i];      
}

Calendar.setMonth = function(month, year) {
    if (month) { 
      if (typeof(month) == 'number' && (month >= 0 && month < 12)) 
          this.Month = month;
      else if (month == 'today') {
          this.Year = Today.Year;
          this.Month = Today.getMonth();
      }
      else if (month == 'prev') {
          if (--this.Month == -1) {
              this.Month = 11;
              --this.Year;
          }
      }
      else if (month == 'next') {
          if (++this.Month == 12) {
              this.Month = 0;
              ++this.Year;
          }
      }
      else if (month != 'now') 
          alert('Unknown month: '+ month);
    }
    if (typeof(year) != 'undefined')  this.setYear(year);
    this.ThisDate = (this.Month == Today.getMonth() && this.Year == Today.Year)?  Today.getDate() : 0;
}

Calendar.setYear = function(year) {
    if (typeof(year) != 'undefined') {
      if (typeof(year) == 'number') {
          this.Year = (year < 100 && year >= 0)?  year + 1900 : year;
      }
      else if (year == 'today')
          this.Year = Today.Year;
      else if (year == 'prev')
          --this.Year;
      else if (year == 'next')
          ++this.Year;
      else if (year != 'now') 
          alert('Unknown year: '+ year);
    }
    this.ThisDate = 0;
}

Calendar.monthCal = function(month, year) {  
    this.setMonth(month, year);
    var first = new Date(this.Year,this.Month,1);
    var day = 0;
    var lastDate = this.monthLen();
    var color;
//    var str = '<STYLE>\nTABLE.'+this.name+' TD.week { font-family:'+this.fontFamily+';color:'+this.weekColor+';font-size:'+this.fontSize+';font-weight:'+this.fontWeight+' } \n';
//    str += 'TABLE.'+this.name+' TD.weekend { font-family:'+this.fontFamily+';color:'+this.weekendColor+';font-size:'+this.fontSize+';font-weight:'+this.fontWeight+' } \n';
//    str += 'TABLE.'+this.name+' TD.today { font-family:'+this.todayFontFamily+';color:'+this.todayFontColor+';font-size:'+this.todayFontSize+';font-weight:'+this.todayFontWeight+' } \n';
//    str += 'TABLE.'+this.name+' TD.head { font-family:'+this.fontFamily+';color:'+this.headFontColor+';font-size:'+this.fontSize+';font-weight:'+this.headFontWeight+' } \n';
//    str += 'TABLE.'+this.name+' TH { font-family:'+this.headFontFamily+';color:'+this.headFontColor+';font-size:'+this.headFontSize+';font-weight:'+this.headFontWeight+' } \n';
//    str += '</STYLE>\n';
    var str = '<TABLE cellSpacing="0" border="0" width="165" height="140" style="border-collapse: collapse" bordercolor="#111111" cellpadding="0">';
    str += '<TR bgColor="#f0f0f0"><TH COLSPAN=7 align="center" height="18"><font face="Arial, Helvetica, sans-serif" color="#006600" size="2">' + 
             this.monthName() +'  '+ this.Year +'</FONT></TH></TR>\n<TR ALIGN="center">\n';
    for (day=this.firstDay; day<this.firstDay+7; day++) 
        str += ' <TD align="center" style="background-color: #FFCC99" height="21"><b><font face="Arial, Helvetica, sans-serif" size="1">' + 
                 this.weekHeadMonth[day%7] +'</FONT></b></TD>';
    str += '\n</TR>\n<TR ALIGN="center">\n';
    day = first.getDay();
    if (day != this.firstDay)
        str += ' <TD align="center" COLSPAN='+ ((day+7-this.firstDay)%7) + ' bgcolor="#FFCC99" align="center" height="16">&nbsp;</TD>';
    for (date=1; date <= lastDate; date++) {
        if (++day == 8)  day = 1;
        if (day == this.firstDay%7+1)
            str += '\n</TR>\n<TR ALIGN="center">\n';
        str += ' <TD align="center" WIDTH='+ this.cellWidth +' bgcolor="#FFCC99" align="center" height="16">';
        color = (day==1 || day==7)?  this.weekendColor : this.weekColor;
        if (date == this.ThisDate) {
          color = this.todayFontColor || color; 
          str += fontTag(this.fontFamily, this.todayFontSize, color, this.todayFontWeight);
        }
        else {
          str += fontTag(this.fontFamily, this.fontSize, color, this.fontWeight);
        }
        for (var i = 0; i < this.links.length; i +=2)
			if (date == this.links[i])
				str += '<a href="' + this.links[i+1] + '">';
				
        str += date +'</FONT></TD>';
        
        for (var i = 0; i < this.links.length; i +=2)
			if (date == this.links[i])
				str += '</a>';
    }
    if ((this.firstDay-day)%7 != 0 ) 
        str += ' <TD COLSPAN='+ ((this.firstDay+7-day)%7) +' bgcolor="#FFCC99" align="center" height="16">&nbsp;</TD>';
    str += '\n</TR>\n</TABLE>\n';
    return str;
}
Calendar.yearCal = function (year) {
    this.setYear(year);
    var saveMonth = this.Month;
    var saveBorder = this.borderMonth;
    this.borderMonth = 0;
    var saveWeekHead = this.weekHeadMonth;
    this.weekHeadMonth = this.weekHeadYear;
    var str = '<TABLE BORDER="'+ this.borderYear +'" CELLPADDING='+ this.paddingYear +' CELLSPACING="'+ this.spacingYear +' BGCOLOR="'+ this.bgColor +'">\n' +
              '<CAPTION><H2>'+ fontTag(this.headFontFamily,'',this.headFontColor,this.headFontWeight) + this.Year +'</H2></CAPTION>\n';
    for (var row = 0; row < 4; row++) {
        str += '<TR VALIGN=TOP>\n';
        for (this.Month = 3*row; this.Month < 3*row + 3; this.Month++) 
            str += '<TD>'+ this.monthCal() +'</TD>\n';
        str += '</TR>\n';
    }
    str += '</TABLE>\n';
    this.Month = saveMonth;
    this.borderMonth = saveBorder;
    this.weekHeadMonth = saveWeekHead;
    return str;
}

function fontTag(family,size,color,weight) {
    var font = '<FONT';
    if (family) font += ' FACE="'+ family +'"';
    if (size) font += ' SIZE="'+ size +'"';
    if (color) font += ' COLOR="'+ color +'"';
    font += '>'
    if (weight && weight != "plain") font += '<'+ weight +'>';
    return font;
}

if (!Today) var Today = new Date();
if (!Today.Year) {
    Today.Year = Today.getYear();
    if (navigator.appName.indexOf("Netscape") != -1 || (Today.Year < 100 && Today.Year >= 0)) 
        Today.Year += 1900;
}
