/*
									COPYRIGHT FLUIDSOFTWARE 2006
									
										 AUTHOR: Dominic Birch 
*/

function fs_jsCalendar(name,dayselecthandler,startdate)
{
document.writeln("<div style='display: inline;' id='"+name+"' name='"+name+"'></div>");

this.calendarElement=document.getElementById(name);
this.create=function()
											{
                      //FORMAT THE CALENDAR HTML
                      var table=document.createElement("table");
                      table.className="fs_jsCalendar";
                      table.style.margin='0 auto';
                      
                      var tbody=document.createElement("tbody");
                      
											//CREATE HEADER ROW
                      {
                      var trow=document.createElement("tr");
                      trow.className="fs_jsCalTitle";
                      
											//CREATE PREV MONTH ARROW
                      var larrow=document.createElement("td");
											larrow.calendar=this;
                      larrow.className="fs_jsCalTitle";
                      larrow.onmouseover=function() {this.className='fs_jsCalTitleHL';}
                      larrow.onmouseout=function() {this.className='fs_jsCalTitle';}
                      larrow.onclick=function() {
																								var date=new Date(this.calendar.selectedDate);
                                                date.setMonth(date.getMonth()-1);
																								this.calendar.display(date);
																								}
																								
                      larrow.appendChild(document.createTextNode("<"));

											//CREATE MONTH AND YEAR DISPLAY
                      var monthyear=document.createElement("td");
                      monthyear.className="fs_jsCalTitle";
                      monthyear.colSpan=5;
                      monthyear.appendChild(document.createTextNode(""));
                      this.monthYear=monthyear;

											//CREATE NEXT MONTH ARROW
                      var rarrow=document.createElement("td");
                      rarrow.calendar=this;
                      rarrow.className="fs_jsCalTitle";
                      rarrow.onmouseover=function() {this.className='fs_jsCalTitleHL';}
                      rarrow.onmouseout=function() {this.className='fs_jsCalTitle';}
                      rarrow.onclick=function() {
                                                var date=new Date(this.calendar.selectedDate);
                                                date.setMonth(date.getMonth()+1);
																								this.calendar.display(date);
                                                }
																								
                      rarrow.appendChild(document.createTextNode(">"));
                      
                      trow.appendChild(larrow);
                      trow.appendChild(monthyear);
                      trow.appendChild(rarrow);
                      
                      tbody.appendChild(trow);
                      }
                      
											//CREATE DAY HEADER ROW											
                      {
                      var row=document.createElement("tr");
                      trow.className="fs_jsCalDayHdr";
                      
                      for (var i=0; i<7; i++)
                        {
                      	var day=document.createElement("td");
                      	day.className="fs_jsCalDayHdr";
                      	
                      	var letter;
                      	
                      	switch (i)
                      	  {
                      		case 0: letter="M"; break;
                      		case 1: letter="T"; break;
                      		case 2: letter="W"; break;
                      		case 3: letter="T"; break;
                      		case 4: letter="F"; break;
                      		case 5: letter="S"; break;
                      		case 6: letter="S"; break;
                      		};
                      		
                      	day.appendChild(document.createTextNode(letter));
                      	row.appendChild(day);
                      	}
                      	
                      tbody.appendChild(row);
                      }
                                    
											this.week=new Array();
											        
                      //CREATE CELLS FOR EACH DAY
											for (var r=0; r<6; r++)
											  {
												row=document.createElement("tr");
                      	row.className="fs_jsCalDay";
                        
												this.week[r]=new Object();
												this.week[r].day=new Array();
												
												for (var d=0;d<7;d++)
												  {
                        	var day=document.createElement("td");
                          day.calendar=this;
                          day.onmouseover=function () {this.className="fs_jsCalDayHL";}
                        	day.onmouseout=function () {this.className=this.normalClass;}
                        	day.onclick=function () {this.calendar.daySelected(this);}
  
                        	day.appendChild(document.createTextNode(''));
  
                        	row.appendChild(day);
													this.week[r].day[d]=day;
                        	}
													
												tbody.appendChild(row);
												}
                      
                      table.appendChild(tbody);
											
											this.calendarElement.appendChild(table);
                      }

this.display=function(cdate)
											{
                      this.selectedDate=new Date(cdate);
                      //VARIABLES USED TO DISPLAY THE CALENDAR	
                      var date = new Date(cdate);
                      var month = date.getMonth();
                      
                      //GO TO START OF MONTH 
                      date.setDate(1);
                      
                      //RETRIEVE PREVIOUS MONTH FOR PREV MONTH BUTTON
                      this.monthYear.replaceChild(document.createTextNode(getMonthStr(date.getMonth())+" "+date.getFullYear()),this.monthYear.childNodes[0]);
											
                      var prevMonth=new Date(date);
                      prevMonth.setDate(0);
                      prevMonth.setDate(1);
                      
                      //RETRIEVE NEXT MONTH FOR NEXT MONTH BUTTON
                      var nextMonth=new Date(date);
                      nextMonth.setMonth(date.getMonth()+1);
                      
                      //GET THE STARTING DAY INDEX (0=SUN...6=SAT)
                      var si=(6+date.getDay())%7;
                                            
                      //FORMAT DATES INTO CELLS
                      
											date.setDate(date.getDate()-si);
                                            
                      for (var row=0; row<6; row++)
											  for (var col=0; col<7; col++)
                        	{
                        	var day=this.week[row].day[col];
  												day.date=new Date(date);
													
													if (date.getMonth()==month)
													  {
														if (date.getDate()==this.selectedDate.getDate())
														  {
															day.className="fs_jsCalDaySel";
															this.selectedDay=day;
															}
														else
														  day.className="fs_jsCalDay";	
														}
													else
                        	  day.className="fs_jsCalDay_out";
														
  												day.normalClass=day.className;
  																						 
                        	day.replaceChild(document.createTextNode(date.getDate()),day.childNodes[0]);
                        	                      	
                        	date.setDate(date.getDate()+1);
                        	}                      
											}

this.daySelected=function(day)
											{
                      this.selectedDay.className='fs_jsCalDay';
											this.selectedDay.normalClass='fs_jsCalDay';
											
                      day.className='fs_jsCalDaySel';
                      day.normalClass='fs_jsCalDaySel';
											
											if (day.date.getMonth()!=this.selectedDay.date.getMonth())
											  this.display(day.date);
											else
											  {
                        this.selectedDay=day;
                        this.selectedDate=new Date(day.date);
												}
                      
                      if (this.onDaySelect)
                        this.onDaySelect(this);
											}
											
this.onDaySelect=dayselecthandler;

this.create();
this.display(startdate);

return this;
}

function getMonthStr(monthindex)
{
switch (monthindex)
  {
	case 0: return "Jan";
	case 1: return "Feb";
	case 2: return "Mar";
	case 3: return "Apr";
	case 4: return "May";
	case 5: return "Jun";
	case 6: return "Jul";
	case 7: return "Aug";
	case 8: return "Sep";
	case 9: return "Oct";
	case 10: return "Nov";
	case 11: return "Dec";
	}

return "Unknown";
}

