// TSCalendarCtrl

// To DO
//
AppletTag('Batch');
this.lingua = poba_fget_userlang();
// Function
function Month2String(nMonth,nLang){ 
  try{
    //var lingua = eval(nLang+"_g_UserLang.value")
    switch (this.lingua){
      case "ITA":
        var aMonth=new
Array("Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre");
        break;
      case "ENG":
        var aMonth=new
Array("Genuary","February","March","April","May","June","July","August","September","October","November","December");
        break;
      default:
        var aMonth=new
Array("Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre");
        break;
    }
  }catch(e){
      var aMonth=new
Array("Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre");
  }
return aMonth[nMonth-1];
}

// TSCalendarCtrl
ZtVWeb.TSCalendarCtrl=function(form,name,ctrlid,x,y,w,h,font,font_size,Month){  //name--->id
AppletTag('Batch');
this.lingua = poba_fget_userlang(); 
	// Metodi
	this.FillData=function(datasource){	
		this.filling=true;
		var dFrom=new Date(0);
		var dTo=new Date(0);
		var idxFieldFrom=datasource.getFldIdx(this.field_from);
		var idxFieldTo=datasource.getFldIdx(this.field_to);
		this.aTaskDate[0]= new Array();
		this.aTaskDate[1]= new Array();
		for (var i=0; i<datasource.nRecs; i++) {
			//debug alert(i+" "+datasource.Data[i][idxFieldFrom] + " " + datasource.Data[i][idxFieldTo]);
			//debug alert(datasource.Data[i][idxFieldFrom].substr(0,4)+" "+datasource.Data[i][idxFieldFrom].substr(5,2)+" "+datasource.Data[i][idxFieldFrom].substr(8,2));
			dFrom.setFullYear(datasource.Data[i][idxFieldFrom].substr(0,4),datasource.Data[i][idxFieldFrom].substr(5,2)-1,datasource.Data[i][idxFieldFrom].substr(8,2));
			dFrom.setHours(0,0,0,0);
			dTo.setFullYear(datasource.Data[i][idxFieldTo].substr(0,4),datasource.Data[i][idxFieldTo].substr(5,2)-1,datasource.Data[i][idxFieldTo].substr(8,2));
			dTo.setHours(23,59,59,999);
			this.aTaskDate[0].push(new Date(dFrom));
			this.aTaskDate[1].push(new Date(dTo));
		}
		if (!this.updating)
		{
			this.fUpdateCal(0,this.FirstCalMonth,this.FirstCalYear,0);
		}
		this.filling=false;
	}
	
	this.UpdateCurRec=function(datasource){
		this.curRec=datasource.curRec;
		this.FillData(datasource);
        }
	
	this.isBusyDay=function(d){
		var i=0;
		var b=false;
		if (this.aTaskDate.length==2) {
			for (i=0; i<this.aTaskDate[0].length; i++) {
			       	if (this.aTaskDate[0][i] <= d && d <= this.aTaskDate[1][i]) {
					b=true;
					break;
				}
			}
		}
		return b;
	}
	
	this.setRowsCols=function(from,to){
		this.field_from=from;
		this.field_to=to;
	}
	
	this.getDaysMonth=function(iYear,iMonth){
		// Parametri opzionali
		if (typeof(iYear)=='undefined') iYear=this.Year;
		if (typeof(iMonth)=='undefined') iMonth=this.Month;
		return new Date(iYear,iMonth, 0).getDate();
	}
	
	this.getFirstDay=function(){
		var iMonth=this.FirstCalMonth;
		var iYear=this.FirstCalYear;		
		var d=  new Date(iYear, iMonth-1, 1);//Modifica per visualizzazione mensile dell'agenda       -2
		//alert(d);
		return d;
	}

	this.getLastDay=function(){
	        var iMonth=this.FirstCalMonth;
		var iYear=this.FirstCalYear;		
		/*DEVIS*/
		var d=new Date(iYear, iMonth, this.getDaysMonth(iYear,iMonth+1)); //iMonth-1
		d.setHours(23,59,59,999);
		//alert(d);
		return d;
	}

	this.getPrevDateOfDay=function(tDate,nDay){
		var nDate=tDate.getDay();
		var i=0;
		if (nDate==nDay) {
			i=0;
		}
		else {
			t = nDate-nDay+7;
			i = -(t%7);
		}
		return new Date(tDate.getTime()+(i*86400000));
	}

	this.Init=function(name,font,font_size,x,y,w,h){		
		this.setCtrlPos(this.Ctrl,x,y,w,h);		
		this.addToForm(this.form,this);
		this.fDrawCal(name,font,font_size);		
		this.fUpdateCal(this.Day,this.Month,this.Year,0);
	}
	
	this.getPrevMonday=function(tDate){
	//alert(tDate);
	msec_oggi = tDate.getTime();
	indice = tDate.getDay();
	//lunedi è 1
	lunedi = Math.abs(indice-1);
	msec_lunedi = msec_oggi - (lunedi*86400000)- (7*86400000);
	PrevMonday = new Date(msec_lunedi);
	//alert("Past Monday: "+PrevMonday );
	return PrevMonday;
	}
  
  this.getNextSunday=function(tDate){
	msec_oggi = tDate.getTime();
	indice = tDate.getDay();
	//lunedi è 1
	domenica = Math.abs(6-indice+1);
	msec_domenica = msec_oggi + ((domenica)*86400000)+ (7*86400000);
	NextSunday = new Date(msec_domenica);
	NextSunday.setHours(23,59,59,999);
	//alert("Next Sunday: "+ NextSunday);
	return NextSunday;
	}
	
this.getMonday=function(tDate){
	msec_oggi = tDate.getTime();
	indice = tDate.getDay();
	if (indice==0) indice =7;
	//lunedi è 1
	lunedi = Math.abs(indice-1);
	msec_lunedi = msec_oggi - (lunedi*86400000);//- (7*86400000);
	PrevMonday = new Date(msec_lunedi);
	//alert("Past Monday: "+PrevMonday );
	return PrevMonday;
	}
  
  this.getSunday=function(tDate){
	msec_oggi = tDate.getTime();
	indice = tDate.getDay();
	//lunedi è 1
	if (indice==0) indice =7;
	domenica = Math.abs(6-indice+1);
	msec_domenica = msec_oggi + ((domenica)*86400000);//+ (7*86400000);
	NextSunday = new Date(msec_domenica);
	NextSunday.setHours(23,59,59,999);
	//alert("Next Sunday: "+ NextSunday);
	return NextSunday;
	}
	
	this.Value=function(v){
	// Value(): ritorna Date() calendario;
	// Value(1): imposta e ritorna data corrente;
	// Value(dt): imposta e ritorna dt;
		if (typeof(v)!='undefined'){
			// --- Aggiunto per poter pilotare da fuori il calendario ----
			if(typeof(v)=='object') {
				var bKeepCal=false;
				var j;
				for(j=0; j <this.nMonth; j++)  // Controllo se la data selezionata appartiene ai mesi visualizzati
					// MB 10/3/05
					if((v.getMonth()+1)==(this.FirstCalMonth+j) && v.getFullYear()==this.FirstCalYear) {
						bKeepCal=true;
						break;
					}
				if(bKeepCal) { // Evidenzio il giorno selezionato (appartiene ai mesi visualizzati
					var i=v.getDate();
					v.setDate(1);
					i+=((v.getDay()-1 < 0 ? 6 : v.getDay()-1) -1+ j*42);
					// MB 16/3 x Mozilla
					//this.fSetSelectedDay(eval(this.varName+'_calCell')[i],true,j)
					i=i>42?i-42:i;
					var week = parseInt(i/7)+1;
					var day = i%7;
					this.fSetSelectedDay(document.getElementById(this.varName+'_calCell_'+j+'_'+week+'_'+day),true,j);
				} else  {// Aggiorno il calendario
					var offset=(v.getMonth()+1-this.Month);
					this.Day=v.getDate();
					this.Month=v.getMonth()+1;
					this.Year=v.getFullYear();
					//this.selectMonth(offset,0);
					this.FirstCalYear=this.Year;
					this.FirstCalMonth=this.Month;
					this.fUpdateCal(0,this.Month,this.Year,0);

				}
			} else {   
				// --- Fine dell'aggiunta ---
				var dCurDate=new Date();
				this.Day=dCurDate.getDate();
				this.Month=dCurDate.getMonth()+1;
				this.Year=dCurDate.getFullYear();
				this.fUpdateCal(this.Day,this.Month,this.Year,0);
				if (!IsNull(this.onChange)) this.onChange(this);
			}
		}
		v=new Date(this.Year, this.Month-1, this.Day);
		return v;
	}
	
	// cambia il colore di un elemento del calendario
	this.fToggleColor=function(myElement) {
		var toggleColor = "#ff0000";
		if (myElement.color == toggleColor) {
			myElement.color = "";
		} else {
			myElement.color = toggleColor;
		}
	}
	
	// seleziona un giorno specifico
	this.fSetSelectedDay=function(myElement, bUpdate, nCalendar){
		var sj=((this.nMonth > 1) ? "["+nCalendar+"]" : "");
		// MB 16/3 x Mozilla
		if (myElement.id.indexOf(this.varName+"_calCell_") != -1) {
		//if (myElement.id==this.varName+"_calCell") {
			// MB 16/3 x Mozilla
			//if (!isNaN(parseInt(myElement.children[0].innerText))) {
						
			var ok = false;
			var dayClick = null;
			if (!isNaN(parseInt(myElement.childNodes[0].innerHTML)))
			{
				dayClick = myElement.childNodes[0].innerHTML;
				ok = true;
			}
			else if (!isNaN(parseInt(myElement.childNodes[0].childNodes[0].innerHTML))) // testo bold (busy)
			{
				dayClick = myElement.childNodes[0].childNodes[0].innerHTML;
				ok = true;
			}
			
			if (ok)
			{
			        if (!IsNull(this.objPrevElement)) this.objPrevElement.bgColor = "#f1f1f1";
				this.objPrevElement = myElement;
				myElement.bgColor = "orange";
				if (bUpdate) {
					var nTmp=this.FirstCalYear*12+this.FirstCalMonth+nCalendar;
					this.Year=Math.floor((nTmp-1)/12);
					this.Month=nTmp-(this.Year*12);
					//this.Day=parseInt(myElement.children[0].innerText);		
					this.Day=parseInt(dayClick);		
					if (!IsNull(this.onChange)) this.onChange(this);					
				}
			}
		}
	}
	
	// ritorna un array che contiene un mese
	this.fBuildCal=function(iYear, iMonth, iDayStyle) {
		// Debug
		// var debugTime=new Date();
		var aMonth = new Array();
		aMonth[0] = new Array(7);
		aMonth[1] = new Array(7);
		aMonth[2] = new Array(7);
		aMonth[3] = new Array(7);
		aMonth[4] = new Array(7);
		aMonth[5] = new Array(7);
		aMonth[6] = new Array(7);

		var dCalDate = new Date(iYear, iMonth-1, 1);
		var iDayOfFirst = dCalDate.getDay()-1;
		iDayOfFirst = (iDayOfFirst < 0) ?  6 : iDayOfFirst;
		var iDaysInMonth = new Date(iYear,iMonth, 0).getDate();
		var iVarDate = 1;
                if (this.lingua=='ENG') iDayOfFirst++
		
		// nella prima riga i nomi dei giorni
try{
  //var lingua=eval(this.form.formid+"_g_UserLang.value");  
  //var lingua = "ENG"
  switch (this.lingua){
    case "ITA":
      aMonth[0][0] = "lun";aMonth[0][1] = "mar";aMonth[0][2] = "mer";aMonth[0][3] = "gio";aMonth[0][4] = "ven";aMonth[0][5] = "sab";aMonth[0][6] = "dom";
      break;
    case "ENG":
      aMonth[0][0] = "sun";aMonth[0][1] = "mon";aMonth[0][2] = "thu";aMonth[0][3] = "wed";aMonth[0][4] = "thr";aMonth[0][5] = "fri";aMonth[0][6] = "sat";
      break;
    default:
      aMonth[0][0] = "lun";aMonth[0][1] = "mar";aMonth[0][2] = "mer";aMonth[0][3] = "gio";aMonth[0][4] = "ven";aMonth[0][5] = "sab";aMonth[0][6] = "dom";
      break;
  }
}catch(e){ 
  aMonth[0][0] = "lun";aMonth[0][1] = "mar";aMonth[0][2] = "mer";aMonth[0][3] = "gio";aMonth[0][4] = "ven";aMonth[0][5] = "sab";aMonth[0][6] = "dom";
}

		// MB 16/3 x Mozilla: svuoto i giorni
		for (var w = 1; w < 7; w++) {
			for (var d = 0; d < 7; d++) {
				aMonth[w][d] = 0;
			}
		}
	
		// riempie anche i giorni nel posto opportuno
		for (var d = iDayOfFirst; d < 7; d++) {
			aMonth[1][d] = iVarDate;
			iVarDate++;
		}
		for (var w = 2; w < 7; w++) {
			for (var d = 0; d < 7; d++) {
				if (iVarDate <= iDaysInMonth) {
				  aMonth[w][d] = iVarDate;
				  iVarDate++;
				}
			}
		}
		// Debug
		// alert("TSCalendarObj.fBuildCal ott. msec:"+(new Date()-debugTime));
		return aMonth;
	}
		
	// disegna un calendario
	this.fDrawCal=function(varName,font,font_size) {
		// Debug
		// var debugTime=new Date();
		this.varName=varName;
		var iCellWidth=10;
		var iCellHeight=10;
		var sDateTextSize='9px';
		var sDateTextWeight='normal'
		if(font_size!=null) sDateTextSize=font_size;
		var DateTextWeight='';
		var iDayStyle=0;
		var myMonth;
		var sIdtbSelMonth=varName+"_tbSelMonth";
		var sj="";
		iYear=this.Year;
		iMonth=this.Month;
		var str='<table width=100% height=100% border="0" bgcolor="#ffffff" cellpadding="0px" cellspacing="0px">'
		for (var j=0; j<this.nMonth; j++) {
			sj=((this.nMonth > 1) ? "["+j+"]" : "");
			// Prepara Calendario
			myMonth = this.fBuildCal(iYear, iMonth, iDayStyle);
			str+='<td>'+
				'<table width=100% height=100% border="0" bgcolor="#ffffff" cellpadding="0px" cellspacing="1px">';
			// Mese e Anno
			str+='<tr><td colspan="7">'+		
				'<table width=100% height=100% border="0" cellpadding="1px" cellspacing="1px" bgcolor="#DCDCDC"><tr>';
			if (j==0) str+='<td width="20px" align="right" style="CURSOR:Pointer;CURSOR:Hand;" onclick="javascript:'+this.form.formid+'.'+this.ctrlid+'.selectMonth(-1,'+j+')"><img src="../images/TSCalendar_prev.gif"/></td>';
			str+='<td width=100%  align="center"><label id="'+sIdtbSelMonth+'" name="'+sIdtbSelMonth+'" style="font-family:Verdana; font-size:7pt">'+Month2String(iMonth,this.form.formid)+' '+iYear+'</label></td>';			
			if (j==(this.nMonth-1)) str+='<td width="20px" align="left" style="CURSOR:Pointer;CURSOR:Hand;" onclick="javascript:'+this.form.formid+'.'+this.ctrlid+'.selectMonth(+1,'+j+')"><img src="../images/TSCalendar_next.gif"/></td>';
			str+='</tr></table></td></tr>';
			// Calendario
			str+="<tr bgcolor='#ffffff'>";
			var std="<td align='center' style=\"font-family:Arial;font-size:9px;font-weight:normal;color:#0A37B6\" >"			
			str+=std + myMonth[0][0] + "</td>"+
				std + myMonth[0][1] + "</td>"+
				std + myMonth[0][2] + "</td>"+
				std + myMonth[0][3] + "</td>"+
				std + myMonth[0][4] + "</td>"+
				std + myMonth[0][5] + "</td>"+
				std + myMonth[0][6] + "</td></tr>";
			for (var w = 1; w < 7; w++) {
				std="<tr>"
				for (var d = 0; d < 7; d++) {
					std+="<td align='center' valign='top' id='"+varName+"_calCell_"+j+"_"+w+"_"+d+"' style='CURSOR:Pointer;CURSOR:Hand;' onMouseOver='"+this.form.formid+"."+this.ctrlid+".fToggleColor(this)' onMouseOut='"+this.form.formid+"."+this.ctrlid+".fToggleColor(this)' onclick="+this.form.formid+"."+this.ctrlid+".fSetSelectedDay(this,true,"+j+") bgcolor='#f1f1f1'>";
					if (myMonth[w][d] != 0) {
						std+="<font id='"+varName+"_calDateText_"+j+"_"+w+"_"+d+"' onMouseOver='"+this.form.formid+"."+this.ctrlid+".fToggleColor(this)' style='CURSOR:Pointer;CURSOR:Hand;FONT-FAMILY:"+font+";FONT-SIZE:" + sDateTextSize + "px;FONT-WEIGHT:" + sDateTextWeight + "' onMouseOut='"+this.form.formid+"."+this.ctrlid+".fToggleColor(this)'>" + myMonth[w][d] + "</font>";
					} else {
						std+="<font id='"+varName+"_calDateText_"+j+"_"+w+"_"+d+"' style='CURSOR:Pointer;CURSOR:Hand;FONT-FAMILY:"+font+";FONT-SIZE:" + sDateTextSize + "px;FONT-WEIGHT:" + sDateTextWeight + "'> </font>";
					}
					std+="</td>";
				}
				str+=std+"</tr>";
			}
			str+="</table>"+
				"</td>";
			if (++iMonth>12){
				iYear++;
				iMonth=1;
			}
		}	
		str+="</table>";
		this.Ctrl.innerHTML=str;
		// Debug
		// alert("TSCalendarObj.fDrawCal ott. msec:"+(new Date()-debugTime));
	}
	
	// aggiorna il calendario
	this.fUpdateCal=function(iDay, iMonth, iYear, nCalendar) {	
		// Debug
		// var debugTime=new Date();	
		// Parametri varianti
		if (typeof(iMonth)=='string') iMonth=parseInt(iMonth);
		if (typeof(iYear)=='string') iYear=parseInt(iYear);
		
		this.updating=true;
	        if (!IsNull(this.onBeforeUpdate) && !this.filling) this.onBeforeUpdate(this);
		var i=0;
		var dCurrent=new Date();
		var objIdtbSelMonth=document.getElementsByName(this.varName+"_tbSelMonth");
		var sj="";
		
		if (!IsNull(this.objPrevElement)) this.objPrevElement.bgColor = "#f1f1f1";
		for (var j=0; j<this.nMonth; j++) {
			// Aggiorna Mese e Anno	
			objIdtbSelMonth[j].innerHTML=Month2String(iMonth,this.form.formid)+' '+iYear;	
			myMonth = this.fBuildCal(iYear, iMonth);
			for (var w = 1; w < 7; w++) {
				for (var d = 0; d < 7; d++) {
					i=((7*w)+d-7)+(42*j);
					var oCalDateText=document.getElementById(this.varName+'_calDateText_'+j+'_'+w+'_'+d);
					var parNode = (oCalDateText.parentNode) ? oCalDateText.parentNode : oCalDateText.parentElement;
					if (myMonth[w][d] != 0) {
						dCurrent.setFullYear(iYear,iMonth-1,myMonth[w][d]);
						dCurrent.setHours(0,0,0,0);
						if (!this.isBusyDay(dCurrent)) {							
							oCalDateText.innerHTML= myMonth[w][d];	
						}else{
							oCalDateText.innerHTML = "<b>" + myMonth[w][d] + "</b>";	  
						}
						// Evidenza Data selezionata
						if (myMonth[w][d]==this.Day && this.Month==iMonth && this.Year==iYear) {
							this.fSetSelectedDay(document.getElementById(this.varName+'_calCell_'+j+'_'+w+'_'+d),false,j);
						} 
						// Evidenza Today
						parNode.style.borderWidth="1px";
						parNode.style.borderStyle="solid";
						if (myMonth[w][d]==this.DayToday && this.MonthToday==iMonth && this.YearToday==iYear) {
							parNode.style.borderColor="blue";
						}else{
							parNode.style.borderColor="#f1f1f1";
						}
					} else {
						oCalDateText.innerHTML = "&nbsp;";
						parNode.style.borderColor="#f1f1f1";
					}
				}
			}
			if (++iMonth>12){
				iYear++;
				iMonth=1;
			}
		}
		this.updating=false;
		// Debug
		// alert("TSCalendarObj.fUpdateCal ott. msec:"+(new Date()-debugTime));
	}
	
	this.selectMonth=function(n,nCalendar){
		var nTmp=this.FirstCalYear*12+this.FirstCalMonth+n;
		this.FirstCalYear=Math.floor((nTmp-1)/12);
		this.FirstCalMonth=nTmp-(this.FirstCalYear*12);
		this.fUpdateCal(0,this.FirstCalMonth,this.FirstCalYear,nCalendar);
	}

	// Properties
	this.name=name;						// Nome variabile univoca
	this.form=form; 							// Reference al form
	this.ctrlid=ctrlid;      						// Nome control in form
	//this.Ctrl=document.getElementById(name+'_div');  	// Reference to HTML Control (in questo caso al div)
	this.Ctrl=document.getElementById(name);
	this.field_from="";
	this.field_to="";
	this.objPrevElement=null;
	this.nMonth=(Month>0) ? Month : 1;			// Numero mesi che verranno visualizzati sul calendario (TO DO esposizione su Portal Studio)
	// Status
	this.updating=false;
	this.filling=false;
	// Events
	this.onBeforeUpdate=null;
	this.onChange=null;
	// Select Day
	var dCurDate=new Date();
	this.Day=dCurDate.getDate();
	this.Month=dCurDate.getMonth()+1;
	this.Year=dCurDate.getFullYear();
	// Today
	this.DayToday=this.Day;
	this.MonthToday=this.Month;				// Valori da [1,12]
	this.YearToday=this.Year;
	this.varName='';							// Identificatore unico per variabili
	this.aTaskDate=new Array();
	
	// Internal
	this.FirstCalMonth=this.Month;				// Mese e Anno del primo calendario - Valori da [1,12]
	this.FirstCalYear=this.Year;
	
	// Init
	this.Init(name,font,font_size,x,y,w,h);
}

ZtVWeb.TSCalendarCtrl.prototype=new ZtVWeb.StdControl;
