1 var monthArray = getMonthSelect();
6 // innerHTML IS ONLY SUPPORTED BY MSIE...
7 function rewriteLayerWithData(obj,data) {
10 obj.document.write(data);
17 document.images['dateFieldFirstImg'].src = dateFieldFirst.src;
18 document.images['dateFieldPreviousImg'].src = dateFieldPrevious.src;
19 document.images['dateFieldTodayImg'].src = dateFieldToday.src;
20 document.images['dateFieldNextImg'].src = dateFieldNext.src;
21 document.images['dateFieldLastImg'].src = dateFieldLast.src;
22 document.images['dateFieldCloseImg'].src = dateFieldClose.src;
26 // DETERMINE BROWSER BRAND
30 if (navigator.appName == "Netscape") {
37 // PRE-BUILD PORTIONS OF THE CALENDAR WHEN THIS JS LIBRARY LOADS INTO THE BROWSER
41 // CALENDAR FUNCTIONS BEGIN HERE ---------------------------------------------------
45 // SET THE INITIAL VALUE OF THE GLOBAL DATE FIELD
46 function setDateField(dateField) {
48 // ASSIGN THE INCOMING FIELD OBJECT TO A GLOBAL VARIABLE
49 calDateField = dateField;
51 // GET THE VALUE OF THE INCOMING FIELD
52 inDate = dateField.value;
54 // SET calDate TO THE DATE IN THE INCOMING FIELD OR DEFAULT TO TODAY'S DATE
60 // SET THE INITIAL CALENDAR DATE TO TODAY OR TO THE EXISTING VALUE IN dateField
61 function setInitialDate() {
63 // CREATE A NEW DATE OBJECT (WILL GENERALLY PARSE CORRECT DATE EXCEPT WHEN "." IS USED AS A DELIMITER)
64 // (THIS ROUTINE DOES *NOT* CATCH ALL DATE FORMATS, IF YOU NEED TO PARSE A CUSTOM DATE FORMAT, DO IT HERE)
65 // ADD CUSTOM DATE PARSING HERE
67 ypos = dateFormat.indexOf('%Y');
68 inYear = parseInt(inDate.substr(ypos,4));
70 mpos = dateFormat.indexOf('%m');
71 if (ypos < mpos) mpos+=2; // because %Y stands for yyyy, add 2
72 inMonth = inDate.substr(mpos,2);
73 if (inMonth.charAt(0) == "0")
74 inMonth = inMonth.substr(1,inMonth.length-1);
75 inMonth = parseInt(inMonth);
77 dpos = dateFormat.indexOf('%d');
78 if (ypos < dpos) dpos+=2; // same as mpos
79 inDay = inDate.substr(dpos,2);
80 if (inDay.charAt(0) == "0")
81 inDay = inDay.substr(1,inDay.length-1);
82 inDay = parseInt(inDay);
84 if ((inYear) && (inMonth) && (inDay)) {
86 calDate = new Date(inYear,inMonth-1,inDay);
93 // KEEP TRACK OF THE CURRENT DAY VALUE
94 calDay = calDate.getDate();
96 // SET DAY VALUE TO 1... TO AVOID JAVASCRIPT DATE CALCULATION ANOMALIES
97 // (IF THE MONTH CHANGES TO FEB AND THE DAY IS 30, THE MONTH WOULD CHANGE TO MARCH
98 // AND THE DAY WOULD CHANGE TO 2. SETTING THE DAY TO 1 WILL PREVENT THAT)
103 // ENABLE MULTIPLE CALENDAR-USING OBJECTS BY USING VARIABLE calendarDiv;
104 var calendarDiv = false;
106 function toggleCalendar(dateFieldEl,calObj,calFormat) {
107 if ((calendarDiv) && (calendarDiv.id != calObj.id)) {
110 calendarDiv = calObj;
112 if (isNav) condition = (calendarDiv.visibility == 'show');
113 if (isIE) condition = (calendarDiv.style.visibility == 'visible');
121 for (i = 0; i < document.forms.length; i++) {
122 for (j = 0; j < document.forms[i].elements.length; j++) {
123 if (document.forms[i].elements[j].name == dateFieldEl) {
124 dateField = document.forms[i].elements[j];
128 dateFormat = calFormat;
129 showCalendar(dateField);
133 // CAPTURE onMouseMove EVENT IF NETSCAPE FOR POSITIONING calendarDiv
136 document.captureEvents( Event.MOUSEMOVE );
137 document.onmousemove = actPos;
145 curScreenPosX = e.pageX + 10;
146 curScreenPosY = e.pageY;
151 function showCalendar(dateField) {
153 // SET INITIAL VALUE OF THE DATE FIELD AND CREATE TOP AND BOTTOM FRAMES
154 setDateField(dateField);
158 calendarDiv.visibility = 'show';
159 calendarDiv.left = curScreenPosX;
160 calendarDiv.top = curScreenPosY;
163 calendarDiv.style.visibility = 'visible';
169 function hideCalendar() {
171 calendarDiv.visibility = 'hide';
174 calendarDiv.style.visibility = 'hidden';
179 // NEW: NO FRAMES ANYMORE, ONE <DIV> INSTEAD
180 function writeCalendar() {
182 data = buildTopCalFrame() + buildBottomCalFrame();
183 if (isNav) rewriteLayerWithData(calendarDiv, data);
184 if (isIE) rewriteLayerWithData(calendarDiv, data);
188 // CREATE month/year DISPLAY
189 function buildCalControlMonthYear() {
190 month = calDate.getMonth();
191 year = calDate.getFullYear();
192 return String(monthArray[month])+" "+String(year);
205 document.onmousemove = MM;
206 document.onmouseup = MU;
212 calendarDiv.style.pixelLeft = event.clientX-X + document.body.scrollLeft;
213 calendarDiv.style.pixelTop = event.clientY-Y + document.body.scrollTop;
220 // document.onmousemove = null;
221 // document.onmouseup = null;
224 // CREATE THE TOP CALENDAR PART
225 function buildTopCalFrame() {
228 "<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0><TR><TD BGCOLOR=black>" +
229 "<TABLE CELLPADDING=0 CELLSPACING=1 BORDER=0>" +
230 "<TR><TD COLSPAN=6 ALIGN=left CLASS=topCal onMouseDown='MD()'>" +
231 buildCalControlMonthYear() +
233 "<TD ALIGN=right CLASS=topCal>"+
234 "<A CLASS=navMonYear HREF='javascript:hideCalendar()'>" +
235 dateFieldCloseSRC+"</A> </TD></TR>" +
237 "<TD COLSPAN=7 CLASS=topCal ALIGN=center><FONT SIZE=1 FACE='Arial'>"+
238 "<A CLASS=navMonYear HREF='javascript:setPreviousYear()'>"+
239 dateFieldFirstSRC+"</A>" +
240 " <A CLASS=navMonYear HREF='javascript:setPreviousMonth()'>"+
241 dateFieldPreviousSRC+"</A>" +
242 " <A CLASS=navMonYear HREF='javascript:setToday()'>"+
243 dateFieldTodaySRC+"</A>" +
244 " <A CLASS=navMonYear HREF='javascript:setNextMonth()'>"+
245 dateFieldNextSRC+"</A>"+
246 " <A CLASS=navMonYear HREF='javascript:setNextYear()'>"+
247 dateFieldLastSRC+"</A>" +
254 // CREATE THE BOTTOM CALENDAR PART
255 function buildBottomCalFrame() {
257 // START CALENDAR DOCUMENT
258 var calDoc = calendarBegin;
260 // GET MONTH, AND YEAR FROM GLOBAL CALENDAR DATE
261 month = calDate.getMonth();
262 year = calDate.getFullYear();
265 // GET GLOBALLY-TRACKED DAY VALUE (PREVENTS JAVASCRIPT DATE ANOMALIES)
270 // DETERMINE THE NUMBER OF DAYS IN THE CURRENT MONTH
271 var days = getDaysInMonth();
273 // IF GLOBAL DAY VALUE IS > THAN DAYS IN MONTH, HIGHLIGHT LAST DAY IN MONTH
278 // DETERMINE WHAT DAY OF THE WEEK THE CALENDAR STARTS ON
279 var firstOfMonth = new Date (year, month, 1);
281 // GET THE DAY OF THE WEEK THE FIRST DAY OF THE MONTH FALLS ON
282 var startingPos = firstOfMonth.getDay();
285 // KEEP TRACK OF THE COLUMNS, START A NEW ROW AFTER EVERY 7 COLUMNS
288 // MAKE BEGINNING NON-DATE CELLS BLANK
289 for (i = 0; i < startingPos; i++) {
295 // SET VALUES FOR DAYS OF THE MONTH
297 var dayType = "weekday";
299 // DATE CELLS CONTAIN A NUMBER
300 for (i = startingPos; i < days; i++) {
302 var paddingChar = " ";
304 // ADJUST SPACING SO THAT ALL LINKS HAVE RELATIVELY EQUAL WIDTHS
305 if (i-startingPos+1 < 10) {
306 padding = " ";
312 // GET THE DAY CURRENTLY BEING WRITTEN
313 currentDay = i-startingPos+1;
315 // SET THE TYPE OF DAY, THE focusDay GENERALLY APPEARS AS A DIFFERENT COLOR
316 if (currentDay == day) {
317 dayType = "focusDay";
323 // ADD THE DAY TO THE CALENDAR STRING
324 calDoc += "<TD align=center bgcolor='lightgrey'>" +
325 "<a class='" + dayType + "' href='javascript:returnDate(" +
326 currentDay + ")'>" + padding + currentDay + paddingChar + "</a></TD>";
330 // START A NEW ROW WHEN NECESSARY
331 if (columnCount % 7 == 0) {
332 calDoc += "</TR><TR>";
336 // MAKE REMAINING NON-DATE CELLS BLANK
337 for (i=days; i<42; i++) {
342 // START A NEW ROW WHEN NECESSARY
343 if (columnCount % 7 == 0) {
351 // FINISH THE NEW CALENDAR PAGE
352 calDoc += calendarEnd;
354 // RETURN THE COMPLETED CALENDAR PAGE
359 // SET THE CALENDAR TO TODAY'S DATE AND DISPLAY THE NEW CALENDAR
360 function setToday() {
362 // SET GLOBAL DATE TO TODAY'S DATE
363 calDate = new Date();
365 // DISPLAY THE NEW CALENDAR
370 // SET THE GLOBAL DATE TO THE PREVIOUS YEAR AND REDRAW THE CALENDAR
371 function setPreviousYear() {
373 var year = calDate.getFullYear();
377 calDate.setFullYear(year);
383 // SET THE GLOBAL DATE TO THE PREVIOUS MONTH AND REDRAW THE CALENDAR
384 function setPreviousMonth() {
386 var year = calDate.getFullYear();
387 var month = calDate.getMonth();
389 // IF MONTH IS JANUARY, SET MONTH TO DECEMBER AND DECREMENT THE YEAR
394 calDate.setFullYear(year);
400 calDate.setMonth(month);
405 // SET THE GLOBAL DATE TO THE NEXT MONTH AND REDRAW THE CALENDAR
406 function setNextMonth() {
408 var year = calDate.getFullYear();
410 var month = calDate.getMonth();
412 // IF MONTH IS DECEMBER, SET MONTH TO JANUARY AND INCREMENT THE YEAR
416 calDate.setFullYear(year);
421 calDate.setMonth(month);
426 // SET THE GLOBAL DATE TO THE NEXT YEAR AND REDRAW THE CALENDAR
427 function setNextYear() {
429 var year = calDate.getFullYear();
431 calDate.setFullYear(year);
436 // GET NUMBER OF DAYS IN MONTH
437 function getDaysInMonth() {
440 var month = calDate.getMonth()+1;
441 var year = calDate.getFullYear();
444 if (month==1 || month==3 || month==5 || month==7 || month==8 ||
445 month==10 || month==12) {
449 else if (month==4 || month==6 || month==9 || month==11) {
454 if (isLeapYear(year)) {
466 // CHECK TO SEE IF YEAR IS A LEAP YEAR
467 function isLeapYear (Year) {
469 if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) {
478 // BUILD THE MONTH SELECT LIST
479 function getMonthSelect() {
481 // IF SET BY A PARAMETER (WRITTEN AT THE BEGINNING BY WOCalendar)
483 monthArray = externMonths;
486 monthArray = new Array('January', 'February', 'March', 'April',
487 'May', 'June', 'July', 'August',
488 'September', 'October', 'November', 'December');
494 // SET DAYS OF THE WEEK DEPENDING ON LANGUAGE
495 function createWeekdayList() {
497 // IF SET BY A PARAMETER (WRITTEN AT THE BEGINNING BY WODateFieldScript)
498 if (externWeekdays) {
499 weekdayArray = externWeekdays;
502 weekdayArray = new Array('Su','Mo','Tu','We','Th','Fr','Sa');
505 var weekdays = "<TR BGCOLOR='white'>";
506 for (i in weekdayArray) {
507 weekdays += "<TD class='heading' align=center>"
508 + weekdayArray[i] + "</TD>";
516 // PRE-BUILD PORTIONS OF THE CALENDAR (FOR PERFORMANCE REASONS)
517 function buildCalParts() {
519 // BUILD THE BLANK CELL ROWS
520 blankCell = "<TD align=center bgcolor='lightGrey'> </TD>";
522 // BUILD THE TOP PORTION OF THE CALENDAR PAGE USING CSS TO CONTROL SOME DISPLAY ELEMENTS
523 calendarBegin = createWeekdayList() + "<TR>";
525 // BUILD THE BOTTOM PORTION OF THE CALENDAR PAGE
528 // END THE TABLE AND HTML DOCUMENT
530 "</TABLE></TD></TR></TABLE>";
534 // REPLACE ALL INSTANCES OF find WITH replace
535 // inString: the string you want to convert
536 // find: the value to search for
537 // replace: the value to substitute
539 // usage: jsReplace(inString, find, replace);
540 // example: jsReplace("To be or not to be", "be", "ski");
541 // result: "To ski or not to ski"
543 function jsReplace(inString, find, replace) {
551 // REPLACE ALL INSTANCES OF find WITH replace
552 if (inString.indexOf(find) != -1) {
553 // SEPARATE THE STRING INTO AN ARRAY OF STRINGS USING THE VALUE IN find
554 t = inString.split(find);
556 // JOIN ALL ELEMENTS OF THE ARRAY, SEPARATED BY THE VALUE IN replace
557 return (t.join(replace));
565 // JAVASCRIPT FUNCTION -- DOES NOTHING (USED FOR THE HREF IN THE CALENDAR CALL)
566 function doNothing() {
570 // ENSURE THAT VALUE IS TWO DIGITS IN LENGTH
571 function makeTwoDigit(inValue) {
573 var numVal = parseInt(inValue, 10);
575 // VALUE IS LESS THAN TWO DIGITS IN LENGTH
578 // ADD A LEADING ZERO TO THE VALUE AND RETURN IT
579 return("0" + numVal);
587 // SET FIELD VALUE TO THE DATE SELECTED AND CLOSE THE CALENDAR WINDOW
588 function returnDate(inDay)
591 // inDay = THE DAY THE USER CLICKED ON
592 calDate.setDate(inDay);
594 // SET THE DATE RETURNED TO THE USER
595 var day = calDate.getDate();
596 var month = calDate.getMonth()+1;
597 var year = calDate.getFullYear();
599 outDate = dateFormat;
600 outDate = jsReplace(outDate,'%Y',String(year));
601 outDate = jsReplace(outDate,'%m',makeTwoDigit(month));
602 outDate = jsReplace(outDate,'%d',makeTwoDigit(day));
604 // SET THE VALUE OF THE FIELD THAT WAS PASSED TO THE CALENDAR
605 calDateField.value = outDate;
607 // CLOSE THE CALENDAR WINDOW