var statusArray = new Array(["A", "Available", "available"], ["C", "Changeover", "changeover"], ["P", "Pending", "short"], ["B", "Booked", "booked"], ["B", "Booked", "booked"], ["-", "Status 5", "unavailable"]);

function createTable(year, destObj) {
    var destStr = "";
	destStr = '<table id="avail_calendar_table" cellpadding="0" cellspacing="0" border="1">';
	destStr += createTableHeader(year);
	destStr += createMonthRows(year);

	destStr += '</table>';

	destObj.innerHTML = destStr;
	updateDays(year);
}
function createTableHeader(year) {
	var tempStr = "";
	tempStr += '<tr>';
	tempStr += '<td id="cal_year">' + year + '</td>';
	for(counter = 1; counter <= 31; counter++) {
	    tempStr += '<td class="cal_dayNum">'+ counter + '</td>';
	}
    return tempStr += '</tr>';
}
function createMonthRows(year) {
	var tempStr = "";
	var counter = 0;
    for(counter = 1; counter <= 12; counter++) {
        tempStr += '<tr>';
        tempStr += printMonth(counter, year);
        tempStr += '</tr>';
    }
    return tempStr;
}
function printMonth(monthIndex, year) {
	var tempStr = "";
	shortMonthName = getMonthName(monthIndex, 3);
	daysInMonth = getMonthNumDays(monthIndex, year);
	tempStr += '<td class="cal_month_name">'+ shortMonthName + '</td>';
	for(counter = 1; counter <= daysInMonth; counter++) {
	    if(isAvailable(monthIndex, counter, year)) {
			dayClass = statusArray[0][2];
			dayStatus = statusArray[0][0];
	    }
	    else {
	        dayClass = "unavailable";
	        dayStatus = "-";
	    }
	    tempStr += '<td id="' + monthIndex + '_' + counter + '"class="' + dayClass + '">' + dayStatus + '</td>';
	}
	for(counter = counter; counter <= 31; counter++) {
	    tempStr += '<td class="blank_days">&nbsp;</td>';
	}
	return tempStr;
}
function getMonthName(monthIndex, nameLen) {
	monthIndex--;
	monthNames = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	strName = new String(monthNames[monthIndex]);
	return strName.substring(0, nameLen);
}
function getMonthNumDays(month, year) {
    monthIndex = month - 1;
    monthLength = [31,28,31,30,31,30,31,31,30,31,30,31];
	if(month == 2) { 
	   	if(year / 4 == Math.floor(year/4)) { 
	       	return 29;
	   	}
	   	else {
	       	return monthLength[monthIndex];
	   	}
	}
	else {
	   	return monthLength[monthIndex];
	}
}
function updateDays(year) {
	var counter = 0;
	for(counter = 0; counter < apps.length; counter++) {
	    fromDay = apps[counter][0];
	    fromMonth = apps[counter][1];
	    toDay = apps[counter][2];
	    toMonth = apps[counter][3];
		aStatus = apps[counter][4];
		popMonth = fromMonth;
		sameMonth = false;
		while(popMonth <= toMonth && !sameMonth) {
		    for(dayCounter = fromDay; dayCounter <= getMonthNumDays(popMonth, year); dayCounter++) {
		        if(popMonth == toMonth && dayCounter >= toDay) {
		            sameMonth = true;
		            break;
		        }
		    	tdID = popMonth + "_" + dayCounter;
		    	tdObj = document.getElementById(tdID);
		    	tdObj.innerHTML = statusArray[aStatus][0];
		    	tdObj.className = statusArray[aStatus][2];
				if(dayCounter >= getMonthNumDays(popMonth, year)) {
				    dayCounter = 0;
				    popMonth++;
				}
		    }
		}
		dayCounter = null;
		popMonth = null;
		
	}
	aStatus = 1;
	var changeOver = true;
	var changeCounter = 0;
	for(changeCounter = 0; changeCounter < apps.length; changeCounter++) {
		startMonth = apps[changeCounter][1];
	    startDay = apps[changeCounter][0];
		toMonth = apps[changeCounter][3];
		toDay = apps[changeCounter][2];
		startChangeOver = true;
		endChangeOver = true;
		if(changeCounter > 0) {
		    if(apps[changeCounter][1] == apps[changeCounter - 1][3] && apps[changeCounter][0] == apps[changeCounter - 1][2]) {
		        startChangeOver = false;
		        endChangeOver = true;
		    }
		}
		if(changeCounter < apps.length - 1) {
		    if(apps[changeCounter][3] == apps[changeCounter + 1][1] && apps[changeCounter][2] == apps[changeCounter + 1][0]) {
		        startChangeOver = true;
		        endChangeOver = false;
		    }
		}
//		alert("startChangeOver: " + startChangeOver + " | endChangeOver: " + endChangeOver + " | Index: " + changeCounter);
		if(startChangeOver === true) {
		    startTDID = startMonth + "_" + startDay;
	    	if(!(startTDObj = document.getElementById(startTDID))) { return false; }
	    	startTDObj = document.getElementById(startTDID);
	    	startTDObj.innerHTML = statusArray[aStatus][0];
	    	startTDObj.className = statusArray[aStatus][2];
		}
		if(endChangeOver === true) {
		    toTDID = toMonth + "_" + toDay;
	    	if(!(toTDObj = document.getElementById(toTDID))) { return false; }
	    	toTDObj = document.getElementById(toTDID);
	    	toTDObj.innerHTML = statusArray[aStatus][0];
	    	toTDObj.className = statusArray[aStatus][2];
		}
	}
	killBeforeToday(year);
}
function killBeforeToday(year) {
	var monthCounter = 0;
	var dayCounter = 0;
	var TdObjId = "";
	for(monthCounter = 1; monthCounter <= 12; monthCounter++) {
	    for(dayCounter = 1; dayCounter <= getMonthNumDays(monthCounter); dayCounter++) {
	        if(!(isAvailable(monthCounter, dayCounter, year))) {
	            tdObjId = monthCounter + "_" + dayCounter;
	            if(tdObj = document.getElementById(tdObjId)) {
	                tdObj.innerHTML = "-";
	                tdObj.className = "unavailable";
	            }
	        }
	    }
	}
}
function isAvailable(viewingMonth, viewingDay, viewingYear) {
	var todayDateObj = new Date();
	var todayDate = todayDateObj.getDate();
	var todayMonth = todayDateObj.getMonth();
	var todayYear = todayDateObj.getFullYear();
	if(viewingYear == "") { viewingYear = todayYear; }
	
	var viewingDateObj = new Date(viewingYear, viewingMonth - 1, viewingDay);
	if(!(viewingDateObj.valueOf() < todayDateObj.valueOf())) {
	    return true;
	}
	else { return false; }
}
