
var selDate1;
var selDate2;
var iReservations;
var iLocalMonths;
var currMonth = new Array(2);
var calMonth = new Array(2);
var weekdays = new Array(7);
var prevClassName = null;

function fGetDaysInMonth(iMonth, iYear) {
	var dPrevDate = new Date(iYear, iMonth, 0);
	return dPrevDate.getDate();
}

function clearSelection(){
	for (w = 1; w < 7; w++) {
		for (d = 0; d < 7; d++) {
            var c = (7*w)+d-7;
            calCell1 = document.getElementById("cal0Cell" + c);
         	unselectCell(calCell1);
			calCell2 = document.getElementById("cal1Cell" + c);
			unselectCell(calCell2);
	    }
	}
}

function indexMonth(month){
    if (month == currMonth[0]) return 0;
    else return 1;
}

function fIsAvailableDay (date){
	day = date.getDate();
	month = date.getMonth();
	return (iReservations[indexMonth(month)][day] == "a")
}



function fIsAvailable(from, to) {
	day1 = from.getDate();
	month1 = from.getMonth();
	day2 = to.getDate();
	month2 = to.getMonth();
	if (month1 == month2) lastday1 = day2;
	else lastday1 = fGetDaysInMonth(month1+1, from.getFullYear());
	
	for (d = day1; d <= lastday1; d++){
		if (iReservations[indexMonth(month1)][d] == "r")
			return false;
		if (iReservations[indexMonth(month1)][d] == "ar" && d < lastday1 && month1 == month2)
			return false;
	}
	for (d = 1; d <= day2 && month1 != month2; d++){
		if (iReservations[indexMonth(month2)][d] == "r")
			return false;
		if (iReservations[indexMonth(month2)][d] == "ar" && d < day2)
			return false;
	}
	return true;
}

function fNextDay(date){
	time = date.getTime();
	return new Date(time + 86400000);
}

function fPrevDay(date){
	time = date.getTime();
	return new Date(time - 86400000);
}

function equalDay(day1, day2){
	return (day1.getTime() == day2.getTime());
}

function selectCell(element) {
	 element.className = element.className + "_Selected";
	 var box = element.parentNode;
     box.className = box.className + "_Selected";
}

function unselectCell(element) {
	if (endsWith(element.className, "_Selected")) {
		element.className = element.className.substr(0, element.className.length - 9);
	 	var box = element.parentNode;
     	box.className = box.className.substr(0, box.className.length - 9);
	}
}

function highlightMonthSelection(dfrom, dto){
	dayfrom = dfrom.getDate();
	month = dfrom.getMonth();
	dayto = dto.getDate();
	firstday = new Date(dfrom.getFullYear(), month, 1);
	offset = firstday.getDay();
	var index;
	if (month == currMonth[0]) index = 0;
	else if (month == currMonth[1]) index = 1;
	for (d = dayfrom; d <= dayto; d++){
        calCell = document.getElementById("cal"+ index +"Cell" + (d + offset - 1));
        selectCell(calCell);
	}
	
}


function highlightSelection(from, to){
	day1 = from.getDate();
	month1 = from.getMonth();
	day2 = to.getDate();
	month2 = to.getMonth();
	if (month1 == month2) lastday1 = to;
	else {
		firstday2 = new Date(to.getFullYear(), month2, 1);
		lastday1 = new Date(from.getFullYear(), month1 + 1, 0);
		highlightMonthSelection(firstday2, to);
	}
	highlightMonthSelection(from, lastday1);
}




function updateFormDate() {  
	date1 = document.getElementById("FromDate");
	if (selDate1 != undefined)
		date1.innerHTML = formatDate(selDate1);
	else date1.innerHTML = "";
	date2 = document.getElementById("ToDate");
	if (selDate2 != undefined)
		date2.innerHTML = formatDate(selDate2);
	else date2.innerHTML = "";
}

function fSelectDay(element, iMonth, iYear){
	form = document.frmCalendar;
	clearSelection();
	
	//variabili temporanee
	var u_selDate1 = selDate1;
	var u_selDate2 = selDate2;
	//controllo
	if (!isNaN(parseInt(element.firstChild.innerHTML))) {
		day = parseInt(element.firstChild.innerHTML);
		
		if (u_selDate1 == undefined && u_selDate2 == undefined){
			u_selDate1 = new Date(iYear, iMonth, day);
			u_selDate2 = u_selDate1;
		} else {
			tempDate = new Date(iYear, iMonth, day);
			if (tempDate < u_selDate1) u_selDate1 = tempDate;
			else if (tempDate > u_selDate2) u_selDate2 = tempDate;
			else if (equalDay(tempDate, u_selDate1) && equalDay(u_selDate1, u_selDate2)) {
				selDate1 = undefined;
				selDate2 = undefined;
				updateFormDate();
				return;
			}
			else if (equalDay(tempDate, u_selDate1)) u_selDate1 = fNextDay(u_selDate1);
			else if (equalDay(tempDate, u_selDate2)) u_selDate2 = fPrevDay(u_selDate2);
			else {
				totinterval = u_selDate2.getTime() - u_selDate1.getTime();
				tempinterval = tempDate.getTime() - u_selDate1.getTime();
				if (tempinterval <= totinterval/2) u_selDate1 = tempDate;
				else u_selDate2 = tempDate;
			}
		}

		//selezione e assegnazione variabili definitive
		if (u_selDate2 == u_selDate1){	
			if (fIsAvailableDay(u_selDate1)){
				selDate1 = u_selDate1;
				selDate2 = u_selDate2;
			}
		} else if (fIsAvailable(u_selDate1, u_selDate2)){
			selDate1 = u_selDate1;
			selDate2 = u_selDate2;
		}
        
        if (selDate1 != undefined && selDate2 != undefined){
            highlightSelection(selDate1, selDate2);
            updateFormDate();
        }
   }
}

