//<!--

var dtToday = new Date();
var Cal;
var divCal;
var selectControl;
var MonthName 	= ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno","Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"];
var WeekDayName	= ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
var exDateTime;	

var WeekChar		= 2;
var CellWidth		= 20;
var DateSeparator	= "/";
var TimeMode		= 24;

var ShowLongMonth	= true;
var ShowMonthYear	= false;

var MonthYearClass		= "clsMonthYear";
var WeekHeaderClass 	= "clsWeekHeader";
var SundayClass 		= "clsSunday";
var SaturdayClass		= "clsSaturday";
var WeekDayClass		= "clsWeekDay";
var TodayClass			= "clsToday";
var SelDateClass		= "clsSelDate";
var YrSelClass			= "clsYrSel";
var MonthSelectorClass	= "clsMonthSelector";

var ThemeBg				= "";				

function hideCal() {
	divCal.style.visibility = 'hidden';
	if (selectControl != null) {
		selectControl.style.visibility = 'visible';
	}
}

function NewCal(pCtrl, pFormat, pShowTime, pShowSelDay, pTimeMode, divId, posId, dx, dy, selectID) {
   
	Cal = new Calendar(dtToday); 
	
	if ((pShowTime != null) && (pShowTime)) {
		Cal.ShowTime=true; 
		if ((pTimeMode!=null) &&((pTimeMode=='12')||(pTimeMode=='24'))) {
			TimeMode=pTimeMode;
		}		
	}	
	
	if (pCtrl != null) {
		Cal.Ctrl = pCtrl;
	}
	if (pFormat != null) {
		Cal.Format = pFormat.toUpperCase();
	}
	
	exDateTime = document.getElementById(pCtrl).value;
	if (exDateTime != "") {			//Parse Date String
	
		var Sp1;				//Index of Date Separator 1
		var Sp2;				//Index of Date Separator 2 
		var tSp1;				//Index of Time Separator 1
		var tSp1;				//Index of Time Separator 2
		var strMonth;
		var strDate;
		var strYear;
		var intMonth;
		var YearPattern;
		var strHour;
		var strMinute;
		var strSecond;
		
		//parse month
		Sp1 = exDateTime.indexOf(DateSeparator, 0)
		Sp2 = exDateTime.indexOf(DateSeparator, (parseInt(Sp1) + 1));
		
		if ((Cal.Format.toUpperCase() == "DDMMYYYY") || (Cal.Format.toUpperCase() == "DDMMMYYYY")) {
			strMonth = exDateTime.substring(Sp1 + 1, Sp2);
			strDate = exDateTime.substring(0, Sp1);
		} else if ((Cal.Format.toUpperCase() == "MMDDYYYY") || (Cal.Format.toUpperCase() == "MMMDDYYYY")) {
			strMonth = exDateTime.substring(0, Sp1);
			strDate = exDateTime.substring(Sp1 + 1, Sp2);
		}
		
		if (isNaN(strMonth)) {
			intMonth=Cal.GetMonthIndex(strMonth);
		} else {
			intMonth=parseInt(strMonth, 10) - 1;	
		}
		
		if ((parseInt(intMonth, 10) >= 0) && (parseInt(intMonth, 10) < 12)) {
			Cal.Month = intMonth;
		}
		//end parse month
		
		//parse Date
		if ((parseInt(strDate, 10) <= Cal.GetMonDays()) && (parseInt(strDate, 10) >= 1)) {
			Cal.Date = strDate;
		}
		//end parse Date
		//parse year
		
		strYear = exDateTime.substring(Sp2 + 1, Sp2 + 5);
		YearPattern = /^\d{4}$/;
		if (YearPattern.test(strYear)) {
			Cal.Year = parseInt(strYear, 10);
		}
		//end parse year
		
		//parse time
		if (Cal.ShowTime==true) {
			tSp1 = exDateTime.indexOf(":", 0)
			tSp2 = exDateTime.indexOf(":", (parseInt(tSp1) + 1));
			strHour=exDateTime.substring(tSp1, (tSp1) - 2);
			Cal.SetHour(strHour);
			strMinute=exDateTime.substring(tSp1 + 1, tSp2);
			Cal.SetMinute(strMinute);
			strSecond=exDateTime.substring(tSp2 + 1, tSp2 + 3);
			Cal.SetSecond(strSecond);
		}	
	}
	
	Cal.ShowSelDay = pShowSelDay;

	divCal = document.getElementById(divId);
	if (selectID == null) {
		selectControl = null;
	} else {
		selectControl = document.getElementById(selectID);
	}
	
	RenderCal();
	
	var objPos = document.getElementById(posId);
	
	var o2 = document.getElementById(posId);
	
	var left    = 0;
	var top     = 0;
	while (o2 != null) {
	    left += o2.offsetLeft;
	    top += o2.offsetTop;
	    o2 = o2.offsetParent;
	}
	
	divCal.style.left = String(left + dx) + "px";
	divCal.style.top = String(top + dy) + "px";
	
	divCal.style.position = 'absolute';
	divCal.style.visibility = 'visible';
	if (selectControl != null) {
		selectControl.style.visibility = 'hidden';
	}
	
}

