//
// JavaScript Calendar Component
// Author: Robert W. Husted  (robert.husted@iname.com)
// Date:   8/22/1999
// Modified Date: 11/30/1999
// Modified By:   Robert W. Husted
// Notes:  Added frameset support (changed reference for "newWin" to "top.newWin")
//         Also changed Spanish "March" from "Marcha" to "Marzo"
//         Fixed JavaScript Date Anomaly affecting days > 28
// 
// 
// 
// Usage:  Add the following lines of code to your page to enable the Calendar
//         component.
//
//
//         // THIS LINE LOADS THE JS LIBRARY FOR THE CALENDAR COMPONENT 
//
//         <SCRIPT LANGUAGE="JavaScript" SRC="calendar.js"></SCRIPT>
//
//
//
//         // THIS LINE IS USED IN CONJUNCTION WITH A FORM FIELD (myDateField) IN A FORM (myForm).
//         // Replace "myForm" and "myDateField" WITH THE NAME OF YOUR FORM AND INPUT FIELD RESPECTIVELY
//         // WINDOW OPTIONS SET THE WIDTH, HEIGHT, AND X/Y POSITION OF THE CALENDAR WINDOW 
//         // WITH TITLEBAR ON, ALL OTHER OPTIONS (TOOLBARS, ETC) ARE DISABLED BY DEFAULT
//
//         <A HREF="javascript:doNothing()" onClick="setDateField(document.myForm.myDateField);top.newWin = window.open('calendar.html','cal','dependent=yes,width=210,height=230,screenX=200,screenY=300,titlebar=yes')">
//         <IMG SRC="calendar.gif" border=0></A>
//
//
// 
// Required Files:
//
//         calendar.js   - contains all JavaScript functions to make the calendar work
//
//         calendar.html - frameset document (not required if you call the showCalendar()
//                         function.  However, calling showCalendar() directly causes
//                         the Java Virtual Machine (JVM) to start which slows down the
//                         loading of the calendar.)
//
// 
// Files Generally Included:
//
//         calendar.gif  - image that looks like a little calendar
// 
//         yourPage.html - page that contains a form and a date field which implements 
//                         the calendar component
// 

// BEGIN USER-EDITABLE SECTION -----------------------------------------------------

// SPECIFY DATE FORMAT RETURNED BY THIS CALENDAR
// (THIS IS ALSO THE DATE FORMAT RECOGNIZED BY THIS CALENDAR)

// DATE FORMAT OPTIONS:
//
// dd   = 1 or 2-digit Day
// DD   = 2-digit Day
// mm   = 1 or 2-digit Month
// MM   = 2-digit Month
// yy   = 2-digit Year
// YY   = 4-digit Year
// yyyy = 4-digit Year
// month   = Month name in lowercase letters
// Month   = Month name in initial caps
// MONTH   = Month name in captital letters
// mon     = 3-letter month abbreviation in lowercase letters
// Mon     = 3-letter month abbreviation in initial caps
// MON     = 3-letter month abbreviation in uppercase letters
// weekday = name of week in lowercase letters
// Weekday = name of week in initial caps
// WEEKDAY = name of week in uppercase letters
// wkdy    = 3-letter weekday abbreviation in lowercase letters
// Wkdy    = 3-letter weekday abbreviation in initial caps
// WKDY    = 3-letter weekday abbreviation in uppercase letters
//
// Examples:
//
// calDateFormat = "mm/dd/yy";
// calDateFormat = "Weekday, Month dd, yyyy";
// calDateFormat = "wkdy, mon dd, yyyy";
// calDateFormat = "DD.MM.YY";     // FORMAT UNSUPPORTED BY JAVASCRIPT -- REQUIRES CUSTOM PARSING
//

calDateFormat    = "dd/mm/yyyy";

// CALENDAR WINDOW
winPrefs = "dependent=yes,width=225,height=275,left=" + ((screen.width - 225) / 2) + ",top=" + ((screen.height - 275) / 2) + ",titlebar=yes";

// CALENDAR COLORS
topBackground    = "#E4E5E5";         				// BG COLOR OF THE TOP FRAME
bottomBackground = "#E4E5E5";						// BG COLOR OF THE BOTTOM FRAME
tablebgcolor     = "#E4E5E5";						// BG COLOR OF THE BOTTOM FRAME'S TABLE
cellColor        = "#cacaca";						// TABLE CELL BG COLOR OF THE DATE CELLS IN THE BOTTOM FRAME
headingCellColor = "#cb2c2c";						// TABLE CELL BG COLOR OF THE WEEKDAY ABBREVIATIONS
headingTextColor = "#ffffff";						// TEXT COLOR OF THE WEEKDAY ABBREVIATIONS
dateColor        = "#000000";						// TEXT COLOR OF THE LISTED DATES (1-28+)
focusColor       = "#000000";						// TEXT COLOR OF THE SELECTED DATE (OR CURRENT DATE)
hoverColor       = "#000000";						// TEXT COLOR OF A LINK WHEN YOU HOVER OVER IT
fontStyle        = "12px Verdana";					// TEXT STYLE FOR DATES
headingFontStyle = "bold 13px Verdana";				// TEXT STYLE FOR WEEKDAY ABBREVIATIONS

