/*
------------------------------------------------------
CHANGE HISTORY

10/6/04		Destry		Added Autotab code for forms
10/15/04	Destry		Fixed Autotab to skip hidden fields
------------------------------------------------------
*/

function LaunchNew(location,w,h,name,extra)
{
	if (extra=='')
	{
		extra=",status=no,toolbar=no,location=no,menubar=no,scrollbars=yes,resizable=no";
	}
	var leftPos = (screen.width / 2) - (w/2);
	var topPos = (screen.height / 2) - (h/2);
	nw=window.open(location, name, "width=" + w + ",height=" + h + 
		",left=" + leftPos + ",top=" + topPos + extra);
}

function LaunchNewScroll(location,w,h,name)
{
 nw=window.open(location, name, "width=" + w + ",height=" + h +
",status=no,toolbar=no,location=no,menubar=no,scrollbars=yes,resizable=no")
;
}


function duplicateRecord(frm)
{
	frm.frm_id.value = '';
	frm.Command.value = 'Duplicate';
	frm.submit();
}

/* IMAGE ROLLOVER FUNCTIONS */

function SetImage(offsrc, onsrc, txt){
        if (document.images){
                this['mouse_out'] = new Image();
                this['mouse_out'].src = offsrc;
                this['mouse_over'] = new Image();
                this['mouse_over'].src = onsrc;
        }this['text'] = txt;
}
function RollOver(imgname){
        if (document.images){
                document.images[imgname].src = JS_Image[imgname]['mouse_over'].src;
                window.status = JS_Image[imgname]['text'];
        }
}
function RollOut(imgname){
        if (document.images){
                document.images[imgname].src = JS_Image[imgname]['mouse_out'].src;
                window.status = '';
        }
}
/* END OF IMAGE ROLLOVER FUNCTIONS */

function SelectAll(frm) {
	for (var i=0;i<frm.elements.length;i++) {
		var e=frm.elements[i];
		if(e.type=="checkbox")
		{
			if (e.checked==false)
				e.checked=true;
			else
				e.checked=false;
		}
	}
}

function toggleIDDisplay(sSection)
{
	var objElement = document.getElementById(sSection);
	if (objElement)
	{
		if (objElement.style.display=='none')
			objElement.style.display='';
		else
			objElement.style.display='none';
	}
}

function toggleIDDisplayPassedByForm(sField)
{
	var objElement = document.getElementById(sField);
	if (objElement)
	{
		if (objElement.value=='none')
			objElement.value='';
		else
			objElement.value='none';
	}
}

/*
------------------------------------------------------
AnchorPosition Functions
------------------------------------------------------

DESCRIPTION: These functions find the position of an <A> tag in a document,
so other elements can be positioned relative to it.

COMPATABILITY: Netscape 4.x,6.x,Mozilla, IE 5.x, 6.x, 7.x on Windows. Some small
positioning errors - usually with Window positioning - occur on the 
Macintosh platform.

FUNCTIONS:
getAnchorPosition(anchorname)
  Returns an Object() having .x and .y properties of the pixel coordinates
  of the upper-left corner of the anchor. Position is relative to the PAGE.

getAnchorWindowPosition(anchorname)
  Returns an Object() having .x and .y properties of the pixel coordinates
  of the upper-left corner of the anchor, relative to the WHOLE SCREEN.

NOTES:

1) For popping up separate browser windows, use getAnchorWindowPosition. 
   Otherwise, use getAnchorPosition

2) Your anchor tag MUST contain both NAME and ID attributes which are the 
   same. For example:
   <A NAME="test" ID="test"> </A>

3) There must be at least a space between <A> </A> for IE5.5 to see the 
   anchor tag correctly. Do not do <A></A> with no space.
*/ 

// getAnchorPosition(anchorname)
//   This function returns an object having .x and .y properties which are the coordinates
//   of the named anchor, relative to the page.
function getAnchorPosition(anchorname) {
	// This function will return an Object with x and y properties
	var useWindow=false;
	var coordinates=new Object();
	var x=0,y=0;
	// Browser capability sniffing
	var use_gebi=false, use_css=false, use_layers=false;
	if (document.getElementById) { use_gebi=true; }
	else if (document.all) { use_css=true; }
	else if (document.layers) { use_layers=true; }
	// Logic to find position
 	if (use_gebi && document.all) {
		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
		}
	else if (use_gebi) {
		var o=document.getElementById(anchorname);
		x=AnchorPosition_getPageOffsetLeft(o);
		y=AnchorPosition_getPageOffsetTop(o);
		}
 	else if (use_css) {
		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
		}
	else if (use_layers) {
		var found=0;
		for (var i=0; i<document.anchors.length; i++) {
			if (document.anchors[i].name==anchorname) { found=1; break; }
			}
		if (found==0) {
			coordinates.x=0; coordinates.y=0; return coordinates;
			}
		x=document.anchors[i].x;
		y=document.anchors[i].y;
		}
	else {
		coordinates.x=0; coordinates.y=0; return coordinates;
		}
	coordinates.x=x;
	coordinates.y=y;
	return coordinates;
	}

// getAnchorWindowPosition(anchorname)
//   This function returns an object having .x and .y properties which are the coordinates
//   of the named anchor, relative to the window
function getAnchorWindowPosition(anchorname) {
	var coordinates=getAnchorPosition(anchorname);
	var x=0;
	var y=0;
	if (document.getElementById) {
		if (isNaN(window.screenX)) {
			x=coordinates.x-document.body.scrollLeft+window.screenLeft;
			y=coordinates.y-document.body.scrollTop+window.screenTop;
			}
		else {
			x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;
			y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;
			}
		}
	else if (document.all) {
		x=coordinates.x-document.body.scrollLeft+window.screenLeft;
		y=coordinates.y-document.body.scrollTop+window.screenTop;
		}
	else if (document.layers) {
		x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;
		y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;
		}
	coordinates.x=x;
	coordinates.y=y;
	return coordinates;
	}

// Functions for IE to get position of an object
function AnchorPosition_getPageOffsetLeft (el) {
	var ol=el.offsetLeft;
	while ((el=el.offsetParent) != null) { ol += el.offsetLeft; }
	return ol;
	}
function AnchorPosition_getWindowOffsetLeft (el) {
	return AnchorPosition_getPageOffsetLeft(el)-document.body.scrollLeft;
	}	
function AnchorPosition_getPageOffsetTop (el) {
	var ot=el.offsetTop;
	while((el=el.offsetParent) != null) { ot += el.offsetTop; }
	return ot;
	}
function AnchorPosition_getWindowOffsetTop (el) {
	return AnchorPosition_getPageOffsetTop(el)-document.body.scrollTop;
	}

/*
------------------------------------------------------
End AnchorPosition Functions
------------------------------------------------------
*/

/*
------------------------------------------------------
PopupWindow Functions
------------------------------------------------------

DESCRIPTION: This object allows you to easily and quickly popup a window
in a certain place. The window can either be a DIV or a separate browser
window.

COMPATABILITY: Works with Netscape 4.x, 6.x, IE 5.x, 6.x, 7.x on Windows. Some small
positioning errors - usually with Window positioning - occur on the 
Macintosh platform. Due to bugs in Netscape 4.x, populating the popup 
window with <STYLE> tags may cause errors.

USAGE:
// Create an object for a WINDOW popup
var win = new PopupWindow(); 

// Create an object for a DIV window using the DIV named 'mydiv'
var win = new PopupWindow('mydiv'); 

// Set the window to automatically hide itself when the user clicks 
// anywhere else on the page except the popup
win.autoHide(); 

// Show the window relative to the anchor name passed in
win.showPopup(anchorname);

// Hide the popup
win.hidePopup();

// Set the size of the popup window (only applies to WINDOW popups
win.setSize(width,height);

// Populate the contents of the popup window that will be shown. If you 
// change the contents while it is displayed, you will need to refresh()
win.populate(string);

// set the URL of the window, rather than populating its contents
// manually
win.setUrl("http://www.site.com/");

// Refresh the contents of the popup
win.refresh();

// Specify how many pixels to the right of the anchor the popup will appear
win.offsetX = 50;

// Specify how many pixels below the anchor the popup will appear
win.offsetY = 100;

NOTES:

1) Your anchor tag MUST contain both NAME and ID attributes which are the 
   same. For example:
   <A NAME="test" ID="test"> </A>

2) There must be at least a space between <A> </A> for IE5.5 to see the 
   anchor tag correctly. Do not do <A></A> with no space.

3) When a PopupWindow object is created, a handler for 'onmouseup' is
   attached to any event handler you may have already defined. Do NOT define
   an event handler for 'onmouseup' after you define a PopupWindow object or
   the autoHide() will not work correctly.
*/ 

// Set the position of the popup window based on the anchor
function PopupWindow_getXYPosition(anchorname) {
	var coordinates;
	if (this.type == "WINDOW") {
		coordinates = getAnchorWindowPosition(anchorname);
	}
	else {
		coordinates = getAnchorPosition(anchorname);
	}
	this.x = coordinates.x;
	this.y = coordinates.y;
}
// Set width/height of DIV/popup window
function PopupWindow_setSize(width,height) {
	this.width = width;
	this.height = height;
}
// Fill the window with contents
function PopupWindow_populate(contents) {
	this.contents = contents;
	this.populated = false;
}
// Set the URL to go to
function PopupWindow_setUrl(url) {
	this.url = url;
}
// Set the window popup properties
function PopupWindow_setWindowProperties(props) {
	this.windowProperties = props;
}
// Refresh the displayed contents of the popup
function PopupWindow_refresh() {
	if (this.divName != null) {
		// refresh the DIV object
		if (this.use_gebi) {
			document.getElementById(this.divName).innerHTML = this.contents;
		}
		else if (this.use_css) { 
			document.all[this.divName].innerHTML = this.contents;
		}
		else if (this.use_layers) { 
			var d = document.layers[this.divName]; 
			d.document.open();
			d.document.writeln(this.contents);
			d.document.close();
		}
	}
	else {
		if (this.popupWindow != null && !this.popupWindow.closed) {
			if (this.url!="") {
				this.popupWindow.location.href=this.url;
			}
			else {
				this.popupWindow.document.open();
				this.popupWindow.document.writeln(this.contents);
				this.popupWindow.document.close();
		}
			this.popupWindow.focus();
		}
	}
}
// Position and show the popup, relative to an anchor object
function PopupWindow_showPopup(anchorname) {
	this.getXYPosition(anchorname);
	this.x += this.offsetX;
	this.y += this.offsetY;
	if (!this.populated && (this.contents != "")) {
		this.populated = true;
		this.refresh();
	}
	if (this.divName != null) {
		// Show the DIV object
		if (this.use_gebi) {
			document.getElementById(this.divName).style.left = this.x + "px";
			document.getElementById(this.divName).style.top = this.y + "px";
			document.getElementById(this.divName).style.visibility = "visible";
		}
		else if (this.use_css) {
			document.all[this.divName].style.left = this.x;
			document.all[this.divName].style.top = this.y;
			document.all[this.divName].style.visibility = "visible";
		}
		else if (this.use_layers) {
			document.layers[this.divName].left = this.x;
			document.layers[this.divName].top = this.y;
			document.layers[this.divName].visibility = "visible";
		}
	}
	else {
		if (this.popupWindow == null || this.popupWindow.closed) {
			// If the popup window will go off-screen, move it so it doesn't
			if (this.x<0) { this.x=0; }
			if (this.y<0) { this.y=0; }
			if (screen && screen.availHeight) {
				if ((this.y + this.height) > screen.availHeight) {
					this.y = screen.availHeight - this.height;
				}
			}
			if (screen && screen.availWidth) {
				if ((this.x + this.width) > screen.availWidth) {
					this.x = screen.availWidth - this.width;
				}
			}
			var avoidAboutBlank = window.opera || ( document.layers && !navigator.mimeTypes['*'] ) || navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled );
			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+"");
		}
		this.refresh();
	}
}
// Hide the popup
function PopupWindow_hidePopup() {
	if (this.divName != null) {
		if (this.use_gebi) {
			document.getElementById(this.divName).style.visibility = "hidden";
		}
		else if (this.use_css) {
			document.all[this.divName].style.visibility = "hidden";
		}
		else if (this.use_layers) {
			document.layers[this.divName].visibility = "hidden";
		}
	}
	else {
		if (this.popupWindow && !this.popupWindow.closed) {
			this.popupWindow.close();
			this.popupWindow = null;
		}
	}
}
// Pass an event and return whether or not it was the popup DIV that was clicked
function PopupWindow_isClicked(e) {
	if (this.divName != null) {
		if (this.use_layers) {
			var clickX = e.pageX;
			var clickY = e.pageY;
			var t = document.layers[this.divName];
			if ((clickX > t.left) && (clickX < t.left+t.clip.width) && (clickY > t.top) && (clickY < t.top+t.clip.height)) {
				return true;
			}
			else { return false; }
		}
		else if (document.all) { // Need to hard-code this to trap IE for error-handling
			var t = window.event.srcElement;
			while (t.parentElement != null) {
				if (t.id==this.divName) {
					return true;
				}
				t = t.parentElement;
			}
			return false;
		}
		else if (this.use_gebi && e) {
			var t = e.originalTarget;
			while (t.parentNode != null) {
				if (t.id==this.divName) {
					return true;
				}
				t = t.parentNode;
			}
			return false;
		}
		return false;
	}
	return false;
}