function RenderCal() {
	
	var vCalHeader;
	var vCalData;
	var vCalTime;
	var i;
	var j;
	var SelectStr;
	var vDayCount = 0;
	var vFirstDay;
	
	var htmlCal = "";

	//htmlCal = "<table bgcolor=\"" + ThemeBg + "\" style=\"z-Index:90;\"><tr><td>";
	htmlCal = "<iframe frameborder=\"0\" src=\"\" style=\"position:absolute; width:100%; height:100%; z-index:-1;\"></iframe><div class=\"clsCalendar\"><table class=\"clsCalendar\" style=\"z-Index:90;\"><tr><td>";

	vCalHeader = "<table border=\"0\" cellpadding=\"2\" cellspacing=\"0\" align=\"center\" valign=\"top\">";
	
	vCalHeader += "<tr><td colspan='7'><table border=0 width='100%' cellpadding=0 cellspacing=1><tr><td align='left'>";
	vCalHeader += "<select class=\"" + MonthSelectorClass + "\" name=\"MonthSelector\" onChange=\"javascript:Cal.SwitchMth(this.selectedIndex);RenderCal();\">";
	for (i=0;i<12;i++) {
		if (i==Cal.Month) {
			SelectStr = "Selected";
		} else {
			SelectStr = "";
		}
		vCalHeader += "<option " + SelectStr + " value >" + MonthName[i] + "";
	}
	
	vCalHeader += "</select></td>";
	
	//Year selector
	vCalHeader += "<td align='right' class='" + YrSelClass + "'><a href=\"javascript:Cal.DecYear();RenderCal()\">&lt;</a> " + Cal.Year + " <a href=\"javascript:Cal.IncYear();RenderCal()\">&gt;</a></td>";
	vCalHeader += "<td class='" + SundayClass + "'><a href=\"javascript:setCtrlDate(null)\">X</a></td></tr></table></td>";	
	vCalHeader += "</tr>";
	
	//Calendar header shows Month and Year
	if (ShowMonthYear) {
		//vCalHeader += "<tr><td colspan='7'><font face='Verdana' size='2' align='center' color='" + MonthYearColor + "'><b>" + Cal.GetMonthName(ShowLongMonth) + " " + Cal.Year + "</b></font></td></tr>";
		vCalHeader += "<tr><td colspan='7' class='" + MonthYearClass + "'>" + Cal.GetMonthName(ShowLongMonth) + " " + Cal.Year + "</td></tr>";
	}
	
	//Week day header
	//vCalHeader += "<tr bgcolor=" + WeekHeadColor + ">";
	vCalHeader += "<tr>";
	for (i=0; i<7; i++) {
		//vCalHeader += "<td align='center'><font face='Verdana' size='2'>" + WeekDayName[i].substr(0, WeekChar) + "</font></td>";
		vCalHeader += "<td align='center' class='" + WeekHeaderClass + "'>" + WeekDayName[i].substr(0, WeekChar) + "</td>";
	}
	vCalHeader += "</tr>";	
	htmlCal += vCalHeader;
	
	//Calendar detail
	CalDate = new Date(Cal.Year,Cal.Month);
	CalDate.setDate(1);
	vFirstDay = CalDate.getDay();
	vCalData = "<tr>";
	for (i=0; i<vFirstDay; i++)	{
		vCalData=vCalData+GenCell();
		vDayCount=vDayCount+1;
	}
	
	for (j=1; j<=Cal.GetMonDays(); j++)	{
		
		var strCell;
		
		vDayCount = vDayCount + 1;
		
		if ((j == dtToday.getDate()) && (Cal.Month == dtToday.getMonth()) && (Cal.Year == dtToday.getFullYear())) {
			strCell = GenCell(j, true, TodayClass); //Highlight today's date
		} else {
			if (j == Cal.Date && Cal.ShowSelDate) {
				//strCell = GenCell(j, true, SelDateColor);
				strCell = GenCell(j, true, SelDateClass);
			} else {	 
				if (vDayCount % 7 == 0) {
					//strCell=GenCell(j, false, SaturdayColor);
					strCell = GenCell(j, false, SaturdayClass);
				} else if ((vDayCount+6)%7==0) {
					//strCell=GenCell(j,false,SundayColor);
					strCell = GenCell(j, false,SundayClass);
				} else {
					//strCell=GenCell(j,null,WeekDayColor);
					strCell = GenCell(j, null, WeekDayClass);
				}
			}		
		}		
						
		vCalData = vCalData + strCell;

		if ((vDayCount % 7 == 0) && (j < Cal.GetMonDays()))	{
			vCalData = vCalData + "</tr><tr>";
		}
	}
	
	//docCal.writeln(vCalData);	
	htmlCal += vCalData;
	
	//Time picker
	if (Cal.ShowTime) {
		var showHour;
		showHour=Cal.getShowHour();		
		vCalTime="<tr><td colspan='7' align='center'>";
		vCalTime+="<input type='text' name='hour' maxlength=2 size=1 style=\"WIDTH: 22px\" value="+showHour+" onchange=\"javascript:Cal.SetHour(this.value)\">";
		vCalTime+=" : ";
		vCalTime+="<input type='text' name='minute' maxlength=2 size=1 style=\"WIDTH: 22px\" value="+Cal.Minutes+" onchange=\"javascript:Cal.SetMinute(this.value)\">";
		vCalTime+=" : ";
		vCalTime+="<input type='text' name='second' maxlength=2 size=1 style=\"WIDTH: 22px\" value="+Cal.Seconds+" onchange=\"javascript:Cal.SetSecond(this.value)\">";
		if (TimeMode==12) {
			var SelectAm =(parseInt(Cal.Hours,10)<12)? "Selected":"";
			var SelectPm =(parseInt(Cal.Hours,10)>=12)? "Selected":"";

			vCalTime+="<select name=\"ampm\" onchange=\"javascript:Cal.SetAmPm(this.options[this.selectedIndex].value);\">";
			vCalTime+="<option "+SelectAm+" value=\"AM\">AM</option>";
			vCalTime+="<option "+SelectPm+" value=\"PM\">PM<option>";
			vCalTime+="</select>";
		}	
		vCalTime+="</td></tr>";
		htmlCal += vCalTime
	}	
	//end time picker
	
	htmlCal += "</table>";
	htmlCal += "</td></tr></table></div>";
	
	divCal.innerHTML = htmlCal;
	
}