// FORMATTING PREFERENCES
bottomborder  = false;        // TRUE/FALSE (WHETHER TO DISPLAY BOTTOM CALENDAR border)
tableborder   = 1;            // SIZE OF CALENDAR TABLE border (BOTTOM FRAME) 0=none

// END USER-EDITABLE SECTION -------------------------------------------------------

// DETERMINE BROWSER BRAND
var isNav = false;
var isIE  = false;

// ASSUME IT'S EITHER NETSCAPE OR MSIE
if (navigator.appName == "Netscape") isNav = true;
else  isIE = true;

// GET CURRENTLY SELECTED LANGUAGE
selectedLanguage = "it"; // navigator.language;

// INIT ARRAYS OF MONTH AND WEEK DAY
initString();
initMonthList();
initWeekdayList();

// PRE-BUILD PORTIONS OF THE CALENDAR WHEN THIS JS LIBRARY LOADS INTO THE BROWSER
buildCalParts();

// CALENDAR FUNCTIONS BEGIN HERE ---------------------------------------------------

// SET THE INITIAL VALUE OF THE GLOBAL DATE FIELD
function setDateField(dateField)
{
    // ASSIGN THE INCOMING FIELD OBJECT TO A GLOBAL VARIABLE
    calDateField = dateField;

    // GET THE VALUE OF THE INCOMING FIELD
    inDate = dateField.value;

    // SET calDate TO THE DATE IN THE INCOMING FIELD OR DEFAULT TO TODAY'S DATE
    if (setInitialDate() == false) return false;

    // THE CALENDAR FRAMESET DOCUMENTS ARE CREATED BY JAVASCRIPT FUNCTIONS
    calDocTop    = buildTopCalFrame();
    calDocBottom = buildBottomCalFrame();
    
    return true;
}