function fBuildCal(iYear, iMonth) {
	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();
	var iDaysInMonth = fGetDaysInMonth(iMonth, iYear);
	var iVarDate = 1;
	var i, d, w;
    for (w = 0; w < 7; w++)
        aMonth[0][w] = weekdays[w];
	for (d = iDayOfFirst; d < 7; d++) {
		aMonth[1][d] = iVarDate;
		iVarDate++;
	}
	for (w = 2; w < 7; w++) {
		for (d = 0; d < 7; d++) {
			if (iVarDate <= iDaysInMonth) {
				aMonth[w][d] = iVarDate;
				iVarDate++;
			}
		}
	}
	return aMonth;
}


function fGetClassName (code) {
	if (code == "r") return "cellReserved";
	return "cellAvailable";
}

function fDrawCal(index, iYear, iMonth) {
	calMonth[index] = fBuildCal(iYear, iMonth+1);
	currMonth[index] = iMonth;
	myMonth = calMonth[index];
	document.write("<table cellspacing='3pt' class='tablecal'>")
	document.write("<tr>");
	document.write("<td class='tdcalhead'>" + myMonth[0][0] + "</td>");
	document.write("<td class='tdcalhead'>" + myMonth[0][1] + "</td>");
	document.write("<td class='tdcalhead'>" + myMonth[0][2] + "</td>");
	document.write("<td class='tdcalhead'>" + myMonth[0][3] + "</td>");
	document.write("<td class='tdcalhead'>" + myMonth[0][4] + "</td>");
	document.write("<td class='tdcalhead'>" + myMonth[0][5] + "</td>");
	document.write("<td class='tdcalhead'>" + myMonth[0][6] + "</td>");
	document.write("</tr>");
	if (index == 0) prevClassName = null;
	for (w = 1; w < 7; w++) {
		document.write("<tr>")
		for (d = 0; d < 7; d++) {
            var c = (7*w)+d-7;
			if (!isNaN(myMonth[w][d])) {
				var currClassName = fGetClassName(iReservations[index][myMonth[w][d]]);
				//var minStayVal = iMinStays[index][myMonth[w][d]];
				if (prevClassName == "cellAvailable" && currClassName == "cellReserved") {
					currClassName = "cellRestricted";
					iReservations[index][myMonth[w][d]] = "ar";
				}
                document.write("<td class='tdcalcell'>");
                document.write("<div class='" + currClassName + "_Box'>");
               // var minStayEvent = minStayVal > 1 ?  "onmouseover='showMinStay(\"" + minStayVal + "\")'" : "";
                document.write("<div class='"+ currClassName + "' id='cal"+ index +"Cell" + c + "' onclick='fSelectDay(this,"+ iMonth +", "+ iYear +")' >");
                document.write("<a id='cal"+ index +"Text" + c + "' >" + myMonth[w][d] + "</a>");
                document.write("</div>");
                document.write("<div class='" + currClassName + "_Overlay'></div>");
                document.write("</div>");
                document.write("</td>");
                prevClassName = currClassName;
			}  else {
                document.write("<td class='tdcalcell cellEmpty' id='cal"+ index +"Cell" + c + "'>");
                document.write("<a id='cal"+ index +"Text" + c + "' > </a>");
                document.write("</td>")
			}
		}
		document.write("</tr>");
	}
	document.write("</table>")
}


function fUpdateCal(index, iYear, iMonth) {
	var myMonth;
	currMonth[index] = iMonth;
	calMonth[index] = fBuildCal(iYear, iMonth + 1);
	myMonth = calMonth[index];
	for (w = 1; w < 7; w++) {
		for (d = 0; d < 7; d++) {
            var c = (7*w)+d-7;
            calCell = document.getElementById("cal" + index + "Cell" + c);
            calText = document.getElementById("cal" + index + "Text" + c);
			if (!isNaN(myMonth[w][d])) {
				calText.innerHTML = myMonth[w][d];
				calCell.className = fGetClassName(iReservations[index][myMonth[w][d]]);
			} else {
				calText.innerHTML = " ";
				calCell.className = "cellEmpty";
	        }
	    }
	}
}

function fUpdateCals(iYear, iMonth) {
	form = document.frmCalendar;
	if (!iLocalMonths.Contains(iMonth) || !iLocalMonths.Contains(iMonth+1)) {
        form.action = "ChangeMonth";
        form.nextMonth.value = "" + iMonth;
        form.submit();
        return;
    }
   /* if ((iMonth+1)%12 != 0)
        iYear2 = iYear + 1;
    else iYear2 = iYear;
    fUpdateCal(0, iYear, iMonth, iLocalMonths);
    fUpdateCal(1, iYear2, (iMonth+1)%12, iLocalMonths);*/
}