// Check an onMouseDown event to see if we should hide
function PopupWindow_hideIfNotClicked(e) {
	if (this.autoHideEnabled && !this.isClicked(e)) {
		this.hidePopup();
	}
}
// Call this to make the DIV disable automatically when mouse is clicked outside it
function PopupWindow_autoHide() {
	this.autoHideEnabled = true;
}
// This global function checks all PopupWindow objects onmouseup to see if they should be hidden
function PopupWindow_hidePopupWindows(e) {
	for (var i=0; i<popupWindowObjects.length; i++) {
		if (popupWindowObjects[i] != null) {
			var p = popupWindowObjects[i];
			p.hideIfNotClicked(e);
		}
	}
}
// Run this immediately to attach the event listener
function PopupWindow_attachListener() {
	if (document.layers) {
		document.captureEvents(Event.MOUSEUP);
	}
	window.popupWindowOldEventListener = document.onmouseup;
	if (window.popupWindowOldEventListener != null) {
		document.onmouseup = new Function("window.popupWindowOldEventListener(); PopupWindow_hidePopupWindows();");
	}
	else {
		document.onmouseup = PopupWindow_hidePopupWindows;
	}
}
// CONSTRUCTOR for the PopupWindow object
// Pass it a DIV name to use a DHTML popup, otherwise will default to window popup
function PopupWindow() {
	if (!window.popupWindowIndex) { window.popupWindowIndex = 0; }
	if (!window.popupWindowObjects) { window.popupWindowObjects = new Array(); }
	if (!window.listenerAttached) {
		window.listenerAttached = true;
		PopupWindow_attachListener();
	}
	this.index = popupWindowIndex++;
	popupWindowObjects[this.index] = this;
	this.divName = null;
	this.popupWindow = null;
	this.width=0;
	this.height=0;
	this.populated = false;
	this.visible = false;
	this.autoHideEnabled = false;
	
	this.contents = "";
	this.url="";
	this.windowProperties="toolbar=no,location=no,status=no,menubar=no,scrollbars=auto,resizable,alwaysRaised,dependent,titlebar=no";
	if (arguments.length>0) {
		this.type="DIV";
		this.divName = arguments[0];
	}
	else {
		this.type="WINDOW";
	}
	this.use_gebi = false;
	this.use_css = false;
	this.use_layers = false;
	if (document.getElementById) { this.use_gebi = true; }
	else if (document.all) { this.use_css = true; }
	else if (document.layers) { this.use_layers = true; }
	else { this.type = "WINDOW"; }
	this.offsetX = 0;
	this.offsetY = 0;
	// Method mappings
	this.getXYPosition = PopupWindow_getXYPosition;
	this.populate = PopupWindow_populate;
	this.setUrl = PopupWindow_setUrl;
	this.setWindowProperties = PopupWindow_setWindowProperties;
	this.refresh = PopupWindow_refresh;
	this.showPopup = PopupWindow_showPopup;
	this.hidePopup = PopupWindow_hidePopup;
	this.setSize = PopupWindow_setSize;
	this.isClicked = PopupWindow_isClicked;
	this.autoHide = PopupWindow_autoHide;
	this.hideIfNotClicked = PopupWindow_hideIfNotClicked;
}

/*
------------------------------------------------------
End PopupWindow Functions
------------------------------------------------------
*/


/*
------------------------------------------------------
CalendarPopup Functions
------------------------------------------------------------------
HISTORY
10/7/04 Destry Hines to have date form field split into Month, Day and Year

------------------------------------------------------------------
DESCRIPTION: This object implements a popup calendar to allow the user to
select a date, month, quarter, or year.

COMPATABILITY: Works with Netscape 4.x, 6.x, IE 5.x on Windows. Some small
positioning errors - usually with Window positioning - occur on the 
Macintosh platform.
The calendar can be modified to work for any location in the world by 
changing which weekday is displayed as the first column, changing the month
names, and changing the column headers for each day.

USAGE:
// Create a new CalendarPopup object of type WINDOW
var cal = new CalendarPopup(); 

// Create a new CalendarPopup object of type DIV using the DIV named 'mydiv'
var cal = new CalendarPopup('mydiv'); 

// Easy method to link the popup calendar with an input box. 
//Changed from inputObject to inputObjectName by Destry Hines 10/07/04
cal.select(inputObjectName, anchorname, dateFormat);
// Same method, but passing a default date other than the field's current value
cal.select(inputObjectName, anchorname, dateFormat, '01/02/2000');
// This is an example call to the popup calendar from a link to populate an 
// input box. Note that to use this, date.js must also be included!!
<A HREF="#" onClick="cal.select(document.forms[0].date,'anchorname','MM/dd/yyyy'); return false;">Select</A>

// Set the type of date select to be used. By default it is 'date'.
cal.setDisplayType(type);

// When a date, month, quarter, or year is clicked, a function is called and
// passed the details. You must write this function, and tell the calendar
// popup what the function name is.
// Function to be called for 'date' select receives y, m, d
cal.setReturnFunction(functionname);
// Function to be called for 'month' select receives y, m
cal.setReturnMonthFunction(functionname);
// Function to be called for 'quarter' select receives y, q
cal.setReturnQuarterFunction(functionname);
// Function to be called for 'year' select receives y
cal.setReturnYearFunction(functionname);

// Show the calendar relative to a given anchor
cal.showCalendar(anchorname);

// Hide the calendar. The calendar is set to autoHide automatically
cal.hideCalendar();

// Set the month names to be used. Default are English month names
cal.setMonthNames("January","February","March",...);

// Set the month abbreviations to be used. Default are English month abbreviations
cal.setMonthAbbreviations("Jan","Feb","Mar",...);

// Show navigation for changing by the year, not just one month at a time
cal.showYearNavigation();

// Show month and year dropdowns, for quicker selection of month of dates
cal.showNavigationDropdowns();

// Set the text to be used above each day column. The days start with 
// sunday regardless of the value of WeekStartDay
cal.setDayHeaders("S","M","T",...);

// Set the day for the first column in the calendar grid. By default this
// is Sunday (0) but it may be changed to fit the conventions of other
// countries.
cal.setWeekStartDay(1); // week is Monday - Saturday

// Set the weekdays which should be disabled in the 'date' select popup. You can
// then allow someone to only select week end dates, or Tuedays, for example
cal.setDisabledWeekDays(0,1); // To disable selecting the 1st or 2nd days of the week

// Selectively disable individual days or date ranges. Disabled days will not
// be clickable, and show as strike-through text on current browsers.
// Date format is any format recognized by parseDate() in date.js
// Pass a single date to disable:
cal.addDisabledDates("2003-01-01");
// Pass null as the first parameter to mean "anything up to and including" the
// passed date:
cal.addDisabledDates(null, "01/02/03");
// Pass null as the second parameter to mean "including the passed date and
// anything after it:
cal.addDisabledDates("Jan 01, 2003", null);
// Pass two dates to disable all dates inbetween and including the two
cal.addDisabledDates("January 01, 2003", "Dec 31, 2003");

// When the 'year' select is displayed, set the number of years back from the 
// current year to start listing years. Default is 2.
// This is also used for year drop-down, to decide how many years +/- to display
cal.setYearSelectStartOffset(2);

// Text for the word "Today" appearing on the calendar
cal.setTodayText("Today");

// The calendar uses CSS classes for formatting. If you want your calendar to
// have unique styles, you can set the prefix that will be added to all the
// classes in the output.
// For example, normal output may have this:
//     <SPAN CLASS="cpTodayTextDisabled">Today<SPAN>
// But if you set the prefix like this:
cal.setCssPrefix("Test");
// The output will then look like:
//     <SPAN CLASS="TestcpTodayTextDisabled">Today<SPAN>
// And you can define that style somewhere in your page.

// When using Year navigation, you can make the year be an input box, so
// the user can manually change it and jump to any year
cal.showYearNavigationInput();

// Set the calendar offset to be different than the default. By default it
// will appear just below and to the right of the anchorname. So if you have
// a text box where the date will go and and anchor immediately after the
// text box, the calendar will display immediately under the text box.
cal.offsetX = 20;
cal.offsetY = 20;

NOTES:
1) Requires the functions in AnchorPosition.js and PopupWindow.js

2) Your anchor tag MUST contain both NAME and ID attributes which are the 
   same. For example:
   <A NAME="test" ID="test"> </A>

3) There must be at least a space between <A> </A> for IE5.5 to see the 
   anchor tag correctly. Do not do <A></A> with no space.

4) When a CalendarPopup object is created, a handler for 'onmouseup' is
   attached to any event handler you may have already defined. Do NOT define
   an event handler for 'onmouseup' after you define a CalendarPopup object 
   or the autoHide() will not work correctly.
   
5) The calendar popup display uses style sheets to make it look nice.

*/ 

// CONSTRUCTOR for the CalendarPopup Object
function CalendarPopup() {
	var c;
	if (arguments.length>0) {
		c = new PopupWindow(arguments[0]);
		}
	else {
		c = new PopupWindow();
		c.setSize(150,175);
		}
	c.offsetX = -152;
	c.offsetY = 25;
	c.autoHide();
	// Calendar-specific properties
	c.monthNames = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	c.monthAbbreviations = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
	c.dayHeaders = new Array("S","M","T","W","T","F","S");
	c.returnFunction = "CP_tmpReturnFunction";
	c.returnMonthFunction = "CP_tmpReturnMonthFunction";
	c.returnQuarterFunction = "CP_tmpReturnQuarterFunction";
	c.returnYearFunction = "CP_tmpReturnYearFunction";
	c.weekStartDay = 0;
	c.isShowYearNavigation = false;
	c.displayType = "date";
	c.disabledWeekDays = new Object();
	c.disabledDatesExpression = "";
	c.yearSelectStartOffset = 2;
	c.currentDate = null;
	c.todayText="Today";
	c.cssPrefix="";
	c.isShowNavigationDropdowns=false;
	c.isShowYearNavigationInput=false;
	window.CP_calendarObject = null;
	window.CP_targetInputMonth = null;
	window.CP_targetInputDay = null;
	window.CP_targetInputYear = null;
	window.CP_dateFormat = "MM/dd/yyyy";
	// Method mappings
	c.copyMonthNamesToWindow = CP_copyMonthNamesToWindow;
	c.setReturnFunction = CP_setReturnFunction;
	c.setReturnMonthFunction = CP_setReturnMonthFunction;
	c.setReturnQuarterFunction = CP_setReturnQuarterFunction;
	c.setReturnYearFunction = CP_setReturnYearFunction;
	c.setMonthNames = CP_setMonthNames;
	c.setMonthAbbreviations = CP_setMonthAbbreviations;
	c.setDayHeaders = CP_setDayHeaders;
	c.setWeekStartDay = CP_setWeekStartDay;
	c.setDisplayType = CP_setDisplayType;
	c.setDisabledWeekDays = CP_setDisabledWeekDays;
	c.addDisabledDates = CP_addDisabledDates;
	c.setYearSelectStartOffset = CP_setYearSelectStartOffset;
	c.setTodayText = CP_setTodayText;
	c.showYearNavigation = CP_showYearNavigation;
	c.showCalendar = CP_showCalendar;
	c.hideCalendar = CP_hideCalendar;
	c.getStyles = getCalendarStyles;
	c.refreshCalendar = CP_refreshCalendar;
	c.getCalendar = CP_getCalendar;
	c.select = CP_select;
	c.setCssPrefix = CP_setCssPrefix;
	c.showNavigationDropdowns = CP_showNavigationDropdowns;
	c.showYearNavigationInput = CP_showYearNavigationInput;
	c.copyMonthNamesToWindow();
	// Return the object
	return c;
	}
function CP_copyMonthNamesToWindow() {
	// Copy these values over to the date.js 
	if (typeof(window.MONTH_NAMES)!="undefined" && window.MONTH_NAMES!=null) {
		window.MONTH_NAMES = new Array();
		for (var i=0; i<this.monthNames.length; i++) {
			window.MONTH_NAMES[window.MONTH_NAMES.length] = this.monthNames[i];
		}
		for (var i=0; i<this.monthAbbreviations.length; i++) {
			window.MONTH_NAMES[window.MONTH_NAMES.length] = this.monthAbbreviations[i];
		}
	}
}
// Temporary default functions to be called when items clicked, so no error is thrown
function CP_tmpReturnFunction(y,m,d) { 
	if (window.CP_targetInputMonth!=null) {
		var dt = new Date(y,m-1,d,0,0,0);
		if (window.CP_calendarObject!=null) { window.CP_calendarObject.copyMonthNamesToWindow(); }
		window.CP_targetInputMonth.value = formatDate(dt,window.CP_dateFormat).substr(0,2);
		window.CP_targetInputDay.value = formatDate(dt,window.CP_dateFormat).substr(3,2);
		window.CP_targetInputYear.value = formatDate(dt,window.CP_dateFormat).substr(6,4);
		}
	else {
		alert('Use setReturnFunction() to define which function will get the clicked results!'); 
		}
	}
function CP_tmpReturnMonthFunction(y,m) { 
	alert('Use setReturnMonthFunction() to define which function will get the clicked results!\nYou clicked: year='+y+' , month='+m); 
	}
function CP_tmpReturnQuarterFunction(y,q) { 
	alert('Use setReturnQuarterFunction() to define which function will get the clicked results!\nYou clicked: year='+y+' , quarter='+q); 
	}
function CP_tmpReturnYearFunction(y) { 
	alert('Use setReturnYearFunction() to define which function will get the clicked results!\nYou clicked: year='+y); 
	}

// Set the name of the functions to call to get the clicked item
function CP_setReturnFunction(name) { this.returnFunction = name; }
function CP_setReturnMonthFunction(name) { this.returnMonthFunction = name; }
function CP_setReturnQuarterFunction(name) { this.returnQuarterFunction = name; }
function CP_setReturnYearFunction(name) { this.returnYearFunction = name; }

// Over-ride the built-in month names
function CP_setMonthNames() {
	for (var i=0; i<arguments.length; i++) { this.monthNames[i] = arguments[i]; }
	this.copyMonthNamesToWindow();
	}

// Over-ride the built-in month abbreviations
function CP_setMonthAbbreviations() {
	for (var i=0; i<arguments.length; i++) { this.monthAbbreviations[i] = arguments[i]; }
	this.copyMonthNamesToWindow();
	}

// Over-ride the built-in column headers for each day
function CP_setDayHeaders() {
	for (var i=0; i<arguments.length; i++) { this.dayHeaders[i] = arguments[i]; }
	}