// SET THE INITIAL CALENDAR DATE TO TODAY OR TO THE EXISTING VALUE IN dateField
function setInitialDate()
{
    // CREATE A NEW DATE OBJECT (WILL GENERALLY PARSE CORRECT DATE EXCEPT WHEN "." IS USED AS A DELIMITER)
    // (THIS ROUTINE DOES *NOT* CATCH ALL DATE FORMATS, IF YOU NEED TO PARSE A CUSTOM DATE FORMAT, DO IT HERE)

	if (inDate.length > 0)
	{
		newDate = inDate
		newDateFormat = calDateFormat

		newDateDay = -1;
		newDateMonth = -1;
		newDateYear = -1;

		while (newDateFormat.length > 0)
		{
			if (newDateFormat.substr(0, 5).toLowerCase() == "month")
			{
				for (ii = 0; ii < monthArray.length; ii++)
				{
					if (newDate.substr(0, monthArray[ii].length).toLowerCase() == monthArray[ii].toLowerCase())
					{
						if (newDateMonth >= 0) return false;
						newDateMonth = ii;
						newDate = newDate.substr(0, newDate.length - monthArray[ii].length);
						break;
					}
				}			
				
				newDateFormat = newDateFormat.substr(5, newDateFormat.length - 5);
			}
			else if (newDateFormat.substr(0, 3).toLowerCase() == "mon")
			{
				for (ii = 0; ii < monthArray.length; ii++)
				{
					if (newDate.substr(0, 3).toLowerCase() == monthArray[ii].substr(0, 3).toLowerCase())
					{
						if (newDateMonth >= 0) return false;
						newDateMonth = ii;
						newDate = newDate.substr(monthArray[ii].length, newDate.length - monthArray[ii].length);
						break;
					}
				}			
				
				newDateFormat = newDateFormat.substr(3, newDateFormat.length - 3);
			}
			else if (newDateFormat.substr(0, 7).toLowerCase() == "weekday")
			{
				for (ii = 0; ii < monthArray.length; ii++)
				{
					if (newDate.substr(0, weekdayList[ii].length).toLowerCase() == weekdayList[ii].toLowerCase())
					{
						newDate = newDate.substr(weekdayList[ii].length, newDate.length - weekdayList[ii].length);
						break;
					}
				}			
	
				newDateFormat = newDateFormat.substr(7, newDateFormat.length - 7);
			}
			else if (newDateFormat.substr(0, 4).toLowerCase() == "wkdy")
			{
				for (ii = 0; ii < monthArray.length; ii++)
				{
					if (newDate.substr(0, weekdayArray[ii].length).toLowerCase() == weekdayArray[ii].toLowerCase())
					{
						newDate = newDate.substr(weekdayArray[ii].length, newDate.length - weekdayArray[ii].length);
						break;
					}
				}			
	
				newDateFormat = newDateFormat.substr(4, newDateFormat.length - 4);
			}
			else if (newDateFormat.substr(0, 4).toLowerCase() == "yyyy")
			{
				if (newDateYear >= 0) return false;
				newDateYear = parseInt(newDate.substr(0, 4), 10);
				if (isNaN(newDateYear)) return false;
				newDate = newDate.substr(4, newDate.length - 4);
				newDateFormat = newDateFormat.substr(4, newDateFormat.length - 4);
			}
			else if (newDateFormat.substr(0, 2) == "YY")
			{
				if (newDateYear >= 0) return false;
				newDateYear = parseInt(newDate.substr(0, 4), 10);
				if (isNaN(newDateYear)) return false;
				newDate = newDate.substr(4, newDate.length - 4);
				newDateFormat = newDateFormat.substr(2, newDateFormat.length - 2);
			}
			else if (newDateFormat.substr(0, 2).toLowerCase() == "yy")
			{
				if (newDateYear >= 0) return false;
				newDateYear = parseInt(newDate.substr(0, 2), 10);
				if (isNaN(newDateYear)) return false;
				newDateYear = 1900 + newDateYear
				newDate = newDate.substr(2, newDate.length - 2);
				newDateFormat = newDateFormat.substr(2, newDateFormat.length - 2);
			}
			else if (newDateFormat.substr(0, 2) == "MM")
			{
				if (newDateMonth >= 0) return false;
				newDateMonth = parseInt(newDate.substr(0, 2), 10);
				if (isNaN(newDateMonth)) return false;
				newDateMonth = newDateMonth - 1;
				newDate = newDate.substr(2, newDate.length - 2);
				newDateFormat = newDateFormat.substr(2, newDateFormat.length - 2);
			}
			else if (newDateFormat.substr(0, 2).toLowerCase() == "mm")
			{
				if (newDateMonth >= 0) return false;
				if ((newDate.charAt(0) >= '0') && (newDate.charAt(0) <= '9'))
				{
					newDateMonth = parseInt(newDate.charAt(0))
					if (isNaN(newDateMonth)) return false;
					newDate = newDate.substr(1, newDate.length - 1);
				}

				if ((newDate.charAt(0) >= '0') && (newDate.charAt(0) <= '9'))
				{
					newDateMonthA = parseInt(newDate.charAt(0))
					if (isNaN(newDateMonthA)) return false;
					newDateMonth = newDateMonth * 10 + newDateMonthA
					newDate = newDate.substr(1, newDate.length - 1);
				}
			
				newDateMonth = newDateMonth - 1;
				newDateFormat = newDateFormat.substr(2, newDateFormat.length - 2);
			}
			else if (newDateFormat.substr(0, 2).toLowerCase() == "dd")
			{
				if (newDateDay >= 0) return false;
				if ((newDate.charAt(0) >= '0') && (newDate.charAt(0) <= '9'))
				{
					newDateDay = parseInt(newDate.charAt(0))
					if (isNaN(newDateDay)) return false;
					newDate = newDate.substr(1, newDate.length - 1);
				}
	
				if ((newDate.charAt(0) >= '0') && (newDate.charAt(0) <= '9'))
				{
					newDateDayA = parseInt(newDate.charAt(0))
					if (isNaN(newDateDayA)) return false;
					newDateDay = newDateDay * 10 + newDateDayA
					newDate = newDate.substr(1, newDate.length - 1);
				}
			
				newDateFormat = newDateFormat.substr(2, newDateFormat.length - 2);
			}
			else
			{	
				newDate = newDate.substr(1, newDate.length - 1);
				newDateFormat = newDateFormat.substr(1, newDateFormat.length - 1);
			}
		}

		calDate = new Date(newDateYear, newDateMonth, newDateDay);

	    // IF THE INCOMING DATE IS INVALID, USE THE CURRENT DATE
		if (isNaN(calDate)) return false;

		if ((newDateDay != calDate.getDate()) || 
			(newDateMonth != calDate.getMonth()) || 
			(newDateYear != calDate.getFullYear())) {
			return false;
		}
	}
	else calDate = new Date();

    // KEEP TRACK OF THE CURRENT DAY VALUE
	calDay  = calDate.getDate();

    // SET DAY VALUE TO 1... TO AVOID JAVASCRIPT DATE CALCULATION ANOMALIES
    // (IF THE MONTH CHANGES TO FEB AND THE DAY IS 30, THE MONTH WOULD CHANGE TO MARCH
    //  AND THE DAY WOULD CHANGE TO 2.  SETTING THE DAY TO 1 WILL PREVENT THAT)
	calDate.setDate(1);

	return true;
}

// POPUP A WINDOW WITH THE CALENDAR IN IT
function showCalendar(dateField, dateFieldD, dateFieldM, dateFieldY)
{
	calDateFieldD = dateFieldD;
	calDateFieldM = dateFieldM;
	calDateFieldY = dateFieldY;

    // SET INITIAL VALUE OF THE DATE FIELD AND CREATE TOP AND BOTTOM FRAMES
    if (setDateField(dateField) == false)
	{
		alert(errorMsg);
		return;
    }

	// INIT ARRAYS OF MONTH AND WEEK DAY
	initString();
	initMonthList();
	initWeekdayList();

	// PRE-BUILD PORTIONS OF THE CALENDAR WHEN THIS JS LIBRARY LOADS INTO THE BROWSER
	buildCalParts();

    // USE THE JAVASCRIPT-GENERATED DOCUMENTS (calDocTop, calDocBottom) IN THE FRAMESET
    calDocFrameset = 
        "<html><head><title>Calendario</title></head>\n" +
        "<frameset rows='70,*' frameborder='0' framespacing='0'>\n" +
        "  <frame name ='topCalFrame'		frameborder='0' framespacing='0' src='javascript:parent.opener.calDocTop'	scrolling='no'>\n" +
        "  <frame name ='bottomCalFrame'	frameborder='0' framespacing='0' src='javascript:parent.opener.calDocBottom'	scrolling='no'>\n" +
        "</frameset>\n";

    // DISPLAY THE CALENDAR IN A NEW POPUP WINDOW
    top.newWin = window.open("javascript:parent.opener.calDocFrameset", "calWin", winPrefs);
    top.newWin.focus();
}

