Skip to content
Snippets Groups Projects
Select Git revision
  • 9aea82817e8fe63338c88b565d690f25255d8de1
  • 3.9 default
  • develop
  • 6.0
  • 5.0
  • 4.0
  • scrutinizer-patch-4
  • scrutinizer-patch-3
  • scrutinizer-patch-2
  • scrutinizer-patch-1
  • 3.7
  • 3.8
  • 3.6
  • 3.9_backported
  • 3.8_backported
  • 3.7_backported
  • 3.5
  • 3.6_backported
  • 3.5_backported
  • 3.4
  • 3.3_backported
  • 6.0.4
  • 6.0.3
  • 5.0.7
  • 6.0.2
  • 6.0.1
  • 5.0.6
  • 6.0.0
  • 5.0.5
  • 6.0.0-rc
  • 5.0.4
  • 6.0.0-beta
  • 5.0.3
  • 4.0.6
  • 5.0.2
  • 5.0.1
  • 4.0.5
  • 5.0.0
  • 4.0.4
  • 5.0.0-rc2
  • 5.0.0-rc1
41 results

lib_calendar.js

Blame
  • lib_calendar.js 29.48 KiB
    //
    // 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><font size=1>Popup Calendar</font>
    //
    //
    // 
    // 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 COLORS
    topBackground    = "#dee7ec";         // BG COLOR OF THE TOP FRAME
    bottomBackground = "white";         // BG COLOR OF THE BOTTOM FRAME
    tableBGColor     = "#7699A9";         // BG COLOR OF THE BOTTOM FRAME'S TABLE
    cellColor        = "lightgrey";     // TABLE CELL BG COLOR OF THE DATE CELLS IN THE BOTTOM FRAME
    headingCellColor = "white";         // TABLE CELL BG COLOR OF THE WEEKDAY ABBREVIATIONS
    headingTextColor = "black";         // TEXT COLOR OF THE WEEKDAY ABBREVIATIONS
    dateColor        = "black";          // TEXT COLOR OF THE LISTED DATES (1-28+)
    focusColor       = "#ff0000";       // TEXT COLOR OF THE SELECTED DATE (OR CURRENT DATE)
    hoverColor       = "darkred";       // TEXT COLOR OF A LINK WHEN YOU HOVER OVER IT
    fontStyle        = "10pt arial,tahoma,verdana,helvetica;";           // TEXT STYLE FOR DATES
    headingFontStyle = "bold 12pt arial, helvetica";      // TEXT STYLE FOR WEEKDAY ABBREVIATIONS
    
    // FORMATTING PREFERENCES
    bottomBorder  = false;        // TRUE/FALSE (WHETHER TO DISPLAY BOTTOM CALENDAR BORDER)
    tableBorder   = 0;            // 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 = navigator.language;
    if(selectedLanguage == "")
    	selectedLanguage = navigator.language;
    
    // 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
        setInitialDate();
    
        // THE CALENDAR FRAMESET DOCUMENTS ARE CREATED BY JAVASCRIPT FUNCTIONS
        calDocTop    = buildTopCalFrame();
        calDocBottom = buildBottomCalFrame();
    }
    
    
    // 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.indexOf("/") > -1)
    	{
    		inDate = inDate.split("/");
    		if(inDate[1].indexOf("0") > -1)
    			inDate[1] = inDate[1].replace("0","");
    		if(inDate[0].indexOf("0") > -1)
    			inDate[0] = inDate[0].replace("0","");
    		calDate = new Date(inDate[2],inDate[1]-1,inDate[0]);
    	}
    	else
    		calDate = new Date(inDate);
    	
        // IF THE INCOMING DATE IS INVALID, USE THE CURRENT DATE
        if (isNaN(calDate)) {
    
            // ADD CUSTOM DATE PARSING HERE
            // IF IT FAILS, SIMPLY CREATE A NEW DATE OBJECT WHICH DEFAULTS TO THE CURRENT DATE
            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);
    }
    
    
    // POPUP A WINDOW WITH THE CALENDAR IN IT
    function showCalendar(dateField) {
    
        // SET INITIAL VALUE OF THE DATE FIELD AND CREATE TOP AND BOTTOM FRAMES
        setDateField(dateField);
    
        // USE THE JAVASCRIPT-GENERATED DOCUMENTS (calDocTop, calDocBottom) IN THE FRAMESET
        calDocFrameset = 
            "<HTML><HEAD><TITLE>JavaScript Calendar</TITLE></HEAD>\n" +
            "<FRAMESET ROWS='60,*' FRAMEBORDER='0'>\n" +
            "  <FRAME NAME='topCalFrame' SRC='javascript:parent.opener.calDocTop' SCROLLING='no'>\n" +
            "  <FRAME NAME='bottomCalFrame' SRC='javascript:parent.opener.calDocBottom' SCROLLING='no'>\n" +
            "</FRAMESET>\n";
    
        // DISPLAY THE CALENDAR IN A NEW POPUP WINDOW
    	l= eval(screen.width / 2);
    	h=eval(screen.height / 2);
        top.newWin = window.open("javascript:parent.opener.calDocFrameset", "calWin", 'directories=no,menubar=no,status=no,location=no,scrollbars=yes,resizable=yes,height=234,width=194,left='+l+'px,top='+h+'px');
        top.newWin.focus();
    	
    }
    
    
    // CREATE THE TOP CALENDAR FRAME
    function buildTopCalFrame() {
    	var today_trans = "Today";
        // CREATE THE TOP FRAME OF THE CALENDAR
    	 if (selectedLanguage == "fr") 
    	 	today_trans = "Aujourd'hui";
    	 // IF GREMAN
    	 else if (selectedLanguage == "de") 
           today_trans = "Heute ";
        // IF SPANISH
        else if (selectedLanguage == "es") 
    	 	today_trans = "Hoy ";
        var calDoc =
            "<HTML>" +
            "<HEAD>" +
    		"<style><!--" +
    		"body {font-size: 12px;font-family: arial,tahoma,verdana,helvetica;margin-top: 0;margin-bottom: 0;margin-right: 0;margin-left: 0;}" +
    		"a:link    { font: verdana, arial, helvetica, sans-serif; font-weight: bold; color: #000000; text-decoration: none; }" +
    		"a:visited { font: verdana, arial, helvetica, sans-serif; font-weight: bold; color: #000000; text-decoration: none; }" +
    		"a:active  { font: verdana, arial, helvetica, sans-serif; font-weight: bold; color: #000000; text-decoration: none; }" +
    		"a:hover   { font: verdana, arial, helvetica, sans-serif; font-weight: bold; color: #000000; text-decoration: none; }" +
    		"input { font: 12px helvetica, verdana, arial, sans-serif; background: #FDFDFD;border: 1px solid #ACBCBB;padding: 0px 0px 0px 0px;margin: 0px 0px 0px 0px;}}" +
    		"//--></style>" +
            "</HEAD>" +
            "<BODY BGCOLOR='" + topBackground + "'>" +
            
            "<CENTER>" +
            "<TABLE CELLPADDING=0 CELLSPACING=1 BORDER=0>" +
            "<TR><TD COLSPAN=7>" +
    		"<FORM NAME='calControl' onSubmit='return false;'>" +
            "<CENTER>" +
            getMonthSelect() +
            "<INPUT NAME='year' VALUE='" + calDate.getFullYear() + "'TYPE=TEXT SIZE=4 MAXLENGTH=4 onChange='parent.opener.setYear()'>" +
            "</CENTER>" +
            "</TD>" +
            "</TR>" +
            "<TR>" +
            "<TD COLSPAN=7>" +
            "<INPUT " +
            "TYPE=BUTTON NAME='previousYear' VALUE='<<'    onClick='parent.opener.setPreviousYear()'><INPUT " +
            "TYPE=BUTTON NAME='previousMonth' VALUE=' < '   onClick='parent.opener.setPreviousMonth()'><INPUT " +
            "TYPE=BUTTON NAME='Today' VALUE=\"" + today_trans+"\" onClick='parent.opener.setToday()'><INPUT " +
            "TYPE=BUTTON NAME='nextMonth' VALUE=' > '   onClick='parent.opener.setNextMonth()'><INPUT " +
            "TYPE=BUTTON NAME='nextYear' VALUE='>>'    onClick='parent.opener.setNextYear()'>" +
    		      "</FORM>" +
            "</TD>" +
            "</TR>" +
            "</TABLE>" +
            "</CENTER>" +
      
            "</BODY>" +
            "</HTML>";
    
        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 + "'>" +
                      "<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;
            }
            // RETURN 28 DAYS
            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)
    
        // 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');
        }
        // DEFAULT TO ENGLISH
        else {
            monthArray = new Array('January', 'February', 'March', 'April', 'May', 'June',
                                   'July', 'August', 'September', 'October', 'November', 'December');
        }
    
        // DETERMINE MONTH TO SET AS DEFAULT
        var activeMonth = calDate.getMonth();
    
        // START HTML SELECT LIST ELEMENT
        monthSelect = "<SELECT NAME='month' onChange='parent.opener.setCurrentMonth()'>";
    
        // LOOP THROUGH MONTH ARRAY
        for (var i=0;i<monthArray.length;i++) {
            // 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;
    }
    
    
    // SET DAYS OF THE WEEK DEPENDING ON LANGUAGE
    function createWeekdayList() {
    
        // 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');
        }
        else {
            weekdayList  = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
            weekdayArray = new Array('Su','Mo','Tu','We','Th','Fr','Sa');
        }
    
        // START HTML TO HOLD WEEKDAY NAMES IN TABLE FORMAT
        var weekdays = "<TR BGCOLOR='" + headingCellColor + "'>";
    
        // LOOP THROUGH WEEKDAY ARRAY
        for (var i=0;i<weekdayArray.length;i++) {
            weekdays += "<TD class='heading' align=center>" + 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 + "'>&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'>" +
            "<!--" +
            "body {font-family: arial,tahoma,verdana,helvetica;margin-top: 0;margin-bottom: 0;margin-right: 0;margin-left: 0;}" +
    		"TD.heading { text-decoration: none; color:" + headingTextColor + "; font: " + headingFontStyle + "; }" +
            "A.focusDay:link { color: " + focusColor + "; text-decoration: none; font: " + fontStyle + "; }" +
            "A.focusDay:hover { color: " + focusColor + "; text-decoration: none; font: " + fontStyle + "; }" +
            "A.weekday:link { color: " + dateColor + "; text-decoration: none; font: " + fontStyle + "; }" +
            "A.weekday:hover { color: " + hoverColor + "; font: " + fontStyle + "; }" +
            "-->" +
            "</STYLE>" +
            "</HEAD>" +
            "<BODY BGCOLOR='" + bottomBackground + "'>" +
            "<CENTER>";
    
            // NAVIGATOR NEEDS A TABLE CONTAINER TO DISPLAY THE TABLE OUTLINES PROPERLY
            if (isNav) {
                calendarBegin += 
                    "<TABLE CELLPADDING=0 CELLSPACING=1 BORDER=" + tableBorder + " ALIGN=CENTER BGCOLOR='" + tableBGColor + "'><TR><TD>";
            }
    
            // BUILD WEEKDAY HEADINGS
            calendarBegin +=
                "<TABLE CELLPADDING=0 CELLSPACING=1 BORDER=" + tableBorder + " 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)
    	{
            if(day < 10)
    			day = "0"+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) 
    	{
    		if(month < 10)
    			month = "0"+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;
    	// SET THE VALUE OF THE FIELD THAT WAS PASSED TO THE CALENDAR
    	dayField = calDateField.name+"day";
    	monthField = calDateField.name+"month";
    	yearField = calDateField.name+"year";
    	calDateField.form.elements[dayField].value = day;
    	calDateField.form.elements[monthField].value = month;
    	calDateField.form.elements[yearField].value = year;
    	
        // GIVE FOCUS BACK TO THE DATE FIELD
        calDateField.focus();
    
        // CLOSE THE CALENDAR WINDOW
        top.newWin.close()
    }