// Set the day of the week (0-7) that the calendar display starts on
// This is for countries other than the US whose calendar displays start on Monday(1), for example
function CP_setWeekStartDay(day) { this.weekStartDay = day; }

// Show next/last year navigation links
function CP_showYearNavigation() { this.isShowYearNavigation = (arguments.length>0)?arguments[0]:true; }

// Which type of calendar to display
function CP_setDisplayType(type) {
	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; }
	this.displayType=type;
	}

// How many years back to start by default for year display
function CP_setYearSelectStartOffset(num) { this.yearSelectStartOffset=num; }

// Set which weekdays should not be clickable
function CP_setDisabledWeekDays() {
	this.disabledWeekDays = new Object();
	for (var i=0; i<arguments.length; i++) { this.disabledWeekDays[arguments[i]] = true; }
	}
	
// Disable individual dates or ranges
// Builds an internal logical test which is run via eval() for efficiency
function CP_addDisabledDates(start, end) {
	if (arguments.length==1) { end=start; }
	if (start==null && end==null) { return; }
	if (this.disabledDatesExpression!="") { this.disabledDatesExpression+= "||"; }
	if (start!=null) { start = parseDate(start); start=""+start.getFullYear()+LZ(start.getMonth()+1)+LZ(start.getDate());}
	if (end!=null) { end=parseDate(end); end=""+end.getFullYear()+LZ(end.getMonth()+1)+LZ(end.getDate());}
	if (start==null) { this.disabledDatesExpression+="(ds<="+end+")"; }
	else if (end  ==null) { this.disabledDatesExpression+="(ds>="+start+")"; }
	else { this.disabledDatesExpression+="(ds>="+start+"&&ds<="+end+")"; }
	}
	
// Set the text to use for the "Today" link
function CP_setTodayText(text) {
	this.todayText = text;
	}

// Set the prefix to be added to all CSS classes when writing output
function CP_setCssPrefix(val) { 
	this.cssPrefix = val; 
	}

// Show the navigation as an dropdowns that can be manually changed
function CP_showNavigationDropdowns() { this.isShowNavigationDropdowns = (arguments.length>0)?arguments[0]:true; }

// Show the year navigation as an input box that can be manually changed
function CP_showYearNavigationInput() { this.isShowYearNavigationInput = (arguments.length>0)?arguments[0]:true; }

// Hide a calendar object
function CP_hideCalendar() {
	if (arguments.length > 0) { window.popupWindowObjects[arguments[0]].hidePopup(); }
	else { this.hidePopup(); }
	}

// Refresh the contents of the calendar display
function CP_refreshCalendar(index) {
	var calObject = window.popupWindowObjects[index];
	if (arguments.length>1) { 
		calObject.populate(calObject.getCalendar(arguments[1],arguments[2],arguments[3],arguments[4],arguments[5]));
		}
	else {
		calObject.populate(calObject.getCalendar());
		}
	calObject.refresh();
	}

// Populate the calendar and display it
function CP_showCalendar(anchorname) {
	if (arguments.length>1) {
		if (arguments[1]==null||arguments[1]=="") {
			this.currentDate=new Date();
			}
		else {
			this.currentDate=new Date(parseDate(arguments[1]));
			}
		}
	this.populate(this.getCalendar());
	this.showPopup(anchorname);
	}

// Simple method to interface popup calendar with a text-entry box
function CP_select(inputobjName, linkname, format) {
	var inputobj, inputobjMonth, inputobjDay, inputobjYear
	inputobjMonth = eval(inputobjName + '_month');
	inputobjDay = eval(inputobjName + '_day');
	inputobjYear = eval(inputobjName + '_year');
	inputobj = inputobjMonth;
	
	var selectedDate=(arguments.length>3)?arguments[3]:null;
	if (!window.getDateFromFormat) {
		alert("calendar.select: To use this method you must also include 'date.js' for date formatting");
		return;
		}
	if (this.displayType!="date"&&this.displayType!="week-end") {
		alert("calendar.select: This function can only be used with displayType 'date' or 'week-end'");
		return;
		}
	if (inputobj.type!="text" && inputobj.type!="hidden" && inputobj.type!="textarea") { 
		alert("calendar.select: Input object passed is not a valid form input object"); 
		window.CP_targetInputMonth=null;
		window.CP_targetInputDay=null;
		window.CP_targetInputYear=null;
		return;
		}
	if (inputobj.disabled) { return; } // Can't use calendar input on disabled form input!
	
	window.CP_targetInputMonth = inputobjMonth;
	window.CP_targetInputDay = inputobjDay;
	window.CP_targetInputYear = inputobjYear;
	window.CP_calendarObject = this;
	this.currentDate=null;
	var time=0;
	if (selectedDate!=null) {
		time = getDateFromFormat(selectedDate,format)
		}
	else if (inputobj.value!="") {
		time = getDateFromFormat(inputobjMonth.value + '/' + inputobjDay.value + '/' + inputobjYear.value, format);
		}
	if (selectedDate!=null || inputobj.value!="") {
		if (time==0) { this.currentDate=null; }
		else { this.currentDate=new Date(time); }
		}
	window.CP_dateFormat = format;
	this.showCalendar(linkname);
	}
	
// Get style block needed to display the calendar correctly
function getCalendarStyles() {
	var result = "";
	var p = "";
	if (this!=null && typeof(this.cssPrefix)!="undefined" && this.cssPrefix!=null && this.cssPrefix!="") { p=this.cssPrefix; }
	result += "<STYLE>\n";
	result += "."+p+"cpYearNavigation,."+p+"cpMonthNavigation { background-color:#C0C0C0; text-align:center; vertical-align:center; text-decoration:none; color:#000000; font-weight:bold; }\n";
	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";
	result += "TD."+p+"cpDayColumnHeader { text-align:right; border:solid thin #C0C0C0;border-width:0 0 1 0; }\n";
	result += "."+p+"cpCurrentMonthDate, ."+p+"cpOtherMonthDate, ."+p+"cpCurrentDate  { text-align:right; text-decoration:none; }\n";
	result += "."+p+"cpCurrentMonthDateDisabled, ."+p+"cpOtherMonthDateDisabled, ."+p+"cpCurrentDateDisabled { color:#D0D0D0; text-align:right; text-decoration:line-through; }\n";
	result += "."+p+"cpCurrentMonthDate, .cpCurrentDate { color:#000000; }\n";
	result += "."+p+"cpOtherMonthDate { color:#808080; }\n";
	result += "TD."+p+"cpCurrentDate { color:white; background-color: #C0C0C0; border-width:1; border:solid thin #800000; }\n";
	result += "TD."+p+"cpCurrentDateDisabled { border-width:1; border:solid thin #FFAAAA; }\n";
	result += "TD."+p+"cpTodayText, TD."+p+"cpTodayTextDisabled { border:solid thin #C0C0C0; border-width:1 0 0 0;}\n";
	result += "A."+p+"cpTodayText, SPAN."+p+"cpTodayTextDisabled { height:20px; }\n";
	result += "A."+p+"cpTodayText { color:black; }\n";
	result += "."+p+"cpTodayTextDisabled { color:#D0D0D0; }\n";
	result += "."+p+"cpBorder { border:solid thin #808080; }\n";
	result += "</STYLE>\n";
	return result;
	}

// Return a string containing all the calendar code to be displayed
function CP_getCalendar() {
	var now = new Date();
	// Reference to window
	if (this.type == "WINDOW") { var windowref = "window.opener."; }
	else { var windowref = ""; }
	var result = "";
	// If POPUP, write entire HTML document
	if (this.type == "WINDOW") {
		result += "<HTML><HEAD><TITLE>Calendar</TITLE>"+this.getStyles()+"</HEAD><BODY MARGINWIDTH=0 MARGINHEIGHT=0 TOPMARGIN=0 RIGHTMARGIN=0 LEFTMARGIN=0>\n";
		result += '<CENTER><TABLE WIDTH=100% BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>\n';
		}
	else {
		result += '<TABLE CLASS="'+this.cssPrefix+'cpBorder" WIDTH=144 BORDER=1 BORDERWIDTH=1 CELLSPACING=0 CELLPADDING=1>\n';
		result += '<TR><TD ALIGN=CENTER>\n';
		result += '<CENTER>\n';
		}
	// Code for DATE display (default)
	// -------------------------------
	if (this.displayType=="date" || this.displayType=="week-end") {
		if (this.currentDate==null) { this.currentDate = now; }
		if (arguments.length > 0) { var month = arguments[0]; }
			else { var month = this.currentDate.getMonth()+1; }
		if (arguments.length > 1 && arguments[1]>0 && arguments[1]-0==arguments[1]) { var year = arguments[1]; }
			else { var year = this.currentDate.getFullYear(); }
		var daysinmonth= new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
		if ( ( (year%4 == 0)&&(year%100 != 0) ) || (year%400 == 0) ) {
			daysinmonth[2] = 29;
			}
		var current_month = new Date(year,month-1,1);
		var display_year = year;
		var display_month = month;
		var display_date = 1;
		var weekday= current_month.getDay();
		var offset = 0;
		
		offset = (weekday >= this.weekStartDay) ? weekday-this.weekStartDay : 7-this.weekStartDay+weekday ;
		if (offset > 0) {
			display_month--;
			if (display_month < 1) { display_month = 12; display_year--; }
			display_date = daysinmonth[display_month]-offset+1;
			}
		var next_month = month+1;
		var next_month_year = year;
		if (next_month > 12) { next_month=1; next_month_year++; }
		var last_month = month-1;
		var last_month_year = year;
		if (last_month < 1) { last_month=12; last_month_year--; }
		var date_class;
		if (this.type!="WINDOW") {
			result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";
			}
		result += '<TR>\n';
		var refresh = windowref+'CP_refreshCalendar';
		var refreshLink = 'javascript:' + refresh;
		if (this.isShowNavigationDropdowns) {
			result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="78" COLSPAN="3"><select CLASS="'+this.cssPrefix+'cpMonthNavigation" name="cpMonth" onChange="'+refresh+'('+this.index+',this.options[this.selectedIndex].value-0,'+(year-0)+');">';
			for( var monthCounter=1; monthCounter<=12; monthCounter++ ) {
				var selected = (monthCounter==month) ? 'SELECTED' : '';
				result += '<option value="'+monthCounter+'" '+selected+'>'+this.monthNames[monthCounter-1]+'</option>';
				}
			result += '</select></TD>';
			result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="10">&nbsp;</TD>';

			result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="56" COLSPAN="3"><select CLASS="'+this.cssPrefix+'cpYearNavigation" name="cpYear" onChange="'+refresh+'('+this.index+','+month+',this.options[this.selectedIndex].value-0);">';
			for( var yearCounter=year-this.yearSelectStartOffset; yearCounter<=year+this.yearSelectStartOffset; yearCounter++ ) {
				var selected = (yearCounter==year) ? 'SELECTED' : '';
				result += '<option value="'+yearCounter+'" '+selected+'>'+yearCounter+'</option>';
				}
			result += '</select></TD>';
			}
		else {
			if (this.isShowYearNavigation) {
				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>';
				result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="58"><SPAN CLASS="'+this.cssPrefix+'cpMonthNavigation">'+this.monthNames[month-1]+'</SPAN></TD>';
				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>';
				result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="10">&nbsp;</TD>';

				result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="10"><A CLASS="'+this.cssPrefix+'cpYearNavigation" HREF="'+refreshLink+'('+this.index+','+month+','+(year-1)+');">&lt;</A></TD>';
				if (this.isShowYearNavigationInput) {
					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>';
					}
				else {
					result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="36"><SPAN CLASS="'+this.cssPrefix+'cpYearNavigation">'+year+'</SPAN></TD>';
					}
				result += '<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="10"><A CLASS="'+this.cssPrefix+'cpYearNavigation" HREF="'+refreshLink+'('+this.index+','+month+','+(year+1)+');">&gt;</A></TD>';
				}
			else {
				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';
				result += '<TD CLASS="'+this.cssPrefix+'cpMonthNavigation" WIDTH="100"><SPAN CLASS="'+this.cssPrefix+'cpMonthNavigation">'+this.monthNames[month-1]+' '+year+'</SPAN></TD>\n';
				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';
				}
			}
		result += '</TR></TABLE>\n';
		result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=0 CELLPADDING=1 ALIGN=CENTER>\n';
		result += '<TR>\n';
		for (var j=0; j<7; j++) {

			result += '<TD CLASS="'+this.cssPrefix+'cpDayColumnHeader" WIDTH="14%"><SPAN CLASS="'+this.cssPrefix+'cpDayColumnHeader">'+this.dayHeaders[(this.weekStartDay+j)%7]+'</TD>\n';
			}
		result += '</TR>\n';
		for (var row=1; row<=6; row++) {
			result += '<TR>\n';
			for (var col=1; col<=7; col++) {
				var disabled=false;
				if (this.disabledDatesExpression!="") {
					var ds=""+display_year+LZ(display_month)+LZ(display_date);
					eval("disabled=("+this.disabledDatesExpression+")");
					}
				var dateClass = "";
				if ((display_month == this.currentDate.getMonth()+1) && (display_date==this.currentDate.getDate()) && (display_year==this.currentDate.getFullYear())) {
					dateClass = "cpCurrentDate";
					}
				else if (display_month == month) {
					dateClass = "cpCurrentMonthDate";
					}
				else {
					dateClass = "cpOtherMonthDate";
					}
				if (disabled || this.disabledWeekDays[col-1]) {
					result += '	<TD CLASS="'+this.cssPrefix+dateClass+'"><SPAN CLASS="'+this.cssPrefix+dateClass+'Disabled">'+display_date+'</SPAN></TD>\n';
					}
				else {
					var selected_date = display_date;
					var selected_month = display_month;
					var selected_year = display_year;
					if (this.displayType=="week-end") {
						var d = new Date(selected_year,selected_month-1,selected_date,0,0,0,0);
						d.setDate(d.getDate() + (7-col));
						selected_year = d.getYear();
						if (selected_year < 1000) { selected_year += 1900; }
						selected_month = d.getMonth()+1;
						selected_date = d.getDate();
						}
					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';
					}
				display_date++;
				if (display_date > daysinmonth[display_month]) {
					display_date=1;
					display_month++;
					}
				if (display_month > 12) {
					display_month=1;
					display_year++;
					}
				}
			result += '</TR>';
			}
		var current_weekday = now.getDay() - this.weekStartDay;
		if (current_weekday < 0) {
			current_weekday += 7;
			}
		result += '<TR>\n';
		result += '	<TD COLSPAN=7 ALIGN=CENTER CLASS="'+this.cssPrefix+'cpTodayText">\n';
		if (this.disabledDatesExpression!="") {
			var ds=""+now.getFullYear()+LZ(now.getMonth()+1)+LZ(now.getDate());
			eval("disabled=("+this.disabledDatesExpression+")");
			}
		if (disabled || this.disabledWeekDays[current_weekday+1]) {
			result += '		<SPAN CLASS="'+this.cssPrefix+'cpTodayTextDisabled">'+this.todayText+'</SPAN>\n';
			}
		else {
			result += '		<A CLASS="'+this.cssPrefix+'cpTodayText" HREF="javascript:'+windowref+this.returnFunction+'(\''+now.getFullYear()+'\',\''+(now.getMonth()+1)+'\',\''+now.getDate()+'\');'+windowref+'CP_hideCalendar(\''+this.index+'\');">'+this.todayText+'</A>\n';
			}
		result += '		<BR>\n';
		result += '	</TD></TR></TABLE></CENTER></TD></TR></TABLE>\n';
	}

	// Code common for MONTH, QUARTER, YEAR
	// ------------------------------------
	if (this.displayType=="month" || this.displayType=="quarter" || this.displayType=="year") {
		if (arguments.length > 0) { var year = arguments[0]; }
		else { 
			if (this.displayType=="year") {	var year = now.getFullYear()-this.yearSelectStartOffset; }
			else { var year = now.getFullYear(); }
			}
		if (this.displayType!="year" && this.isShowYearNavigation) {
			result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";
			result += '<TR>\n';
			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';
			result += '	<TD CLASS="'+this.cssPrefix+'cpYearNavigation" WIDTH="100">'+year+'</TD>\n';
			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';
			result += '</TR></TABLE>\n';
			}
		}
		
	// Code for MONTH display 
	// ----------------------
	if (this.displayType=="month") {
		// If POPUP, write entire HTML document
		result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';
		for (var i=0; i<4; i++) {
			result += '<TR>';
			for (var j=0; j<3; j++) {
				var monthindex = ((i*3)+j);
				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>';
				}
			result += '</TR>';
			}
		result += '</TABLE></CENTER></TD></TR></TABLE>\n';
		}
	
	// Code for QUARTER display
	// ------------------------
	if (this.displayType=="quarter") {
		result += '<BR><TABLE WIDTH=120 BORDER=1 CELLSPACING=0 CELLPADDING=0 ALIGN=CENTER>\n';
		for (var i=0; i<2; i++) {
			result += '<TR>';
			for (var j=0; j<2; j++) {
				var quarter = ((i*2)+j+1);
				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>';
				}
			result += '</TR>';
			}
		result += '</TABLE></CENTER></TD></TR></TABLE>\n';
		}

	// Code for YEAR display
	// ---------------------
	if (this.displayType=="year") {
		var yearColumnSize = 4;
		result += "<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>";
		result += '<TR>\n';
		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';
		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';
		result += '</TR></TABLE>\n';
		result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';
		for (var i=0; i<yearColumnSize; i++) {
			for (var j=0; j<2; j++) {
				var currentyear = year+(j*yearColumnSize)+i;
				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>';
				}
			result += '</TR>';
			}
		result += '</TABLE></CENTER></TD></TR></TABLE>\n';
		}
	// Common
	if (this.type == "WINDOW") {
		result += "</BODY></HTML>\n";
		}
	return result;
	}