// CREATE THE TOP CALENDAR FRAME
function buildTopCalFrame()
{
    var currentDay = (new Date()).getDate();
	// CREATE THE TOP FRAME OF THE CALENDAR
    var calDoc =
        "<html>\n" +
        "<body leftmargin='0' topmargin='10' marginwidth='0' marginheight='0' bgcolor='" + topBackground + "'>\n" +
        "<form name ='calControl' onSubmit='return false;'>\n" +
        "<center>\n" +
        "<table cellpadding='0' cellspacing='1' border='0'>\n" +
        "<tr><td colspan=7>\n" +
        "<center>\n"
		+ getMonthSelect() +
        "&nbsp;&nbsp;<input style='font: bold 12px Verdana; color: #000000;' name ='year' value='" + calDate.getFullYear() + "' type='text' size='4' maxlength='4' onChange='parent.opener.setYear();'>\n" +
        "</center>\n" +
        "</td>\n" +
        "</tr>\n" +
        "<tr>\n" +
        "<td colspan=7>\n" +
        "<input type='button' name ='previousYear'	style='font: bold 12px Verdana; color: #000000;' value='<<' onClick='parent.opener.setPreviousYear();'>\n" +
		"<input type='button' name ='previousMonth'	style='font: bold 12px Verdana; color: #000000;' value=' < ' onClick='parent.opener.setPreviousMonth();'>\n" +
		//"<input type='button' name ='today'			style='font: bold 12px Verdana; color: #000000;' value='" + strToday + "' onClick='parent.opener.setToday();'>\n" +
		"<input type='button' name ='today'			style='font: bold 12px Verdana; color: #000000;' value='" + strToday + "' onClick='parent.opener.returnDate(" + currentDay + ");'>\n" +
		"<input type='button' name ='nextMonth'		style='font: bold 12px Verdana; color: #000000;' value=' > ' onClick='parent.opener.setNextMonth();'>\n" +
		"<input type='button' name ='nextYear'		style='font: bold 12px Verdana; color: #000000;' value='>>' onClick='parent.opener.setNextYear();'>\n" +
        "</td>\n" +
        "</tr>\n" +
        "</table>\n" +
        "</center>\n" +
        "</form>\n" +
        "</body>\n" +
        "</html>\n";

    return calDoc;
}

// CREATE THE BOTTOM CALENDAR FRAME 
// (THE MONTHLY CALENDAR)
function buildBottomCalFrame()
{       
    // START CALENDAR DOCUMENT
    var calDoc = calendarBegin;

    // GET MONTH, AND YEAR FROM GLOBAL CALENDAR DATE
    month   = calDate.getMonth();
    year    = calDate.getFullYear();


    // GET GLOBALLY-TRACKED DAY VALUE (PREVENTS JAVASCRIPT DATE ANOMALIES)
    day     = calDay;

    var i   = 0;

    // DETERMINE THE NUMBER OF DAYS IN THE CURRENT MONTH
    var days = getDaysInMonth();

    // IF GLOBAL DAY VALUE IS > THAN DAYS IN MONTH, HIGHLIGHT LAST DAY IN MONTH
    if (day > days) day = days;

    // DETERMINE WHAT DAY OF THE WEEK THE CALENDAR STARTS ON
    var firstOfMonth = new Date (year, month, 1);

    // GET THE DAY OF THE WEEK THE FIRST DAY OF THE MONTH FALLS ON
    var startingPos  = firstOfMonth.getDay();
    days += startingPos;

    // KEEP TRACK OF THE COLUMNS, START A NEW ROW AFTER EVERY 7 COLUMNS
    var columnCount = 0;

    // MAKE BEGINNING NON-DATE CELLS BLANK
    for (i = 0; i < startingPos; i++)
	{
        calDoc += blankCell;
		columnCount++;
    }

    // SET VALUES FOR DAYS OF THE MONTH
    var currentDay = 0;
    var dayType    = "weekday";

    // DATE CELLS CONTAIN A NUMBER
    for (i = startingPos; i < days; i++)
	{
		var paddingChar = "&nbsp;";

        // ADJUST SPACING SO THAT ALL LINKS HAVE RELATIVELY EQUAL WIDTHS
        if (i-startingPos+1 < 10) padding = "&nbsp;&nbsp;";
        else padding = "&nbsp;";

        // GET THE DAY CURRENTLY BEING WRITTEN
        currentDay = i-startingPos+1;

        // SET THE TYPE OF DAY, THE focusDay GENERALLY APPEARS AS A DIFFERENT COLOR
        if (currentDay == day) dayType = "focusDay";
        else dayType = "weekday";

        // ADD THE DAY TO THE CALENDAR STRING
        calDoc += "<td align='center' bgcolor='" + cellColor + "' height='26'><a class='" + dayType + "' href='javascript:parent.opener.returnDate(" + currentDay + ");'>" + padding + currentDay + paddingChar + "</a></td>";
        columnCount++;

        // START A NEW ROW WHEN NECESSARY
        if (columnCount % 7 == 0) calDoc += "</tr><tr>";
    }

    // MAKE REMAINING NON-DATE CELLS BLANK
    for (i=days; i<42; i++)
	{
        calDoc += blankCell;
		columnCount++;

        // START A NEW ROW WHEN NECESSARY
        if (columnCount % 7 == 0)
		{
            calDoc += "</tr>";
            if (i<41) calDoc += "<tr>";
        }
    }

    // FINISH THE NEW CALENDAR PAGE
    calDoc += calendarEnd;

    // RETURN THE COMPLETED CALENDAR PAGE
    return calDoc;
}

