function Calendar()
{this.id="DefaultCalendarId";this.XSLPath="defaultCalendar.xsl";this.setTitles=this.setDefaultAbbreviations;this.DataXSLPath=null;this.xml;this.html;this.date;this.destinationObj;this.HTMLElement;this.monthAbbreviations;this.weekdayAbbreviations;this.getCalendar=function()
{var TODAYS_DATE=new Date();if(!window._calCount)window._calCount=0;window._calCount++;this.setTitles();this.makeCalendarXML(TODAYS_DATE);this.transformCalendarXML();eval("window._"+this.id+" = this");return this.HTMLElement;}
this.setDefaultAbbreviations=function(){this.monthAbbreviations=new Array("Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre");this.weekdayAbbreviations=new Array("Do","Lu","Ma","Me","Gi","Ve","Sa");}
this.setLongNames=function(){this.monthAbbreviations=new Array("Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre");this.weekdayAbbreviations=new Array("Do","Lu","Ma","Me","Gi","Ve","Sa");}
this.transformCalendarXML=function(){objXML=CreateXMLFromString(this.xml);objXSL=GetXMLViaHTTP(this.XSLPath);this.HTMLElement=TransformNodeToHTMLObject(objXML,objXSL);}
this.makeAndReplaceCalendar=function(){this.makeCalendarXML(this.date);this.transformCalendarXML();this.replaceCalendar();}
this.replaceCalendar=function(){thisObj=document.getElementById(this.id);thisObj.parentNode.replaceChild(this.HTMLElement,thisObj);}
this.changeDateToNextMonth=function(){thisMonth=this.date.getMonth();thisYear=this.date.getFullYear();nextMonth=(thisMonth==11?0:thisMonth+1);nextMonthsYear=(nextMonth==0?thisYear+1:thisYear);this.date=new Date(nextMonthsYear,nextMonth,1);}
this.changeDateToPreviousMonth=function(){thisMonth=this.date.getMonth();thisYear=this.date.getFullYear();previousMonth=(thisMonth==0?11:thisMonth-1);previousMonthsYear=(previousMonth==11?thisYear-1:thisYear);this.date=new Date(previousMonthsYear,previousMonth,1);}
this.forwardOneMonth=function(){this.changeDateToNextMonth();this.makeAndReplaceCalendar();try{document.getElementById(this.id+"_thisdate").style.display="block";}catch(e){}}
this.backOneMonth=function(){this.changeDateToPreviousMonth();this.makeAndReplaceCalendar();try{document.getElementById(this.id+"_thisdate").style.display="block";}catch(e){}}
this.toTodaysDate=function(){this.date=new Date();this.makeAndReplaceCalendar();}
this.makeCalendarXML=makeCalendarXML;}
function makeCalendarXML(date){this.date=date;var now=this.date;var todaysdate=new Date();var month=now.getMonth();var year=now.getFullYear();var daysinmonth=new Array(31,28,31,30,31,30,31,31,30,31,30,31);if(((year%4==0)&&(year%100!=0))||(year%400==0)){daysinmonth[2]=29;}
var StartDay;var currDate=new Date(year,month,1);var prevDate=new Date(year,month-1,1);var thisMonthStartsOnWeekDay=currDate.getDay();if(thisMonthStartsOnWeekDay>0){StartDay=daysinmonth[prevDate.getMonth()]-(thisMonthStartsOnWeekDay-1);}
var xml="";xml+="<weekdays>\n";for(var i=0;i<this.weekdayAbbreviations.length;i++){xml+="<day abbr=\"";xml+=this.weekdayAbbreviations[i];xml+="\" />\n";}
xml+="</weekdays>\n";c=0;var grid=new Array();for(var i=StartDay;i<=daysinmonth[prevDate.getMonth()];i++){grid[c]=new Array(i,"outOfMonth");c++;}
for(var i=1;i<=daysinmonth[now.getMonth()];i++){var dayType="";if(i==todaysdate.getDate()&&month==todaysdate.getMonth()&&year==todaysdate.getFullYear())dayType="today";grid[c]=new Array(i,dayType);c++;}
var daysLeft=42-grid.length;for(var i=1;i<=daysLeft;i++){grid[c]=new Array(i,"outOfMonth");c++;}
for(var i=0;i<grid.length;i++){var date=grid[i][0];var type=grid[i][1];var IsWeekStart=(i%7==0);var IsWeekEnd=((i+1)%7==0);if(IsWeekStart){if(type!="outOfMonth")type="weekendStart";xml+="<week>\n";}
if(IsWeekEnd){if(type!="outOfMonth")type="weekendEnd";}
xml+="<date";if(type.length>0)xml+=" type=\""+type+"\"";xml+=" month=\""+month+"\" ";xml+=" year=\""+year+"\" ";xml+=" day=\""+date+"\" />\n";if(IsWeekEnd){xml+="</week>\n";}}
xml="<calendar"+" name=\""+this.monthAbbreviations[month]+" "+year+"\">\n"
+xml+"</calendar>\n";if(this.DataXSLPath!=null){try{var objXML=CreateXMLFromString(xml);var objXSL=GetXMLViaHTTP(this.DataXSLPath);var doc=TransformNodeToDocumentObject(objXML,objXSL);xml=doc.xml;}catch(e){alert("Couldn't find Data XSL at "+this.DataXSLPath);}}
this.xml=xml;}
function FormCalendar()
{this.id="FormCalendar";this.XSLPath="js/FormCalendar.xsl";this.setTitles=this.setDefaultAbbreviations;}
FormCalendar.prototype=new Calendar();
window.onload=function()
{var cal=new FormCalendar().getCalendar();document.getElementById("cal").appendChild(cal);}