/*
------------------------------------------------------
End CalendarPopup Functions
------------------------------------------------------
*/

/*
------------------------------------------------------
Autotab Functions
------------------------------------------------------
*/

var isNN = (navigator.appName.indexOf("Netscape")!=-1);

var inputName;

function checkDateArrows(input, max, e)
{
	var newValue = input.value;
	var keyCode = (isNN) ? e.which : e.keyCode; 
	//alert(keyCode)
	if (keyCode == 38 || keyCode == 107 || keyCode == 187) //Up Arrow
	{
		newValue++;
		if (newValue > max)
			return false;
		newValue = '00' + newValue.toString();
		input.value = newValue.substr(newValue.length-2, 2);
		input.select();
		return false;
	}
	if (keyCode == 40 || keyCode == 109 || keyCode == 189) //Down Arrow
	{
		newValue--;
		if (newValue < 1)
			return false;
		newValue = '00' + newValue.toString();
		input.value = newValue.substr(newValue.length-2, 2);
		input.select();
		return false;
	}
	return true;
}

function autoTabDown(input)
{
	inputName = input.name;
}

function autoTab(input,len, e)
{
	if (inputName != input.name)
		return true;
	var keyCode = (isNN) ? e.which : e.keyCode; 
	var filter = (isNN) ? [0,8,9] : [0,8,9,16,17,18,36,37,38,39,40,46];
	//if (!containsElement(filter,keyCode))
	//	alert(keyCode);
	if(input.value.length >= len && !containsElement(filter,keyCode))
	{
		input.value = input.value.slice(0, len);
		try
		{
			input.form[(getIndex(input)+1) % input.form.length].select();
		} 
		catch (e)
		{
		}
		input.form[(getIndex(input)+1) % input.form.length].focus();
	}
	return false;
}

function containsElement(arr, ele) {
	var found = false, index = 0;
	while(!found && index < arr.length)
		if(arr[index] == ele)
			found = true;
		else
			index++;
	return found;
}

function getIndex(input) {
	var index = -1, i = 0, found = false;
	var bAlreadyFound;
	
	while (i < input.form.length && index == -1)
		if (input.form[i] == input || bAlreadyFound)
		{
			bAlreadyFound = true;
			if (input.form[i+1].type!='hidden')
			{
				index = i;
				return index;
			}
			else
				i++;
		}
		else
			i++;
			
	return index;
}

/*
------------------------------------------------------
Field Validation Functions
------------------------------------------------------
*/

var objLastElement;

function validate(field, valid, required) {
	var ok = "yes";
	var temp;
	
	if (valid != '')
	{
		for (var i=0; i<field.value.length; i++) {
			temp = "" + field.value.substring(i, i+1);
			if (valid.indexOf(temp) == "-1") 
			{
				ok = "no";
				break;
			}
		
		}
	}
	if (ok == "no") {
		alert("Invalid character '" + temp + "' in field");
		return false;
		//field.focus();
		//field.select();
	}
	else
	{
		if (required == "1" && field.value.length==0) {
			//if (objLastElement != field)
			//	alert("Field is required");
			//objLastElement = field;
			//field.focus();
			//field.select();
		}
		return true;
	}
}


function checkLength(ctrl, lLength)
{
	if(ctrl.value.length >= lLength)
	{
		return false;
	}
}

// Check browser version
var isNav4 = false, isNav5 = false, isIE4 = false
var strSeperator = "/"; 
// If you are using any Java validation on the back side you will want to use the / because 
// Java date validations do not recognize the dash as a valid date separator.
var vDateType = 3; // Global value for type of date format
//                1 = mm/dd/yyyy
//                2 = yyyy/dd/mm  (Unable to do date check at this time)
//                3 = dd/mm/yyyy
var vYearType = 2; //Set to 2 or 4 for number of digits in the year for Netscape
var vYearLength = 2; // Set to 4 if you want to force the user to enter 4 digits for the year before validating.
var err = 0; // Set the error code to a default of zero

if(navigator.appName == "Netscape") {
	
	if (navigator.appVersion < "5") {
		isNav4 = true;
		isNav5 = false;
	}
	else
		if (navigator.appVersion > "4") {
			isNav4 = false;
			isNav5 = true;
		}
	}
	else {
		isIE4 = true;
	}
	
function DateFormat(vDateName, vDateValue, e, dateCheck, dateType) {
	vDateType = dateType;
	// vDateName = object name
	// vDateValue = value in the field being checked
	// e = event
	// dateCheck 
	// True  = Verify that the vDateValue is a valid date
	// False = Format values being entered into vDateValue only
	// vDateType
	// 1 = mm/dd/yyyy
	// 2 = yyyy/mm/dd
	// 3 = dd/mm/yyyy
	//Enter a tilde sign for the first number and you can check the variable information.

	if (vDateValue == "~") {
		alert("AppVersion = "+navigator.appVersion+" \nNav. 4 Version = "+isNav4+" \nNav. 5 Version = "+isNav5+" \nIE Version = "+isIE4+" \nYear Type = "+vYearType+" \nDate Type = "+vDateType+" \nSeparator = "+strSeperator);
		vDateName.value = "";
		vDateName.focus();
		return true;
	}

	var whichCode = (window.Event) ? e.which : e.keyCode;
	// Check to see if a seperator is already present.
	// bypass the date if a seperator is present and the length greater than 8
	if (vDateValue.length > 8 && isNav4) {
		if ((vDateValue.indexOf("-") >= 1) || (vDateValue.indexOf("/") >= 1))
			return true;
	}

	//alert (whichCode);
	//Eliminate all the ASCII codes that are not valid
	var alphaCheck = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/-";
	if (alphaCheck.indexOf(vDateValue) >= 1) {
		if (isNav4) {
			vDateName.value = "";
			vDateName.focus();
			vDateName.select();
			return false;
		}
		else {
			vDateName.value = vDateName.value.substr(0, (vDateValue.length-1));
			return false;
		}
	}

	if (whichCode == 8 || whichCode == 16 || whichCode == 0) //Ignore the Netscape value for backspace. IE has no value
		return false;
	else {
		//Create numeric string values for 0123456789/
		//The codes provided include both keyboard and keypad values
		var strCheck = '47,48,49,50,51,52,53,54,55,56,57,58,59,95,96,97,98,99,100,101,102,103,104,105';
		if (strCheck.indexOf(whichCode) != -1) {
			if (isNav4) {
				if (((vDateValue.length < 6 && dateCheck) || (vDateValue.length == 7 && dateCheck)) && (vDateValue.length >=1)) {
					alert("Invalid Date\nPlease Re-Enter");
					vDateName.value = "";
					vDateName.focus();
					vDateName.select();
					return false;
				}
				if (vDateValue.length == 6 && dateCheck) {
					var mDay = vDateName.value.substr(2,2);
					var mMonth = vDateName.value.substr(0,2);
					var mYear = vDateName.value.substr(4,4)
					//Turn a two digit year into a 4 digit year
					if (mYear.length == 2 && vYearType == 4) {
						var mToday = new Date();
						//If the year is greater than 30 years from now use 19, otherwise use 20
						var checkYear = mToday.getFullYear() + 30; 
						var mCheckYear = '20' + mYear;
						if (mCheckYear >= checkYear)
							mYear = '19' + mYear;
						else
							mYear = '20' + mYear;
					}

					var vDateValueCheck = mMonth+strSeperator+mDay+strSeperator+mYear;
					if (!dateValid(vDateValueCheck)) {
						alert("Invalid Date\nPlease Re-Enter");
						vDateName.value = "";
						vDateName.focus();
						vDateName.select();
						return false;
					}
					
					return true;
				}
				else {
					// Reformat the date for validation and set date type to a 1
					if (vDateValue.length >= 8  && dateCheck) {
						if (vDateType == 1) // mmddyyyy
						{
							var mDay = vDateName.value.substr(2,2);
							var mMonth = vDateName.value.substr(0,2);
							var mYear = vDateName.value.substr(4,4)
							vDateName.value = mMonth+strSeperator+mDay+strSeperator+mYear;
						}
						if (vDateType == 2) // yyyymmdd
						{
							var mYear = vDateName.value.substr(0,4)
							var mMonth = vDateName.value.substr(4,2);
							var mDay = vDateName.value.substr(6,2);
							vDateName.value = mYear+strSeperator+mMonth+strSeperator+mDay;
						}
						if (vDateType == 3) // ddmmyyyy
						{
							var mMonth = vDateName.value.substr(2,2);
							var mDay = vDateName.value.substr(0,2);
							var mYear = vDateName.value.substr(4,4)
							vDateName.value = mDay+strSeperator+mMonth+strSeperator+mYear;
						}

						//Create a temporary variable for storing the DateType and change
						//the DateType to a 1 for validation.
						var vDateTypeTemp = vDateType;
						vDateType = 1;
						var vDateValueCheck = mMonth+strSeperator+mDay+strSeperator+mYear;
						if (!dateValid(vDateValueCheck)) {
							alert("Invalid Date\nPlease Re-Enter");
							vDateType = vDateTypeTemp;
							vDateName.value = "";
							vDateName.focus();
							vDateName.select();
							return false;
						}
						vDateType = vDateTypeTemp;
						return true;
					}
					else {
						if (((vDateValue.length < 8 && dateCheck) || (vDateValue.length == 9 && dateCheck)) && (vDateValue.length >=1)) {
							alert("Invalid Date\nPlease Re-Enter");
							vDateName.value = "";
							vDateName.focus();
							vDateName.select();
							return false;
						}
					}
				}
			}
			else {
				// Non isNav Check
				if (((vDateValue.length < 8 && dateCheck) || (vDateValue.length == 9 && dateCheck)) && (vDateValue.length >=1)) {
					alert("Invalid Date\nPlease Re-Enter");
					vDateName.value = "";
					vDateName.focus();
					return true;
				}

				// Reformat date to format that can be validated. mm/dd/yyyy
				if (vDateValue.length >= 8 && dateCheck) {
					// Additional date formats can be entered here and parsed out to
					// a valid date format that the validation routine will recognize.
					if (vDateType == 1) // mm/dd/yyyy
					{
						var mMonth = vDateName.value.substr(0,2);
						var mDay = vDateName.value.substr(3,2);
						var mYear = vDateName.value.substr(6,4)
					}
					if (vDateType == 2) // yyyy/mm/dd
					{
						var mYear = vDateName.value.substr(0,4)
						var mMonth = vDateName.value.substr(5,2);
						var mDay = vDateName.value.substr(8,2);
					}
					if (vDateType == 3) // dd/mm/yyyy
					{
						var mDay = vDateName.value.substr(0,2);
						var mMonth = vDateName.value.substr(3,2);
						var mYear = vDateName.value.substr(6,4)
					}
					if (vYearLength == 4) {
						if (mYear.length < 4) {
							alert("Invalid Date\nPlease Re-Enter");
							vDateName.value = "";
							vDateName.focus();
							return true;
						}
					}
					
					// Create temp. variable for storing the current vDateType
					var vDateTypeTemp = vDateType;
					// Change vDateType to a 1 for standard date format for validation
					// Type will be changed back when validation is completed.
					vDateType = 1;
					// Store reformatted date to new variable for validation.
					var vDateValueCheck = mMonth+strSeperator+mDay+strSeperator+mYear;
					
					if (mYear.length == 2 && vYearType == 4 && dateCheck) {
						//Turn a two digit year into a 4 digit year
						var mToday = new Date();
						//If the year is greater than 30 years from now use 19, otherwise use 20
						var checkYear = mToday.getFullYear() + 30; 
						var mCheckYear = '20' + mYear;
						if (mCheckYear >= checkYear)
							mYear = '19' + mYear;
						else
							mYear = '20' + mYear;
						vDateValueCheck = mMonth+strSeperator+mDay+strSeperator+mYear;
						// Store the new value back to the field.  This function will
						// not work with date type of 2 since the year is entered first.
						if (vDateTypeTemp == 1) // mm/dd/yyyy
							vDateName.value = mMonth+strSeperator+mDay+strSeperator+mYear;
						if (vDateTypeTemp == 3) // dd/mm/yyyy
							vDateName.value = mDay+strSeperator+mMonth+strSeperator+mYear;
					} 
					if (!dateValid(vDateValueCheck)) {
						alert("Invalid Date\nPlease Re-Enter");
						vDateType = vDateTypeTemp;
						vDateName.value = "";
						vDateName.focus();
						return true;
					}

					vDateType = vDateTypeTemp;
					return true;
				}
				else {
					if (vDateType == 1) {
						if (vDateValue.length == 2) {
							vDateName.value = vDateValue+strSeperator;
						}
						if (vDateValue.length == 5) {
							vDateName.value = vDateValue+strSeperator;
						}
					}
					if (vDateType == 2) {
						if (vDateValue.length == 4) {
							vDateName.value = vDateValue+strSeperator;
						}
						if (vDateValue.length == 7) {
							vDateName.value = vDateValue+strSeperator;
						}
					} 
					if (vDateType == 3) {
						if (vDateValue.length == 2) {
							vDateName.value = vDateValue+strSeperator;
						}
						if (vDateValue.length == 5) {
							vDateName.value = vDateValue+strSeperator;
						}
					}
					return true;
				}
			}

			if (vDateValue.length == 10&& dateCheck) {
				if (!dateValid(vDateName)) {
					// Un-comment the next line of code for debugging the dateValid() function error messages
					//alert(err);  
					alert("Invalid Date\nPlease Re-Enter");
					vDateName.focus();
					vDateName.select();
				}
			}
			return false;
		}
		else {
			// If the value is not in the string return the string minus the last
			// key entered.
			if (isNav4) {
				vDateName.value = "";
				vDateName.focus();
				vDateName.select();
				return false;
			}
			else
			{
				var strCheck = '36,35,67,86,46,45,17';	//Home, end, ctrl+c, paste, ctrl+del,ctrl+insert,ctrl+v
				if (strCheck.indexOf(whichCode) == -1)
				{
					//alert(whichCode);
					vDateName.value = vDateName.value.substr(0, (vDateValue.length-1));
				}
				return false;
			}
		}
	}
}

