PageSourceSearch

https://monumenteromania.ro/js/CalendarPopup.js

js monumenteromania.ro collected 2026-10-02 10:13:26 UTC 61,471 bytes, 1,506 lines download raw bytes

1// ===================================================================
2// Author: Matt Kruse <[email protected]>
3// WWW: http://www.mattkruse.com/
4//
5// NOTICE: You may use this code for any purpose, commercial or
6// private, without any further permission from the author. You may
7// remove this notice from your final code if you wish, however it is
8// appreciated by the author if at least my web site address is kept.
9//
10// You may *NOT* re-distribute this code in any way except through its
11// use. That means, you can include it in your product, or your web
12// site, or any other form where the code is actually being used. You
13// may not put the plain javascript up on your site for download or
14// include it in your javascript libraries for download. 
15// If you wish to share this code with others, please just point them
16// to the URL instead.
17// Please DO NOT link directly to my .js files from your site. Copy
18// the files to your server and use them there. Thank you.
19// ===================================================================
20
21
22/* SOURCE FILE: AnchorPosition.js */
23
24/* 
25AnchorPosition.js
26Author: Matt Kruse
27Last modified: 10/11/02
28
29DESCRIPTION: These functions find the position of an <A> tag in a document,
30so other elements can be positioned relative to it.
31
32COMPATABILITY: Netscape 4.x,6.x,Mozilla, IE 5.x,6.x on Windows. Some small
33positioning errors - usually with Window positioning - occur on the 
34Macintosh platform.
35
36FUNCTIONS:
37getAnchorPosition(anchorname)
38  Returns an Object() having .x and .y properties of the pixel coordinates
39  of the upper-left corner of the anchor. Position is relative to the PAGE.
40
41getAnchorWindowPosition(anchorname)
42  Returns an Object() having .x and .y properties of the pixel coordinates
43  of the upper-left corner of the anchor, relative to the WHOLE SCREEN.
44
45NOTES:
46
471) For popping up separate browser windows, use getAnchorWindowPosition. 
48   Otherwise, use getAnchorPosition
49
502) Your anchor tag MUST contain both NAME and ID attributes which are the 
51   same. For example:
52   <A NAME="test" ID="test"> </A>
53
543) There must be at least a space between <A> </A> for IE5.5 to see the 
55   anchor tag correctly. Do not do <A></A> with no space.
56*/ 
57
58// getAnchorPosition(anchorname)
59//   This function returns an object having .x and .y properties which are the coordinates
60//   of the named anchor, relative to the page.
61function getAnchorPosition(anchorname) {
62	// This function will return an Object with x and y properties
63	var useWindow=false;
64	var coordinates=new Object();
65	var x=0,y=0;
66	// Browser capability sniffing
67	var use_gebi=false, use_css=false, use_layers=false;
68	if (document.getElementById) { use_gebi=true; }
69	else if (document.all) { use_css=true; }
70	else if (document.layers) { use_layers=true; }
71	// Logic to find position
72 	if (use_gebi && document.all) {
73		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
74		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
75		}
76	else if (use_gebi) {
77		var o=document.getElementById(anchorname);
78		x=AnchorPosition_getPageOffsetLeft(o);
79		y=AnchorPosition_getPageOffsetTop(o);
80		}
81 	else if (use_css) {
82		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
83		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
84		}
85	else if (use_layers) {
86		var found=0;
87		for (var i=0; i<document.anchors.length; i++) {
88			if (document.anchors[i].name==anchorname) { found=1; break; }
89			}
90		if (found==0) {
91			coordinates.x=0; coordinates.y=0; return coordinates;
92			}
93		x=document.anchors[i].x;
94		y=document.anchors[i].y;
95		}
96	else {
97		coordinates.x=0; coordinates.y=0; return coordinates;
98		}
99	coordinates.x=x;
100	coordinates.y=y;
101	return coordinates;
102	}
103
104// getAnchorWindowPosition(anchorname)
105//   This function returns an object having .x and .y properties which are the coordinates
106//   of the named anchor, relative to the window
107function getAnchorWindowPosition(anchorname) {
108	var coordinates=getAnchorPosition(anchorname);
109	var x=0;
110	var y=0;
111	if (document.getElementById) {
112		if (isNaN(window.screenX)) {
113			x=coordinates.x-document.body.scrollLeft+window.screenLeft;
114			y=coordinates.y-document.body.scrollTop+window.screenTop;
115			}
116		else {
117			x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;
118			y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;
119			}
120		}
121	else if (document.all) {
122		x=coordinates.x-document.body.scrollLeft+window.screenLeft;
123		y=coordinates.y-document.body.scrollTop+window.screenTop;
124		}
125	else if (document.layers) {
126		x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;
127		y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;
128		}
129	coordinates.x=x;
130	coordinates.y=y;
131	return coordinates;
132	}
133
134// Functions for IE to get position of an object
135function AnchorPosition_getPageOffsetLeft (el) {
136	var ol=el.offsetLeft;
137	while ((el=el.offsetParent) != null) { ol += el.offsetLeft; }
138	return ol;
139	}
140function AnchorPosition_getWindowOffsetLeft (el) {
141	return AnchorPosition_getPageOffsetLeft(el)-document.body.scrollLeft;
142	}	
143function AnchorPosition_getPageOffsetTop (el) {
144	var ot=el.offsetTop;
145	while((el=el.offsetParent) != null) { ot += el.offsetTop; }
146	return ot;
147	}
148function AnchorPosition_getWindowOffsetTop (el) {
149	return AnchorPosition_getPageOffsetTop(el)-document.body.scrollTop;
150	}
151
152/* SOURCE FILE: date.js */
153
154// HISTORY
155// ------------------------------------------------------------------
156// May 17, 2003: Fixed bug in parseDate() for dates <1970
157// March 11, 2003: Added parseDate() function
158// March 11, 2003: Added "NNN" formatting option. Doesn't match up
159//                 perfectly with SimpleDateFormat formats, but 
160//                 backwards-compatability was required.
161
162// ------------------------------------------------------------------
163// These functions use the same 'format' strings as the 
164// java.text.SimpleDateFormat class, with minor exceptions.
165// The format string consists of the following abbreviations:
166// 
167// Field        | Full Form          | Short Form
168// -------------+--------------------+-----------------------
169// Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
170// Month        | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
171//              | NNN (abbr.)        |
172// Day of Month | dd (2 digits)      | d (1 or 2 digits)
173// Day of Week  | EE (name)          | E (abbr)
174// Hour (1-12)  | hh (2 digits)      | h (1 or 2 digits)
175// Hour (0-23)  | HH (2 digits)      | H (1 or 2 digits)
176// Hour (0-11)  | KK (2 digits)      | K (1 or 2 digits)
177// Hour (1-24)  | kk (2 digits)      | k (1 or 2 digits)
178// Minute       | mm (2 digits)      | m (1 or 2 digits)
179// Second       | ss (2 digits)      | s (1 or 2 digits)
180// AM/PM        | a                  |
181//
182// NOTE THE DIFFERENCE BETWEEN MM and mm! Month=MM, not mm!
183// Examples:
184//  "MMM d, y" matches: January 01, 2000
185//                      Dec 1, 1900
186//                      Nov 20, 00
187//  "M/d/yy"   matches: 01/20/00
188//                      9/2/00
189//  "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
190// ------------------------------------------------------------------
191
192var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
193var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
194function LZ(x) {return(x<0||x>9?"":"0")+x}
195
196// ------------------------------------------------------------------
197// isDate ( date_string, format_string )
198// Returns true if date string matches format of format string and
199// is a valid date. Else returns false.
200// It is recommended that you trim whitespace around the value before
201// passing it to this function, as whitespace is NOT ignored!
202// ------------------------------------------------------------------
203function isDate(val,format) {
204	var date=getDateFromFormat(val,format);
205	if (date==0) { return false; }
206	return true;
207	}
208
209// -------------------------------------------------------------------
210// compareDates(date1,date1format,date2,date2format)
211//   Compare two date strings to see which is greater.
212//   Returns:
213//   1 if date1 is greater than date2
214//   0 if date2 is greater than date1 of if they are the same
215//  -1 if either of the dates is in an invalid format
216// -------------------------------------------------------------------
217function compareDates(date1,dateformat1,date2,dateformat2) {
218	var d1=getDateFromFormat(date1,dateformat1);
219	var d2=getDateFromFormat(date2,dateformat2);
220	if (d1==0 || d2==0) {
221		return -1;
222		}
223	else if (d1 > d2) {
224		return 1;
225		}
226	return 0;
227	}
228
229// ------------------------------------------------------------------
230// formatDate (date_object, format)
231// Returns a date in the output format specified.
232// The format string uses the same abbreviations as in getDateFromFormat()
233// ------------------------------------------------------------------
234function formatDate(date,format) {
235	format=format+"";
236	var result="";
237	var i_format=0;
238	var c="";
239	var token="";
240	var y=date.getYear()+"";
241	var M=date.getMonth()+1;
242	var d=date.getDate();
243	var E=date.getDay();
244	var H=date.getHours();
245	var m=date.getMinutes();
246	var s=date.getSeconds();
247	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
248	// Convert real date parts into formatted versions
249	var value=new Object();
250	if (y.length < 4) {y=""+(y-0+1900);}
251	value["y"]=""+y;
252	value["yyyy"]=y;
253	value["yy"]=y.substring(2,4);
254	value["M"]=M;
255	value["MM"]=LZ(M);
256	value["MMM"]=MONTH_NAMES[M-1];
257	value["NNN"]=MONTH_NAMES[M+11];
258	value["d"]=d;
259	value["dd"]=LZ(d);
260	value["E"]=DAY_NAMES[E+7];
261	value["EE"]=DAY_NAMES[E];
262	value["H"]=H;
263	value["HH"]=LZ(H);
264	if (H==0){value["h"]=12;}
265	else if (H>12){value["h"]=H-12;}
266	else {value["h"]=H;}
267	value["hh"]=LZ(value["h"]);
268	if (H>11){value["K"]=H-12;} else {value["K"]=H;}
269	value["k"]=H+1;
270	value["KK"]=LZ(value["K"]);
271	value["kk"]=LZ(value["k"]);
272	if (H > 11) { value["a"]="PM"; }
273	else { value["a"]="AM"; }
274	value["m"]=m;
275	value["mm"]=LZ(m);
276	value["s"]=s;
277	value["ss"]=LZ(s);
278	while (i_format < format.length) {
279		c=format.charAt(i_format);
280		token="";
281		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
282			token += format.charAt(i_format++);
283			}
284		if (value[token] != null) { result=result + value[token]; }
285		else { result=result + token; }
286		}
287	return result;
288	}
289	
290// ------------------------------------------------------------------
291// Utility functions for parsing in getDateFromFormat()
292// ------------------------------------------------------------------
293function _isInteger(val) {
294	var digits="1234567890";
295	for (var i=0; i < val.length; i++) {
296		if (digits.indexOf(val.charAt(i))==-1) { return false; }
297		}
298	return true;
299	}
300function _getInt(str,i,minlength,maxlength) {
301	for (var x=maxlength; x>=minlength; x--) {
302		var token=str.substring(i,i+x);
303		if (token.length < minlength) { return null; }
304		if (_isInteger(token)) { return token; }
305		}
306	return null;
307	}
308	
309// ------------------------------------------------------------------
310// getDateFromFormat( date_string , format_string )
311//
312// This function takes a date string and a format string. It matches
313// If the date string matches the format string, it returns the 
314// getTime() of the date. If it does not match, it returns 0.
315// ------------------------------------------------------------------
316function getDateFromFormat(val,format) {
317	val=val+"";
318	format=format+"";
319	var i_val=0;
320	var i_format=0;
321	var c="";
322	var token="";
323	var token2="";
324	var x,y;
325	var now=new Date();
326	var year=now.getYear();
327	var month=now.getMonth()+1;
328	var date=1;
329	var hh=now.getHours();
330	var mm=now.getMinutes();
331	var ss=now.getSeconds();
332	var ampm="";
333	
334	while (i_format < format.length) {
335		// Get next token from format string
336		c=format.charAt(i_format);
337		token="";
338		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
339			token += format.charAt(i_format++);
340			}
341		// Extract contents of value based on format token
342		if (token=="yyyy" || token=="yy" || token=="y") {
343			if (token=="yyyy") { x=4;y=4; }
344			if (token=="yy")   { x=2;y=2; }
345			if (token=="y")    { x=2;y=4; }
346			year=_getInt(val,i_val,x,y);
347			if (year==null) { return 0; }
348			i_val += year.length;
349			if (year.length==2) {
350				if (year > 70) { year=1900+(year-0); }
351				else { year=2000+(year-0); }
352				}
353			}
354		else if (token=="MMM"||token=="NNN"){
355			month=0;
356			for (var i=0; i<MONTH_NAMES.length; i++) {
357				var month_name=MONTH_NAMES[i];
358				if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
359					if (token=="MMM"||(token=="NNN"&&i>11)) {
360						month=i+1;
361						if (month>12) { month -= 12; }
362						i_val += month_name.length;
363						break;
364						}
365					}
366				}
367			if ((month < 1)||(month>12)){return 0;}
368			}
369		else if (token=="EE"||token=="E"){
370			for (var i=0; i<DAY_NAMES.length; i++) {
371				var day_name=DAY_NAMES[i];
372				if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
373					i_val += day_name.length;
374					break;
375					}
376				}
377			}
378		else if (token=="MM"||token=="M") {
379			month=_getInt(val,i_val,token.length,2);
380			if(month==null||(month<1)||(month>12)){return 0;}
381			i_val+=month.length;}
382		else if (token=="dd"||token=="d") {
383			date=_getInt(val,i_val,token.length,2);
384			if(date==null||(date<1)||(date>31)){return 0;}
385			i_val+=date.length;}
386		else if (token=="hh"||token=="h") {
387			hh=_getInt(val,i_val,token.length,2);
388			if(hh==null||(hh<1)||(hh>12)){return 0;}
389			i_val+=hh.length;}
390		else if (token=="HH"||token=="H") {
391			hh=_getInt(val,i_val,token.length,2);
392			if(hh==null||(hh<0)||(hh>23)){return 0;}
393			i_val+=hh.length;}
394		else if (token=="KK"||token=="K") {
395			hh=_getInt(val,i_val,token.length,2);
396			if(hh==null||(hh<0)||(hh>11)){return 0;}
397			i_val+=hh.length;}
398		else if (token=="kk"||token=="k") {
399			hh=_getInt(val,i_val,token.length,2);
400			if(hh==null||(hh<1)||(hh>24)){return 0;}
401			i_val+=hh.length;hh--;}
402		else if (token=="mm"||token=="m") {
403			mm=_getInt(val,i_val,token.length,2);
404			if(mm==null||(mm<0)||(mm>59)){return 0;}
405			i_val+=mm.length;}
406		else if (token=="ss"||token=="s") {
407			ss=_getInt(val,i_val,token.length,2);
408			if(ss==null||(ss<0)||(ss>59)){return 0;}
409			i_val+=ss.length;}
410		else if (token=="a") {
411			if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
412			else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
413			else {return 0;}
414			i_val+=2;}
415		else {
416			if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
417			else {i_val+=token.length;}
418			}
419		}
420	// If there are any trailing characters left in the value, it doesn't match
421	if (i_val != val.length) { return 0; }
422	// Is date valid for month?
423	if (month==2) {
424		// Check for leap year
425		if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
426			if (date > 29){ return 0; }
427			}
428		else { if (date > 28) { return 0; } }
429		}
430	if ((month==4)||(month==6)||(month==9)||(month==11)) {
431		if (date > 30) { return 0; }
432		}
433	// Correct hours value
434	if (hh<12 && ampm=="PM") { hh=hh-0+12; }
435	else if (hh>11 && ampm=="AM") { hh-=12; }
436	var newdate=new Date(year,month-1,date,hh,mm,ss);
437	return newdate.getTime();
438	}
439
440// ------------------------------------------------------------------
441// parseDate( date_string [, prefer_euro_format] )
442//
443// This function takes a date string and tries to match it to a
444// number of possible date formats to get the value. It will try to
445// match against the following international formats, in this order:
446// y-M-d   MMM d, y   MMM d,y   y-MMM-d   d-MMM-y  MMM d
447// M/d/y   M-d-y      M.d.y     MMM-d     M/d      M-d
448// d/M/y   d-M-y      d.M.y     d-MMM     d/M      d-M
449// A second argument may be passed to instruct the method to search
450// for formats like d/M/y (european format) before M/d/y (American).
451// Returns a Date object or null if no patterns match.
452// ------------------------------------------------------------------
453function parseDate(val) {
454	var preferEuro=(arguments.length==2)?arguments[1]:false;
455	generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');
456	monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');
457	dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');
458	var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');
459	var d=null;
460	for (var i=0; i<checkList.length; i++) {
461		var l=window[checkList[i]];
462		for (var j=0; j<l.length; j++) {
463			d=getDateFromFormat(val,l[j]);
464			if (d!=0) { return new Date(d); }
465			}
466		}
467	return null;
468	}
469
470/* SOURCE FILE: PopupWindow.js */
471
472/* 
473PopupWindow.js
474Author: Matt Kruse
475Last modified: 02/16/04
476
477DESCRIPTION: This object allows you to easily and quickly popup a window
478in a certain place. The window can either be a DIV or a separate browser
479window.
480
481COMPATABILITY: Works with Netscape 4.x, 6.x, IE 5.x on Windows. Some small
482positioning errors - usually with Window positioning - occur on the 
483Macintosh platform. Due to bugs in Netscape 4.x, populating the popup 
484window with <STYLE> tags may cause errors.
485
486USAGE:
487// Create an object for a WINDOW popup
488var win = new PopupWindow(); 
489
490// Create an object for a DIV window using the DIV named 'mydiv'
491var win = new PopupWindow('mydiv'); 
492
493// Set the window to automatically hide itself when the user clicks 
494// anywhere else on the page except the popup
495win.autoHide(); 
496
497// Show the window relative to the anchor name passed in
498win.showPopup(anchorname);
499
500// Hide the popup
501win.hidePopup();
502
503// Set the size of the popup window (only applies to WINDOW popups
504win.setSize(width,height);
505
506// Populate the contents of the popup window that will be shown. If you 
507// change the contents while it is displayed, you will need to refresh()
508win.populate(string);
509
510// set the URL of the window, rather than populating its contents
511// manually
512win.setUrl("http://www.site.com/");
513
514// Refresh the contents of the popup
515win.refresh();
516
517// Specify how many pixels to the right of the anchor the popup will appear
518win.offsetX = 50;
519
520// Specify how many pixels below the anchor the popup will appear
521win.offsetY = 100;
522
523NOTES:
5241) Requires the functions in AnchorPosition.js
525
5262) Your anchor tag MUST contain both NAME and ID attributes which are the 
527   same. For example:
528   <A NAME="test" ID="test"> </A>
529
5303) There must be at least a space between <A> </A> for IE5.5 to see the 
531   anchor tag correctly. Do not do <A></A> with no space.
532
5334) When a PopupWindow object is created, a handler for 'onmouseup' is
534   attached to any event handler you may have already defined. Do NOT define
535   an event handler for 'onmouseup' after you define a PopupWindow object or
536   the autoHide() will not work correctly.
537*/ 
538
539// Set the position of the popup window based on the anchor
540function PopupWindow_getXYPosition(anchorname) {
541	var coordinates;
542	if (this.type == "WINDOW") {
543		coordinates = getAnchorWindowPosition(anchorname);
544		}
545	else {
546		coordinates = getAnchorPosition(anchorname);
547		}
548	this.x = coordinates.x;
549	this.y = coordinates.y;
550	}
551// Set width/height of DIV/popup window
552function PopupWindow_setSize(width,height) {
553	this.width = width;
554	this.height = height;
555	}
556// Fill the window with contents
557function PopupWindow_populate(contents) {
558	this.contents = contents;
559	this.populated = false;
560	}
561// Set the URL to go to
562function PopupWindow_setUrl(url) {
563	this.url = url;
564	}
565// Set the window popup properties
566function PopupWindow_setWindowProperties(props) {
567	this.windowProperties = props;
568	}
569// Refresh the displayed contents of the popup
570function PopupWindow_refresh() {
571	if (this.divName != null) {
572		// refresh the DIV object
573		if (this.use_gebi) {
574			document.getElementById(this.divName).innerHTML = this.contents;
575			}
576		else if (this.use_css) { 
577			document.all[this.divName].innerHTML = this.contents;
578			}
579		else if (this.use_layers) { 
580			var d = document.layers[this.divName]; 
581			d.document.open();
582			d.document.writeln(this.contents);
583			d.document.close();
584			}
585		}
586	else {
587		if (this.popupWindow != null && !this.popupWindow.closed) {
588			if (this.url!="") {
589				this.popupWindow.location.href=this.url;
590				}
591			else {
592				this.popupWindow.document.open();
593				this.popupWindow.document.writeln(this.contents);
594				this.popupWindow.document.close();
595			}
596			this.popupWindow.focus();
597			}
598		}
599	}
600// Position and show the popup, relative to an anchor object
601function PopupWindow_showPopup(anchorname) {
602	this.getXYPosition(anchorname);
603	this.x += this.offsetX;
604	this.y += this.offsetY;
605	if (!this.populated && (this.contents != "")) {
606		this.populated = true;
607		this.refresh();
608		}
609	if (this.divName != null) {
610		// Show the DIV object
611		if (this.use_gebi) {
612			document.getElementById(this.divName).style.left = this.x + "px";
613			document.getElementById(this.divName).style.top = this.y + "px";
614			document.getElementById(this.divName).style.visibility = "visible";
615			}
616		else if (this.use_css) {
617			document.all[this.divName].style.left = this.x;
618			document.all[this.divName].style.top = this.y;
619			document.all[this.divName].style.visibility = "visible";
620			}
621		else if (this.use_layers) {
622			document.layers[this.divName].left = this.x;
623			document.layers[this.divName].top = this.y;
624			document.layers[this.divName].visibility = "visible";
625			}
626		}
627	else {
628		if (this.popupWindow == null || this.popupWindow.closed) {
629			// If the popup window will go off-screen, move it so it doesn't
630			if (this.x<0) { this.x=0; }
631			if (this.y<0) { this.y=0; }
632			if (screen && screen.availHeight) {
633				if ((this.y + this.height) > screen.availHeight) {
634					this.y = screen.availHeight - this.height;
635					}
636				}
637			if (screen && screen.availWidth) {
638				if ((this.x + this.width) > screen.availWidth) {
639					this.x = screen.availWidth - this.width;
640					}
641				}
642			var avoidAboutBlank = window.opera || ( document.layers && !navigator.mimeTypes['*'] ) || navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled );
643			this.popupWindow = window.open(avoidAboutBlank?"":"about:blank","window_"+anchorname,this.windowProperties+",width="+this.width+",height="+this.height+",screenX="+this.x+",left="+this.x+",screenY="+this.y+",top="+this.y+"");
644			}
645		this.refresh();
646		}
647	}
648// Hide the popup
649function PopupWindow_hidePopup() {
650	if (this.divName != null) {
651		if (this.use_gebi) {
652			document.getElementById(this.divName).style.visibility = "hidden";
653			}
654		else if (this.use_css) {
655			document.all[this.divName].style.visibility = "hidden";
656			}
657		else if (this.use_layers) {
658			document.layers[this.divName].visibility = "hidden";
659			}
660		}
661	else {
662		if (this.popupWindow && !this.popupWindow.closed) {
663			this.popupWindow.close();
664			this.popupWindow = null;
665			}
666		}
667	}
668// Pass an event and return whether or not it was the popup DIV that was clicked
669function PopupWindow_isClicked(e) {
670	if (this.divName != null) {
671		if (this.use_layers) {
672			var clickX = e.pageX;
673			var clickY = e.pageY;
674			var t = document.layers[this.divName];
675			if ((clickX > t.left) && (clickX < t.left+t.clip.width) && (clickY > t.top) && (clickY < t.top+t.clip.height)) {
676				return true;
677				}
678			else { return false; }
679			}
680		else if (document.all) { // Need to hard-code this to trap IE for error-handling
681			var t = window.event.srcElement;
682			while (t.parentElement != null) {
683				if (t.id==this.divName) {
684					return true;
685					}
686				t = t.parentElement;
687				}
688			return false;
689			}
690		else if (this.use_gebi && e) {
691			var t = e.originalTarget;
692			while (t.parentNode != null) {
693				if (t.id==this.divName) {
694					return true;
695					}
696				t = t.parentNode;
697				}
698			return false;
699			}
700		return false;
701		}
702	return false;
703	}
704
705// Check an onMouseDown event to see if we should hide
706function PopupWindow_hideIfNotClicked(e) {
707	if (this.autoHideEnabled && !this.isClicked(e)) {
708		this.hidePopup();
709		}
710	}
711// Call this to make the DIV disable automatically when mouse is clicked outside it
712function PopupWindow_autoHide() {
713	this.autoHideEnabled = true;
714	}
715// This global function checks all PopupWindow objects onmouseup to see if they should be hidden
716function PopupWindow_hidePopupWindows(e) {
717	for (var i=0; i<popupWindowObjects.length; i++) {
718		if (popupWindowObjects[i] != null) {
719			var p = popupWindowObjects[i];
720			p.hideIfNotClicked(e);
721			}
722		}
723	}
724// Run this immediately to attach the event listener
725function PopupWindow_attachListener() {
726	if (document.layers) {
727		document.captureEvents(Event.MOUSEUP);
728		}
729	window.popupWindowOldEventListener = document.onmouseup;
730	if (window.popupWindowOldEventListener != null) {
731		document.onmouseup = new Function("window.popupWindowOldEventListener(); PopupWindow_hidePopupWindows();");
732		}
733	else {
734		document.onmouseup = PopupWindow_hidePopupWindows;
735		}
736	}
737// CONSTRUCTOR for the PopupWindow object
738// Pass it a DIV name to use a DHTML popup, otherwise will default to window popup
739function PopupWindow() {
740	if (!window.popupWindowIndex) { window.popupWindowIndex = 0; }
741	if (!window.popupWindowObjects) { window.popupWindowObjects = new Array(); }
742	if (!window.listenerAttached) {
743		window.listenerAttached = true;
744		PopupWindow_attachListener();
745		}
746	this.index = popupWindowIndex++;
747	popupWindowObjects[this.index] = this;
748	this.divName = null;
749	this.popupWindow = null;
750	this.width=0;
751	this.height=0;
752	this.populated = false;
753	this.visible = false;
754	this.autoHideEnabled = false;
755	
756	this.contents = "";
757	this.url="";
758	this.windowProperties="toolbar=no,location=no,status=no,menubar=no,scrollbars=auto,resizable,alwaysRaised,dependent,titlebar=no";
759	if (arguments.length>0) {
760		this.type="DIV";
761		this.divName = arguments[0];
762		}
763	else {
764		this.type="WINDOW";
765		}
766	this.use_gebi = false;
767	this.use_css = false;
768	this.use_layers = false;
769	if (document.getElementById) { this.use_gebi = true; }
770	else if (document.all) { this.use_css = true; }
771	else if (document.layers) { this.use_layers = true; }
772	else { this.type = "WINDOW"; }
773	this.offsetX = 0;
774	this.offsetY = 0;
775	// Method mappings
776	this.getXYPosition = PopupWindow_getXYPosition;
777	this.populate = PopupWindow_populate;
778	this.setUrl = PopupWindow_setUrl;
779	this.setWindowProperties = PopupWindow_setWindowProperties;
780	this.refresh = PopupWindow_refresh;
781	this.showPopup = PopupWindow_showPopup;
782	this.hidePopup = PopupWindow_hidePopup;
783	this.setSize = PopupWindow_setSize;
784	this.isClicked = PopupWindow_isClicked;
785	this.autoHide = PopupWindow_autoHide;
786	this.hideIfNotClicked = PopupWindow_hideIfNotClicked;
787	}
788
789/* SOURCE FILE: CalendarPopup.js */
790
791// HISTORY
792// ------------------------------------------------------------------
793// Feb 7, 2005: Fixed a CSS styles to use px unit
794// March 29, 2004: Added check in select() method for the form field
795//      being disabled. If it is, just return and don't do anything.
796// March 24, 2004: Fixed bug - when month name and abbreviations were
797//      changed, date format still used original values.
798// January 26, 2004: Added support for drop-down month and year
799//      navigation (Thanks to Chris Reid for the idea)
800// September 22, 2003: Fixed a minor problem in YEAR calendar with
801//      CSS prefix.
802// August 19, 2003: Renamed the function to get styles, and made it
803//      work correctly without an object reference
804// August 18, 2003: Changed showYearNavigation and 
805//      showYearNavigationInput to optionally take an argument of
806//      true or false
807// July 31, 2003: Added text input option for year navigation.
808//      Added a per-calendar CSS prefix option to optionally use 
809//      different styles for different calendars.
810// July 29, 2003: Fixed bug causing the Today link to be clickable 
811//      even though today falls in a disabled date range.
812//      Changed formatting to use pure CSS, allowing greater control
813//      over look-and-feel options.
814// June 11, 2003: Fixed bug causing the Today link to be unselectable
815//      under certain cases when some days of week are disabled
816// March 14, 2003: Added ability to disable individual dates or date
817//      ranges, display as light gray and strike-through
818// March 14, 2003: Removed dependency on graypixel.gif and instead 
819///     use table border coloring
820// March 12, 2003: Modified showCalendar() function to allow optional
821//      start-date parameter
822// March 11, 2003: Modified select() function to allow optional
823//      start-date parameter
824/* 
825DESCRIPTION: This object implements a popup calendar to allow the user to
826select a date, month, quarter, or year.
827
828COMPATABILITY: Works with Netscape 4.x, 6.x, IE 5.x on Windows. Some small
829positioning errors - usually with Window positioning - occur on the 
830Macintosh platform.
831The calendar can be modified to work for any location in the world by 
832changing which weekday is displayed as the first column, changing the month
833names, and changing the column headers for each day.
834
835USAGE:
836// Create a new CalendarPopup object of type WINDOW
837var cal = new CalendarPopup(); 
838
839// Create a new CalendarPopup object of type DIV using the DIV named 'mydiv'
840var cal = new CalendarPopup('mydiv'); 
841
842// Easy method to link the popup calendar with an input box. 
843cal.select(inputObject, anchorname, dateFormat);
844// Same method, but passing a default date other than the field's current value
845cal.select(inputObject, anchorname, dateFormat, '01/02/2000');
846// This is an example call to the popup calendar from a link to populate an 
847// input box. Note that to use this, date.js must also be included!!
848<A HREF="#" onClick="cal.select(document.forms[0].date,'anchorname','MM/dd/yyyy'); return false;">Select</A>
849
850// Set the type of date select to be used. By default it is 'date'.
851cal.setDisplayType(type);
852
853// When a date, month, quarter, or year is clicked, a function is called and
854// passed the details. You must write this function, and tell the calendar
855// popup what the function name is.
856// Function to be called for 'date' select receives y, m, d
857cal.setReturnFunction(functionname);
858// Function to be called for 'month' select receives y, m
859cal.setReturnMonthFunction(functionname);
860// Function to be called for 'quarter' select receives y, q
861cal.setReturnQuarterFunction(functionname);
862// Function to be called for 'year' select receives y
863cal.setReturnYearFunction(functionname);
864
865// Show the calendar relative to a given anchor
866cal.showCalendar(anchorname);
867
868// Hide the calendar. The calendar is set to autoHide automatically
869cal.hideCalendar();
870
871// Set the month names to be used. Default are English month names
872cal.setMonthNames("January","February","March",...);
873
874// Set the month abbreviations to be used. Default are English month abbreviations
875cal.setMonthAbbreviations("Jan","Feb","Mar",...);
876
877// Show navigation for changing by the year, not just one month at a time
878cal.showYearNavigation();
879
880// Show month and year dropdowns, for quicker selection of month of dates
881cal.showNavigationDropdowns();
882
883// Set the text to be used above each day column. The days start with 
884// sunday regardless of the value of WeekStartDay
885cal.setDayHeaders("S","M","T",...);
886
887// Set the day for the first column in the calendar grid. By default this
888// is Sunday (0) but it may be changed to fit the conventions of other
889// countries.
890cal.setWeekStartDay(1); // week is Monday - Sunday
891
892// Set the weekdays which should be disabled in the 'date' select popup. You can
893// then allow someone to only select week end dates, or Tuedays, for example
894cal.setDisabledWeekDays(0,1); // To disable selecting the 1st or 2nd days of the week
895
896// Selectively disable individual days or date ranges. Disabled days will not
897// be clickable, and show as strike-through text on current browsers.
898// Date format is any format recognized by parseDate() in date.js
899// Pass a single date to disable:
900cal.addDisabledDates("2003-01-01");
901// Pass null as the first parameter to mean "anything up to and including" the
902// passed date:
903cal.addDisabledDates(null, "01/02/03");
904// Pass null as the second parameter to mean "including the passed date and
905// anything after it:
906cal.addDisabledDates("Jan 01, 2003", null);
907// Pass two dates to disable all dates inbetween and including the two
908cal.addDisabledDates("January 01, 2003", "Dec 31, 2003");
909
910// When the 'year' select is displayed, set the number of years back from the 
911// current year to start listing years. Default is 2.
912// This is also used for year drop-down, to decide how many years +/- to display
913cal.setYearSelectStartOffset(2);
914
915// Text for the word "Today" appearing on the calendar
916cal.setTodayText("Today");
917
918// The calendar uses CSS classes for formatting. If you want your calendar to
919// have unique styles, you can set the prefix that will be added to all the
920// classes in the output.
921// For example, normal output may have this:
922//     <SPAN CLASS="cpTodayTextDisabled">Today<SPAN>
923// But if you set the prefix like this:
924cal.setCssPrefix("Test");
925// The output will then look like:
926//     <SPAN CLASS="TestcpTodayTextDisabled">Today<SPAN>
927// And you can define that style somewhere in your page.
928
929// When using Year navigation, you can make the year be an input box, so
930// the user can manually change it and jump to any year
931cal.showYearNavigationInput();
932
933// Set the calendar offset to be different than the default. By default it
934// will appear just below and to the right of the anchorname. So if you have
935// a text box where the date will go and and anchor immediately after the
936// text box, the calendar will display immediately under the text box.
937cal.offsetX = 20;
938cal.offsetY = 20;
939
940NOTES:
9411) Requires the functions in AnchorPosition.js and PopupWindow.js
942
9432) Your anchor tag MUST contain both NAME and ID attributes which are the 
944   same. For example:
945   <A NAME="test" ID="test"> </A>
946
9473) There must be at least a space between <A> </A> for IE5.5 to see the 
948   anchor tag correctly. Do not do <A></A> with no space.
949
9504) When a CalendarPopup object is created, a handler for 'onmouseup' is
951   attached to any event handler you may have already defined. Do NOT define
952   an event handler for 'onmouseup' after you define a CalendarPopup object 
953   or the autoHide() will not work correctly.
954   
9555) The calendar popup display uses style sheets to make it look nice.
956
957*/ 
958
959// Quick fix for FF3
960function CP_stop(e) { if (e && e.stopPropagation) { e.stopPropagation(); } }
961
962// CONSTRUCTOR for the CalendarPopup Object
963function CalendarPopup() {
964	var c;
965	if (arguments.length>0) {
966		c = new PopupWindow(arguments[0]);
967		}
968	else {
969		c = new PopupWindow();
970		c.setSize(150,175);
971		}
972	c.offsetX = -152;
973	c.offsetY = 25;
974	c.autoHide();
975	// Calendar-specific properties
976	c.monthNames = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
977	c.monthAbbreviations = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
978	c.dayHeaders = new Array("S","M","T","W","T","F","S");
979	c.returnFunction = "CP_tmpReturnFunction";
980	c.returnMonthFunction = "CP_tmpReturnMonthFunction";
981	c.returnQuarterFunction = "CP_tmpReturnQuarterFunction";
982	c.returnYearFunction = "CP_tmpReturnYearFunction";
983	c.weekStartDay = 0;
984	c.isShowYearNavigation = false;
985	c.displayType = "date";
986	c.disabledWeekDays = new Object();
987	c.disabledDatesExpression = "";
988	c.yearSelectStartOffset = 100;
989	c.currentDate = null;
990	c.todayText="Today";
991	c.cssPrefix="";
992	c.isShowNavigationDropdowns=false;
993	c.isShowYearNavigationInput=false;
994	window.CP_calendarObject = null;
995	window.CP_targetInput = null;
996	window.CP_dateFormat = "MM/dd/yyyy";
997	// Method mappings
998	c.copyMonthNamesToWindow = CP_copyMonthNamesToWindow;
999	c.setReturnFunction = CP_setReturnFunction;
1000	c.setReturnMonthFunction = CP_setReturnMonthFunction;
1001	c.setReturnQuarterFunction = CP_setReturnQuarterFunction;
1002	c.setReturnYearFunction = CP_setReturnYearFunction;
1003	c.setMonthNames = CP_setMonthNames;
1004	c.setMonthAbbreviations = CP_setMonthAbbreviations;
1005	c.setDayHeaders = CP_setDayHeaders;
1006	c.setWeekStartDay = CP_setWeekStartDay;
1007	c.setDisplayType = CP_setDisplayType;
1008	c.setDisabledWeekDays = CP_setDisabledWeekDays;
1009	c.addDisabledDates = CP_addDisabledDates;
1010	c.setYearSelectStartOffset = CP_setYearSelectStartOffset;
1011	c.setTodayText = CP_setTodayText;
1012	c.showYearNavigation = CP_showYearNavigation;
1013	c.showCalendar = CP_showCalendar;
1014	c.hideCalendar = CP_hideCalendar;
1015	c.getStyles = getCalendarStyles;
1016	c.refreshCalendar = CP_refreshCalendar;
1017	c.getCalendar = CP_getCalendar;
1018	c.select = CP_select;
1019	c.setCssPrefix = CP_setCssPrefix;
1020	c.showNavigationDropdowns = CP_showNavigationDropdowns;
1021	c.showYearNavigationInput = CP_showYearNavigationInput;
1022	c.copyMonthNamesToWindow();
1023	// Return the object
1024	return c;
1025	}
1026function CP_copyMonthNamesToWindow() {
1027	// Copy these values over to the date.js 
1028	if (typeof(window.MONTH_NAMES)!="undefined" && window.MONTH_NAMES!=null) {
1029		window.MONTH_NAMES = new Array();
1030		for (var i=0; i<this.monthNames.length; i++) {
1031			window.MONTH_NAMES[window.MONTH_NAMES.length] = this.monthNames[i];
1032		}
1033		for (var i=0; i<this.monthAbbreviations.length; i++) {
1034			window.MONTH_NAMES[window.MONTH_NAMES.length] = this.monthAbbreviations[i];
1035		}
1036	}
1037}
1038// Temporary default functions to be called when items clicked, so no error is thrown
1039function CP_tmpReturnFunction(y,m,d) { 
1040	if (window.CP_targetInput!=null) {
1041		var dt = new Date(y,m-1,d,0,0,0);
1042		if (window.CP_calendarObject!=null) { window.CP_calendarObject.copyMonthNamesToWindow(); }
1043		window.CP_targetInput.value = formatDate(dt,window.CP_dateFormat);
1044		}
1045	else {
1046		alert('Use setReturnFunction() to define which function will get the clicked results!'); 
1047		}
1048	}
1049function CP_tmpReturnMonthFunction(y,m) { 
1050	alert('Use setReturnMonthFunction() to define which function will get the clicked results!\nYou clicked: year='+y+' , month='+m); 
1051	}
1052function CP_tmpReturnQuarterFunction(y,q) { 
1053	alert('Use setReturnQuarterFunction() to define which function will get the clicked results!\nYou clicked: year='+y+' , quarter='+q); 
1054	}
1055function CP_tmpReturnYearFunction(y) { 
1056	alert('Use setReturnYearFunction() to define which function will get the clicked results!\nYou clicked: year='+y); 
1057	}
1058
1059// Set the name of the functions to call to get the clicked item
1060function CP_setReturnFunction(name) { this.returnFunction = name; }
1061function CP_setReturnMonthFunction(name) { this.returnMonthFunction = name; }
1062function CP_setReturnQuarterFunction(name) { this.returnQuarterFunction = name; }
1063function CP_setReturnYearFunction(name) { this.returnYearFunction = name; }
1064
1065// Over-ride the built-in month names
1066function CP_setMonthNames() {
1067	for (var i=0; i<arguments.length; i++) { this.monthNames[i] = arguments[i]; }
1068	this.copyMonthNamesToWindow();
1069	}
1070
1071// Over-ride the built-in month abbreviations
1072function CP_setMonthAbbreviations() {
1073	for (var i=0; i<arguments.length; i++) { this.monthAbbreviations[i] = arguments[i]; }
1074	this.copyMonthNamesToWindow();
1075	}
1076
1077// Over-ride the built-in column headers for each day
1078function CP_setDayHeaders() {
1079	for (var i=0; i<arguments.length; i++) { this.dayHeaders[i] = arguments[i]; }
1080	}
1081
1082// Set the day of the week (0-7) that the calendar display starts on
1083// This is for countries other than the US whose calendar displays start on Monday(1), for example
1084function CP_setWeekStartDay(day) { this.weekStartDay = day; }
1085
1086// Show next/last year navigation links
1087function CP_showYearNavigation() { this.isShowYearNavigation = (arguments.length>0)?arguments[0]:true; }
1088
1089// Which type of calendar to display
1090function CP_setDisplayType(type) {
1091	if (type!="date"&&type!="week-end"&&type!="month"&&type!="quarter"&&type!="year") { alert("Invalid display type! Must be one of: date,week-end,month,quarter,year"); return false; }
1092	this.displayType=type;
1093	}
1094
1095// How many years back to start by default for year display
1096function CP_setYearSelectStartOffset(num) { this.yearSelectStartOffset=num; }
1097
1098// Set which weekdays should not be clickable
1099function CP_setDisabledWeekDays() {
1100	this.disabledWeekDays = new Object();
1101	for (var i=0; i<arguments.length; i++) { this.disabledWeekDays[arguments[i]] = true; }
1102	}
1103	
1104// Disable individual dates or ranges
1105// Builds an internal logical test which is run via eval() for efficiency
1106function CP_addDisabledDates(start, end) {
1107	if (arguments.length==1) { end=start; }
1108	if (start==null && end==null) { return; }
1109	if (this.disabledDatesExpression!="") { this.disabledDatesExpression+= "||"; }
1110	if (start!=null) { start = parseDate(start); start=""+start.getFullYear()+LZ(start.getMonth()+1)+LZ(start.getDate());}
1111	if (end!=null) { end=parseDate(end); end=""+end.getFullYear()+LZ(end.getMonth()+1)+LZ(end.getDate());}
1112	if (start==null) { this.disabledDatesExpression+="(ds<="+end+")"; }
1113	else if (end  ==null) { this.disabledDatesExpression+="(ds>="+start+")"; }
1114	else { this.disabledDatesExpression+="(ds>="+start+"&&ds<="+end+")"; }
1115	}
1116	
1117// Set the text to use for the "Today" link
1118function CP_setTodayText(text) {
1119	this.todayText = text;
1120	}
1121
1122// Set the prefix to be added to all CSS classes when writing output
1123function CP_setCssPrefix(val) { 
1124	this.cssPrefix = val; 
1125	}
1126
1127// Show the navigation as an dropdowns that can be manually changed
1128function CP_showNavigationDropdowns() { this.isShowNavigationDropdowns = (arguments.length>0)?arguments[0]:true; }
1129
1130// Show the year navigation as an input box that can be manually changed
1131function CP_showYearNavigationInput() { this.isShowYearNavigationInput = (arguments.length>0)?arguments[0]:true; }
1132
1133// Hide a calendar object
1134function CP_hideCalendar() {
1135	if (arguments.length > 0) { window.popupWindowObjects[arguments[0]].hidePopup(); }
1136	else { this.hidePopup(); }
1137	}
1138
1139// Refresh the contents of the calendar display
1140function CP_refreshCalendar(index) {
1141	var calObject = window.popupWindowObjects[index];
1142	if (arguments.length>1) { 
1143		calObject.populate(calObject.getCalendar(arguments[1],arguments[2],arguments[3],arguments[4],arguments[5]));
1144		}
1145	else {
1146		calObject.populate(calObject.getCalendar());
1147		}
1148	calObject.refresh();
1149	}
1150
1151// Populate the calendar and display it
1152function CP_showCalendar(anchorname) {
1153	if (arguments.length>1) {
1154		if (arguments[1]==null||arguments[1]=="") {
1155			this.currentDate=new Date();
1156			}
1157		else {
1158			this.currentDate=new Date(parseDate(arguments[1]));
1159			}
1160		}
1161	this.populate(this.getCalendar());
1162	this.showPopup(anchorname);
1163	}
1164
1165// Simple method to interface popup calendar with a text-entry box
1166function CP_select(inputobj, linkname, format) {
1167	var selectedDate=(arguments.length>3)?arguments[3]:null;
1168	if (!window.getDateFromFormat) {
1169		alert("calendar.select: To use this method you must also include 'date.js' for date formatting");
1170		return;
1171		}
1172	if (this.displayType!="date"&&this.displayType!="week-end") {
1173		alert("calendar.select: This function can only be used with displayType 'date' or 'week-end'");
1174		return;
1175		}
1176	if (inputobj.type!="text" && inputobj.type!="hidden" && inputobj.type!="textarea") { 
1177		alert("calendar.select: Input object passed is not a valid form input object"); 
1178		window.CP_targetInput=null;
1179		return;
1180		}
1181	if (inputobj.disabled) { return; } // Can't use calendar input on disabled form input!
1182	window.CP_targetInput = inputobj;
1183	window.CP_calendarObject = this;
1184	this.currentDate=null;
1185	var time=0;
1186	if (selectedDate!=null) {
1187		time = getDateFromFormat(selectedDate,format)
1188		}
1189	else if (inputobj.value!="") {
1190		time = getDateFromFormat(inputobj.value,format);
1191		}
1192	if (selectedDate!=null || inputobj.value!="") {
1193		if (time==0) { this.currentDate=null; }
1194		else { this.currentDate=new Date(time); }
1195		}
1196	window.CP_dateFormat = format;
1197	this.showCalendar(linkname);
1198	}
1199	
1200// Get style block needed to display the calendar correctly
1201function getCalendarStyles() {
1202	var result = "";
1203	var p = "";
1204	if (this!=null && typeof(this.cssPrefix)!="undefined" && this.cssPrefix!=null && this.cssPrefix!="") { p=this.cssPrefix; }
1205	result += "<STYLE>\n";
1206	result += "."+p+"cpYearNavigation,."+p+"cpMonthNavigation { background-color:#C0C0C0; text-align:center; vertical-align:center; text-decoration:none; color:#000000; font-weight:bold; }\n";
1207	result += "."+p+"cpDayColumnHeader, ."+p+"cpYearNavigation,."+p+"cpMonthNavigation,."+p+"cpCurrentMonthDate,."+p+"cpCurrentMonthDateDisabled,."+p+"cpOtherMonthDate,."+p+"cpOtherMonthDateDisabled,."+p+"cpCurrentDate,."+p+"cpCurrentDateDisabled,."+p+"cpTodayText,."+p+"cpTodayTextDisabled,."+p+"cpText { font-family:arial; font-size:8pt; }\n";
1208	result += "TD."+p+"cpDayColumnHeader { text-align:right; border:solid thin #C0C0C0;border-width:0px 0px 1px 0px; }\n";
1209	result += "."+p+"cpCurrentMonthDate, ."+p+"cpOtherMonthDate, ."+p+"cpCurrentDate  { text-align:right; text-decoration:none; }\n";
1210	result += "."+p+"cpCurrentMonthDateDisabled, ."+p+"cpOtherMonthDateDisabled, ."+p+"cpCurrentDateDisabled { color:#D0D0D0; text-align:right; text-decoration:line-through; }\n";
1211	result += "."+p+"cpCurrentMonthDate, .cpCurrentDate { color:#000000; }\n";
1212	result += "."+p+"cpOtherMonthDate { color:#808080; }\n";
1213	result += "TD."+p+"cpCurrentDate { color:white; background-color: #C0C0C0; border-width:1px; border:solid thin #800000; }\n";
1214	result += "TD."+p+"cpCurrentDateDisabled { border-width:1px; border:solid thin #FFAAAA; }\n";
1215	result += "TD."+p+"cpTodayText, TD."+p+"cpTodayTextDisabled { border:solid thin #C0C0C0; border-width:1px 0px 0px 0px;}\n";
1216	result += "A."+p+"cpTodayText, SPAN."+p+"cpTodayTextDisabled { height:20px; }\n";
1217	result += "A."+p+"cpTodayText { color:black; }\n";
1218	result += "."+p+"cpTodayTextDisabled { color:#D0D0D0; }\n";
1219	result += "."+p+"cpBorder { border:solid thin #808080; }\n";
1220	result += "</STYLE>\n";
1221	return result;
1222	}
1223
1224// Return a string containing all the calendar code to be displayed
1225function CP_getCalendar() {
1226	var now = new Date();
1227	// Reference to window
1228	if (this.type == "WINDOW") { var windowref = "window.opener."; }
1229	else { var windowref = ""; }
1230	var result = "";
1231	// If POPUP, write entire HTML document
1232	if (this.type == "WINDOW") {
1233		result += "<HTML><HEAD><TITLE>Calendar</TITLE>"+this.getStyles()+"</HEAD><BODY MARGINWIDTH=0 MARGINHEIGHT=0 TOPMARGIN=0 RIGHTMARGIN=0 LEFTMARGIN=0>\n";
1234		result += '<CENTER><TABLE WIDTH=100% BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>\n';
1235		}
1236	else {
1237		result += '<TABLE CLASS="'+this.cssPrefix+'cpBorder" WIDTH=144 BORDER=1 BORDERWIDTH=1 CELLSPACING=0 CELLPADDING=1>\n';
1238		result += '<TR><TD ALIGN=CENTER>\n';
1239		result += '<CENTER>\n';
1240		}
1241	// Code for DATE display (default)
1242	// -------------------------------
1243	if (this.displayType=="date" || this.displayType=="week-end") {
1244		if (this.currentDate==null) { this.currentDate = now; }
1245		if (arguments.length > 0) { var month = arguments[0]; }
1246			else { var month = this.currentDate.getMonth()+1; }
1247		if (arguments.length > 1 && arguments[1]>0 && arguments[1]-0==arguments[1]) { var year = arguments[1]; }
1248			else { var year = this.currentDate.getFullYear(); }
1249		var daysinmonth= new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
1250		if ( ( (year%4 == 0)&&(year%100 != 0) ) || (year%400 == 0) ) {
1251			daysinmonth[2] = 29;
1252			}
1253		var current_month = new Date(year,month-1,1);
1254		var display_year = year;
1255		var display_month = month;
1256		var display_date = 1;
1257		var weekday= current_month.getDay();
1258		var offset = 0;
1259		
1260		offset = (weekday >= this.weekStartDay) ? weekday-this.weekStartDay : 7-this.weekStartDay+weekday ;
1261		if (offset > 0) {
1262			display_month--;
1263			if (display_month < 1) { display_month = 12; display_year--; }
1264			display_date = daysinmonth[display_month]-offset+1;
1265			}
1266		var next_month = month+1;
1267		var next_month_year = year;
1268		if (next_month > 12) { next_month=1; next_month_year++; }
1269		var last_month = month-1;
1270		var last_month_year = year;
1271		if (last_month < 1) { last_month=12; last_month_year--; }
1272		var date_class;
1273		if (this.type!="WINDOW") {
1274			result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";
1275			}
1276		result += '<TR>\n';
1277		var refresh = windowref+'CP_refreshCalendar';
1278		var refreshLink = 'javascript:' + refresh;
1279		if (this.isShowNavigationDropdowns) {
1280			result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="78" COLSPAN="3"><select CLASS="'+this.cssPrefix+'cpMonthNavigation" name="cpMonth" onmouseup="CP_stop(event)" onChange="'+refresh+'('+this.index+',this.options[this.selectedIndex].value-0,'+(year-0)+');">';
1281			for( var monthCounter=1; monthCounter<=12; monthCounter++ ) {
1282				var selected = (monthCounter==month) ? 'SELECTED' : '';
1283				result += '<option value="'+monthCounter+'" '+selected+'>'+this.monthNames[monthCounter-1]+'</option>';
1284				}
1285			result += '</select></TD>';
1286			result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="10">&nbsp;</TD>';
1287
1288			result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="56" COLSPAN="3"><select CLASS="'+this.cssPrefix+'cpYearNavigation" name="cpYear" onmouseup="CP_stop(event)" onChange="'+refresh+'('+this.index+','+month+',this.options[this.selectedIndex].value-0);">';
1289			for( var yearCounter=year-this.yearSelectStartOffset; yearCounter<=year+5; yearCounter++ ) {
1290				var selected = (yearCounter==year) ? 'SELECTED' : '';
1291				result += '<option value="'+yearCounter+'" '+selected+'>'+yearCounter+'</option>';
1292				}
1293			result += '</select></TD>';
1294			}
1295		else {
1296			if (this.isShowYearNavigation) {
1297				result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="10"><A CLASS="'+this.cssPrefix+'cpMonthNavigation" HREF="'+refreshLink+'('+this.index+','+last_month+','+last_month_year+');">&lt;</A></TD>';
1298				result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="58"><SPAN CLASS="'+this.cssPrefix+'cpMonthNavigation">'+this.monthNames[month-1]+'</SPAN></TD>';
1299				result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="10"><A CLASS="'+this.cssPrefix+'cpMonthNavigation" HREF="'+refreshLink+'('+this.index+','+next_month+','+next_month_year+');">&gt;</A></TD>';
1300				result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="10">&nbsp;</TD>';
1301
1302				result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="10"><A CLASS="'+this.cssPrefix+'cpYearNavigation" HREF="'+refreshLink+'('+this.index+','+month+','+(year-1)+');">&lt;</A></TD>';
1303				if (this.isShowYearNavigationInput) {
1304					result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="36"><INPUT NAME="cpYear" CLASS="'+this.cssPrefix+'cpYearNavigation" SIZE="4" MAXLENGTH="4" VALUE="'+year+'" onBlur="'+refresh+'('+this.index+','+month+',this.value-0);"></TD>';
1305					}
1306				else {
1307					result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="36"><SPAN CLASS="'+this.cssPrefix+'cpYearNavigation">'+year+'</SPAN></TD>';
1308					}
1309				result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="10"><A CLASS="'+this.cssPrefix+'cpYearNavigation" HREF="'+refreshLink+'('+this.index+','+month+','+(year+1)+');">&gt;</A></TD>';
1310				}
1311			else {
1312				result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="22"><A CLASS="'+this.cssPrefix+'cpMonthNavigation" HREF="'+refreshLink+'('+this.index+','+last_month+','+last_month_year+');">&lt;&lt;</A></TD>\n';
1313				result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="100"><SPAN CLASS="'+this.cssPrefix+'cpMonthNavigation">'+this.monthNames[month-1]+' '+year+'</SPAN></TD>\n';
1314				result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="22"><A CLASS="'+this.cssPrefix+'cpMonthNavigation" HREF="'+refreshLink+'('+this.index+','+next_month+','+next_month_year+');">&gt;&gt;</A></TD>\n';
1315				}
1316			}
1317		result += '</TR></TABLE>\n';
1318		result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=0 CELLPADDING=1 ALIGN=CENTER>\n';
1319		result += '<TR>\n';
1320		for (var j=0; j<7; j++) {
1321
1322			result += '<TD CLASS="'+this.cssPrefix+'cpDayColumnHeader" WIDTH="14%"><SPAN CLASS="'+this.cssPrefix+'cpDayColumnHeader">'+this.dayHeaders[(this.weekStartDay+j)%7]+'</TD>\n';
1323			}
1324		result += '</TR>\n';
1325		for (var row=1; row<=6; row++) {
1326			result += '<TR>\n';
1327			for (var col=1; col<=7; col++) {
1328				var disabled=false;
1329				if (this.disabledDatesExpression!="") {
1330					var ds=""+display_year+LZ(display_month)+LZ(display_date);
1331					eval("disabled=("+this.disabledDatesExpression+")");
1332					}
1333				var dateClass = "";
1334				if ((display_month == this.currentDate.getMonth()+1) && (display_date==this.currentDate.getDate()) && (display_year==this.currentDate.getFullYear())) {
1335					dateClass = "cpCurrentDate";
1336					}
1337				else if (display_month == month) {
1338					dateClass = "cpCurrentMonthDate";
1339					}
1340				else {
1341					dateClass = "cpOtherMonthDate";
1342					}
1343				if (disabled || this.disabledWeekDays[col-1]) {
1344					result += '	<TD CLASS="'+this.cssPrefix+dateClass+'"><SPAN CLASS="'+this.cssPrefix+dateClass+'Disabled">'+display_date+'</SPAN></TD>\n';
1345					}
1346				else {
1347					var selected_date = display_date;
1348					var selected_month = display_month;
1349					var selected_year = display_year;
1350					if (this.displayType=="week-end") {
1351						var d = new Date(selected_year,selected_month-1,selected_date,0,0,0,0);
1352						d.setDate(d.getDate() + (7-col));
1353						selected_year = d.getYear();
1354						if (selected_year < 1000) { selected_year += 1900; }
1355						selected_month = d.getMonth()+1;
1356						selected_date = d.getDate();
1357						}
1358					result += '	<TD CLASS="'+this.cssPrefix+dateClass+'"><A HREF="javascript:'+windowref+this.returnFunction+'('+selected_year+','+selected_month+','+selected_date+');'+windowref+'CP_hideCalendar(\''+this.index+'\');" CLASS="'+this.cssPrefix+dateClass+'">'+display_date+'</A></TD>\n';
1359					}
1360				display_date++;
1361				if (display_date > daysinmonth[display_month]) {
1362					display_date=1;
1363					display_month++;
1364					}
1365				if (display_month > 12) {
1366					display_month=1;
1367					display_year++;
1368					}
1369				}
1370			result += '</TR>';
1371			}
1372		var current_weekday = now.getDay() - this.weekStartDay;
1373		if (current_weekday < 0) {
1374			current_weekday += 7;
1375			}
1376		result += '<TR>\n';
1377		result += '	<TD COLSPAN=7 ALIGN=CENTER CLASS="'+this.cssPrefix+'cpTodayText">\n';
1378		if (this.disabledDatesExpression!="") {
1379			var ds=""+now.getFullYear()+LZ(now.getMonth()+1)+LZ(now.getDate());
1380			eval("disabled=("+this.disabledDatesExpression+")");
1381			}
1382		if (disabled || this.disabledWeekDays[current_weekday+1]) {
1383			result += '		<SPAN CLASS="'+this.cssPrefix+'cpTodayTextDisabled">'+this.todayText+'</SPAN>\n';
1384			}
1385		else {
1386			result += '		<A CLASS="'+this.cssPrefix+'cpTodayText" HREF="javascript:'+windowref+this.returnFunction+'(\''+now.getFullYear()+'\',\''+(now.getMonth()+1)+'\',\''+now.getDate()+'\');'+windowref+'CP_hideCalendar(\''+this.index+'\');">
1386'+this.todayText+'</A>\n';
1387			}
1388		result += '		<BR>\n';
1389		result += '	</TD></TR></TABLE></CENTER></TD></TR></TABLE>\n';
1390	}
1391
1392	// Code common for MONTH, QUARTER, YEAR
1393	// ------------------------------------
1394	if (this.displayType=="month" || this.displayType=="quarter" || this.displayType=="year") {
1395		if (arguments.length > 0) { var year = arguments[0]; }
1396		else { 
1397			if (this.displayType=="year") {	var year = now.getFullYear()-this.yearSelectStartOffset; }
1398			else { var year = now.getFullYear(); }
1399			}
1400		if (this.displayType!="year" && this.isShowYearNavigation) {
1401			result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";
1402			result += '<TR>\n';
1403			result += '	<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="22"><A CLASS="'+this.cssPrefix+'cpYearNavigation" HREF="javascript:'+windowref+'CP_refreshCalendar('+this.index+','+(year-1)+');">&lt;&lt;</A></TD>\n';
1404			result += '	<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="100">'+year+'</TD>\n';
1405			result += '	<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="22"><A CLASS="'+this.cssPrefix+'cpYearNavigation" HREF="javascript:'+windowref+'CP_refreshCalendar('+this.index+','+(year+1)+');">&gt;&gt;</A></TD>\n';
1406			result += '</TR></TABLE>\n';
1407			}
1408		}
1409		
1410	// Code for MONTH display 
1411	// ----------------------
1412	if (this.displayType=="month") {
1413		// If POPUP, write entire HTML document
1414		result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';
1415		for (var i=0; i<4; i++) {
1416			result += '<TR>';
1417			for (var j=0; j<3; j++) {
1418				var monthindex = ((i*3)+j);
1419				result += '<TD WIDTH=33% ALIGN=CENTER><A CLASS="'+this.cssPrefix+'cpText" HREF="javascript:'+windowref+this.returnMonthFunction+'('+year+','+(monthindex+1)+');'+windowref+'CP_hideCalendar(\''+this.index+'\');" CLASS="'+date_class+'">'+this.monthAbbreviations[monthindex]+'</A></TD>';
1420				}
1421			result += '</TR>';
1422			}
1423		result += '</TABLE></CENTER></TD></TR></TABLE>\n';
1424		}
1425	
1426	// Code for QUARTER display
1427	// ------------------------
1428	if (this.displayType=="quarter") {
1429		result += '<BR><TABLE WIDTH=120 BORDER=1 CELLSPACING=0 CELLPADDING=0 ALIGN=CENTER>\n';
1430		for (var i=0; i<2; i++) {
1431			result += '<TR>';
1432			for (var j=0; j<2; j++) {
1433				var quarter = ((i*2)+j+1);
1434				result += '<TD WIDTH=50% ALIGN=CENTER><BR><A CLASS="'+this.cssPrefix+'cpText" HREF="javascript:'+windowref+this.returnQuarterFunction+'('+year+','+quarter+');'+windowref+'CP_hideCalendar(\''+this.index+'\');" CLASS="'+date_class+'">Q'+quarter+'</A><BR><BR></TD>';
1435				}
1436			result += '</TR>';
1437			}
1438		result += '</TABLE></CENTER></TD></TR></TABLE>\n';
1439		}
1440
1441	// Code for YEAR display
1442	// ---------------------
1443	if (this.displayType=="year") {
1444		var yearColumnSize = 4;
1445		result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";
1446		result += '<TR>\n';
1447		result += '	<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="50%"><A CLASS="'+this.cssPrefix+'cpYearNavigation" HREF="javascript:'+windowref+'CP_refreshCalendar('+this.index+','+(year-(yearColumnSize*2))+');">&lt;&lt;</A></TD>\n';
1448		result += '	<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="50%"><A CLASS="'+this.cssPrefix+'cpYearNavigation" HREF="javascript:'+windowref+'CP_refreshCalendar('+this.index+','+(year+(yearColumnSize*2))+');">&gt;&gt;</A></TD>\n';
1449		result += '</TR></TABLE>\n';
1450		result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';
1451		for (var i=0; i<yearColumnSize; i++) {
1452			for (var j=0; j<2; j++) {
1453				var currentyear = year+(j*yearColumnSize)+i;
1454				result += '<TD WIDTH=50% ALIGN=CENTER><A CLASS="'+this.cssPrefix+'cpText" HREF="javascript:'+windowref+this.returnYearFunction+'('+currentyear+');'+windowref+'CP_hideCalendar(\''+this.index+'\');" CLASS="'+date_class+'">'+currentyear+'</A></TD>';
1455				}
1456			result += '</TR>';
1457			}
1458		result += '</TABLE></CENTER></TD></TR></TABLE>\n';
1459		}
1460	// Common
1461	if (this.type == "WINDOW") {
1462		result += "</BODY></HTML>\n";
1463		}
1464	return result;
1465	}
1466	
1467	
1468	
1469function writeSource(div) {
1470	if (!document.getElementById) { return; }
1471	var o = document.getElementById(div);
1472	if (typeof(o) == "undefined" || o==null) { return; }
1473	var s = o.innerHTML;
1474	if (s==null || s.length==0) { 
1475		return;
1476		}
1477	else {
1478		var i;
1479		for(i=0;s.charAt(i)==" "||s.charAt(i)=="\n"||s.charAt(i)=="\r"||s.charAt(i)=="\t";i++) {}
1480		s = s.substring(i);
1481		for (i = s.length; i>0; i--) {
1482			if (s.charAt(i)=="<") {
1483				s = s.substring(0,i) + "&lt;" + s.substring(i+1) ;
1484				}
1485			}
1486		for (i = s.length; i>0; i--) {
1487			if (s.charAt(i)==">") {
1488				s = s.substring(0,i) + "&gt;" + s.substring(i+1) ;
1489				}
1490			}
1491		for (i = s.length; i>0; i--) {
1492			if (s.charAt(i)=="\t") {
1493				s = s.substring(0,i) + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + s.substring(i+1) ;
1494				}
1495			}
1496		for (i = s.length; i>0; i--) {
1497			if (s.charAt(i)=="\n") {
1498				s = s.substring(0,i) + "<BR>" + s.substring(i+1) ;
1499				}
1500			}
1501		s = s + "<BR>";
1502		}
1503	document.write('<A STYLE="font-family:arial; font-size:x-small; text-decoration:none;" HREF="#" onClick="var d=document.getElementById(\'jssource'+div+'\').style; if(d.display==\'block\'){d.display=\'none\';this.innerText=\'+ Show Source\';}else{d.display=\'block\';this.innerText=\'- Hide Source\';} return false;">+ Show Source</A><BR>');
1504	document.write('<SPAN ID="jssource'+div+'" STYLE="display:none;background-color:#EEEEEE"><TT>'+s+'</TT></SPAN>');
1505	}
1506		

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.