// WRITE THE MONTHLY CALENDAR TO THE BOTTOM CALENDAR FRAME
function writeCalendar()
{
    // CREATE THE NEW CALENDAR FOR THE SELECTED MONTH & YEAR
    calDocBottom = buildBottomCalFrame();

    // WRITE THE NEW CALENDAR TO THE BOTTOM FRAME
    top.newWin.frames['bottomCalFrame'].document.open();
    top.newWin.frames['bottomCalFrame'].document.write(calDocBottom);
    top.newWin.frames['bottomCalFrame'].document.close();
}

// SET THE CALENDAR TO TODAY'S DATE AND DISPLAY THE NEW CALENDAR
function setToday()
{
    // SET GLOBAL DATE TO TODAY'S DATE
    calDate = new Date();

    // SET DAY MONTH AND YEAR TO TODAY'S DATE
    var month = calDate.getMonth();
    var year  = calDate.getFullYear();

    // SET MONTH IN DROP-DOWN LIST
    top.newWin.frames['topCalFrame'].document.calControl.month.selectedIndex = month;

    // SET YEAR VALUE
    top.newWin.frames['topCalFrame'].document.calControl.year.value = year;

    // DISPLAY THE NEW CALENDAR
    writeCalendar();
}

// SET THE GLOBAL DATE TO THE NEWLY ENTERED YEAR AND REDRAW THE CALENDAR
function setYear()
{
    // GET THE NEW YEAR VALUE
    var year  = top.newWin.frames['topCalFrame'].document.calControl.year.value;

    // IF IT'S A FOUR-DIGIT YEAR THEN CHANGE THE CALENDAR
    if (isFourDigitYear(year))
	{
        calDate.setFullYear(year);
        writeCalendar();
    }
    else
	{
        // HIGHLIGHT THE YEAR IF THE YEAR IS NOT FOUR DIGITS IN LENGTH
        top.newWin.frames['topCalFrame'].document.calControl.year.focus();
        top.newWin.frames['topCalFrame'].document.calControl.year.select();
    }
}

// SET THE GLOBAL DATE TO THE SELECTED MONTH AND REDRAW THE CALENDAR
function setCurrentMonth()
{
    // GET THE NEWLY SELECTED MONTH AND CHANGE THE CALENDAR ACCORDINGLY
    var month = top.newWin.frames['topCalFrame'].document.calControl.month.selectedIndex;

    calDate.setMonth(month);
    writeCalendar();
}

// SET THE GLOBAL DATE TO THE PREVIOUS YEAR AND REDRAW THE CALENDAR
function setPreviousYear()
{
    var year  = top.newWin.frames['topCalFrame'].document.calControl.year.value;

    if (isFourDigitYear(year) && year > 1000)
	{
        year--;
        calDate.setFullYear(year);
        top.newWin.frames['topCalFrame'].document.calControl.year.value = year;
        writeCalendar();
    }
}

// SET THE GLOBAL DATE TO THE PREVIOUS MONTH AND REDRAW THE CALENDAR
function setPreviousMonth()
{
    var year  = top.newWin.frames['topCalFrame'].document.calControl.year.value;

    if (isFourDigitYear(year))
	{
        var month = top.newWin.frames['topCalFrame'].document.calControl.month.selectedIndex;

        // IF MONTH IS JANUARY, SET MONTH TO DECEMBER AND DECREMENT THE YEAR
        if (month == 0)
		{
            month = 11;
            if (year > 1000)
			{
                year--;
                calDate.setFullYear(year);
                top.newWin.frames['topCalFrame'].document.calControl.year.value = year;
            }
        }
        else month--;

        calDate.setMonth(month);
        top.newWin.frames['topCalFrame'].document.calControl.month.selectedIndex = month;
        writeCalendar();
    }
}

// SET THE GLOBAL DATE TO THE NEXT MONTH AND REDRAW THE CALENDAR
function setNextMonth()
{
    var year = top.newWin.frames['topCalFrame'].document.calControl.year.value;

    if (isFourDigitYear(year))
	{
        var month = top.newWin.frames['topCalFrame'].document.calControl.month.selectedIndex;

        // IF MONTH IS DECEMBER, SET MONTH TO JANUARY AND INCREMENT THE YEAR
        if (month == 11)
		{
            month = 0;
            year++;
            calDate.setFullYear(year);
            top.newWin.frames['topCalFrame'].document.calControl.year.value = year;
        }
        else month++;

        calDate.setMonth(month);
        top.newWin.frames['topCalFrame'].document.calControl.month.selectedIndex = month;
        writeCalendar();
    }
}