function dateValid(objName) {
	var strDate;
	var strDateArray;
	var strDay;
	var strMonth;
	var strYear;
	var intday;
	var intMonth;
	var intYear;
	var booFound = false;
	var datefield = objName;
	var strSeparatorArray = new Array("-"," ","/",".");
	var intElementNr;
	// var err = 0;
	var strMonthArray = new Array(12);
	strMonthArray[0] = "Jan";
	strMonthArray[1] = "Feb";
	strMonthArray[2] = "Mar";
	strMonthArray[3] = "Apr";
	strMonthArray[4] = "May";
	strMonthArray[5] = "Jun";
	strMonthArray[6] = "Jul";
	strMonthArray[7] = "Aug";
	strMonthArray[8] = "Sep";
	strMonthArray[9] = "Oct";
	strMonthArray[10] = "Nov";
	strMonthArray[11] = "Dec";
	//strDate = datefield.value;
	strDate = objName;
	if (strDate.length < 1) {
		return true;
	}
	for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
		if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {
			strDateArray = strDate.split(strSeparatorArray[intElementNr]);
			if (strDateArray.length != 3) {
				err = 1;
				return false;
			}
			else {
				strDay = strDateArray[0];
				strMonth = strDateArray[1];
				strYear = strDateArray[2];
			}
			booFound = true;
		}
	}

	if (booFound == false) {
		if (strDate.length>5) {
			strDay = strDate.substr(0, 2);
			strMonth = strDate.substr(2, 2);
			strYear = strDate.substr(4);
		}
	}

	//Adjustment for short years entered
	if (strYear.length == 2) {
		strYear = '20' + strYear;
	}

	strTemp = strDay;
	strDay = strMonth;
	strMonth = strTemp;
	intday = parseInt(strDay, 10);
	if (isNaN(intday)) {
		err = 2;
		return false;
	}

	intMonth = parseInt(strMonth, 10);
	if (isNaN(intMonth)) {
		for (i = 0;i<12;i++) {
			if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) {
				intMonth = i+1;
				strMonth = strMonthArray[i];
				i = 12;
			}
		}
		if (isNaN(intMonth)) {
			err = 3;
			return false;
		}
	}

	intYear = parseInt(strYear, 10);

	if (isNaN(intYear)) {
		err = 4;
		return false;
	}

	if (intMonth>12 || intMonth<1) {
		err = 5;
		return false;
	}

	if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
		err = 6;
		return false;
	}

	if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
		err = 7;
		return false;
	}

	if (intMonth == 2) {
		if (intday < 1) {
			err = 8;
			return false;
		}
		if (LeapYear(intYear) == true) {
			if (intday > 29) {
				err = 9;
				return false;
			}
		}
		else {
			if (intday > 28) {
				err = 10;
				return false;
			}
		}
	}
	return true;
}

function LeapYear(intYear) {
	if (intYear % 100 == 0) {
		if (intYear % 400 == 0) { return true; }
	}
	else {
		if ((intYear % 4) == 0) { return true; }
	}
	return false;
}

/*
------------------------------------------------------
Date Functions
------------------------------------------------------

HISTORY

------------------------------------------------------------------
These functions use the same 'format' strings as the 
java.text.SimpleDateFormat class, with minor exceptions.
The format string consists of the following abbreviations:

Field        | Full Form          | Short Form
-------------+--------------------+-----------------------
Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
Month        | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
             | NNN (abbr.)        |
Day of Month | dd (2 digits)      | d (1 or 2 digits)
Day of Week  | EE (name)          | E (abbr)
Hour (1-12)  | hh (2 digits)      | h (1 or 2 digits)
Hour (0-23)  | HH (2 digits)      | H (1 or 2 digits)
Hour (0-11)  | KK (2 digits)      | K (1 or 2 digits)
Hour (1-24)  | kk (2 digits)      | k (1 or 2 digits)
Minute       | mm (2 digits)      | m (1 or 2 digits)
Second       | ss (2 digits)      | s (1 or 2 digits)
AM/PM        | a                  |

NOTE THE DIFFERENCE BETWEEN MM and mm! Month=MM, not mm!
Examples:
 "MMM d, y" matches: January 01, 2000
                     Dec 1, 1900
                     Nov 20, 00
 "M/d/yy"   matches: 01/20/00
                     9/2/00
 "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
------------------------------------------------------------------
*/

var 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');
var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x) {return(x<0||x>9?"":"0")+x}

// ------------------------------------------------------------------
// isDate ( date_string, format_string )
// Returns true if date string matches format of format string and
// is a valid date. Else returns false.
// It is recommended that you trim whitespace around the value before
// passing it to this function, as whitespace is NOT ignored!
// ------------------------------------------------------------------
function isDate(val,format) {
	var date=getDateFromFormat(val,format);
	if (date==0) { return false; }
	return true;
	}

// -------------------------------------------------------------------
// compareDates(date1,date1format,date2,date2format)
//   Compare two date strings to see which is greater.
//   Returns:
//   1 if date1 is greater than date2
//   0 if date2 is greater than date1 of if they are the same
//  -1 if either of the dates is in an invalid format
// -------------------------------------------------------------------
function compareDates(date1,dateformat1,date2,dateformat2) {
	var d1=getDateFromFormat(date1,dateformat1);
	var d2=getDateFromFormat(date2,dateformat2);
	if (d1==0 || d2==0) {
		return -1;
		}
	else if (d1 > d2) {
		return 1;
		}
	return 0;
	}

// ------------------------------------------------------------------
// formatDate (date_object, format)
// Returns a date in the output format specified.
// The format string uses the same abbreviations as in getDateFromFormat()
// ------------------------------------------------------------------
function formatDate(date,format) {
	format=format+"";
	var result="";
	var i_format=0;
	var c="";
	var token="";
	var y=date.getYear()+"";
	var M=date.getMonth()+1;
	var d=date.getDate();
	var E=date.getDay();
	var H=date.getHours();
	var m=date.getMinutes();
	var s=date.getSeconds();
	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
	// Convert real date parts into formatted versions
	var value=new Object();
	if (y.length < 4) {y=""+(y-0+1900);}
	value["y"]=""+y;
	value["yyyy"]=y;
	value["yy"]=y.substring(2,4);
	value["M"]=M;
	value["MM"]=LZ(M);
	value["MMM"]=MONTH_NAMES[M-1];
	value["NNN"]=MONTH_NAMES[M+11];
	value["d"]=d;
	value["dd"]=LZ(d);
	value["E"]=DAY_NAMES[E+7];
	value["EE"]=DAY_NAMES[E];
	value["H"]=H;
	value["HH"]=LZ(H);
	if (H==0){value["h"]=12;}
	else if (H>12){value["h"]=H-12;}
	else {value["h"]=H;}
	value["hh"]=LZ(value["h"]);
	if (H>11){value["K"]=H-12;} else {value["K"]=H;}
	value["k"]=H+1;
	value["KK"]=LZ(value["K"]);
	value["kk"]=LZ(value["k"]);
	if (H > 11) { value["a"]="PM"; }
	else { value["a"]="AM"; }
	value["m"]=m;
	value["mm"]=LZ(m);
	value["s"]=s;
	value["ss"]=LZ(s);
	while (i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		if (value[token] != null) { result=result + value[token]; }
		else { result=result + token; }
		}
	return result;
	}
	
// ------------------------------------------------------------------
// Utility functions for parsing in getDateFromFormat()
// ------------------------------------------------------------------
function _isInteger(val) {
	var digits="1234567890";
	for (var i=0; i < val.length; i++) {
		if (digits.indexOf(val.charAt(i))==-1) { return false; }
		}
	return true;
	}
function _getInt(str,i,minlength,maxlength) {
	for (var x=maxlength; x>=minlength; x--) {
		var token=str.substring(i,i+x);
		if (token.length < minlength) { return null; }
		if (_isInteger(token)) { return token; }
		}
	return null;
	}
	
// ------------------------------------------------------------------
// getDateFromFormat( date_string , format_string )
//
// This function takes a date string and a format string. It matches
// If the date string matches the format string, it returns the 
// getTime() of the date. If it does not match, it returns 0.
// ------------------------------------------------------------------
function getDateFromFormat(val,format) {
	val=val+"";
	format=format+"";
	var i_val=0;
	var i_format=0;
	var c="";
	var token="";
	var token2="";
	var x,y;
	var now=new Date();
	var year=now.getYear();
	var month=now.getMonth()+1;
	var date=1;
	var hh=now.getHours();
	var mm=now.getMinutes();
	var ss=now.getSeconds();
	var ampm="";
	
	while (i_format < format.length) {
		// Get next token from format string
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		// Extract contents of value based on format token
		if (token=="yyyy" || token=="yy" || token=="y") {
			if (token=="yyyy") { x=4;y=4; }
			if (token=="yy")   { x=2;y=2; }
			if (token=="y")    { x=2;y=4; }
			year=_getInt(val,i_val,x,y);
			if (year==null) { return 0; }
			i_val += year.length;
			if (year.length==2) {
				if (year > 70) { year=1900+(year-0); }
				else { year=2000+(year-0); }
				}
			}
		else if (token=="MMM"||token=="NNN"){
			month=0;
			for (var i=0; i<MONTH_NAMES.length; i++) {
				var month_name=MONTH_NAMES[i];
				if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
					if (token=="MMM"||(token=="NNN"&&i>11)) {
						month=i+1;
						if (month>12) { month -= 12; }
						i_val += month_name.length;
						break;
						}
					}
				}
			if ((month < 1)||(month>12)){return 0;}
			}
		else if (token=="EE"||token=="E"){
			for (var i=0; i<DAY_NAMES.length; i++) {
				var day_name=DAY_NAMES[i];
				if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
					i_val += day_name.length;
					break;
					}
				}
			}
		else if (token=="MM"||token=="M") {
			month=_getInt(val,i_val,token.length,2);
			if(month==null||(month<1)||(month>12)){return 0;}
			i_val+=month.length;}
		else if (token=="dd"||token=="d") {
			date=_getInt(val,i_val,token.length,2);
			if(date==null||(date<1)||(date>31)){return 0;}
			i_val+=date.length;}
		else if (token=="hh"||token=="h") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>12)){return 0;}
			i_val+=hh.length;}
		else if (token=="HH"||token=="H") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>23)){return 0;}
			i_val+=hh.length;}
		else if (token=="KK"||token=="K") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>11)){return 0;}
			i_val+=hh.length;}
		else if (token=="kk"||token=="k") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>24)){return 0;}
			i_val+=hh.length;hh--;}
		else if (token=="mm"||token=="m") {
			mm=_getInt(val,i_val,token.length,2);
			if(mm==null||(mm<0)||(mm>59)){return 0;}
			i_val+=mm.length;}
		else if (token=="ss"||token=="s") {
			ss=_getInt(val,i_val,token.length,2);
			if(ss==null||(ss<0)||(ss>59)){return 0;}
			i_val+=ss.length;}
		else if (token=="a") {
			if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
			else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
			else {return 0;}
			i_val+=2;}
		else {
			if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
			else {i_val+=token.length;}
			}
		}
	// If there are any trailing characters left in the value, it doesn't match
	if (i_val != val.length) { return 0; }
	// Is date valid for month?
	if (month==2) {
		// Check for leap year
		if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
			if (date > 29){ return 0; }
			}
		else { if (date > 28) { return 0; } }
		}
	if ((month==4)||(month==6)||(month==9)||(month==11)) {
		if (date > 30) { return 0; }
		}
	// Correct hours value
	if (hh<12 && ampm=="PM") { hh=hh-0+12; }
	else if (hh>11 && ampm=="AM") { hh-=12; }
	var newdate=new Date(year,month-1,date,hh,mm,ss);
	return newdate.getTime();
	}

