var mSelectedDay;
var mSelectedMonth
var mSelectedYear;

var mHighlightedDay = 0;
var mCurrentMonth;
var mCurrentYear;

var mOnHideFunction;

function setSelectedDates(dateString)
{
  var currentSelectedDate = new Date(dateString);

  if (isNaN(currentSelectedDate))
  {
    currentSelectedDate = new Date();
  }

  mSelectedDay = currentSelectedDate.getDate();
  mSelectedMonth = currentSelectedDate.getMonth();
  mSelectedYear = currentSelectedDate.getFullYear();

  mCurrentMonth = mSelectedMonth;
  mCurrentYear = mSelectedYear;
}

function generateCalendar(month, year, calendarDivID)
{
  var headingHTML = "";
  headingHTML += "<table class='monthHeadingTable' border='0' cellspacing='1' cellpadding='1'>";
  headingHTML += "<tr>";
  headingHTML += "<td class='changeMonthTD'>";
  headingHTML += "<img src='../Style/prev.gif' alt='Mese Precedente' ";
  headingHTML += " width='16' height='16' onclick='goPreviousMonth(\"";
  headingHTML += calendarDivID + "\")'>";
  headingHTML += "</td>";
  headingHTML += "<td class='monthHeadingTD' width='140px'>";
  headingHTML += getMonthName(month) + " " + year + "</td>";
  headingHTML += "<td class='changeMonthTD'>";
  headingHTML += "<img src='../Style/next.gif' alt='Mese Successivo' ";
  headingHTML += " width='16' height='16' onclick='goNextMonth(\"";
  headingHTML += calendarDivID + "\")'>";
  headingHTML += "</td>";
  headingHTML += "</tr>";
  headingHTML += "</table>";
  var tableInnerHTML = "";
  tableInnerHTML += "<tr>";
  tableInnerHTML += "<td class='dayHeadTDf'>D</td>";
  tableInnerHTML += "<td class='dayHeadTD'>L</td>";
  tableInnerHTML += "<td class='dayHeadTD'>M</td>";
  tableInnerHTML += "<td class='dayHeadTD'>M</td>";
  tableInnerHTML += "<td class='dayHeadTD'>G</td>";
  tableInnerHTML += "<td class='dayHeadTD'>V</td>";
  tableInnerHTML += "<td class='dayHeadTD'>S</td>";
  tableInnerHTML += "</tr>"
  var elementIndex = 1;
  var iCellCounter;
  var iStartDayOfMonth = getStartDayOfMonthNumber(month,year);
  var iLastDayOfMonth = getDaysInAMonth(month,year);
  
  var Pyear, Pmonth;
  var Nyear, Nmonth;
  
  if ((month-1) < 0){
	Pmonth = 11;
	Pyear  = year-1;
  }
  else {
	Pmonth = (month-1);
	Pyear  = year;
  }
  
  if ((month+1) > 11){
	Nmonth = 0;
	Nyear  = year+1;
  }
  else {
	Nmonth = (month+1);
	Nyear  = year;
  }
  
  var iPStartDayOfMonth = getStartDayOfMonthNumber(Pmonth,Pyear);
  var iPLastDayOfMonth = getDaysInAMonth(Pmonth,Pyear);
  
  var iNStartDayOfMonth = getStartDayOfMonthNumber(Nmonth,Nyear);
  var iNLastDayOfMonth = getDaysInAMonth(Nmonth,Nyear);
  
  var tableRows = 6;
  var bgkColor;

  for (weekIndex = 1; weekIndex <= tableRows; weekIndex++)
  {
    tableInnerHTML = tableInnerHTML + "<tr>";
    var dayCounter;

    for (dayCounter = 1; dayCounter <= 7; dayCounter++)
    {
	  if (dayCounter == 1 && elementIndex > (iLastDayOfMonth + iStartDayOfMonth))	
	  break;
	  else {
      	if (elementIndex <= iStartDayOfMonth || elementIndex > (iLastDayOfMonth + iStartDayOfMonth) ) {
		  if (dayCounter == 1)	// evidenzia in rosso le domeniche
			tableInnerHTML += "<td class='emptyTDf' id='dayTD";
		  else
			tableInnerHTML += "<td class='emptyTD' id='dayTD"; 
		  tableInnerHTML += elementIndex;
		  if (elementIndex <= iStartDayOfMonth){
			tableInnerHTML += "'>"+(iPLastDayOfMonth-(iStartDayOfMonth-elementIndex))+"</td>";
		  }
		  if (elementIndex > (iLastDayOfMonth + iStartDayOfMonth)){
			tableInnerHTML += "'>"+(elementIndex-(iStartDayOfMonth+iLastDayOfMonth))+"</td>";
		  }
	  	}
      	else {
	  	  if (dayCounter == 1)	// evidenzia in rosso le domeniche
        	tableInnerHTML += "<td class='dayTDf' ";
		  else
        	tableInnerHTML += "<td class='dayTD'";
          tableInnerHTML += " OnClick='updateSelectedDate("; 
          tableInnerHTML += (elementIndex - iStartDayOfMonth); 
          tableInnerHTML += "," + month + ","; 
          tableInnerHTML += year + "); ";
          tableInnerHTML += " hideCalendar(\"" + calendarDivID; 
          tableInnerHTML += "\"); "; 
          tableInnerHTML += "' id='dayTD" + elementIndex +"' "; 
		  tableInnerHTML += " OnMouseOver='bgkColor = this.style.backgroundColor; this.style.backgroundColor=\"#DCE9EF\";' "; 
          tableInnerHTML += " OnMouseOut='this.style.backgroundColor=bgkColor'>"; 
          tableInnerHTML += (elementIndex - iStartDayOfMonth); 
          tableInnerHTML += "</td>";
      	}
        elementIndex++;
	  }
    }
    tableInnerHTML = tableInnerHTML + "</tr>";
  }
  var calendarDivObject = getTagById(calendarDivID)
  calendarDivObject.innerHTML = headingHTML + 
    "<table class='calendarTable' cellspacing='0'><tbody>" + 
    tableInnerHTML + 
    "<tr><td colspan='7'><a href='javaScript: " + 
    "cancelCalendar(\"" + 
    calendarDivID + "\")' class='cancelHyperlink'>&nbsp;Chiudi&nbsp;</a></td></tr>" + 
    "</tbody></table>";
  if (mCurrentMonth == mSelectedMonth && mCurrentYear == mSelectedYear)
  {
    highlightDay(mSelectedDay, mSelectedMonth, mSelectedYear);
  }
}