// SET THE GLOBAL DATE TO THE NEXT YEAR AND REDRAW THE CALENDAR
function setNextYear()
{
    var year  = top.newWin.frames['topCalFrame'].document.calControl.year.value;

    if (isFourDigitYear(year))
	{
        year++;
        calDate.setFullYear(year);
        top.newWin.frames['topCalFrame'].document.calControl.year.value = year;
        writeCalendar();
    }
}

// GET NUMBER OF DAYS IN MONTH
function getDaysInMonth()
{
    var days;
    var month = calDate.getMonth()+1;
    var year  = calDate.getFullYear();

    // RETURN 31 DAYS
    if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) days = 31;

    // RETURN 30 DAYS
    else
	{
		if (month==4 || month==6 || month==9 || month==11) days = 30;
	    // RETURN 29 DAYS
	    else
		{
			if (month==2)
			{
	        	if (isLeapYear(year)) days = 29;
		        else days = 28;
	        }
	    }
	}

    return (days);
}

// CHECK TO SEE IF YEAR IS A LEAP YEAR
function isLeapYear (Year)
{
    if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) return (true);
    else return (false);
}

// ENSURE THAT THE YEAR IS FOUR DIGITS IN LENGTH
function isFourDigitYear(year)
{
    if (year.length != 4)
	{
        top.newWin.frames['topCalFrame'].document.calControl.year.value = calDate.getFullYear();
        top.newWin.frames['topCalFrame'].document.calControl.year.select();
        top.newWin.frames['topCalFrame'].document.calControl.year.focus();
    }
    else return true;
}

// BUILD THE MONTH SELECT LIST
function getMonthSelect()
{
    // BROWSER LANGUAGE CHECK DONE PREVIOUSLY (navigator.language())
    // FIRST TWO CHARACTERS OF LANGUAGE STRING SPECIFIES THE LANGUAGE
    // (THE LAST THREE OPTIONAL CHARACTERS SPECIFY THE LANGUAGE SUBTYPE)
    // SET THE NAMES OF THE MONTH TO THE PROPER LANGUAGE (DEFAULT TO ENGLISH)

    // DETERMINE MONTH TO SET AS DEFAULT
    var activeMonth = calDate.getMonth();

    // START HTML SELECT LIST ELEMENT
    monthSelect = "<select style='font: bold 12px Verdana; color: #000000;' name ='month' onChange='parent.opener.setCurrentMonth();'>";

    // LOOP THROUGH MONTH ARRAY
    for (i in monthArray)
	{
        // SHOW THE CORRECT MONTH IN THE SELECT LIST
        if (i == activeMonth) monthSelect += "<option selected>" + monthArray[i] + "\n";
        else monthSelect += "<option>" + monthArray[i] + "\n";
    }

    monthSelect += "</select>";

    // RETURN A STRING VALUE WHICH CONTAINS A SELECT LIST OF ALL 12 MONTHS
    return monthSelect;
}

try
{
	selectedLanguage = selectedLanguage;
}

catch (e) { var selectedLanguage = "it"; }

// INIT ERROR
function initString()
{
    // IF FRENCH
    if (selectedLanguage == "fr") {
		strToday = "FR Today"
        errorMsg = "FR Error";
    }
    // IF GERMAN
    else if (selectedLanguage == "de") {
		strToday = "DE Today"
        errorMsg = "DE Error";
    }
    // IF SPANISH
    else if (selectedLanguage == "es") {
		strToday = "ES Today"
        errorMsg = "ES Error";
    }
    // IF ITALIAN
    else if (selectedLanguage == "it") {
		strToday = "Oggi"
        errorMsg = "ATTENZIONE: la data è errata oppure non è nel formato richiesto";
    }
    // DEFAULT TO ENGLISH
    else {
		strToday = "Today"
        errorMsg = "EN Error";
    }
    
    errorMsg = errorMsg + " " + calDateFormat;
}

// INIT MONTH DEPENDING ON LANGUAGE
function initMonthList()
{
    // IF FRENCH
    if (selectedLanguage == "fr") {
        monthArray = new Array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',
                               'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Décembre');
    }
    // IF GERMAN
    else if (selectedLanguage == "de") {
        monthArray = new Array('Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
                               'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember');
    }
    // IF SPANISH
    else if (selectedLanguage == "es") {
        monthArray = new Array('Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',
                               'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre');
    }
    // IF ITALIAN
    else if (selectedLanguage == "it") {
        monthArray = new Array('Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno',
                               'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre');
    }
    // DEFAULT TO ENGLISH
    else {
        monthArray = new Array('January', 'February', 'March', 'April', 'May', 'June',
                               'July', 'August', 'September', 'October', 'November', 'December');
    }
}

// INIT DAYS OF THE WEEK DEPENDING ON LANGUAGE
function initWeekdayList()
{
    // IF FRENCH
    if (selectedLanguage == "fr") {
        weekdayList  = new Array('Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi');
        weekdayArray = new Array('Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa');
    }
    // IF GERMAN
    else if (selectedLanguage == "de") {
        weekdayList  = new Array('Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag');
        weekdayArray = new Array('So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa');
    }
    // IF SPANISH
    else if (selectedLanguage == "es") {
        weekdayList  = new Array('Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado')
        weekdayArray = new Array('Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa');
    }
    // IF ITALIAN
    else if (selectedLanguage == "it") {
        weekdayList  = new Array('Domenica', 'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato')
        weekdayArray = new Array('Do', 'Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa');
    }
    // DEFAULT TO ENGLISH
    else {
        weekdayList  = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
        weekdayArray = new Array('Su','Mo','Tu','We','Th','Fr','Sa');
    }
}