// ------------------------------------------------------------------
// parseDate( date_string [, prefer_euro_format] )
//
// This function takes a date string and tries to match it to a
// number of possible date formats to get the value. It will try to
// match against the following international formats, in this order:
// y-M-d   MMM d, y   MMM d,y   y-MMM-d   d-MMM-y  MMM d
// M/d/y   M-d-y      M.d.y     MMM-d     M/d      M-d
// d/M/y   d-M-y      d.M.y     d-MMM     d/M      d-M
// A second argument may be passed to instruct the method to search
// for formats like d/M/y (european format) before M/d/y (American).
// Returns a Date object or null if no patterns match.
// ------------------------------------------------------------------
function parseDate(val) {
	var preferEuro=(arguments.length==2)?arguments[1]:false;
	generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');
	monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');
	dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');
	var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');
	var d=null;
	for (var i=0; i<checkList.length; i++) {
		var l=window[checkList[i]];
		for (var j=0; j<l.length; j++) {
			d=getDateFromFormat(val,l[j]);
			if (d!=0) { return new Date(d); }
			}
		}
	return null;
	}

/*
------------------------------------------------------
End Date Functions
------------------------------------------------------
*/


/*
------------------------------------------------------
Start Tree View Functions
------------------------------------------------------
*/

var iDivs = 0;
var sCurrentElement = -1;
var sGotoPath = '';
var sGotoFile = '';
var bLoaded=0;
var sTreeViewPath = '';
/*
if (ver4) {
    with (document) {
        write("<STYLE TYPE='text/css'>");
        if (NS4) {
            write(".parent {position:absolute; visibility:visible}");
            write(".child {position:absolute; visibility:visible}");
            write(".regular {position:absolute; visibility:visible}");
        }
        else {
            write(".child {display:none}");
        }
        write("</STYLE>");
    }
}
*/
function mov(i)
{
	if (IE4) {
		e = eval("td" + i);
	}
	else if (NS6 || is_moz || is_fx) {
    	whichEl = document.getElementsByTagName('td');
		e = whichEl["td" + i];
	}
	e.style.backgroundColor ='#cccccc';
	e.style.border = '1px solid #999999';
}

function mou(i)
{
	if (IE4) {
		e = eval("td" + i);
		a = eval("a" + i);
	}
	else if (NS6 || is_moz || is_fx) {
		whichEl = document.getElementsByTagName('td');
		e = whichEl["td" + i];
		whichEl = document.getElementsByTagName('a');
		a = whichEl["a" + i];
	}

	if (i==sCurrentElement)
	{
		e.style.backgroundColor ='#0000aa';
		e.style.border = '1px solid #999999';
		e.style.color = '#ffffff';
		a.style.color = '#ffffff';
	}
	else
	{
		e.style.backgroundColor ='#ffffff';
		e.style.border = '1px solid #ffffff';
		e.style.color = '#000000';
		a.style.color = '#000000';
	}
}

function highlightRow(el)
{
	//If there is a previoiusly highlighted item then clear it
	if (sCurrentElement != -1)
	{
		var old = sCurrentElement;
		sCurrentElement = -1;
		mou(old);
	}
	sCurrentElement = el;
	mou(el);
}

function expandTo(sPath, sFileName)
{
	var i, sDivPath, sDivFileName
	sPath = sPath.toLowerCase();
	sFileName = sFileName.toLowerCase();
	for (i=1; i<=iDivs; i++) {
		if (IE4) {
			sDivPath = eval("hP" + i).value.toLowerCase();
			sDivFileName = eval("hF" + i).value.toLowerCase();
		}
		else if (NS6 || is_moz || is_fx) {
			whichEl = document.getElementsByTagName('input');
			sDivPath = whichEl["hP" + i].value.toLowerCase();
			sDivFileName = whichEl["hF" + i].value.toLowerCase();
		}
	
		if (sPath.indexOf(sDivPath) == 0)
		{
			//See if this is the main path or filename
			if (sDivFileName == "" || ((sDivPath == sPath) && (sDivFileName == sFileName)))
			{
				try
				{
					if (IE4) {
						whichEl = eval("div" + i);
						//If it's hiden then show it
						if (whichEl.style.display == "none") {
							expandIt(i, true);
						}
					}
					else if (NS6 || is_fx || is_moz) {
						whichEl = document.getElementsByTagName("div")
      
						//If it's hiden then show it
						if (whichEl["div" + i].style.display == "none") {
							expandIt(i, true);
						}
					}
				}
				catch (e)
				{
				}
				//If this is the file or path selected then select it
				if (sDivPath == sPath && (sFileName == "" || sDivFileName == sFileName))
				{
					highlightRow(i);
					break;
				}
			}
		}
	}
}

function getIndex(el) {
    ind = null;
    for (i=0; i<document.layers.length; i++) {
        whichEl = document.layers[i];
        if (whichEl.id == el) {
            ind = i;
            break;
        }
    }
    return ind;
}

function arrange() {
    nextY = document.layers[firstInd].pageY + document.layers[firstInd].document.height;
    for (i=firstInd+1; i<document.layers.length; i++) {
        whichEl = document.layers[i];
        if (whichEl.visibility != "hide") {
            whichEl.pageY = nextY;
            nextY += whichEl.document.height;
        }
    }
}

function initIt(){
    if (!ver4) return;
    if (NS4) {
       for (i=0; i<document.layers.length; i++) {
           whichEl = document.layers[i];
           if (whichEl.id.indexOf("d") == 0) whichEl.visibility = "hide";
       }
       arrange();
    }
    else {
        divColl = document.all.tags("DIV");
        for (i=0; i<divColl.length; i++) {
            whichEl = divColl(i);
            whichEl.style.display = "none";
        }
    }
}

function expandIt(el, bHighlight) {
	if (bHighlight)
	{
		highlightRow(el);
	}
    if (IE4) {
        whichEl = eval("div" + el);
        whichIm = eval("img" + el);
        if (whichEl.style.display == "none") {
            whichEl.style.display = "block";
            whichIm.src = sTreeViewPath + "open.gif";        
        }
        else {
            whichEl.style.display = "none";
            whichIm.src = sTreeViewPath + "closed.gif";
        }
    }
    else if (NS6 || is_moz || is_fx) {
       whichEl = document.getElementsByTagName("div")
       if (whichEl["div" + el].style.display == "none") {
            whichEl["div" + el].style.display = "inline";
			whichIm = document.getElementsByTagName("img")
            whichIm["img" + el].src = sTreeViewPath + "open.gif";
        }
        else {
            whichEl["div" + el].style.display = "none";
			whichIm = document.getElementsByTagName("img")
            whichIm["img" + el].src = sTreeViewPath + "closed.gif";
        }
        //arrange();
    }
    /*else if (NS6 && !is_moz && !is_fx) {
       whichEl = document.getElementsByTagName("div")
       if (whichEl["div" + el].style.visibility == "hide") {
            whichEl["div" + el].style.visibility = "show";
			whichIm = document.getElementsByTagName("img")
            whichIm["img" + el].src = sTreeViewPath + "open.gif";
        }
        else {
            whichEl["div" + el].style.visibility = "hidden";
			whichIm = document.getElementsByTagName("img")
            whichIm["img" + el].src = sTreeViewPath + "closed.gif";
        }
        arrange();
    }*/
    else if (NS4) {
       whichEl = document.layers["div" + el];
       whichIm = document.layers["img" + el];
       if (whichEl.visibility == "hide") {
            whichEl.visibility = "show";
            whichIm.src = sTreeViewPath + "open.gif";
       }
       else {
           whichEl.visibility = "hide";
           whichIm.src = sTreeViewPath + "closed.gif";
       }
       arrange();
    }
    else {
        whichEl = eval("document.dim" + el);
        whichIm = eval("document.img" + el);
        if (whichEl.visibility == "hide") {
            whichEl.visibility = "show";
            whichIm.src = sTreeViewPath + "open.gif";
        }
        else {
            whichEl.visibility = "hide";
            whichIm.src = sTreeViewPath + "closed.gif";
        }
        arrange();
    }
}

/*
------------------------------------------------------
End Tree View Functions
------------------------------------------------------
*/

/*
------------------------------------------------------------
Start in-page popup Functions
------------------------------------------------------------
*/

var lPopupMouseTop = 0, lPopupMouseLeft = 0, lPopupMouseTopDiff = 0, lPopupMouseLeftDiff = 0, bPopupMouseDown;
var ie=document.all;
var nn6=document.getElementById&&!document.all;

var oTopFrame;

if (top.frames['fraDocument'])
{
	oTopFrame = top.frames['fraDocument'];
}
else
{
	oTopFrame = top;
}

oTopFrame.isdrag=false;

var x,y;
var iPopupID = 0;
var objPopupOpener = new Array();
var iTopPopupZIndex=0;

function setWindowTitle(iPopupID, sTitle)
{
	var fraTargetDoc = oTopFrame.document;
	alert('fraPopupBackground_' + iPopupID);
	docTitle = getIFrame(fraTargetDoc, 'fraPopupBackground_' + iPopupID)
	if (docTitle)
	{
		var tdTitle = docTitle.getElementById('tdTitle');
		if (tdTitle)
		{
			tdTitle.innerHTML = sTitle;
		}
	}

}

function getPopupID(objDocument)
{
	var sID, iID=0;
	if (objDocument.window.frameElement)
	{
		sID = objDocument.window.frameElement.id;
		if (sID.substr(0, 9)=='fraPopup_')
			iID = sID.substring(9);
		else
			alert('getPopupID: Cound not find id in ' + sID);
		
	}
	return iID;
}