function getTagById(tagId)
{
  var selectedTag;

  if (document.all)
  {
    selectedTag = document.all.item(tagId);
  }
  else 
  {
    selectedTag = document.getElementById(tagId);
  }

  return selectedTag;
}

function getStartDayOfMonthNumber(month,year)
{
  var newDate = new Date();
  newDate.setMonth(month)
  newDate.setFullYear(year);
  newDate.setDate(1);

  return newDate.getDay();
}

function getDaysInAMonth(month, year)
{
  var nowDate;
  month = parseInt(month)
  year = parseInt(year)

  var monthDays = new Array(31,29,31,30,31,30,31,31,30,31,30,31)

  // If Feb then need to check for leap years
  if (month == 1)
  {
    nowDate = new Date();
    nowDate.setMonth(1);
    nowDate.setYear(year);
    nowDate.setDate(29);

    if (nowDate.getMonth() == 2)
      monthDays[1] = 28;
  }

  return monthDays[month];
}

function getMonthName(month)
{
  var months = new 
    Array("gennaio","febbraio","marzo","aprile","maggio","giugno",
          "luglio","agosto","settembre","ottobre","novembre","dicembre");
  return months[month];
}

function highlightDay(day, month, year)
{
  // highlight selected cell
  var idOfCellToHighlight = day + getStartDayOfMonthNumber(month,year);
  idOfCellToHighlight = "dayTD" + idOfCellToHighlight;
  getTagById(idOfCellToHighlight).style.backgroundColor = '#b9c8dd';
}

function updateSelectedDate(day,month,year)
{
  mSelectedDay = day;
  mSelectedMonth = month;
  mSelectedYear = year;
}

function goPreviousMonth(calendarDivID)
{
  mCurrentMonth--;
  if (mCurrentMonth < 0)
  {
    mCurrentMonth = 11;
    mCurrentYear--;
  }

  generateCalendar(mCurrentMonth, mCurrentYear,calendarDivID);
}

function goNextMonth(calendarDivID)
{
  mCurrentMonth++;
  if (mCurrentMonth > 11)
  {
    mCurrentMonth = 0;
    mCurrentYear++;
  }

  generateCalendar(mCurrentMonth, mCurrentYear,calendarDivID);
}

function cancelCalendar(calendarDivID)
{
/*  
  getTagById(calendarDivID).style.left = "-1200px";
  getTagById(calendarDivID).style.top = "-1000px";
*/  
  getTagById(calendarDivID).style.visibility = "hidden";
}

function hideCalendar(calendarDivID)
{
  cancelCalendar(calendarDivID);
  mOnHideFunction(mSelectedDay, mSelectedMonth+1, mSelectedYear);
}

function showCalendar(xPos, yPos, calendarDivID, onHideFunction)
{
  getTagById(calendarDivID).style.left = xPos;
  getTagById(calendarDivID).style.top = yPos;
  mOnHideFunction = onHideFunction;
  getTagById(calendarDivID).style.visibility = "visible";
}