// SET DAYS OF THE WEEK DEPENDING ON LANGUAGE
function createWeekdayList()
{
    // START HTML TO HOLD WEEKDAY NAMES IN TABLE FORMAT
    var weekdays = "<tr align='center' valign='middle' bgcolor='" + headingCellColor + "'>";

    // LOOP THROUGH WEEKDAY ARRAY
    for (i in weekdayArray) weekdays += "<td height='26' class='heading' align='center'><img src='img/dummy.gif' width='26' height='1'><br>" + weekdayArray[i] + "</td>";
    weekdays += "</tr>";

    // RETURN TABLE ROW OF WEEKDAY ABBREVIATIONS TO DISPLAY ABOVE THE CALENDAR
    return weekdays;
}

// PRE-BUILD PORTIONS OF THE CALENDAR (FOR PERFORMANCE REASONS)

function buildCalParts()
{
    // GENERATE WEEKDAY HEADERS FOR THE CALENDAR
    weekdays = createWeekdayList();

    // BUILD THE BLANK CELL ROWS
    blankCell = "<td align=center bgcolor='" + cellColor + "' height='26'>&nbsp;&nbsp;&nbsp;</td>";

    // BUILD THE TOP PORTION OF THE CALENDAR PAGE USING CSS TO CONTROL SOME DISPLAY ELEMENTS
    calendarBegin =
        "<html>" +
        "<head>" +

        // STYLESHEET DEFINES APPEARANCE OF CALENDAR
        "<style type='text/css'>" +
	        "<!--" +
	        "td.heading			{ text-decoration: none; color:" + headingTextColor + "; font: " + headingFontStyle + "; }" +
	        "A					{ color: " + dateColor + ";		text-decoration: none; font: " + fontStyle + "; }" +
	        "A.focusDay:link	{ color: " + focusColor + ";	text-decoration: none; font: bold " + fontStyle + "; }" +
	        "A.focusDay:hover	{ color: " + focusColor + ";	text-decoration: none; font: bold " + fontStyle + "; }" +
	        "A.weekday:link		{ color: " + dateColor + ";		text-decoration: none; font: " + fontStyle + "; }" +
	        "A.weekday:hover	{ color: " + hoverColor + ";	font: bold " + fontStyle + "; }" +
	        "-->" +
        "</style>" +

        "</head>" +
        "<body leftmargin='0' topmargin='0' marginwidth='0' marginheight='0' bgcolor='" + bottomBackground + "'>" +
        "<center>";

        // NAVIGATOR NEEDS A TABLE CONTAINER TO DISPLAY THE TABLE OUTLINES PROPERLY
        if (isNav) calendarBegin += "<table cellpadding='0' cellspacing='1' border='" + tableborder + "' bordercolor='#ffffff' align='center' bgcolor='" + tablebgcolor + "'><tr><td>";

        // BUILD WEEKDAY HEADINGS
        calendarBegin += "<table cellpadding='0' cellspacing='1' border='" + tableborder + "' bordercolor='#ffffff' align='center' bgcolor='" + tablebgcolor + "'>" + weekdays + "<tr>";

    // BUILD THE BOTTOM PORTION OF THE CALENDAR PAGE
    calendarEnd = "";

        // WHETHER OR NOT TO DISPLAY A THICK LINE BELOW THE CALENDAR
        if (bottomborder) calendarEnd += "<tr></tr>";

        // NAVIGATOR NEEDS A TABLE CONTAINER TO DISPLAY THE borderS PROPERLY
        if (isNav) calendarEnd += "</td></tr></table>";

        // END THE TABLE AND HTML DOCUMENT
        calendarEnd += "</table></center></body></html>";
}

// REPLACE ALL INSTANCES OF find WITH replace
// inString: the string you want to convert
// find:     the value to search for
// replace:  the value to substitute
//
// usage:    jsReplace(inString, find, replace);
// example:  jsReplace("To be or not to be", "be", "ski");
//           result: "To ski or not to ski"
//
function jsReplace(inString, find, replace)
{
    var outString = "";

    if (!inString)return "";

    // REPLACE ALL INSTANCES OF find WITH replace
    if (inString.indexOf(find) != -1)
	{
        // SEPARATE THE STRING INTO AN ARRAY OF STRINGS USING THE VALUE IN find
        t = inString.split(find);

        // JOIN ALL ELEMENTS OF THE ARRAY, SEPARATED BY THE VALUE IN replace
        return (t.join(replace));
    }
    else return inString;
}

// JAVASCRIPT FUNCTION -- DOES NOTHING (USED FOR THE HREF IN THE CALENDAR CALL)
function doNothing() {}

// ENSURE THAT VALUE IS TWO DIGITS IN LENGTH
function makeTwoDigit(inValue)
{
    var numVal = parseInt(inValue, 10);

    // VALUE IS LESS THAN TWO DIGITS IN LENGTH
    if (numVal < 10)
	{
        // ADD A LEADING ZERO TO THE VALUE AND RETURN IT
        return("0" + numVal);
    }
    else return numVal;
}