function openEmbeddedWindow(objOpener, sTitle, sURL, iWidth, iHeight, sOptions)
{ 
	var bCenter, bSizeable, bModal, bStatusBar, bScroll;

	//Increment the popupID so we can have multiple popups visible.
	oTopFrame.iPopupID++;
	oTopFrame.iTopPopupZIndex = oTopFrame.iTopPopupZIndex + 2;
	/*******************************************
	GET THE OPTIONS
	*******************************************/
	
	if (sOptions.indexOf('center=1')!=-1) bCenter = true;
	if (sOptions.indexOf('resize=1')!=-1) bSizeable = true;
	if (sOptions.indexOf('modal=1')!=-1) bModal = true;
	if (sOptions.indexOf('statusbar=1')!=-1) bStatusBar = true;
	if (sOptions.indexOf('scroll=1')!=-1) bScroll = true;
	

	/*******************************************
	CREATE THE OBJECTS
	*******************************************/
	var fraTargetDoc = oTopFrame.document;
	var fraPopup = fraTargetDoc.createElement("IFRAME"); 
	var fraPopupBackground = fraTargetDoc.createElement("IFRAME"); 

	var objTitleDiv = fraTargetDoc.createElement("DIV"); 

	var iInnerWidth = getInnerWidth(oTopFrame);
	var iInnerHeight = getInnerHeight(oTopFrame);
	var iScrollX = (fraTargetDoc.all)?fraTargetDoc.body.scrollLeft:oTopFrame.window.pageXOffset; 
	var iScrollY = (fraTargetDoc.all)?fraTargetDoc.body.scrollTop:oTopFrame.window.pageYOffset;
	
//    var iScrollX = (window.pageXOffset)?(window.pageXOffset):(document.documentElement)?document.documentElement.scrollLeft:document.body.scrollLeft;
/* If window.pageXOffset is defined, set left to the pageXOffset of the current document. If it isn’t and document.documentElement is defined, set left to document.documentElement.scrollLeft. If document.documentElement and window.pageXOffset are both undefined, set the variable to document.body.scrollLeft */
//    var iScrollY = (window.pageYOffset)?(window.pageYOffset):(document.documentElement)?document.documentElement.scrollTop:document.body.scrollTop;
/* An explanation here: the variable “top” is going to represent one of three things: window.pageYOffset (if it is available, if it’s not, it represents document.documentElement.scrollTop. If document.documentElement is not available, it will represent document.body.scrollTop (sound familiar?). This is the variable we’ll use to determine the amount of pixels this document is scrolled from the top. It is important because it tells us where we should put the frame on the right. */
	

	if (bModal)
	{
		//Build the blocking iframe
		var fraBlocker = fraTargetDoc.createElement("IMG"); 
		fraBlocker.setAttribute('id', 'fraPopupBlocker_' + oTopFrame.iPopupID);
		fraBlocker.setAttribute('popupId', oTopFrame.iPopupID);
		fraBlocker.setAttribute('src', '/images/spacer.gif');
		fraBlocker.style.display='block';
		fraBlocker.style.position='absolute';
		fraBlocker.style.zIndex=oTopFrame.iTopPopupZIndex
		fraBlocker.style.top = "0px"; 
		fraBlocker.style.left = "0px"; 
		fraBlocker.style.width = '100%'
		var divBodyContent = fraTargetDoc.getElementById("tabBody");
		fraBlocker.style.height = divBodyContent.clientHeight + 'px';
		//fraBlocker.onselectstart = oTopFrame.rfalse;
		fraBlocker.style.border = '0px';
		//fraBlocker.style.filter = 'alpha(opacity=75)';
		fraTargetDoc.body.appendChild(fraBlocker);
	}

	//Setup differences for IE and FireFox
	var iExtraWidth;
	var iExtraHeight;
	if (is_fx)
	{
		iExtraWidth = 1;
		iExtraHeight = 1;
	}
	else
	{
		iExtraWidth = 0;
		iExtraHeight = 0;
	}

	
	//Build the Title bar
	objTitleDiv.setAttribute('id', 'divPopupTitle_' + oTopFrame.iPopupID);
	objTitleDiv.setAttribute('popupId', oTopFrame.iPopupID);
	
	objTitleDiv.setAttribute('center', bCenter ? 1 : 0);
	objTitleDiv.setAttribute('resize', bSizeable ? 1 : 0);
	objTitleDiv.setAttribute('modal', bModal ? 1 : 0);
	objTitleDiv.setAttribute('statusbar', bStatusBar ? 1 : 0);
	objTitleDiv.setAttribute('scroll', bScroll ? 1 : 0);
	
	objTitleDiv.style.backgroundColor='#D4D0C8';
	objTitleDiv.style.display='block';
	objTitleDiv.style.position='absolute';
	objTitleDiv.style.zIndex=oTopFrame.iTopPopupZIndex + 1;
	objTitleDiv.style.top = (iScrollY + ((iInnerHeight / 2) - (iHeight / 2)) - 20) + "px"; 
	objTitleDiv.style.left = iScrollX + ((iInnerWidth / 2) - (iWidth / 2)) + "px"; 
	objTitleDiv.style.width = (iWidth + 4 - (iExtraWidth * 4)) + "px"; 
	objTitleDiv.style.height = (iHeight + 20 - (iExtraHeight * 4)) + "px"; 
	objTitleDiv.style.border = '0px';
	objTitleDiv.style.marginTop = '0px';
	objTitleDiv.style.marginLeft = '0px';
	objTitleDiv.style.marginBottom = '0px';
	objTitleDiv.style.marginRight = '0px';
	objTitleDiv.style.paddingRight = '0px';
	objTitleDiv.style.paddingTop = '0px'; 
	objTitleDiv.style.paddingLeft = '0px'; 
	objTitleDiv.style.paddingBottom = '0px';
	//objTitleDiv.innerHTML = "<table width=100% cellpadding=2 cellspacing=0 bgcolor=#0A246A border=0><tr><td height=20 valign=top style='color: #ffffff; font-size: 8pt; font-face: Tahoma; font-weight: bold;'>" + sTitle + '</td></tr></table>';
	objTitleDiv.onselectstart = oTopFrame.rfalse;
	fraTargetDoc.body.appendChild(objTitleDiv);

	//Build IFRAME for background
	fraPopupBackground.setAttribute('id', 'fraPopupBackground_' + oTopFrame.iPopupID);
	fraPopupBackground.setAttribute('name', 'fraPopupBackground_' + oTopFrame.iPopupID);
	fraPopupBackground.setAttribute('popupId', oTopFrame.iPopupID);
	fraPopupBackground.style.display='block';
	fraPopupBackground.style.position='absolute';
	fraPopupBackground.style.zIndex=0;
	fraPopupBackground.style.borderTop = '2px outset #efefef'; 
	fraPopupBackground.style.borderLeft = '2px outset #efefef'; 
	fraPopupBackground.style.borderBottom = '2px outset #efefef';
	fraPopupBackground.style.borderRight = '2px outset #efefef';
	fraPopupBackground.style.margin = '0px';
	fraPopupBackground.style.padding = '0px';
	fraPopupBackground.style.top = "0px"; 
	fraPopupBackground.style.left = "0px"; 
	fraPopupBackground.style.width = (iWidth - (iExtraWidth * 4)) + "px"; 
	fraPopupBackground.style.height = (iHeight + 16 - (iExtraHeight * 4)) + "px"; 
	fraPopupBackground.scrolling = 'no'; 
	fraPopupBackground.setAttribute('src', '/embedded.php?Title=' + URLEncode(sTitle));
	objTitleDiv.appendChild(fraPopupBackground);

	//Build Close image
	var imgClose = fraTargetDoc.createElement("IMG"); ;
	imgClose.setAttribute('id', 'imgPopupCloser_' + oTopFrame.iPopupID);
	imgClose.setAttribute('popupId', oTopFrame.iPopupID);
	imgClose.setAttribute('src', '/images/popup_close.gif');
	imgClose.style.position='absolute';
	imgClose.style.zIndex=4;
	imgClose.style.top = "4px"; 
	imgClose.style.left = (iWidth - 16) + "px"; 
	imgClose.style.width = "16px"; 
	imgClose.style.height = "14px"; 
	imgClose.onmousedown=oTopFrame.getThenCloseEmbeddedWindow;
	imgClose.onmouseup=oTopFrame.movePopupMouseUp;
	//imgClose.className = 'dragme';
	objTitleDiv.appendChild(imgClose);

	//Build Minimize image
	var imgMinimize = fraTargetDoc.createElement("IMG"); ;
	imgMinimize.setAttribute('id', 'imgPopupMinimize_' + oTopFrame.iPopupID);
	imgMinimize.setAttribute('popupId', oTopFrame.iPopupID);
	imgMinimize.setAttribute('src', '/images/popup_minimize.gif');
	imgMinimize.style.position='absolute';
	imgMinimize.style.zIndex=4;
	imgMinimize.style.top = "4px"; 
	imgMinimize.style.left = (iWidth - 35) + "px"; 
	imgMinimize.style.width = "16px"; 
	imgMinimize.style.height = "14px"; 
	imgMinimize.onmousedown=oTopFrame.minimizeEmbeddedWindow;
	imgMinimize.onmouseup=oTopFrame.movePopupMouseUp;
	//imgMinimize.className = 'dragme';
	objTitleDiv.appendChild(imgMinimize);

	//Build Titlebar drag image
	var imgTitlebarDrag = fraTargetDoc.createElement("IMG"); ;
	imgTitlebarDrag.setAttribute('id', 'imgPopupTitlebarDrag_' + oTopFrame.iPopupID);
	imgTitlebarDrag.setAttribute('popupId', oTopFrame.iPopupID);
	imgTitlebarDrag.setAttribute('src', '/images/spacer.gif');
	imgTitlebarDrag.style.position='absolute';
	imgTitlebarDrag.style.zIndex=3;
	imgTitlebarDrag.style.top = "0px"; 
	imgTitlebarDrag.style.left = "0px"; 
	imgTitlebarDrag.style.width = (iWidth) + "px"; 
	imgTitlebarDrag.style.height = "20px"; 
	imgTitlebarDrag.className = 'dragme';
	imgTitlebarDrag.onmousedown=oTopFrame.popupSelectMouse;
	imgTitlebarDrag.onmouseup=oTopFrame.movePopupMouseUp;
	objTitleDiv.appendChild(imgTitlebarDrag);
	
	if (bStatusBar)
	{
		//Build Titlebar drag image
		var divStatusBar = fraTargetDoc.createElement("DIV"); ;
		divStatusBar.setAttribute('id', 'divStatusBar_' + oTopFrame.iPopupID);
		divStatusBar.setAttribute('popupId', oTopFrame.iPopupID);
		divStatusBar.style.position='absolute';
		divStatusBar.style.zIndex=2;
		divStatusBar.style.top = (iHeight - 2) + "px"; 
		divStatusBar.style.left = "2px"; 
		divStatusBar.style.width = (iWidth - (iExtraWidth * 4)) + "px"; 
		divStatusBar.style.height = (20 - (iExtraHeight * 4)) + "px"; 
		divStatusBar.style.backgroundColor='#D4D0C8';
		divStatusBar.style.borderTop = '1px solid #808080'; 
		divStatusBar.style.borderLeft = '1px solid #808080'; 
		divStatusBar.style.borderRight = '1px solid #ffffff';
		divStatusBar.style.borderBottom = '1px solid #ffffff';
		divStatusBar.style.padding = '0px';
		divStatusBar.style.paddingTop = '2px'; 
		divStatusBar.style.paddingLeft = '2px'; 
		divStatusBar.style.paddingBottom = '0px';
		divStatusBar.style.margin = '0px';
		divStatusBar.style.fontName = 'Arial';
		divStatusBar.style.color = '#000000';
		divStatusBar.style.fontSize = '8pt';
		divStatusBar.style.fontWeight = 'normal';
		divStatusBar.innerHTML = '';
		divStatusBar.onselectstart = oTopFrame.rfalse;
		divStatusBar.onmouseup=oTopFrame.movePopupMouseUp;
		objTitleDiv.appendChild(divStatusBar);
	}

	//Build IFRAME for content
	fraPopup.setAttribute('id', 'fraPopup_' + oTopFrame.iPopupID);
	fraPopup.setAttribute('name', 'fraPopup_' + oTopFrame.iPopupID);
	fraPopup.style.display='block';
	fraPopup.style.position='absolute';
	fraPopup.style.zIndex=1;
	fraPopup.style.border = '0px';
	fraPopup.style.margin = '0px';
	fraPopup.style.padding = '0px';
	fraPopup.style.top = "22px"; 
	fraPopup.style.left = "2px"; 
	fraPopup.style.width = (iWidth) + "px"; 
	if (bStatusBar)
	{
		fraPopup.style.height = (iHeight - 20 - 4) + "px"; 
	}
	else
	{
		fraPopup.style.height = (iHeight - 4) + "px"; 
	}
	if (!bScroll)
	{
		fraPopup.scrolling = 'no'; 
	}
	
	fraPopup.style.border = '0px';
	//fraPopup.style.filter = 'alpha(opacity=90)';
	//Load the page into the popup
	fraPopup.setAttribute('src', sURL);
	fraPopup.setAttribute('popupId', oTopFrame.iPopupID);
	//Assign the opener so that the popup code can use it to identify the opener
	if (!fraTargetDoc.objPopupOpener)
	{
		fraTargetDoc.objPopupOpener = new Array();
	}
	fraTargetDoc.objPopupOpener[oTopFrame.iPopupID] = objOpener;

	objTitleDiv.appendChild(fraPopup);
	//fraTargetDoc.body.appendChild(fraPopup);

	if (bSizeable)
	{
		//Build Resizer image
		var imgResizer = fraTargetDoc.createElement("IMG"); 
		imgResizer.setAttribute('id', 'imgPopupResizer_' + oTopFrame.iPopupID);
		imgResizer.setAttribute('popupId', oTopFrame.iPopupID);
		imgResizer.setAttribute('src', '/images/resizer.gif');
		imgResizer.style.position='absolute';
		imgResizer.className = 'dragme';
		imgResizer.style.zIndex=3;
		imgResizer.style.top = (iHeight + 5) + "px"; 
		imgResizer.style.left = (iWidth - 11) + "px"; 
		imgResizer.onmousedown=oTopFrame.popupSelectMouse;
		objTitleDiv.appendChild(imgResizer);
	}
	
	//fraTargetDoc.onmousedown=oTopFrame.popupSelectMouse;
	fraTargetDoc.onmouseup=oTopFrame.movePopupMouseUp;
	//fraTargetDoc.onmouseup=new Function("oTopFrame.movePopupMouseUp(e)");
	/*if ( is_fx ) {
		fraTargetDoc.body.addEventListener('mousemove', popupMouseMove, false);
	}
	if ( IE4 ) {
		fraTargetDoc.body.attachEvent('onmousemove', popupMouseMove);
	}*/
	setTimeout('setChildDocumentsPopupID(' + oTopFrame.iPopupID + ')', 50);
}


/*
	Sets the iPopupId variable in the child window so it can be used
	by the child script to access the parent window.
	This function and setTimeout loop is start
*/
function setChildDocumentsPopupID(iThisPopupId)
{
	var fraTargetDoc = oTopFrame.document;

	var objPopupFrame = fraTargetDoc.getElementById('fraPopup_' + iThisPopupId);
	if (objPopupFrame)
	{
		try
		{
			objPopupFrame.contentWindow.iPopupId = iThisPopupId;
		}
		catch (e)
		{
			setTimeout('setChildDocumentsPopupID(' + iThisPopupId + ')', 500);
		}
	}
	else
	{
		setTimeout('setChildDocumentsPopupID(' + iThisPopupId + ')', 500);
	}
}

function movePopupMouseUp(e)
{
	oTopFrame.isdrag=false;

	var fobj = getEventObject(e);
	if (fobj)
	{
		var iThisPopupId = fobj.getAttribute('popupID');
		if (iThisPopupId > 0)
		{
			var fraTargetDoc = oTopFrame.document;
			var objPopupTitlebarDrag = fraTargetDoc.getElementById('imgPopupTitlebarDrag_' + iThisPopupId);
			if (objPopupTitlebarDrag)
			{
				objPopupTitlebarDrag.style.top = '0px';
				objPopupTitlebarDrag.style.height = '20px';
			}
		}
	}
}