function setCtrlDate(v) {
	if (v == null) {
		document.getElementById(Cal.Ctrl).value = "  /  /    ";
	} else {
		document.getElementById(Cal.Ctrl).value = Cal.FormatDate(v);
	}
	divCal.style.visibility = "hidden";
	if (selectControl != null) {
		selectControl.style.visibility = 'visible';
	}
}

function GenCell(pValue, pHighLight, pClass) { //Generate table cell with value

	var PValue;
	var PCellStr;
	var vClass;
	
	//var vHLstr1;		//HighLight string
	//var vHlstr2;
	var vTimeStr;
	
	if (pValue == null) {
		PValue = "";
	} else {
		PValue = pValue;
	}
	
	if (pClass!=null) {
		vClass = "class=\"" + pClass + "\"";
	} else {
		vClass = "";	
	}
		
	if ((pHighLight!=null)&&(pHighLight)) {
		vHLstr1 = "color='red'><b>";
		vHLstr2 = "</b>";
	} else {
		vHLstr1 = ">";
		vHLstr2 = "";	
	}
	
	if (Cal.ShowTime) {
		vTimeStr = "document.getElementById('" + Cal.Ctrl + "').value+=' '+" + "Cal.getShowHour()" + "+':'+" + "Cal.Minutes" + "+':'+" + "Cal.Seconds";
		if (TimeMode==12) {
			vTimeStr += "+' '+Cal.AMorPM";
		}
	} else {
		vTimeStr="";		
	}
	
	//PCellStr="<td "+vColor+" width="+CellWidth+" align='center'><font face='verdana' size='2'"+vHLstr1+"<a href=\"javascript:document.getElementById('"+Cal.Ctrl+"').value='"+Cal.FormatDate(PValue)+"';"+vTimeStr+";\">"+PValue+"</a>"+vHLstr2+"</font></td>";
	PCellStr="<td " + vClass + " width =" + CellWidth + " align='center'><a href=\"javascript:setCtrlDate(" + PValue + ")\">"+PValue+"</a></td>";
	return PCellStr;
}