// SET FIELD VALUE TO THE DATE SELECTED AND CLOSE THE CALENDAR WINDOW
function returnDate(inDay)
{
	// inDay = THE DAY THE USER CLICKED ON
    calDate.setDate(inDay);

    // SET THE DATE RETURNED TO THE USER
    var day           = calDate.getDate();
    var month         = calDate.getMonth()+1;
    var year          = calDate.getFullYear();
    var monthString   = monthArray[calDate.getMonth()];
    var monthAbbrev   = monthString.substring(0,3);
    var weekday       = weekdayList[calDate.getDay()];
    var weekdayAbbrev = weekday.substring(0,3);

    outDate = calDateFormat;

    // RETURN TWO DIGIT DAY
    if (calDateFormat.indexOf("DD") != -1) {
        day = makeTwoDigit(day);
        outDate = jsReplace(outDate, "DD", day);
    }
    // RETURN ONE OR TWO DIGIT DAY
    else if (calDateFormat.indexOf("dd") != -1) {
        day = makeTwoDigit(day);
        outDate = jsReplace(outDate, "dd", day);
    }

    // RETURN TWO DIGIT MONTH
    if (calDateFormat.indexOf("MM") != -1) {
        month = makeTwoDigit(month);
        outDate = jsReplace(outDate, "MM", month);
    }
    // RETURN ONE OR TWO DIGIT MONTH
    else if (calDateFormat.indexOf("mm") != -1) {
        month = makeTwoDigit(month);
        outDate = jsReplace(outDate, "mm", month);
    }

    // RETURN FOUR-DIGIT YEAR
    if (calDateFormat.indexOf("yyyy") != -1) {
        outDate = jsReplace(outDate, "yyyy", year);
    }
    // RETURN TWO-DIGIT YEAR
    else if (calDateFormat.indexOf("yy") != -1) {
        var yearString = "" + year;
        var yearString = yearString.substring(2,4);
        outDate = jsReplace(outDate, "yy", yearString);
    }
    // RETURN FOUR-DIGIT YEAR
    else if (calDateFormat.indexOf("YY") != -1) {
        outDate = jsReplace(outDate, "YY", year);
    }

    // RETURN DAY OF MONTH (Initial Caps)
    if (calDateFormat.indexOf("Month") != -1) {
        outDate = jsReplace(outDate, "Month", monthString);
    }
    // RETURN DAY OF MONTH (lowercase letters)
    else if (calDateFormat.indexOf("month") != -1) {
        outDate = jsReplace(outDate, "month", monthString.toLowerCase());
    }
    // RETURN DAY OF MONTH (UPPERCASE LETTERS)
    else if (calDateFormat.indexOf("MONTH") != -1) {
        outDate = jsReplace(outDate, "MONTH", monthString.toUpperCase());
    }

    // RETURN DAY OF MONTH 3-DAY ABBREVIATION (Initial Caps)
    if (calDateFormat.indexOf("Mon") != -1) {
        outDate = jsReplace(outDate, "Mon", monthAbbrev);
    }
    // RETURN DAY OF MONTH 3-DAY ABBREVIATION (lowercase letters)
    else if (calDateFormat.indexOf("mon") != -1) {
        outDate = jsReplace(outDate, "mon", monthAbbrev.toLowerCase());
    }
    // RETURN DAY OF MONTH 3-DAY ABBREVIATION (UPPERCASE LETTERS)
    else if (calDateFormat.indexOf("MON") != -1) {
        outDate = jsReplace(outDate, "MON", monthAbbrev.toUpperCase());
    }

    // RETURN WEEKDAY (Initial Caps)
    if (calDateFormat.indexOf("Weekday") != -1) {
        outDate = jsReplace(outDate, "Weekday", weekday);
    }
    // RETURN WEEKDAY (lowercase letters)
    else if (calDateFormat.indexOf("weekday") != -1) {
        outDate = jsReplace(outDate, "weekday", weekday.toLowerCase());
    }
    // RETURN WEEKDAY (UPPERCASE LETTERS)
    else if (calDateFormat.indexOf("WEEKDAY") != -1) {
        outDate = jsReplace(outDate, "WEEKDAY", weekday.toUpperCase());
    }

    // RETURN WEEKDAY 3-DAY ABBREVIATION (Initial Caps)
    if (calDateFormat.indexOf("Wkdy") != -1) {
        outDate = jsReplace(outDate, "Wkdy", weekdayAbbrev);
    }
    // RETURN WEEKDAY 3-DAY ABBREVIATION (lowercase letters)
    else if (calDateFormat.indexOf("wkdy") != -1) {
        outDate = jsReplace(outDate, "wkdy", weekdayAbbrev.toLowerCase());
    }
    // RETURN WEEKDAY 3-DAY ABBREVIATION (UPPERCASE LETTERS)
    else if (calDateFormat.indexOf("WKDY") != -1) {
        outDate = jsReplace(outDate, "WKDY", weekdayAbbrev.toUpperCase());
    }

    // SET THE VALUE OF THE FIELD THAT WAS PASSED TO THE CALENDAR
    calDateField.value = outDate;

    // GIVE FOCUS BACK TO THE DATE FIELD
    // calDateField.focus();

    // CLOSE THE CALENDAR WINDOW
    top.newWin.close()
}