function minimizeEmbeddedWindow(e)
{
	var fobj = getEventObject(e);
	var iThisPopupId = fobj.getAttribute('popupID');

	var fraTargetDoc = oTopFrame.document;
	var objPopupTitleBar = fraTargetDoc.getElementById('divPopupTitle_' + iThisPopupId);
	var objPopupFrame = fraTargetDoc.getElementById('fraPopup_' + iThisPopupId);
	var objPopupFrameBackground = fraTargetDoc.getElementById('fraPopupBackground_' + iThisPopupId);
	var objPopupResizer = fraTargetDoc.getElementById('imgPopupResizer_' + iThisPopupId);
	var objPopupMinimize = fraTargetDoc.getElementById('imgPopupMinimize_' + iThisPopupId);
	var objStatusBar = fraTargetDoc.getElementById('divStatusBar_' + iThisPopupId);

	//Setup differences for IE and FireFox
	var iExtraWidth;
	var iExtraHeight;
	if (is_fx)
	{
		iExtraWidth = 1;
		iExtraHeight = 1;
	}
	else
	{
		iExtraWidth = 0;
		iExtraHeight = 0;
	}

	if (objPopupTitleBar)
	{
		if (objPopupTitleBar.style.height == (18 - (iExtraHeight * 4)) + 'px')
		{
			//Show
			objPopupTitleBar.style.height = objPopupTitleBar.getAttribute('popupHeight');
			objPopupFrameBackground.style.height = objPopupFrameBackground.getAttribute('popupHeight');
			objPopupFrame.style.display='';
			if (objPopupResizer)
			{
				objPopupResizer.style.display='';
			}
			if (objStatusBar)
			{
				objStatusBar.style.display='';
			}
			objPopupMinimize.src = '/images/popup_minimize.gif';
		}
		else
		{
			//Hide
			objPopupTitleBar.setAttribute('popupHeight', objPopupTitleBar.style.height);
			objPopupTitleBar.style.height = (18 - (iExtraHeight * 4)) + 'px';
			objPopupFrameBackground.setAttribute('popupHeight', objPopupFrameBackground.style.height);
			objPopupFrameBackground.style.height = (18 - (iExtraHeight * 4)) + 'px';
			objPopupFrame.style.display='none';
			if (objPopupResizer)
			{
				objPopupResizer.style.display='none';
			}
			if (objStatusBar)
			{
				objStatusBar.style.display='none';
			}
			objPopupMinimize.src = '/images/popup_maximize.gif';
		}
	}
	oTopFrame.isdrag = false;
}

function getThenCloseEmbeddedWindow(e)
{
	var fobj = getEventObject(e);
	var iThisPopupId = fobj.getAttribute('popupID');
	setTimeout("closeEmbeddedWindow(" + iThisPopupId + ")", 10);
}

function closeEmbeddedWindow(iThisPopupId)
{
	var Node;

	oTopFrame.movePopupMouseUp()
	
	Node = oTopFrame.document.getElementById('fraPopupBlocker_' + iThisPopupId); 
	if (Node)
	{
		Node.parentNode.removeChild(Node);
	}
	
	Node = oTopFrame.document.getElementById('divPopupTitle_' + iThisPopupId); 
	if (Node)
	{
		Node.parentNode.removeChild(Node);
	}
}

function movePopupToTop(iThisPopupID)
{
	var fraTargetDoc = oTopFrame.document;

	var objBottomWindow = fraTargetDoc.getElementById('divPopupTitle_' + iThisPopupID);
	
	if (objBottomWindow)
	{
		objBottomWindow.style.zIndex = oTopFrame.iTopPopupZIndex + 2;
		oTopFrame.iTopPopupZIndex = oTopFrame.iTopPopupZIndex + 4;
		//displayHelpContent('swapped ' + iTop + ' and ' + iBottom);
	}
}

function getObjPopupOpener(iPopupId)
{
	return oTopFrame.document.objPopupOpener[iPopupId];
}


function popupMouseMoveTitleBar(e)
{
	var iWidth, iHeight, iLeft, iTop;
	
	var fobj = getEventObject(e);
	
	if (fobj)
	{
		try
		{
			var iThisPopupId = fobj.getAttribute('popupID');

			var fraTargetDoc = oTopFrame.document;
			var objPopupTitleBar = fraTargetDoc.getElementById('divPopupTitle_' + iThisPopupId);
			var objPopupFrame = fraTargetDoc.getElementById('fraPopup_' + iThisPopupId);
			var objPopupResizer = fraTargetDoc.getElementById('imgPopupResizer_' + iThisPopupId);
			
			if (oTopFrame.isdrag)
			{
				iLeft = nn6 ? tx + e.clientX - x : tx + oTopFrame.event.clientX - x;
				iTop = nn6 ? ty + e.clientY - y : ty + oTopFrame.event.clientY - y;
				if (objPopupFrame)
				{
					objPopupTitleBar.style.left = parseInt(stripNonNumeric(objPopupTitleBar.style.left)) + iLeft;
					objPopupTitleBar.style.top = parseInt(stripNonNumeric(objPopupTitleBar.style.top)) + iTop;// + 1000; //See noe below
					//We add 1000 because the drag image that transparently covers the title bar extends above the titlebar by an extra 1000 pixels
					//so the drag up doesn't "lose" the window.
				}
				x = nn6 ? e.clientX : oTopFrame.event.clientX;
				y = nn6 ? e.clientY : oTopFrame.event.clientY;
				//displayHelpContent('x=' + x + ' fobj.name=' + fobj.name);
				return false;
			}
			//displayHelpContent('x=' + x + ' oTopFrame.isdrag=' + oTopFrame.isdrag);
		}
		catch (e)
		{
			//Doh!
		}
	}
}

function popupMouseMoveResizer(e)
{
	var iWidth, iHeight, iLeft, iTop;
	
	var fobj = getEventObject(e);
	
	var iThisPopupId = fobj.getAttribute('popupID');

	var fraTargetDoc = oTopFrame.document;
	var objPopupTitleBar = fraTargetDoc.getElementById('divPopupTitle_' + iThisPopupId);
	var objPopupFrame = fraTargetDoc.getElementById('fraPopup_' + iThisPopupId);
	var objPopupFrameBackground = fraTargetDoc.getElementById('fraPopupBackground_' + iThisPopupId);
	var objPopupResizer = fraTargetDoc.getElementById('imgPopupResizer_' + iThisPopupId);
	var objPopupCloser = fraTargetDoc.getElementById('imgPopupCloser_' + iThisPopupId);
	var objPopupMinimize = fraTargetDoc.getElementById('imgPopupMinimize_' + iThisPopupId);
	var objPopupTitlebarDrag = fraTargetDoc.getElementById('imgPopupTitlebarDrag_' + iThisPopupId);
	var objStatusBar = fraTargetDoc.getElementById('divStatusBar_' + iThisPopupId);

	//Setup differences for IE and FireFox
	var iExtraWidth;
	var iExtraHeight;
	if (is_fx)
	{
		iExtraWidth = 1;
		iExtraHeight = 1;
	}
	else
	{
		iExtraWidth = 0;
		iExtraHeight = 0;
	}
		
	if (oTopFrame.isdrag)
	{
		iLeft = nn6 ? tx + e.clientX - x : tx + oTopFrame.event.clientX - x;
		iTop = nn6 ? ty + e.clientY - y : ty + oTopFrame.event.clientY - y;

		if (objPopupTitleBar)
		{
			iWidth = iLeft + 13;
			iHeight = iTop - 3;
			if (iWidth > 100)
			{
				objPopupTitleBar.style.width = (iWidth + 1 - (iExtraWidth * 4)) + "px"; 
				objPopupFrameBackground.style.width = (iWidth - 2 - (iExtraWidth * 4)) + "px"; 
				objPopupFrame.style.width = (iWidth - 2) + "px"; 
				objPopupTitlebarDrag.style.width = objPopupFrame.style.width;
				if (objStatusBar)
				{
					objStatusBar.style.width = (iWidth - 2 - (iExtraWidth * 4)) + "px"; 
				}
				if (objPopupCloser)
				{
					objPopupCloser.style.left = (iWidth - 18) + "px"; 
				}
				if (objPopupMinimize)
				{
					objPopupMinimize.style.left = (iWidth - 37) + "px"; 
				}
				if (objPopupResizer)
				{
					objPopupResizer.style.left = iLeft;
				}
			}
			if (iHeight > 100)
			{
				objPopupTitleBar.style.height = (iHeight + 18 - (iExtraHeight * 4)) + "px"; 
				objPopupFrameBackground.style.height = (iHeight + 14 - (iExtraHeight * 4)) + "px"; 
				if (objStatusBar)
				{
					objPopupFrame.style.height = (iHeight - 20 - 6) + "px"; 
					objStatusBar.style.top = iTop - 7;
				}
				else
				{
					objPopupFrame.style.height = (iHeight - 8) + "px"; 
				}
				if (objPopupResizer)
				{
					objPopupResizer.style.top = iTop;
				}
			}
		}
		return false;
	}
}

function popupSelectMouse(e) 
{
	var fobj = getEventObject(e);
	
	var iThisPopupId = fobj.getAttribute('popupID');
	
	if (fobj.className=="dragme")
	{
		movePopupToTop(iThisPopupId);
	
		oTopFrame.isdrag = true;
		tx = parseInt(fobj.style.left+0);
		ty = parseInt(fobj.style.top+0);
		x = nn6 ? e.clientX : oTopFrame.event.clientX;
		y = nn6 ? e.clientY : oTopFrame.event.clientY;
		if (fobj.id=='imgPopupTitlebarDrag_' + iThisPopupId)
		{
			if (fobj.style.top=='0px')
			{
				var fraTargetDoc = oTopFrame.document;
				var objPopupTitleBar = fraTargetDoc.getElementById('divPopupTitle_' + iThisPopupId);
				fobj.style.top = '-1000px';
				fobj.style.height = (parseInt(stripNonNumeric(objPopupTitleBar.style.height)) + 1020) + 'px';
				//displayHelpContent(fobj.style.height);
			}
			oTopFrame.document.onmousemove=oTopFrame.popupMouseMoveTitleBar;
		}
		if (fobj.id=='imgPopupResizer_' + iThisPopupId)
		{
			//var iLeft = nn6 ? tx + e.clientX - x : tx + oTopFrame.event.clientX - x;
			//var iTop = nn6 ? ty + e.clientY - y : ty + oTopFrame.event.clientY - y;
			//displayHelpContent('Top:' + iTop + ' Left:' + iLeft);
			oTopFrame.document.onmousemove=oTopFrame.popupMouseMoveResizer;
		}
		return false;
	}
}

function getEventObject(e) {
	var fobj;
	var topelement;

	if (nn6)
	{
		if (e)
		{
			fobj = e.target;
		}
		topelement = "HTML";
	}
	else
	{
		if (oTopFrame.event)
		{
			fobj = oTopFrame.event.srcElement;
			topelement = "BODY";
		}
	}
	/*
		var fobj       = nn6 ? e.target : oTopFrame.event.srcElement;
		var topelement = nn6 ? "HTML" : "BODY";
	*/
	/*while (fobj.tagName != topelement && fobj.className != "dragme")
	{
		fobj = nn6 ? fobj.parentNode : fobj.parentElement;
	}*/
	return fobj;
}

function rfalse() {
  return false;
}

/*
------------------------------------------------------------
End in-page popup Functions
------------------------------------------------------------
*/

/*
------------------------------------------------------------
Sizeable List (DisplayType = 2) Functionality
------------------------------------------------------------
*/
function getInnerWidth(win) {
  var myWidth = 0;
  if( typeof( win.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = win.innerWidth;
  } else if( win.document.documentElement && ( win.document.documentElement.clientWidth || win.document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = win.document.documentElement.clientWidth;
  } else if( win.document.body && ( win.document.body.clientWidth || win.document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = win.document.body.clientWidth;
  }
  return myWidth;
}

function getInnerHeight(win) {
  var myHeight = 0;
  if( typeof( win.innerWidth ) == 'number' ) {
    //Non-IE
    myHeight = win.innerHeight;
  } else if( win.document.documentElement && ( win.document.documentElement.clientWidth || win.document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myHeight = win.document.documentElement.clientHeight;
  } else if( win.document.body && ( win.document.body.clientWidth || win.document.body.clientHeight ) ) {
    //IE 4 compatible
    myHeight = win.document.body.clientHeight;
  }
  return myHeight;
}

function getScrollXY(win) {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( win.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = win.pageYOffset;
    scrOfX = win.pageXOffset;
  } else if( win.document.body && ( win.document.body.scrollLeft || win.document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = win.document.body.scrollTop;
    scrOfX = win.document.body.scrollLeft;
  } else if( win.document.documentElement && ( win.document.documentElement.scrollLeft || win.document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = win.document.documentElement.scrollTop;
    scrOfX = win.document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}
/*
------------------------------------------------------------
End of Sizeable List (DisplayType = 2) Functionality
------------------------------------------------------------
*/


/*
------------------------------------------------------------
Start Miscellaneous Functions
------------------------------------------------------------
*/

function addCommas(nStr)
{
	var sReturn;
	
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	
	sReturn = x1 + x2;
	if (sReturn.indexOf(".")!= -1)
	{
		if (sReturn.indexOf(".") == sReturn.length - 2)
		{
			sReturn += '0';
		}
	}
	else
	{
		sReturn += '.00';
	}
	return sReturn;
}

function stripCommas(nStr)
{
	var valo = new String();
	var valid = "-0123456789.";
	var chars = nStr.split(""); 
	var i;
	
	for (i = 0; i < chars.length; i++) {
		if (valid.indexOf(chars[i]) != -1) 
			valo += chars[i];
	}
	return valo; 
}

function stripNonNumeric(nStr)
{
	var valo = new String();
	var valid = "-0123456789.";
	var chars = nStr.split(""); 
	var i;
	
	for (i = 0; i < chars.length; i++) {
		if (valid.indexOf(chars[i]) != -1) 
			valo += chars[i];
	}
	return valo; 
}


/*
------------------------------------------------------------
End Miscellaneous Functions
------------------------------------------------------------
*/