function Calendar(pDate, pCtrl) {
	
	//Properties
	this.Date	= pDate.getDate();		//selected date
	this.Month	= pDate.getMonth();		//selected month number
	this.Year	= pDate.getFullYear();			//selected year in 4 digits
	this.Hours	= pDate.getHours();	
	
	if (pDate.getMinutes()<10) {
		this.Minutes="0"+pDate.getMinutes();
	} else {
		this.Minutes=pDate.getMinutes();
	}
	
	if (pDate.getSeconds()<10) {
		this.Seconds="0"+pDate.getSeconds();
	} else {
		this.Seconds=pDate.getSeconds();
	}
		
	//this.MyWindow = winCal;
	this.Ctrl = pCtrl;
	this.Format = "ddMMyyyy";
	this.Separator = DateSeparator;
	this.ShowTime = false;
	this.ShowSelDay = false;
	
	if (pDate.getHours()<12) {
		this.AMorPM="AM";
	} else {
		this.AMorPM="PM";	
	}
}

function GetMonthIndex(shortMonthName) {
	for (i = 0; i < 12; i++) {
		if (MonthName[i].substring(0,3).toUpperCase()==shortMonthName.toUpperCase()) {
			return i;
		}
	}
}

Calendar.prototype.GetMonthIndex = GetMonthIndex;

function IncYear() {
	Cal.Year++;
}
Calendar.prototype.IncYear = IncYear;

function DecYear() {
	Cal.Year--;
}
Calendar.prototype.DecYear = DecYear;
	
function SwitchMth(intMth) {
	Cal.Month = intMth;
}
Calendar.prototype.SwitchMth = SwitchMth;

function SetHour(intHour) {	
	
	var MaxHour;
	var MinHour;
	
	if (TimeMode==24) {
		MaxHour=23;MinHour=0
	} else if (TimeMode==12) {
		MaxHour=12;MinHour=1
	} else {
		alert("TimeMode can only be 12 or 24");		
	}
	
	var HourExp=new RegExp("^\\d\\d$");
	
	if (HourExp.test(intHour) && (parseInt(intHour,10)<=MaxHour) && (parseInt(intHour,10)>=MinHour)) {	
		if ((TimeMode==12) && (Cal.AMorPM=="PM")) {
			if (parseInt(intHour,10)==12) {
				Cal.Hours=12;
			} else	{
				Cal.Hours=parseInt(intHour,10)+12;
			}
		} else if ((TimeMode==12) && (Cal.AMorPM=="AM")) {
			if (intHour==12) {
				intHour-=12;
			}
			Cal.Hours=parseInt(intHour,10);
		} else if (TimeMode==24) {
			Cal.Hours=parseInt(intHour,10);	
		}
	}
}
Calendar.prototype.SetHour=SetHour;

