function M2Calendar(tableid){this.tableid=tableid;this.DAYLYMILLISEC=86400000;this.dowlang=['Do','Lu','Ma','Me','Gi','Ve','Sa'];this.dowstartidx=1;this.monthlang=['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'];this.todaylabel='Oggi';this.calendarstyle='m2c';this.dowstyle='m2c_dow';this.barstyle='m2c_barstyle';this.todaystyle='m2c_today';this.selectedstyle='m2c_selected';this.festdaystyle='m2c_festday';this.outstyle='m2c_outa';this.busystyle='m2c_busy';this.hintstyle='m2c_hint';this.monthstyle='m2c_month';this.closestyle='m2c_close';this.hasclose=false;this.startclosed=false;this.onfocus=null;this.onclick=null;this.inputFormat='d/m/y';this.outputFormat='d/m/y';this.RESEPARATOR=/^\s*(.*?)\s+(.*)/;this.eventDays=[];this.festDays=['1/1/* Capodanno','6/1/* Epifania','16/4/6 Pasqua','17/4/6 Lunedi\' dell\'Angelo','25/4/* Festa della liberazione','1/5/* Festa del lavoro','2/6/* Festa delle Repubblica','15/8/* Festa dell\'Assunta (ferragosto)','1/11/* Tutti i Santi','8/12/* Immacolata','25/12/* Natale','26/12/* S.Stefano'];this.EVENT_ITEM=1;this.FEST_ITEM=2;this.selectedDate=null;this.eventDayList=[];this.dayDateMap=null;this.dayEventMap=null}M2Calendar.prototype.build=function(){this.evalEventDays();var mytab=document.createElement('table');mytab.id=this.tableid;mytab.className=this.calendarstyle;if(this.startclosed)mytab.style.display='none';mytab.m2c=this;mytab.onmouseover=function(event){this.m2c.mouseover(event,this)};mytab.onclick=function(event){this.m2c.click(event,this)};this.rebuild(new Date(),mytab);return mytab};M2Calendar.prototype.selectDate=function(sdate){if(!sdate)return sdate;var ymd=this.sdate2ymd(sdate);if(!ymd||ymd.indexOf('.')!=-1)return sdate;var vv=ymd.match(/(\d{4})(\d{2})(\d{2})/);this.selectedDate=new Date(vv[1],vv[2]-1,vv[3]);this.rebuild(this.selectedDate,document.getElementById(this.tableid));return this.getSelectedDateAsString()};M2Calendar.prototype.getSelectedDateAsString=function(){var out='';if(!this.selectedDate)return out;for(var ii=0;ii<this.outputFormat.length;ii++){switch(this.outputFormat.charAt(ii)){case'd':out+=this.selectedDate.getDate();break;case'm':out+=''+(1+this.selectedDate.getMonth());break;case'y':out+=this.selectedDate.getFullYear();break;default:out+=this.outputFormat.charAt(ii)}}return out};M2Calendar.prototype.mouseover=function(event,obj){var event=event||window.event;var target=event.target||event.srcElement;var yy=event.pageY||event.clientY+document.body.scrollTop;var xx=event.pageX||event.clientX+document.body.scrollLeft;if(this.dayEventMap[target.id]){var divhint=document.getElementById(this.tableid+'_hint');divhint.innerHTML=this.dayEventMap[target.id];var absPos=this.getAbsPosition(target);divhint.style.top=parseInt(absPos.absTop+target.offsetHeight*75/100)+'px';divhint.style.left=parseInt(absPos.absLeft+target.offsetWidth*75/100)+'px';divhint.style.display='block'}else if(target.id.indexOf(this.tableid)==0&&target.id.indexOf('_hint')<0){var divhint=document.getElementById(this.tableid+'_hint');divhint.style.display='none'}};M2Calendar.prototype.click=function(event,obj){var event=event||window.event;var target=event.target||event.srcElement;if(!target||!target.id)return;if(target.id==this.tableid+'_close'){var tableobj=document.getElementById(this.tableid);tableobj.style.display='none'}else if(target.id.match(/_\d+$/)){this.selectedDate=this.dayDateMap[target.id];this.rebuild(this.selectedDate,document.getElementById(this.tableid));if(this.onclick)this.onclick(event)}else if(this.dayDateMap[target.id])this.rebuild(this.dayDateMap[target.id],document.getElementById(this.tableid))};M2Calendar.prototype.evalEventDays=function(){var vv,ii,jj=0;for(ii=0;ii<this.eventDays.length;ii++){vv=this.eventDays[ii].match(this.RESEPARATOR);this.eventDayList[jj]=new Array(3);this.eventDayList[jj][0]=new RegExp(this.sdate2ymd(vv[1]));this.eventDayList[jj][1]=vv[2];this.eventDayList[jj][2]=this.EVENT_ITEM;jj++}for(ii=0;ii<this.festDays.length;ii++){vv=this.festDays[ii].match(this.RESEPARATOR);this.eventDayList[jj]=new Array(3);this.eventDayList[jj][0]=new RegExp(this.sdate2ymd(vv[1]));this.eventDayList[jj][1]=vv[2];this.eventDayList[jj][2]=this.FEST_ITEM;jj++}};M2Calendar.prototype.rebuild=function(daterif,mytab){while(mytab.firstChild)mytab.removeChild(mytab.firstChild);var mytbody=document.createElement('tbody');this.dayDateMap=new Object();this.dayEventMap=new Object();this.buildHeader(daterif,mytbody);this.buildMonth(daterif,mytbody);mytab.appendChild(mytbody)};M2Calendar.prototype.buildHeader=function(daterif,mytbody){var mytd,mytr;var curdate=new Date(daterif);curdate.setDate(15);mytr=document.createElement('tr');mytbody.appendChild(mytr);mytd=document.createElement('td');mytr.appendChild(mytd);mytd.colSpan=this.hasclose?6:7;mytd.className=this.monthstyle;mytd.innerHTML=''+this.monthlang[curdate.getMonth()]+' '+curdate.getFullYear()+'<div id="'+this.tableid+'_hint" class="'+this.hintstyle+'" style="position: absolute; display: none;"></div>';if(this.hasclose){mytd=document.createElement('td');mytr.appendChild(mytd);mytd.innerHTML='x';mytd.className=this.closestyle;mytd.id=this.tableid+'_close'}mytr=document.createElement('tr');mytbody.appendChild(mytr);mytd=document.createElement('td');mytr.appendChild(mytd);mytd.id=this.tableid+'_py';mytd.innerHTML='&lt;&lt;';mytd.className=this.barstyle;this.dayDateMap[mytd.id]=new Date(curdate.getTime()-this.DAYLYMILLISEC*365);mytd=document.createElement('td');mytr.appendChild(mytd);mytd.id=this.tableid+'_pm';mytd.innerHTML='&lt;';mytd.className=this.barstyle;this.dayDateMap[mytd.id]=new Date(curdate.getTime()-this.DAYLYMILLISEC*31);mytd=document.createElement('td');mytr.appendChild(mytd);mytd.colSpan=3;mytd.id=this.tableid+'_today';mytd.innerHTML=''+this.todaylabel;mytd.className=this.barstyle;this.dayDateMap[mytd.id]=new Date();mytd=document.createElement('td');mytr.appendChild(mytd);mytd.id=this.tableid+'_nm';mytd.innerHTML='&gt;';mytd.className=this.barstyle;this.dayDateMap[mytd.id]=new Date(curdate.getTime()+this.DAYLYMILLISEC*31);mytd=document.createElement('td');mytr.appendChild(mytd);mytd.id=this.tableid+'_ny';mytd.innerHTML='&gt;&gt;';mytd.className=this.barstyle;this.dayDateMap[mytd.id]=new Date(curdate.getTime()+this.DAYLYMILLISEC*365);mytr=document.createElement('tr');mytbody.appendChild(mytr);for(var ii=0;ii<7;ii++){mytd=document.createElement('td');mytr.appendChild(mytd);mytd.innerHTML=this.dowlang[(ii+this.dowstartidx)%7];mytd.className=this.dowstyle}};M2Calendar.prototype.buildMonth=function(daterif,mytbody){var mytd,mytr;var curdate=new Date(daterif);curdate.setDate(1);var curmonth=daterif.getMonth();var todayid=this.date2ymd(new Date());var selectedid=this.date2ymd(this.selectedDate);curdate.setTime(curdate.getTime()-((curdate.getDay()+7-this.dowstartidx)%7*this.DAYLYMILLISEC));for(ii=0;true;ii++){if(ii%7==0){if(ii>=42)break;mytr=document.createElement('tr');mytbody.appendChild(mytr)}var dateid=this.date2ymd(curdate);var eventdesc=null;var festday=(curdate.getDay()==0);var eventday=false;for(var jj=0;jj<this.eventDayList.length;jj++){if(dateid.match(this.eventDayList[jj][0])){if(!eventdesc)eventdesc=this.eventDayList[jj][1];else eventdesc+='<br>'+this.eventDayList[jj][1];if(!eventday&&this.eventDayList[jj][2]==this.EVENT_ITEM)eventday=true;if(!festday&&this.eventDayList[jj][2]==this.FEST_ITEM)festday=true}}mytd=document.createElement('td');mytr.appendChild(mytd);mytd.id=this.tableid+'_'+dateid;if(eventdesc)this.dayEventMap[mytd.id]=eventdesc;mytd.innerHTML=curdate.getDate();if(dateid==selectedid)mytd.className=this.selectedstyle;else if(eventday)mytd.className=this.busystyle;else if(festday)mytd.className=this.festdaystyle;else if(curdate.getMonth()!=curmonth)mytd.className=this.outstyle;if(dateid==todayid)mytd.className+=' '+this.todaystyle;this.dayDateMap[mytd.id]=new Date(curdate);curdate.setTime(curdate.getTime()+this.DAYLYMILLISEC)}};M2Calendar.prototype.date2ymd=function(adate){if(!adate)return null;var ymd=''+adate.getFullYear();ymd+=('0'+(1+adate.getMonth())).replace(/^0*(..)$/,'$1');ymd+=('0'+adate.getDate()).replace(/^0*(..)$/,'$1');return ymd};M2Calendar.prototype.sdate2ymd=function(sdate){var tok=sdate.split(/[^\d\*]/);var itok=0;var rif=new Date();var ymd=new Array(3);for(var ii=0;ii<this.inputFormat.length;ii++){ctok=tok[itok];switch(this.inputFormat.charAt(ii)){case'd':if(ctok=='*')ymd[2]='..';else if(ctok>=1&&ctok<10)ymd[2]='0'+ctok;else if(ctok>=10&&ctok<=31)ymd[2]=ctok;else ymd[2]=('0'+rif.getDate()).replace(/^0*(..)$/,'$1');itok++;break;case'm':if(ctok=='*')ymd[1]='..';else if(ctok>=1&&ctok<10)ymd[1]='0'+ctok;else if(ctok>=10&&ctok<=12)ymd[1]=ctok;else ymd[1]=('0'+(1+rif.getMonth())).replace(/^0*(..)$/,'$1');itok++;break;case'y':if(ctok=='*')ymd[0]='....';else if(ctok>=1&&ctok<10)ymd[0]='200'+ctok;else if(ctok>=10&&ctok<27)ymd[0]='20'+ctok;else if(ctok>=27&&ctok<100)ymd[0]='19'+ctok;else if(ctok>=1000&&ctok<10000)ymd[0]=ctok;else ymd[0]=rif.getFullYear();itok++;break}}return ymd.join('')};M2Calendar.prototype.getAbsPosition=function(element){var left=0,top=0;while(element){if(getComputedStyle2(element,'position')!='static'||getComputedStyle2(element,'overflow')!='visible')break;left+=parseInt(element.offsetLeft,10);top+=parseInt(element.offsetTop,10);element=element.offsetParent}return{absLeft:left,absTop:top}};function getComputedStyle2(element,jsprop){if(element.style[jsprop])return element.style[jsprop];if(element.currentStyle)return element.currentStyle[jsprop];if(document.defaultView&&document.defaultView.getComputedStyle){var cssprop=jsprop.replace(/([A-Z])/g,"-$1").toLowerCase();return document.defaultView.getComputedStyle(element,null).getPropertyValue(cssprop)}return null};