function SetMinute(intMin) {
	var MinExp=new RegExp("^\\d\\d$");
	if (MinExp.test(intMin) && (intMin<60))
		Cal.Minutes=intMin;
}
Calendar.prototype.SetMinute=SetMinute;

function SetSecond(intSec) {	
	var SecExp=new RegExp("^\\d\\d$");
	if (SecExp.test(intSec) && (intSec<60))
		Cal.Seconds=intSec;
}
Calendar.prototype.SetSecond=SetSecond;

function SetAmPm(pvalue) {
	this.AMorPM=pvalue;
	if (pvalue=="PM") {
		this.Hours=(parseInt(this.Hours,10))+12;
		if (this.Hours==24)
			this.Hours=12;
	} else if (pvalue=="AM") {
		this.Hours-=12;	
	}
}
Calendar.prototype.SetAmPm = SetAmPm;

function getShowHour() {
	
	var finalHour; 
	
    if (TimeMode==12) {
	    
    	if (parseInt(this.Hours,10)==0) {
			this.AMorPM="AM";
			finalHour=parseInt(this.Hours,10)+12;	
		} else if (parseInt(this.Hours,10)==12) {
			this.AMorPM="PM";
			finalHour=12;
		} else if (this.Hours>12) {
			this.AMorPM="PM";
			if ((this.Hours-12)<10) {
				finalHour="0"+((parseInt(this.Hours,10))-12);
			} else {
				finalHour=parseInt(this.Hours,10)-12;	
			}
		} else {
			this.AMorPM="AM";
			if (this.Hours<10) {
				finalHour="0"+parseInt(this.Hours,10);
			} else {
				finalHour=this.Hours;	
			}
		}
	} else if (TimeMode==24) {
		if (this.Hours<10) {
			finalHour="0"+parseInt(this.Hours,10);
		} else {
			finalHour=this.Hours;
		}
	}	
	return finalHour;	
}				
Calendar.prototype.getShowHour=getShowHour;		

function GetMonthName(IsLong)
{
	var Month=MonthName[this.Month];
	if (IsLong)
		return Month;
	else
		return Month.substr(0,3);
}
Calendar.prototype.GetMonthName=GetMonthName;

function GetMonDays()//Get number of days in a month
{
	var DaysInMonth=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	if (this.IsLeapYear())
	{
		DaysInMonth[1]=29;
	}	
	return DaysInMonth[this.Month];	
}
Calendar.prototype.GetMonDays=GetMonDays;

function IsLeapYear() {
	if ((this.Year % 4)==0) {
		if ((this.Year % 100 == 0) && (this.Year % 400) != 0) {
			return false;
		} else {
			return true;
		}
	} else {
		return false;
	}
}
Calendar.prototype.IsLeapYear=IsLeapYear;

function FormatDate(pDate) {
	if (pDate < 10) {
		pDate = "0" +pDate.toString();
	}
	
	if (this.Format.toUpperCase() == "DDMMYYYY") {
		return (pDate + DateSeparator + (this.GetMonth()) + DateSeparator + this.Year);
	} else if (this.Format.toUpperCase() == "DDMMMYYYY") {
		return (pDate + DateSeparator + this.GetMonthName(false) + DateSeparator + this.Year);
	} else if (this.Format.toUpperCase() == "MMDDYYYY") {
		return ((this.GetMonth()) + DateSeparator + pDate + DateSeparator + this.Year);
	} else if (this.Format.toUpperCase() == "MMMDDYYYY") {
		return (this.GetMonthName(false) + DateSeparator + pDate + DateSeparator + this.Year);			
	}
}
Calendar.prototype.FormatDate = FormatDate;	

function GetMonth() {
	var M = this.Month + 1;
	M = ((M < 10) ? "0" + M.toString() : M.toString())
	return M;
}
Calendar.prototype.GetMonth = GetMonth;	

function GetDate() {
	var D = this.date;
	D = ((D < 10) ? "0" + D.toString() : D.toString())
	return D;
}
Calendar.prototype.GetDate = GetDate;	
//-->
