//================================
//
//	*** INTERPELAGO ***
//		-- site and server functions
//
//================================
	
	// 	-- base href tags
	gstrInterpelago = 'http://www.interpelago.net';
	function setBaseHref() 		 { document.writeln('<base href="'+gWWWPath+'">'); }
	function setBaseHrefSecure() { document.writeln('<base href="'+gWWWPathSecure+'">'); }
	// 	-- title tag
	function setTitle(strTitle)  { document.writeln('<link rel="icon" type="image/vnd.microsoft.icon" href="favicon.ico"><title>'+gstrSchoolNameShort+' - '+strTitle+'</title>'); }
	function setTitleEx(strStart,strTitle)  { setTitle(strStart+' '+strTitle); }
	//	-- other
	function readPersonalEmail() { alert("Webmail has been disabled in this version of the site."); }

//================================
//
//	GLOBAL VARS
//
//================================
	//	onerror=handleErr;
	//	function handleErr(msg,url,l) {
	//		txt="There was an error on this page.\n\n";
	//		txt+="Error: " + msg + "\n";
	//		txt+="URL: " + url + "\n";
	//		txt+="Line: " + l + "\n\n";
	//		txt+="Click OK to continue.\n\n";
	//		alert(txt);
	//		return true;
	//	}
	//	-- time arrays
	var aMonthsShort = new Array("Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec");
	var aMonths = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	var aDays = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
	var aDaysShort = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
	var aDaysInitial = new Array("S", "M", "T", "W", "T", "F", "S");
	var msecOneDay = 86400000;		//WARNING: not exact. don't use in precise date math because of daylight savings days
	var msecOneYear = 31536000000;  //WARNING: not exact. don't use in precise date match because of leap years
	//	-- defaults
	var gDefaultDaysBeforeNoticeExpires = 7;
	var gIsMacIE = checkMacIE();
	var gIsWinIE = checkWinIE();
	var gnScratch = 0;
	// -- site search globals
	var gstrSearchText = GetCookie('SearchText');
	if (!gstrSearchText) { gstrSearchFlags = ''; }
	var gstrSearchFlags	= GetCookie('SearchFlags');
	if (!gstrSearchFlags) { gstrSearchFlags = '1:0:0:0:0:0'; }
	var r = gstrSearchFlags.split(':');
	var gfDoP 	= r[0];
	var gfDoR 	= r[1];
	var gfDoG 	= r[2];
	var gfDoB 	= r[3];
	var gfDoE 	= r[4];
	var gfDoN 	= r[5];
	var gtDate = new Date();
	var gstrEnd 				= jsToMysqlDateTime(gtDate);
	gtDate.setFullYear(gtDate.getFullYear()-2);
	var gstrStart				= jsToMysqlDateTime(gtDate);
	var gfDoArchived 			= false;
	// -- group id context string
	var gstrContextGroups = '';
	// check for kiosk setting cookie
	var gfPublic = !(GetCookie('public') == 'false');
	var gMaxLinks = 50;
	var gMaxDocs = 50;
	var gstrMissingDesc = 'No description.';
	var gstrPeopleIds = '';
	var gfExternal = false;
	var gnPageType = 0;
	var gidPage = 0;
	var gfPDetails = false;
	var gfGDetails = false;
	var gfCDetails = false;
	var gfRDetails = false;
	var gfLDetails = false;
	function resetTimer() {
		var tMs = new Date().getTime();
		var tMsOut = tMs + 300000;		// 5 min;300000;
		if (!gfPublic) {
			tMsOut = tMs + 28800000;	// 8 hrs;28800000;
		}
		SetCookie('sessiontimeout',tMsOut-60000);
		gAutoTimerWarning = setInterval('autologoutwarning()', 5000);
	}
	// called by an interval timer; don't use wndOpenPopUp because it may display a modal "popup blocker" alert.
	function autologoutwarning() {
		var tMs = new Date().getTime();
		var tMsOut = GetCookie('sessiontimeout');
		if (tMs > tMsOut) {
			var wndNew = wndOpenNewDialog('Session_Expiration_Warning',325,175);
			if (wndNew != null) {
				var strURL = gCGIPath + 'dlg_signout_warning.cgi';
				wndNew.location.replace(strURL);
			}
		}
	}

	function hasSession() {
		var cookieval = GetCookie('sessionid'); return (cookieval && (cookieval != -1));
	}
	if (opener && hasSession()) {
		setInterval('checkSession()', 2000);
	}
	function checkSession() {
		if (!hasSession()) { close(); }
	}
	function pubPixDir() {
		return 'public/images';
	}
	function pubDocDir() {
		return 'public/documents';
	}
		
	//
	//	HILIGHTING CODE
	//
	function getBackgroundRGB(o) {
		var strCSSValue = getOStyleValue(o,'backgroundColor');
		// can return
		//		-- rgb(n, n, n)
		//		-- #xxxxxx
		//		-- (color name)
		//		-- transparent
		//		translate all to n:n:n (with -1 for transparent or named color)
		var r = -1;
		var g = -1;
		var b = -1;
		if (strCSSValue.charAt(0) == '#') {
			r = parseInt('0x'+strCSSValue.substring(1,3));
			g = parseInt('0x'+strCSSValue.substring(3,5));
			b = parseInt('0x'+strCSSValue.substring(5,7));
		}
		else if (strCSSValue.substring(0,3) == 'rgb') {
			var rgbComma = strCSSValue.substring(4,strCSSValue.length);
			var argb = rgbComma.split(',');
			r = parseInt(argb[0]);
			g = parseInt(argb[1]);
			b = parseInt(argb[2]);
		}
		var strR = r+':'+g+':'+b;
		return strR;
	}
	function hiliteMenubar(e,o) {
		if (!o.fIsHighlighted) {
			var strRGB = getBackgroundRGB(o);
			argb = strRGB.split(':');
			r = parseInt(argb[0]);
			g = parseInt(argb[1]);
			b = parseInt(argb[2]);
			if (r > 0) {
				o.originalBackgroundColor = strRGB;
				o.fIsHighlighted = true;
				// make lighter
				r = parseInt(r * 105/100);
				g = parseInt(g * 105/100);
				b = parseInt(b * 105/100);
				o.style.backgroundColor = 'rgb('+r+','+g+','+b+')';
			}
		}
	}
	function unhiliteMenubar(e,o) {
		var strRGB = o.originalBackgroundColor;
		if (strRGB) {
			argb = strRGB.split(':');
			r = parseInt(argb[0]);
			g = parseInt(argb[1]);
			b = parseInt(argb[2]);
			if (r > 0) {
				o.style.backgroundColor = 'rgb('+r+','+g+','+b+')';
				o.fIsHighlighted = false;
			}
		}
	}

//================================
//
//	SHOW MAIN WINDOWS and DIALOGS
//
//================================

	// 	MAIN WINDOW
	function redirect(strURL) {
		top.document.location = strURL;
	}
	function refreshPage() {
		location.reload();
	}

	function login() {
		top.document.location = gWWWPathSecure+"signin.html";
	}
	function loginExpired() {
		top.document.location = gWWWPathSecure+"signin.html?expired=1";
	}
	function logout() {
		top.document.location = gCGIPathSecure+"site_logout.cgi";
	}
	function autologout() {
		top.document.location = gCGIPathSecure+"site_logout.cgi?expired=1";
	}
	function gotoLostPassword() {
		top.document.location = gCGIPathSecure+"site_forgotpassword.cgi";
	}
	function gotoEmailAccountInfo() {
		top.document.location = gWWWPathSecure+"email_accountinfo1.html";
	}
	
	function showPIP(idUserPage) {
		top.document.location = gCGIPath+"show_pip.cgi?PIP="+idUserPage;
	}
	function dialogToPIP(id) {
		if (opener) { opener.showPIP(id); }
	}
	function dialogToGIP(id) {
		if (opener) { opener.showGIP(id);	}
	}
	function dialogToLIP(id) {
		if (opener) { opener.showLIP(id);	}
	}
	function dialogToRIP(id) {
		if (opener) { opener.showRIP(id);	}
	}
	function showGIP(idGroup) {
		top.document.location = gCGIPath+"show_gip.cgi?GIP="+idGroup;
	}
	function showRIP(idRIP) {
		if (idRIP == 0) { showIndex(); } else { top.document.location = gCGIPath+"show_page_rip.pl?RIP="+idRIP; }
	}
	function showExternalRIP(idRIP) {
		top.document.location = gCGIPath+"show_page_rip_external.pl?XRIP="+idRIP;
		//top.document.location = gWWWPath+"public/resources/res"+idRIP+"/index.html";
	}
	function showIndex() {
		top.document.location = gCGIPath+"show_home.cgi";		
	}
	function showRIPPage(idRIP,strFile) {
		strFile = escape(strFile);
		top.document.location = gCGIPath+"show_page_rip.pl?RIP="+idRIP+"&PAGE="+strFile;
	}
	function showLIP(idLIP, strDate) {
		var strQPlus = '';
		if (strDate) {
			var aDT = parseMysqlDatetime(strDate);
			var nStartYear 		= aDT[0];
			var nStartMonth 	= aDT[1];
			var nStartDay 		= aDT[2];
			strQPlus = '&DATE='+nStartYear+'-'+nStartMonth+'-'+nStartDay;

		}
		top.document.location = gCGIPath+"show_page_lip.pl?LIP="+idLIP+strQPlus;
	}
	function showPagePix(p,fName,id) {
		var strURL = '';
		if (p == 'PIP') 		{ strURL += 'fetch_person_pix.cgi?ID='+id+'&F='; }
		else if (p == 'GIP') 	{ strURL += 'fetch_group_pix.cgi?ID='+id+'&F='; }
		else if (p == 'RIP') 	{ strURL += 'fetch_rip_pix.cgi?ID='+id+'&F='; }
		else if (p == 'LIP') 	{ strURL += 'fetch_lip_pix.cgi?ID='+id+'&F='; }
		strURL += escape(fName)+'&SIZE=3';
		showWindowCGICustom('',330,330,strURL,1,0,0);
	}
	function getThumbURL(p,fName) {
		var strURL = '';
		if (!fName) { fName = 'default.jpg'; }
		if (gnSiteVersion != 1) {
			strURL += pubPixDir();
			if (p == 'PIP') 		{ strURL += '/people/thumb_'; }
			else if (p == 'GIP') 	{ strURL += '/groups/thumb_'; }
			else if (p == 'RIP') 	{ strURL += '/resources/thumb_'; }
			else if (p == 'LIP') 	{ strURL += '/locations/thumb_'; }
		} else {
			strURL += gCGIPathSecure;
			if (p == 'PIP') 		{ strURL += 'fetch_person_pix.cgi?SIZE=2&F='; }
			else if (p == 'GIP') 	{ strURL += 'fetch_group_pix.cgi?SIZE=2&F='; }
			else if (p == 'RIP') 	{ strURL += 'fetch_rip_pix.cgi?SIZE=2&F='; }
			else if (p == 'LIP') 	{ strURL += 'fetch_lip_pix.cgi?SIZE=2&F='; }
		}
		return strURL+fName;
	}
	function drawTopBanner(strURLBanner,strURLBannerLink) {
		var str = '';
		if (!strURLBanner) { 
			str += '<div id="site_topleft">&nbsp;</div>';
			str += '<div id="site_imagebar">&nbsp;</div>';
		} else {
			if (!strURLBannerLink) {
				str += '<div id="site_topleft" style="background-image:url(&quot;'+pubPixDir()+'/banners/'+strURLBanner+'&quot;);">&nbsp;</div>';
			} else {
				str += '<div id="site_topleft" title="Click to go to '+strURLBannerLink+'..." onclick="showWebsite(\''+escape(strURLBannerLink)+'\',0,0)" style="background-image:url(&quot;'+pubPixDir()+'/banners/'+strURLBanner+'&quot;);cursor:pointer;">&nbsp;</div>';
			}
		}
		str += '<div id="site_schoolname" onclick="showIndex()" title="Click to go to the index page...">&nbsp;</div>';
		document.writeln(str);
	}

	//	DIALOGS
	function dlgDeleteGroupItemInline () {}
	function deleteGroupItemInline(idItem, nType, fpass, idOb) {
		loadjsfile("scripts/dialogs.js");
		loadcssfile("public/styles/style-dlg.css");
		gtInlineForm = setInterval('dlgDeleteGroupItemInline('+idItem+','+nType+',\''+fpass+'\',\''+idOb+'\')', 10);
	}

	// -- People dialogs
	function addPerson() {
		var strCGI = "dlg_person_new.cgi";
		showDialogCGISecure("AddPerson",600,720,strCGI);
	}
	function tellafriend() {
		var strCGI = "dlg_tellafriend.cgi";
		showDialogCGI("TellaFriend",600,520,strCGI);
	}
	function editPersonDisplayname(idPerson) {
		var strCGI = "dlg_person_displayname.cgi?PIP="+idPerson;
		showDialogCGISecure("EditPersonalDisplayName",600,300,strCGI);
	}
	function editPersonsPix(idPerson) {
		var strCGI = "dlg_person_pix.cgi?PIP="+idPerson;
		showDialogCGI("EditPersonsPix",600,330,strCGI);
	}
	function editGroupsPix(idGroup) {
		var strCGI = "dlg_group_pix.cgi?GIP="+idGroup;
		showDialogCGI("EditGroupsPix",600,330,strCGI);
	}
	function editGroupFeeds(idGroup) {
		var strCGI = "dlg_group_feeds.cgi?GIP="+idGroup;
		showDialogCGI("EditGroupFeeds",600,330,strCGI);
	}
	// RIP=0; GIP=1; PIP=2; LIP=3;
	function showReference(idRef) {
		var strCGI = "show_reference.cgi?ID="+idRef;
		showWindowCGICustom("Reference"+idRef,600,500,strCGI,2,0,0);
	}
	function findReference(idPage, pageType) {
		var strCGI = "dlg_find_reference1.cgi?PAGEID="+idPage+"&PAGETYPE="+pageType;
		showDialogCGI("FindResource",600,300,strCGI);
	}
	function addReference(idPage, pageType) {
		var strCGI = "dlg_reference_new.cgi?PAGEID="+idPage+"&PAGETYPE="+pageType;
		showDialogCGI("AddResource",600,680,strCGI);
	}
	function dlgAddReferenceInline () {}
	function addReferenceInline(idPage, pageType, idOb) {
		loadjsfile("scripts/dialogs.js");
		loadjsfile("scripts/filetypes.js");
		loadcssfile("public/styles/style-dlg.css");
		gtInlineForm = setInterval('dlgAddReferenceInline('+idPage+','+pageType+',\''+idOb+'\')', 10);
	}
	function deleteReference(idRef, idPage, pageType) {
		var strCGI = "dlg_reference_delete.cgi?ID="+idRef+"&PAGEID="+idPage+"&PAGETYPE="+pageType;
		showDialogCGI("DeleteReference",600,200,strCGI);
	}
	function restoreReference(idRef, idPage, pageType) {
		var strCGI = "dlg_reference_delete.cgi?ID="+idRef+"&PAGEID="+idPage+"&PAGETYPE="+pageType+"&RESTORE=1";
		showDialogCGI("RestoreReference",600,200,strCGI);
	}
	function editReference(idRef, idPage, pageType) {
		var strCGI = "dlg_reference_edit.cgi?ID="+idRef+"&PAGEID="+idPage+"&PAGETYPE="+pageType;
		showDialogCGI("EditReference",600,680,strCGI);
	}
	function autoUpdateReferences(idPage,pageType) {
		top.document.location = gCGIPath+"submit_page_autoupdate.cgi?PAGEID="+idPage+"&PAGETYPE="+pageType;
	}
	function removeReferences(idPage,pageType) {
		var strCGI = "dlg_references_remove.cgi?PAGEID="+idPage+"&PAGETYPE="+pageType;
		showDialogCGI("RemoveReferences",600,400,strCGI);
	}
	function restoreReferences(idPage,pageType) {
		var strCGI = "dlg_references_restore.cgi?PAGEID="+idPage+"&PAGETYPE="+pageType;
		showDialogCGI("restoreReferences",600,200,strCGI);
	}
	function changeReferenceOrder(idPage, pageType) {
		var strCGI = "dlg_reference_order.cgi?PAGEID="+idPage+"&PAGETYPE="+pageType;
		showDialogCGI("ChangeReferenceOrder",600,540,strCGI);
	}
	function changeReferenceState(idPage, pageType) {
		var strCGI = "dlg_reference_state.cgi?PAGEID="+idPage+"&PAGETYPE="+pageType;
		showDialogCGI("ChangeReferenceState",600,540,strCGI);
	}
	function editPersonPassword(idPerson) {
		var strCGI = "dlg_person_password.cgi?IDPERSON="+idPerson;
		showDialogCGISecure("EditPersonalPassword",600,480,strCGI);
	}
	function resetPersonPassword(idPerson) {
		var strCGI = "dlg_person_resetpassword.cgi?PIP="+idPerson;
		showDialogCGISecure("ResetPassword",600,480,strCGI);
	}
	function sendPersonAccountInfo(idPerson) {
		var strCGI = "dlg_send_account_info.cgi?IDPERSON="+idPerson;
		showDialogCGISecure("SendAccountInfo",600,480,strCGI);
	}
	function archivePerson(idPerson) {
		var strCGI = "dlg_person_archive.cgi?IDPERSON="+idPerson;
		showDialogCGISecure("ArchivePerson",600,500,strCGI);
	}
	function publishPersonCalendar(idPerson) {
		var strCGI = "dlg_publish_calendar.cgi?PIP="+idPerson;
		showDialogCGI("PublishPersonCalendar",600,330,strCGI);
	}
	function publishGroupCalendar(idGroup) {
		var strCGI = "dlg_publish_calendar.cgi?GIP="+(idGroup);
		showDialogCGI("PublishGroupCalendar",600,330,strCGI);
	}
	function suppressMyGroups(idPerson) {
		var strCGI = "dlg_mygroups_suppress.cgi?PIP="+idPerson;
		showDialogCGI("SupressMyGroups",600,330,strCGI);
	}
	function delMyPeopleList(idPerson) {
		var strCGI = "dlg_mypeople_del.cgi?PIP="+idPerson;
		showDialogCGI("RemoveMyPeople",600,330,strCGI);
	}
	function addMyPeopleList(idPerson) {
		var strCGI = "dlg_mypeople_add.cgi?PIP="+idPerson;
		showDialogCGI("AddMyPeople",600,270,strCGI);
	}
	function editPersonInfo(idPerson) {
		var strCGI = "dlg_personinfo_edit.cgi?PIP="+idPerson;
		showDialogCGISecure("EditPersonInfo",600,500,strCGI);
	}
	function editPersonReminder(idPerson) {
		var strCGI = "dlg_person_reminder.cgi?PIP="+idPerson;
		showDialogCGISecure("EditPersonReminder",600,400,strCGI);
	}
	function editEmployeeContactInfo(idPerson) {
		var strCGI = "dlg_employee_edit_contact.cgi?PIP="+idPerson;
		showDialogCGISecure("EditEmployeeContactInfo",600,400,strCGI);
	}
	function editParentContactInfo(idPerson) {
		var strCGI = "dlg_parent_edit_contact.cgi?PIP="+idPerson;
		showDialogCGISecure("EditParentContactInfo",600,540,strCGI);
	}
	function viewPersonInfo(idPerson) {
		var strCGI = "dlg_personinfo_view.cgi?PIP="+idPerson;
		showDialogCGISecure("ViewPersonInfo",600,300,strCGI);
	}
	function viewEmployeeContactInfo(idPerson) {
		var strCGI = "dlg_employee_view_contact.cgi?PIP="+idPerson;
		showDialogCGISecure("ViewEmployeeContactInfo",600,400,strCGI);
	}
	function viewParentContactInfo(idPerson) {
		var strCGI = "dlg_parent_view_contact.cgi?PIP="+idPerson;
		showDialogCGISecure("ViewParentContactInfo",600,540,strCGI);
	}
	function viewPersonEMail(idPerson) {
		var strCGI = "dlg_person_email.cgi?PIP="+idPerson;
		showDialogCGISecure("ViewPersonEMail",600,500,strCGI);
	}
	function findPerson() {
		var strCGI = "dlg_find_person1.cgi";
		showDialogCGI("FindPerson",600,310,strCGI);
	}
	function findPersonPowerbar(searchtext) {
		var strCGI = "dlg_find_person2.cgi?SEARCHTEXT="+escape(searchtext);
		showDialogCGI("FindPerson",600,270,strCGI);
	}
	//
	function addPersonIdentity(idPerson) {
		var strCGI = "dlg_person_newidentity.cgi?PIP="+idPerson;
		showDialogCGISecure("AddNewIdentity",600,500,strCGI);
	}
	function switchPersonRole(idPersonNew, fHome) {
		top.document.location = gCGIPath+"submit_person_switchrole.cgi?NR="+idPersonNew+'&FHOME='+fHome+'&URL='+top.document.location;
	}
	function setDefaultPersonRole(idPersonDefault) {
		top.document.location = gCGIPath+"submit_person_defaultrole.cgi?DR="+idPersonDefault;
	}
	function adminEditPerson(idPerson) {
		var strCGI = "dlg_person_adminedit.cgi?PIP="+idPerson;
		showDialogCGISecure("AdminEditPerson",600,480,strCGI);
	}
	function editPartnershipDescription(idPerson) {
		var strCGI = "dlg_partnership_description.cgi?PIP="+idPerson;
		showDialogCGISecure("EditPartnershipDescription",600,300,strCGI);
	}

	// -- Group dialogs
	function addGroup(idRes,idGroup) {
		var strCGI = "dlg_group_new.cgi?RIP="+idRes+"&IDCOPY="+idGroup;
		showDialogCGI("NewGroup",600,620,strCGI);
	}
	function editGroupDisplayname(idGroup) {
		var strCGI = "dlg_group_displayname.cgi?GIP="+idGroup;
		showDialogCGISecure("EditGroupDisplayName",600,300,strCGI);
	}
	function editGroupInfo(idGroup) {
		var strCGI = "dlg_groupinfo.cgi?GIP="+idGroup+"&TYPE=3";
		showDialogCGI("EditGroupInfo",600,620,strCGI);
	}
	function importGroupInfo(idGroup) {
		var strCGI = "dlg_groupinfo_import.cgi?GIP="+idGroup+"&TYPE=3";
		showDialogCGI("ImportGroupInfo",600,420,strCGI);
	}
	function editGroupContacts(idGroup) {
		var strCGI = "dlg_group_contacts.cgi?GIP="+idGroup;
		showDialogCGI("EditGroupContacts",600,420,strCGI);
	}
	function GroupSubscribe(idGroup) {
		var strCGI = "dlg_group_subscribe.cgi?GIP="+idGroup+"&METHOD=1";
		showDialogCGI("SubscribeToGroup",600,300,strCGI);
	}
	function GroupUnsubscribe(idGroup) {
		var strCGI = "dlg_group_subscribe.cgi?GIP="+idGroup+"&METHOD=0";
		showDialogCGI("UnsubscribeToGroup",600,300,strCGI);
	}
	function GroupUninvite(idGroup) {
		var strCGI = "dlg_group_uninvite.cgi?GIP="+idGroup;
		showDialogCGI("Uninvite",600,300,strCGI);
	}
	function findGroup() {
		var strCGI = "dlg_find_group1.cgi";
		showDialogCGI("FindGroup",600,300,strCGI);
	}
	function findGroupPowerbar(searchtext) {
		var strCGI = "dlg_find_group2.cgi?SEARCHTEXT="+escape(searchtext);
		showDialogCGI("FindGroup",600,300,strCGI);
	}
	function archiveGroup(idGroup) {
		var strCGI = "dlg_group_archive.cgi?GIP="+idGroup;
		showDialogCGISecure("ArchiveGroup",600,400,strCGI);
	}
	function unarchiveGroup(idGroup) {
		var strCGI = "dlg_group_unarchive.cgi?GIP="+idGroup;
		showDialogCGI("UnarchiveGroup",600,400,strCGI);
	}
	function assignGroupMembers(idGroup) {
		var strCGI = "dlg_group_assignmembers.cgi?GIP="+idGroup;
		showDialogCGI("AssignGroupMembers",600,400,strCGI);
	}
	function unassignGroupMembers(idGroup) {
		var strCGI = "dlg_group_unassignmembers.cgi?GIP="+idGroup;
		showDialogCGI("UnAssignGroupMembers",600,600,strCGI);
	}
	function copyMembersFromOtherGroup(idGroup) {
		var strCGI = "dlg_group_copymembers1.cgi?GIP="+idGroup;
		showDialogCGI("CopyAssignedMembers",600,370,strCGI);
	}
	function inviteGroupMembers(idGroup) {
		var strCGI = "dlg_group_invitemembers.cgi?GIP="+idGroup;
		showDialogCGI("InviteMembers",600,370,strCGI);
	}
	function invitePeople(idGroup) {
		var strCGI = "dlg_group_invitepeople.cgi?GIP="+idGroup;
		showDialogCGI("InvitePeople",600,400,strCGI);
	}
	function groupInviteAccept(idGroup, idFrom, fAccept) {
		var strCGI = "submit_group_inviteaccept.cgi?GIP="+idGroup+"&INV="+idFrom+"&ACCEPT="+fAccept;
		showInProgressDialogCGI("AcceptInvitation",600,300,strCGI);
	}
	function showSubscribableGroups() {
		var strCGI = "dlg_list_groups_subscribable.cgi";
		showDialogCGI("SubscribableGroups",600,400,strCGI);
	}
	function showMyArchivedGroups() {
		var strCGI = "dlg_list_groups_myarchived.cgi";
		showDialogCGI("MyArchivedGroups",600,400,strCGI);
	}
	// -- Personal Message dialogs
	function showPersonalMessages(fSent) {
		var strCGI = "show_personmsgs.cgi?BOX="+fSent;
		showDialogCGI("PersonalMessages",800,500,strCGI);
	}
	function addPersonMessage(idPersonList, strSubject) {		// idPersonList format: id:id:id:id
		var strCGI = "dlg_personmsg_new.cgi?TO="+idPersonList+'&ALSOTO='+gstrPeopleIds+'&SENDEMAIL=1';
		if (strSubject) {
			strCGI += "&SUBJECT="+strSubject;
		}
		showDialogCGISecure("NewPersonalMessage",600,500,strCGI);
	}
	
	// -- Anything
	function addAnything(idGroup) {
		var strCGI = "dlg_groupitem_new.cgi?GIP="+idGroup+"&TYPE=0&DATA=NONE&IDCOPY=0";
		showDialogCGI("NewAnything",600,380,strCGI);
	}

	// -- Bulletin dialogs
	function addBulletin(idGroup) {
		var strCGI = "dlg_groupitem_new.cgi?GIP="+idGroup+"&TYPE=1&DATA=NONE&IDCOPY=0";
		showDialogCGI("NewBulletin",600,680,strCGI);
	}
	function dlgAddBulletinInline() {}
	function addBulletinInline(idGroup, idOb) {
		loadjsfile("scripts/dialogs.js");
		loadjsfile("scripts/filetypes.js");
		loadcssfile("public/styles/style-dlg.css");
		gtInlineForm = setInterval('dlgAddBulletinInline('+idGroup+',\''+idOb+'\')', 10);
	}
	function copyBulletin(idGroup,idBulletin) {
		var strCGI = "dlg_groupitem_new.cgi?GIP="+idGroup+"&TYPE=1&DATA=NONE&IDCOPY="+idBulletin;
		showDialogCGI("NewBulletin",600,680,strCGI);
	}
	function editBulletin(idGroup,idBulletin) {
		var strCGI = "dlg_groupitem_edit.cgi?GIP="+idGroup+"&TYPE=1&RID="+idBulletin;
		showDialogCGI("EditBulletin",600,680,strCGI);
	}
	function deleteBulletin(id,strTitle) {
		var strCGI = "dlg_groupitem_del.cgi?ITEMID="+id+"&TYPE=1";
		showDialogCGI("DeleteBulletin",600,200,strCGI);
	}
	function deleteBulletinInline(id,fpass,idOB) {
		deleteGroupItemInline(id,1,fpass,idOB);
	}
	function restoreBulletin(id,strTitle) {
		var strCGI = "dlg_groupitem_del.cgi?ITEMID="+id+"&TYPE=1&RESTORE=1";
		showDialogCGI("DeleteBulletin",600,200,strCGI);
	}
	function featureBulletin(id, idGroup, nMode) {
		top.document.location = gCGIPath+"submit_bulletin_featured.cgi?ID="+id+"&GROUP="+idGroup+"&MODE="+nMode;
	}
	function showBulletin(idShow) {
		var strCGI = "show_bulletin.cgi?ID="+idShow;
		showWindowCGICustom("Bulletin"+idShow,600,500,strCGI,2,0,0);
	}
	
	//	-- Event Dialogs
	function showEvent(idEvent) {
		var strCGI = "show_event.cgi?ID="+idEvent;
		showWindowCGICustom("Event"+idEvent,600,500,strCGI,2,0,0);
	}
	function getAddEventData(nDay, nMonth, nYear, idLoc, nHour, nMin) {
		if (nDay == 0) {
			var t = getNow();		
			nDay 	= t.getDate();
			nMonth 	= t.getMonth()+1;
			nYear 	= timeGetYear(t);
			nHour 	= t.getHours();
			nMin 	= t.getMinutes()+(15-(t.getMinutes()%15));
		}
		return nDay + ":"+ nMonth + ":"+ nYear + ":" + idLoc + ":" + nHour + ":" + nMin;
	}
	function addEvent(nDay, nMonth, nYear, idGroup, idLoc, nHour, nMin) {
		var strData = getAddEventData(nDay, nMonth, nYear, idLoc, nHour, nMin);
		var strCGI = "dlg_groupitem_new.cgi?GIP="+idGroup+"&TYPE=2&DATA="+strData+"&IDCOPY=0";
		showDialogCGI("NewEvent",600,680,strCGI);
	}
	function dlgAddEventInline () {}
	function addEventInline(nDay, nMonth, nYear, idGroup, idLoc, nHour, nMin, idOb, fShowDate) {
		loadjsfile("scripts/dialogs.js");
		loadcssfile("public/styles/style-dlg.css");
		loadcssfile("public/styles/style-days.css");
		gtInlineForm = setInterval('dlgAddEventInline('+nDay+','+nMonth+','+nYear+','+idGroup+','+idLoc+','+nHour+','+nMin+',\''+idOb+'\','+fShowDate+')', 10);
	}
	function copyEvent(idGroup,idCopy) {
		var strData = getAddEventData(0, 0, 0, 0, 0, 0);
		var strCGI = "dlg_groupitem_new.cgi?GIP="+idGroup+"&TYPE=2&DATA="+strData+"&IDCOPY="+idCopy;
		showDialogCGI("NewEvent",600,680,strCGI);
	}
	function noaddEvent(nDay, nMonth, nYear, idGroup, idLoc, nHour, nMin) {
		alert('You must be an editor to post to the group calendar.');
	}
	function deleteEvent(id,strTitle) {
		var strCGI = "dlg_groupitem_del.cgi?ITEMID="+id+"&TYPE=2";
		showDialogCGI("DeleteEvent",600,200,strCGI);
	}
	function deleteEventInline(id,fpass,idOB) {
		deleteGroupItemInline(id,2,fpass,idOB);
	}
	function restoreEvent(id,strTitle) {
		var strCGI = "dlg_groupitem_del.cgi?ITEMID="+id+"&TYPE=2&RESTORE=1";
		showDialogCGI("DeleteEvent",600,200,strCGI);
	}
	function editEvent(idGroup,idEvent) {
		var strCGI = "dlg_groupitem_edit.cgi?GIP="+idGroup+"&TYPE=2&RID="+idEvent;
		showDialogCGI("EditEvent",600,650,strCGI);
	}
	function bulkDistributeEvents(idGroup) {
		var strCGI = "dlg_events_bulkdistribute.cgi?GIP="+idGroup;
		showDialogCGI("BulkDistributeEvents",600,600,strCGI);
	}	
	function importEvents(idGroup) {
		var strCGI = "dlg_event_import.cgi?GIP="+idGroup;
		showDialogCGI("ImportEvents",600,300,strCGI);
	}	
	function viewPIPCalendarReport(idPerson, nView) {
		var strCGI = "show_calendar.cgi?PIP="+idPerson+"&VIEW="+nView+"&CREATETITLE=1";
		showWindowCGICustom("CalendarReport",950,600,strCGI,3,0,0);
	}
	function viewGIPCalendarReport(idGroup,fNextMonth) {
		var strCGI = "show_calendar.cgi?GIP="+idGroup+"&CREATETITLE=1&NEXTMONTH="+fNextMonth;
		showWindowCGICustom("CalendarReport",950,600,strCGI,3,0,0);
	}
	function viewLIPCalendarReport(idLoc) {
		var strCGI = "show_calendar.cgi?LIP="+idLoc+"&CREATETITLE=1";
		showWindowCGICustom("CalendarReport",950,600,strCGI,3,0,0);
	}
	function viewCustomCalendarReport(strTitle,strGIPList,idPIP) {
		var aG = strGIPList.split(':');
		var strQ = "TITLE="+escape(strTitle);
		strQ += '&PIP='+idPIP;
		for (var i = 0; i < aG.length; i++) {
			var idG = aG[i];
			if (idG > 0) {
				strQ += '&GIP='+idG;
			}
		}
		var strCGI = "show_calendar.cgi?"+strQ;
		showWindowCGICustom("CalendarReport",950,600,strCGI,3,0,0);
	}
	function viewRIPCalendarReport(idResource) {
		var strCGI = "show_calendar.cgi?RIP="+idResource+"&CREATETITLE=1";
		showWindowCGICustom("CalendarReport",950,600,strCGI,3,0,0);
	}
	
	//	-- Directory window
	function viewGIPPersonDirectory(idGroup) {
		var strCGI = "show_person_directory.cgi?GIP="+idGroup+"&CREATETITLE=1";
		showWindowCGICustom("PersonDirectory",857,800,strCGI,3,0,0);
	}
	function viewMultiGIPPersonDirectory(strGIPList) {
		var aG = strGIPList.split(':');
		var strQ = '';
		for (var i = 0; i < aG.length; i++) {
			var idG = aG[i];
			if (idG > 0) {
				strQ += '&GIP='+idG;
			}
		}
		var strCGI = "show_person_directory.cgi?"+strQ+"&CREATETITLE=1";
		showWindowCGICustom("PersonDirectory",857,800,strCGI,3,0,0);
	}
	function viewPIPPersonDirectory(idP) {
		var strCGI = "show_person_directory.cgi?PIP="+idP+"&CREATETITLE=1";
		showWindowCGICustom("PersonDirectory",857,800,strCGI,3,0,0);
	}
	function viewRIPPersonDirectory(idR) {
		var strCGI = "show_person_directory.cgi?RIP="+idR+"&CREATETITLE=1";
		showWindowCGICustom("PersonDirectory",857,800,strCGI,3,0,0);
	}
	// nType = 1:bulletin, 2:event, 3: notice
	function dlgGroupItemDistribution(nType,id) {
		var strCGI = "dlg_groupitem_distribution.cgi?TYPE="+nType+"&ID="+id;
		showDialogCGI("GroupItemDistribution",600,300,strCGI);
	}
	//	-- Notice dialogs
	function showNotice(idNotice) {
		var strCGI = "show_notice.cgi?ID="+idNotice;
		showWindowCGICustom("Notice"+idNotice,600,500,strCGI,2,0,0);
	}
	function addGroupMessage(idGroup) {
		var strCGI = "dlg_groupitem_new.cgi?GIP="+idGroup+"&TYPE=3&IDCOPY=0";
		showDialogCGI("NewGroupMessage",600,560,strCGI);
	}
	function dlgAddGroupMessageInline () {}
	function addGroupMessageInline(idGroup, idOb) {
		loadjsfile("scripts/dialogs.js");
		loadcssfile("public/styles/style-dlg.css");
		gtInlineForm = setInterval('dlgAddGroupMessageInline('+idGroup+',\''+idOb+'\')', 10);
	}
	function copyGroupMessage(idGroup, idNotice) {
		var strCGI = "dlg_groupitem_new.cgi?GIP="+idGroup+"&TYPE=3&IDCOPY="+idNotice;
		showDialogCGI("NewGroupMessage",600,560,strCGI);
	}
	function editGroupMessage(idGroup,idNotice) {
		var strCGI = "dlg_groupitem_edit.cgi?GIP="+idGroup+"&TYPE=3&RID="+idNotice;
		showDialogCGI("EditNotice",600,600,strCGI);
	}
	function deleteGroupMessage(id) {
		var strCGI = "dlg_groupitem_del.cgi?ITEMID="+id+"&TYPE=3";
		showDialogCGI("DeleteNotice",600,200,strCGI);
	}
	function deleteGroupMessageInline(id,fpass,idOB) {
		deleteGroupItemInline(id,3,fpass,idOB);
	}
	function restoreGroupMessage(id) {
		var strCGI = "dlg_groupitem_del.cgi?ITEMID="+id+"&TYPE=3&RESTORE=1";
		showDialogCGI("DeleteNotice",600,200,strCGI);
	}
	function showSurvey(id) {
		var strCGI = "dlg_survey.cgi?ITEMID="+id;
		showDialogCGI("Survey",600,400,strCGI);
	}
	function showPageTour(nType) {
		var strPagePath = top.document.location;
		var strTourPath = gCGIPath+'show_tour.cgi?PAGETYPE='+nType;
		var strCGIPath = gCGIPath+'show_tour_frameset.cgi?PAGETYPE='+nType+'&PAGEURL='+strPagePath+'&TOURURL='+strTourPath;
		top.location.replace(strCGIPath);
	}
	function showLicense() {
		wndOpenPopUp('Terms of Use',gWWWPath+'terms_of_use.html',600,500);
	}
	//	-- Help dialogs
	function sendFeedback() {
		wndOpenPopUp('Feedback',gWWWPath+'dlg_feedback.html',600,500);
	}
	function setPersonBanners() {
		var strCGI = "dlg_banners.cgi";
		showDialogCGI("SetPersonBanners",600,480,strCGI);
	}
	function setColorPalette() {
		var strCGI = "dlg_site_palette.cgi";
		showDialogCGI("SetColorPalette",600,480,strCGI);
	}
	function setFontSet() {
		var strCGI = "dlg_fontset.cgi";
		showDialogCGI("SetFontSet",600,480,strCGI);
	}
	function setFileTypes() {
		var strCGI = "dlg_filetypes.cgi";
		showDialogCGI("SetFileTypes",600,480,strCGI);
	}
	//	-- admin command dialogs
	function adminCommand(iCmd, idPage) {
		var urlCGI = '';
		var strDoIt = '';
		if 		(iCmd == 1) { editGroupContacts(idPage); }
		else if (iCmd == 2) { assignGroupMembers(idPage); }
		else if (iCmd == 3) { unassignGroupMembers(idPage); }
		else if (iCmd == 4) { copyMembersFromOtherGroup(idPage); }
		else if (iCmd == 5) { urlCGI = gCGIPath+"dlg_group_rolemembers.cgi?GIP="+idPage; }
		else if (iCmd == 6) { urlCGI = gCGIPath+"admin_update_linkedmembers.cgi"; 
								  strDoIt = "This command updates every group's membership list to include the latest list of people linked by type. Do you want to continue?";}
		else if (iCmd == 7) { adminEditPerson(idPage); }
		else if (iCmd == 8) { resetPersonPassword(idPage); }
		else if (iCmd == 9) { archivePerson(idPage); }
		else if (iCmd == 10) { addPersonIdentity(idPage); }
		else if (iCmd == 11) { urlCGI = gCGIPath+"admin_accountid_new.cgi?ID="+idPage; 
								  strDoIt = "CAUTION: This command will erase this person's account number and generate a new one for them. It will *NOT* be possible to retreive the old account number. You will need to inform this person of their new account number. Do you want to continue?";}
		else if (iCmd == 12) { addPerson(); }
		else if (iCmd == 13) { urlCGI = gCGIPath+"admin_peoplepix_cleanup.cgi"; 
								  strDoIt = "If you have uploaded people's pictures to the correct directory, this command makes them appear on the site. It first finds all people who don't have a photo set in the database. For each, it tries to find a matching file in the people picture directory to use. Do you want to continue?";}
		else if (iCmd == 14) { urlCGI = gCGIPath+"admin_peoplepix_thumbnails.cgi"; 
								  strDoIt = "This command creates a thumbnail version of each active person's photo if one doesn't already exist. Do you want to continue?";}
		else if (iCmd == 15) { urlCGI = gCGIPath+"admin_initialize_and_list_people.cgi"; 
								  strDoIt = "This command archives everyone who has graduated and removes their names from membership and contact lists. It then creates a new account number and password for every person who doesn't have one. These people are then active on the site. Finally it displays a tabulated list all active people. Do you want to continue?";}
		else if (iCmd == 16) { urlCGI = gCGIPath+"admin_set_and_forward_email.cgi"; 
								  strDoIt = "This command creates site-specific email addresses for all eligable people who don't have one. It then sets email forwarding for this address. Do you want to continue?";}
		else if (iCmd == 17) { urlCGI = gCGIPath+"admin_report_signin.cgi?SORT=0&ORD=1"; }
		else if (iCmd == 18) { urlCGI = gCGIPath+"admin_report_contactinfo.cgi"; }
		else if (iCmd == 19) { urlCGI = gCGIPath+"admin_report_contact_changelog.cgi"; }
		else if (iCmd == 20) { urlCGI = gCGIPath+"admin_report_people.cgi"; }
		else if (iCmd == 21) { urlCGI = gCGIPath+"admin_report_groups.cgi"; }
		else if (iCmd == 22) { urlCGI = gCGIPath+"admin_report_locations.cgi"; }
		else if (iCmd == 23) { SetCookie('writeLog',0); alert('Logging stopped.'); }
		else if (iCmd == 24) { SetCookie('writeLog',1); alert('Logging started.'); }
		else if (iCmd == 25) { urlCGI = gCGIPath+"admin_log_show.cgi"; }
		else if (iCmd == 26) { top.document.location = gCGIPath+"admin_log_clear.cgi"; alert("Log file cleared.");}
		else if (iCmd == 27) { urlCGI = gCGIPath+"dlg_person_adminlevel.cgi?ID="+idPage; }
		else if (iCmd == 28) { urlCGI = gCGIPath+"dlg_myrelations_add2.cgi?PIP="+idPage; }
		else if (iCmd == 29) { sendPersonAccountInfo(idPage); }
		else if (iCmd == 30) { urlCGI = gCGIPath+"admin_grouppix_thumbnails.cgi"; 
								  strDoIt = "This command creates a thumbnail version of each active group's photo if one doesn't already exist. Do you want to continue?";}
		else if (iCmd == 31) { urlCGI = gCGIPath+"admin_bulletinpix_thumbnails.cgi"; 
								  strDoIt = "This command creates a thumbnail version of each bulletin art photo if one doesn't already exist. Do you want to continue?";}
		else if (iCmd == 32) { urlCGI = gCGIPath+"dlg_resource_new.cgi"; }
		else if (iCmd == 33) { urlCGI = gCGIPath+"dlg_location_new.cgi"; }
		else if (iCmd == 34) { addGroup(idPage,0); }
		else if (iCmd == 35) { urlCGI = gCGIPath+"admin_locationpix_thumbnails.cgi"; 
								  strDoIt = "This command creates a thumbnail version of each location's photo if one doesn't already exist. Do you want to continue?";}
		else if (iCmd == 36) { urlCGI = gCGIPath+"admin_resourcepix_thumbnails.cgi"; 
								  strDoIt = "This command creates a thumbnail version of each resource's photo if one doesn't already exist. Do you want to continue?";}
		else if (iCmd == 37) { setPersonBanners(); }
		else if (iCmd == 38) { setColorPalette(); }
		else if (iCmd == 39) { setFileTypes(); }
		else if (iCmd == 40) { setFontSet(); }
		else if (iCmd == 41) { urlCGI = gCGIPath+"admin_flush_datastore.cgi"; 
								  strDoIt = "This command will permanently remove all deleted records and any data associated with them, including pictures and file attachments. Do you want to continue?";}
		else if (iCmd == 42) { editPersonsPix(idPage); }
		else if (iCmd == 43) { editParentContactInfo(idPage); }
		else if (iCmd == 44) { editEmployeeContactInfo(idPage); }
		else if (iCmd == 45) { editPartnershipDescription(idPage); }
		else if (iCmd == 46) { urlCGI = gCGIPath+"admin_report_admintools.cgi"; }
		else if (iCmd == 47) { urlCGI = gCGIPath+"dlg_site_pix.cgi"; }
		else if (iCmd == 48) { urlCGI = gCGIPath+"dlg_site_globals.cgi"; }
		else if (iCmd == 49) { urlCGI = gCGIPath+"dlg_site_banners.cgi"; }
		else if (iCmd == 50) { urlCGI = gCGIPath+"dlg_site_logo.cgi"; }
		else if (iCmd == 51) { urlCGI = gCGIPath+"dlg_site_people.cgi"; }
		else if (iCmd == 52) { importEvents(idPage); }
		else if (iCmd == 53) { urlCGI = gCGIPath+"dlg_role_adminlevel.cgi?ID="+idPage; }
		else if (iCmd == 54) { urlCGI = gCGIPath+"dlg_site_calendar.cgi"; }
		else if (iCmd == 55) { urlCGI = gCGIPath+"dlg_location_status.cgi"; }
		else if (iCmd == 56) { urlCGI = gCGIPath+"dlg_resource_status.cgi"; }
		else if (iCmd == 57) { urlCGI = gCGIPath+"dlg_site_reminders.cgi"; }
		else if (iCmd == 58) { urlCGI = gCGIPath+"dlg_site_timecodes.cgi"; }
		else if (iCmd == 59) { urlCGI = gCGIPath+"dlg_page_types.cgi"; }
		else if (iCmd == 60) { alert("People assigned this command can post and edit information on any page they can visit."); }
		else if (iCmd == 61) { urlCGI = gCGIPath+"dlg_site_daycodes.cgi"; }
		else if (iCmd == 62) { urlCGI = gCGIPath+"dlg_person_roles.cgi"; }
		else if (iCmd == 63) { urlCGI = gCGIPathSecure+"dlg_site_construction.cgi"; }
		else if (iCmd == 64) { urlCGI = gCGIPath+"dlg_mystudents_add2.cgi?PIP="+idPage; }
		else if (iCmd == 65) { urlCGI = gCGIPath+"dlg_group_relationmembers.cgi?GIP="+idPage; }
		else if (iCmd == 66) { urlCGI = gCGIPath+"dlg_site_families.cgi"; }
		else if (iCmd == 67) { urlCGI = gCGIPath+"dlg_group_relationgroupmembers.cgi?GIP="+idPage; }
		else if (iCmd == 68) { urlCGI = gCGIPath+"dlg_sponsorships.cgi"; }
		else if (iCmd == 69) { urlCGI = gCGIPath+"dlg_backup_new.cgi"; }
		else if (iCmd == 70) { urlCGI = gCGIPath+"dlg_backup_restore.cgi"; }
		else if (iCmd == 71) { urlCGI = gCGIPath+"dlg_site_update.cgi"; }
		else if (iCmd == 72) { urlCGI = gCGIPath+"admin_report_resources.cgi"; }
		else if (iCmd == 73) { urlCGI = gCGIPath+"admin_referencepix_thumbnails.cgi"; 
								  strDoIt = "This command creates a thumbnail version of each resource art photo if one doesn't already exist. Do you want to continue?";}
		else if (iCmd == 74) { urlCGI = gCGIPath+"dlg_site_periodictasks.cgi"; }
		else if (iCmd == 75) { urlCGI = gCGIPath+"dlg_site_ferpa.cgi"; }
		else if (iCmd == 76) { urlCGI = gCGIPath+"dlg_site_xpages.cgi"; }
		else if (iCmd == 77) { urlCGI = gCGIPath+"dlg_site_graphics.cgi"; }
		else if (iCmd == 78) { viewPageDefault(0); }
		else if (iCmd == 79) { viewPageDefault(1); }
		else if (iCmd == 80) { viewPageDefault(2); }
		else if (iCmd == 81) { viewPageDefault(3); }
		else if (iCmd == 82) { urlCGI = gCGIPath+"dlg_site_new.cgi";
								  strDoIt = "This command creates a new Interpelago website, erasing all information in the current database and server. Do you want to continue?";}
		else if (iCmd == 83) { urlCGI = gCGIPath+"admin_report_people.cgi?GIP="+idPage; }
		else if (iCmd == 84) { urlCGI = gCGIPath+"admin_report_groups.cgi?PIP="+idPage; }
		else if (iCmd == 85) { urlCGI = gCGIPath+"admin_report_resources.cgi?PIP="+idPage; }
		else if (iCmd == 86) { urlCGI = gCGIPath+"admin_report_locations.cgi?PIP="+idPage; }
		else if (iCmd == 87) { editGroupInfo(idPage); }
		else if (iCmd == 88) { editGroupsPix(idPage); }
		else if (iCmd == 89) { editResourceDescription(idPage); }
		else if (iCmd == 90) { editResourcePix(idPage); }
		else if (iCmd == 91) { editLocationDescription(idPage); }
		else if (iCmd == 92) { editLocationPix(idPage); }
		else if (iCmd == 93) { urlCGI = gCGIPath+"admin_report_people.cgi?RIP="+idPage; }
		else if (iCmd == 94) { urlCGI = gCGIPath+"admin_report_people.cgi?LIP="+idPage; }
		else if (iCmd == 95) { urlCGI = gCGIPath+"admin_report_groups.cgi?RIP="+idPage; }
		else if (iCmd == 96) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=0"; }
		else if (iCmd == 97) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=1"; }
		else if (iCmd == 98) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=2"; }
		else if (iCmd == 99) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=3"; }
		else if (iCmd == 100) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=4"; }
		else if (iCmd == 101) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=1&PIP="+idPage; }
		else if (iCmd == 102) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=2&PIP="+idPage; }
		else if (iCmd == 103) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=3&PIP="+idPage; }
		else if (iCmd == 104) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=4&PIP="+idPage; }
		else if (iCmd == 105) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=1&RIP="+idPage; }
		else if (iCmd == 106) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=2&RIP="+idPage; }
		else if (iCmd == 107) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=3&RIP="+idPage; }
		else if (iCmd == 108) { urlCGI = gCGIPath+"admin_report_assignments.cgi?FILTER=4&RIP="+idPage; }


		// if a cgi command then call it now
		if (urlCGI) {
			var fDoIt = true;
			if (strDoIt) {
				fDoIt = confirm(strDoIt);
			}
			if (fDoIt) {
				var nWidth = 600;
				if (urlCGI.indexOf('_report_') != -1) {
					nWidth = 800;
				}
				var wndNew = wndOpenNewWindow("SiteAdminTool"+iCmd,nWidth,500);
				if (wndNew != null) {
					wndNew.location.replace(urlCGI);
					wndNew.focus();
				} else {
					alert("Sorry, the Admin window could not be opened. Please try again. If you continue having troubles, please let us know. Thank you.");
				}
			}
		}
	}
	var aPBOther = new Array();
	function hasAdminCmd(id) {
		for (var i = 0; i < aPBOther.length - 1; i++) {
			var aCmds = aPBOther[i].split('|');
			var idCmd = aCmds[0];
			if (idCmd == id) { return true; }
		}
		return false;
	}
	function canAddGroups() {
		var cAddGroupCmdId 	= 34;
		return hasAdminCmd(cAddGroupCmdId);
	}
	function isSiteEditor() {
		var cSiteEditorCmdId = 60;
		return hasAdminCmd(cSiteEditorCmdId);
	}
	function getUnderConstructionNotice() {
		if (gnUnderConstruction == 1) 		{ return 'Site Proxies' ; }
		else if (gnUnderConstruction == 2) 	{ return 'General Editors' ; }
		else if (gnUnderConstruction == 3) 	{ return 'Site Admins' ; }
		else if (gnUnderConstruction == 4) 	{ return 'Page Editors' ; }
		return 'Everyone';
	}
	function getDailyTasksNotice(n) {
		var aFlags = gstrDailyTasks.split(':');
		if (aFlags[n-1] != '0') 	{ return 'On'; }
		return 'Off';
	}
	
	// CREATE DIALOG WINDOWS
	function wndOpenPopUp(strName,strURL,dx,dy) {
		var wndNew = wndOpenNewDialog(strName,dx,dy);
		if (wndNew != null) {
			wndNew.location.replace(strURL);
			wndNew.focus();
		} else {
			alert("Sorry, the "+strName+" window could not be opened, possibly because your browser is blocking pop-up windows. Please be sure pop-up windows are allowed during "+gstrSiteName+" sessions. Thank you.");
		}
		return wndNew;
	}
	// -- Create minimum-crome client side browser window
	function wndOpenNewDialog(strWndName, dxPref, dyPref) {
		var dx = screen.width - 80 ;
		var dy = screen.height - 160;
		if (dxPref > dx) {dxPref = dx;}
		if (dyPref > dy) {dyPref = dy;}
		var xWnd = parseInt((dx + 70 - dxPref)/2);
		if (xWnd < 10) { xWnd = 10; }
		// if (navigator.appName.indexOf('Netscape') != -1) { dxPref += 15 } // different spacing for scroll bars
		var strParams = "directories=0,personalbar=0,scrollbars=1,status=0,resizable=1,location=0,toolbar=0,width="+dxPref+",height="+dyPref+",screenX="+xWnd+",left="+xWnd+",screenY="+82+",top="+82;
		var wndNew = window.open("",strWndName,strParams);
		return wndNew;
	}
	// -- 
	function showInProgressDialogCGI(strName,dx,dy,strCGI) {
		var wndName = "wnd"+strName;
		var aS = strCGI.split('?');
		var strCGIfile = aS[0];
		var strURLSearchItems = aS[1];
		var strURLSearch = 'CGI='+gCGIPath+strCGIfile;
		if (strURLSearch) { 
			strURLSearch += '&'+strURLSearchItems; 
		}
		var wndNew = wndOpenNewDialog(wndName,dx,dy);
		if (wndNew != null) {
			wndNew.location.replace(gWWWPath+"dlg_inprogress.html?"+strURLSearch);
			wndNew.focus();
		} else {
			alert("Sorry, the "+strName+" window could not be opened. Please try again. If you continue having troubles, please let us know. Thank you.");
		}
	}	
	// -- Call cgi program to return correct dialog html for the client side window
	function showDialogCGI(strName,dx,dy,strCGI) {
		wndOpenPopUp("wnd"+strName,gCGIPath+strCGI,dx,dy);
	}	
	// -- Call cgi program securely to return correct dialog html for the client side window
	function showDialogCGISecure(strName,dx,dy,strCGI) {
		wndOpenPopUp("wnd"+strName,gCGIPathSecure+strCGI,dx,dy);
	}	
	// -- Create high-chrome client side browser window	
	function wndOpenNewWindow(strWndName, dxPref, dyPref) {
		return wndOpenNewWindowCustom(strWndName, dxPref, dyPref, 2, 0, 0);
	}
	function wndOpenNewWindowCustom(strWndName, dxPref, dyPref, fChromeLevel, nLeft, nTop) {
		var dx = screen.width - 80 ;
		var dy = screen.height - 160;
		var dyOrig = dyPref;
		if (dxPref > dx) {dxPref = dx;}
		if (dyPref > dy) {dyPref = dy;}
		var xWnd = parseInt((dx + 70 - dxPref)/2);
		if (xWnd < 10) { xWnd = 10; }
		if (!nLeft) {nLeft = xWnd}
		if (!nTop) {nTop = 82}
		// if (navigator.appName.indexOf('Netscape') != -1) { dxPref += 15 } // different spacing for scroll bars
		var strParams = "scrollbars=1,status=0,width="+dxPref+",height="+dyPref+",screenX="+xWnd+",left="+nLeft+",screenY="+nTop+",top="+nTop;
		if (fChromeLevel == 1) {
			strParams += ",resizable=1,menubar=0,toolbar=0,location=0,directories=0,personalbar=0";
		} else if (fChromeLevel == 2) {
			strParams += ",resizable=1,toolbar=0";
		} else if (fChromeLevel == 3) {
			strParams += ",menubar=1,resizable=1,directories=0,personalbar=0";
		} 
		var wndNew = window.open("",strWndName,strParams);
		return wndNew;
	}
	function showWindowCGICustom(strName,dx,dy,strCGI,fChromeLevel,nLeft,nTop) {
		var wndName = "wnd"+strName;
		var strCGIPath = gCGIPath+strCGI;
		var wndNew = wndOpenNewWindowCustom(wndName,dx,dy,fChromeLevel,nLeft,nTop);
		if (wndNew != null) {
			wndNew.location.replace(strCGIPath);
			wndNew.focus();
		} else {
			alert("Sorry, the "+strName+" window could not be opened. Please try again. If you continue having troubles, please let us know. Thank you.");
		}
		return wndNew;
	}	
	// -- Call cgi program securely to return correct dialog html for the client side window
	function showWindowCGI(strName,dx,dy,strCGI) {
		return showWindowCGICustom(strName,dx,dy,strCGI,0,0,0);
	}
	
	// EXTERNAL DOCUMENT WINDOWS
	
	//	-- show website
	function showWebsite(strURL,idPage,nPageType) {
		// INTERNAL LINK: local:*ip:123
		// INTERNAL LINK: local:bulletin:123
		// INTERNAL LINK: local:bulletinpiece:123:filename.jpg
		var nLocalCheck = strURL.toLowerCase().indexOf("local:");
		var fPopWin = false;
		if (opener) {
			fPopWin = (opener.gWWWPath == gWWWPath);
		}
		if (nLocalCheck >= 0) {
			strURL = strURL.substr(nLocalCheck,strURL.length); 
			var aURL = strURL.split(":");
			var strType 		= cleanStr(aURL[1].toLowerCase());
			var idLink 			= cleanStr(aURL[2].toLowerCase());
			var strFName 		= aURL[3];
			if (strType == 'gip') {
				if (fPopWin) { opener.showGIP(idLink); }
				else { showGIP(idLink); }
			} else if (strType == 'pip') {
				if (fPopWin) { opener.showPIP(idLink); }
				else { showPIP(idLink); }
			} else if (strType == 'lip') {
				if (fPopWin) { opener.showLIP(idLink); }
				else { showLIP(idLink); }
			} else if (strType == 'rip') {
				if (fPopWin) { opener.showRIP(idLink); }
				else { showRIP(idLink); }
			} else if (strType == 'resource') {
				if (fPopWin) { opener.showReference(idLink); }
				else { showReference(idLink,idPage,nPageType); }
			} else if (strType == 'bulletin') {
				if (fPopWin) { opener.showBulletin(idLink); }
				else { showBulletin(idLink); }
			} else if (strType == 'event') {
				if (fPopWin) { opener.showEvent(idLink); }
				else { showEvent(idLink); }
			} else if (strType == 'notice') {
				if (fPopWin) { opener.showNotice(idLink); }
				else { showNotice(idLink); }
			} else if (strType == 'resourcepiece') {
				if (fPopWin) { opener.showReferencePiece(strFName,idLink); }
				else { showReferencePiece(strFName,idLink); }
			} else if (strType == 'bulletinpiece') {
				if (fPopWin) { opener.showBulletinPiece(strFName,idLink); }
				else { showBulletinPiece(strFName,idLink); }
			}
		} else if (strURL.indexOf(gWWWPath) != -1) {
			strURL = unescapeStr(strURL);
			if (fPopWin) { 
				opener.location = strURL;
			} else {
				window.location = strURL;
			}
		} else {
			//	ELSE EXTERNAL LINK
			if (strURL.indexOf("://") < 0) {
				strURL = "http://" + strURL;
			}
			strURL = strURL.replace(/'/g, "\\'");
			strURL = strURL.replace(/"/g, '\\"');
			strURL = unescapeStr(strURL);
			var dx = screen.width - 200;
			var dy = screen.height - 200;
			var strParams = "status=1,toolbar=1,menubar=1,location=1,scrollbars=1,resizable=1,width="+dx+",height="+dy+",screenX=10,left=10,screenY=10,top=10";
			var wndNew = window.open("","",strParams);
			if (wndNew != null) {
				wndNew.moveTo(10,10);
				wndNew.location = strURL;
				wndNew.location;
				wndNew.focus();
			}
		}
	}
	//	-- show pieces
	function getBulletinPieceURL(strFName,idB) {
		var t = getNow(); 
		var strLink = "fetch_bulletin_piece.cgi?ID="+idB+"&F="+escape(strFName)+"&X="+t.getTime()+"/"+strFName;
		return strLink;
	}
	function showBulletinPiece(strFName,idB) {
		var strLink = getBulletinPieceURL(strFName,idB);
		//top.document.location = gCGIPath+strLink;
		var winNew = showWindowCGICustom("",330,330,strLink,0,0,0);
	}
	function getReferencePieceURL(strFName,idR) {
		var t = getNow(); 
		var strLink = "fetch_reference_piece.cgi?ID="+idR+"&F="+escape(strFName)+"&X="+t.getTime()+"/"+strFName;
		return strLink;
	}
	function showReferencePiece(strFName,idR) {
		var strLink = getReferencePieceURL(strFName,idR);
		//top.document.location = gCGIPath+strLink;
		var winNew = showWindowCGICustom("",330,330,strLink,0,0,0);
	}
	
	
// =======================
//
//	BASIC INTERFACE FEATURES
//
// =======================	
	
	function drawMainSubheadHTML(strName, fEditor) {
		var str = '';
		var idGrp = 0;
		var idPip = 0;
		if (gnPageType == 1) { idGrp = gidPage; }
		if (gnPageType == 2) { idPip = gidPage; }
		str += '<div id="page_head" class="sectionhead_main">';
			str += '<table cellspacing="0" cellpadding="0" class="site_sectionhead_wide_accent"><tr>';
				str += '<td class="main_sectionhead_text_accent">';
				str += strName;
				str += '</td>';
				if (hasSession()) {
					str += '<td class="main_sectionhead_text_right" align="right">';
					if (fGCanEdit) {
						str += '&nbsp;<a href="javascript:addAnything('+idGrp+');"><img src="bits/PostWhite.gif" border="0" width="13" height="13" hspace="1" title="Post..."></a>';
					}
					str += '&nbsp;<a href="javascript:addPersonMessage('+idPip+',\'\');"><img src="bits/MailWhite.gif" border="0" width="13" height="13" hspace="1" title="Write someone..."></a>';
					str += '&nbsp;<a href="javascript:showPersonalMessages();"><img src="bits/ReadEnotesWhite.gif" border="0" width="13" height="13" hspace="1" title="Read your e-notes..."></a>';
					// str += '&nbsp;<a href="javascript:showPageTour('+gnPageType+');"><img src="bits/TourWhite.gif" border="0" width="13" height="13" hspace="1" title="Learn more about this page..."></a>';
					str += '&nbsp;<a href="javascript:sendFeedback();"><img src="bits/FeedbackWhite.gif" border="0" width="13" height="13" hspace="1" title="Contact Site Admin..."></a>';
					str += '</td>';
				}
			str += '</tr></table>';
		str += '</div>';
		str += '<div style="position:absolute;z-index:3;left:782px;top:25px;">';
			str += getTranslateHTML();
		str += '</div>';
		document.writeln(str);
	}
	function drawLinksSubhead () {
		var str = '';
		str += getSubHeadWithRightHTML('Links','',2,'links','');
		document.writeln(str);
	}
	
	// --------------------------------------
	//	NAVIGATION LINKS BLOCK
	//		-- mysql version
	//		-- on pip, gip, rip
	//		-- link to userPip, signin/signout, SiteHomeRip, OtherLinks
	// -- global page links array: type|id|title; type: // RIP=0; GIP=1; PIP=2; LIP=3; cookie page = type+10
	var aGPageLinks = new Array();
	// global flag if user is editor of at least one group.
	var fGCanEdit = false;
	function getNavBlockHTML (idUser, fHomePage, strUsername, aPBGroupLinks, aPBPeopleLinks, aPBResLinks, aPBRoles) {

		resetTimer();
		
		var str = '';
		var nTMax = 24;
		str += '<div id="navbar">';
		
			// LINE: YOUR PAGE
			str += '<div class="nav_menubox">';
				str += '<div class="nav_commands">';
					str += '<table cellspacing="0" cellpadding="0" class="page_sectionhead_table_narrow"><tr>'; 
					str += '<td><a href="javascript:showPIP('+idUser+')"><img src="bits/HomeBlack.gif" border="0"></a>&nbsp;<a class="navlink_off" href="javascript:showPIP('+idUser+')">Home</a></td><td align="right"><a class="navlink_off" href="javascript:logout()">sign out</a></td>';
					str += '</tr></table>';
					str += getSubMenuCommandHTML('showSubscribableGroups()', 'Browse Groups...', 'BrowseBlack.gif');
					str += getSubMenuCommandHTML('showIndex(0)', 'Site Index', 'IndexBlack.gif');
				str += '</div>';
			str += '</div>';


			// LINE 1: YOUR ROLES
			var nRoles = aPBRoles.length-1;
			if (nRoles > 1) {
				fHome = 0;
				if (fHomePage) { fHome = 1; }
				var str1 = '';
				var str2 = '';
				for (var r = 0; r < nRoles; r++) {
					var aRI = aPBRoles[r].split('|');
					var roleName 	= aRI[0];
					var displayName = aRI[1];
					var idSwitch 	= aRI[2];
					var fIsPrimary = aRI[3];
					var strIconName = 'RadioOffBlack.gif';
					if (idSwitch == idUser) { strIconName = 'RadioOnBlack.gif'; }
					str1 += getSubMenuCommandHTML('switchPersonRole('+idSwitch+','+fHome+')', roleName, strIconName);
					strIconName = 'RadioOffBlack.gif';
					if (fIsPrimary == 1) { strIconName = 'RadioOnBlack.gif'; }
					str2 += getSubMenuCommandHTML('setDefaultPersonRole('+idSwitch+')', roleName, strIconName);
				}
				var fDisplay = getMenuState('pip_roles',false);
				var strDisplay = getMenuDisplay(fDisplay);
				str += getMenuToggleHeaderHTML('pip_roles_menu','pip_roles', 'Switch Role', fDisplay, '');
				str += '<div id="pip_roles" style="'+strDisplay+'">';
					str += '<div class="nav_menubox">';
						str += '<div class="nav_commands">';
							str += str1;
						str += '</div>';
						var fDisplay = getMenuState('pip_roles_default',false);
						var strDisplay = getMenuDisplay(fDisplay);
						str += getSubMenuToggleHeaderHTML('', 'pip_roles_default', 'Sign In As', fDisplay);
						str += '<div class="nav_commands" id="pip_roles_default" style="'+strDisplay+'">';
							str += str2;
						str += '</div>';
					str += '</div>';
				str += '</div>';
			}

			// LINE 2: SITE NAV
			//		-- heading
			var fDisplay = getMenuState('nav_navigate',false);
			var strDisplay = getMenuDisplay(fDisplay);
			str += getMenuToggleHeaderHTML('nav_navigate_menu','nav_navigate', 'Navigate', fDisplay, '');
			str += '<div id="nav_navigate" style="'+strDisplay+'">';
				str += '<div class="nav_menubox">';
					// LINE 4: GROUPS
					//		-- heading
					var fDisplay = getMenuState('nav_groups',false);
					var strDisplay = getMenuDisplay(fDisplay);
					str += getSubMenuToggleHeaderHTML('', 'nav_groups','My Groups', fDisplay);
					str += '<div id="nav_groups" style="'+strDisplay+'">';
						var strItems = '';
						for (var g = 0; g < aPBGroupLinks.length - 1; g++) {
							var aPB = aPBGroupLinks[g].split('|');
							var idG			= aPB[0];
							var strGName	= aPB[1];
							var idGT		= aPB[2];
							var strGTName	= aPB[3];
							var fIsEd	 	= aPB[4];
							var strDisplay = strGName;
							var strTip = 'Write to people in the '+strGName+' group...';
							if (fIsEd != 0) { strDisplay += ' (ed.)'; fGCanEdit = true; }
							strDisplay = trimStringCenter(strDisplay, nTMax);
							strItems += '<tr><td width="13"><img src="bits/Blank.gif"></td><td>&nbsp;';
							strItems += '<a href="javascript:showGIP('+idG+')" class="navlink_off">'+strDisplay+'</a>';	
							strItems += '</td><td align="right">';
							if (fIsEd != 0) {
								strItems += '<a href="javascript:addAnything('+idG+')" class="navlink_off">';
								strItems += '<img src="bits/PostBlack.gif" width="12" height="12" alt="'+strTip+'" title="'+strTip+'" border="0">';
								strItems += '</a>';
							}
							strItems += '</td></tr>';
							// update page array
							aGPageLinks[aGPageLinks.length] = '1|'+idG+'|'+strGName;
						}
						if (strItems) {
							str += '<div class="nav_menubox">';
								// str += '<div class="nav_menuheader"><img src="bits/Blank.gif">&nbsp;Your Groups</div>';
								str += '<div class="nav_commands">';
									str += '<table width="180" cellspacing="0" cellpadding="0" style="padding:0px; margin:0px;">';
									str += strItems;
									str += '</table>';
								str += '</div>';
							str += '</div>';
						}
						// MRG list
						var strCookie = 'MRG'+idUser;
						var strMRG = GetCookie(strCookie);
						var strItems = '';
						if (strMRG) {
							var aMRGs = strMRG.split('&&');
							for (var i = 0; i < aMRGs.length; i++) {
								var aRG 	 = aMRGs[i].split('::');
								var idRG 	 = parseInt(aRG[0]);
								var strRGName = aRG[1];
								var strDisplay = strRGName;
								var strTip = 'Write to people in the '+strRGName+' group...';
								strDisplay = trimStringCenter(strDisplay, nTMax);
								idRG += 0;
								if (idRG > 0) {
									strItems += '<tr><td width="13"><img src="bits/Blank.gif"></td><td>&nbsp;';
									strItems += '<a href="javascript:showGIP('+idRG+')" class="navlink_off">'+strDisplay+'</a>';	
									strItems += '</td></tr>';
									// update page array
									aGPageLinks[aGPageLinks.length] = '1|'+idRG+'|'+strRGName;
								}
							}
							if (strItems) {
								str += '<div class="nav_menubox">';
									str += '<div class="nav_commands">';
										str += '<div class="boldtext"><img src="bits/Blank.gif">&nbsp;Also Visited</div>';
										str += '<table width="180" cellspacing="0" cellpadding="0" style="padding:0px; margin:0px;">';
										str += strItems;
										str += '</table>';
									str += '</div>';
								str += '</div>';
							}
						}
						//		-- end links
					str += '</div>';
		
					// LINE 5: PEOPLE
					//		-- heading
					var fDisplay = getMenuState('nav_people',false);
					var strDisplay = getMenuDisplay(fDisplay);
					str += getSubMenuToggleHeaderHTML('', 'nav_people','My People', fDisplay);
					str += '<div id="nav_people" style="'+strDisplay+'">';
						var strItems = '';
						for (var g = 1; g < aPBPeopleLinks.length - 1; g++) {
							var aPB = aPBPeopleLinks[g].split('|');
							var idP			= aPB[0];
							var strPName	= aPB[1];
							var IsParent	= aPB[2];
							var IsChild		= aPB[3];
							var fEnotes		= aPB[4];
							var strDisplay = strPName;
							var strTip = 'Write to '+strPName+'...';
							if (IsParent == 1) { strDisplay += ' (parent)'; }
							if (IsChild == 1)  { strDisplay += ' (child)'; }
							strDisplay = trimStringCenter(strDisplay, nTMax);
							// create link	
							strItems += '<tr><td width="13"><img src="bits/Blank.gif"></td><td>&nbsp;';
							strItems += '<a href="javascript:showPIP('+idP+')" class="navlink_off">'+strDisplay+'</a>';	
							strItems += '</td><td align="right">';
							if (fEnotes == 1) {
								strItems += '<a href="javascript:addPersonMessage('+idP+', \'\')" title="write e-note" class="navlink_off">';
								strItems += '<img src="bits/icon-enote2.gif" width="12" height="12" alt="'+strTip+'" title="'+strTip+'" border="0">';
								strItems += '</a>';
							}
							strItems += '</td></tr>';
							// update page array
							aGPageLinks[aGPageLinks.length] = '2|'+idP+'|'+strPName;
						}
						if (strItems) {
							str += '<div class="nav_menubox">';
								// str += '<div class="nav_menuheader"><img src="bits/Blank.gif">&nbsp;Your People</div>';
								str += '<div class="nav_commands">';
									str += '<table width="180" cellspacing="0" cellpadding="0" style="padding:0px; margin:0px;">';
									str += strItems;
									str += '</table>';
								str += '</div>';
							str += '</div>';
						}
						//  MRP list
						var strCookie = 'MRP'+idUser;
						var strMRP = GetCookie(strCookie);
						var strItems = '';
						if (strMRP) {
							var aMRPs = strMRP.split('&&');
							if (aMRPs.length > 0) {
								for (var i = 0; i < aMRPs.length; i++) {
									var aRP 	  	= aMRPs[i].split('::');
									var idRP 	  	= parseInt(aRP[0]);
									var strRPName 	= aRP[1];
									var fEnotes		= aRP[2];
									var strDisplay = strRPName;
									var strTip = 'Write to '+strRPName+'...';
									strDisplay = trimStringCenter(strDisplay, nTMax);
									if (idRP > 0) {
										strItems += '<tr><td width="13"><img src="bits/Blank.gif"></td><td>&nbsp;';
										strItems += '<a href="javascript:showPIP('+idRP+')" class="navlink_off">'+strDisplay+'</a>';	
										strItems += '</td><td align="right">';
										if (fEnotes == 1) {
											strItems += '<a href="javascript:addPersonMessage('+idRP+', \'\')" class="navlink_off">';
											strItems += '<img src="bits/icon-enote2.gif" width="12" height="12" alt="'+strTip+'" title="'+strTip+'" border="0">';	
											strItems += '</a>';
										}
										strItems += '</td></tr>';
										// update page array
										aGPageLinks[aGPageLinks.length] = '2|'+idRP+'|'+strRPName;
									}
								}
							}
						}
						if (strItems) {
							str += '<div class="nav_menubox">';
								str += '<div class="nav_commands">';
									str += '<div class="boldtext"><img src="bits/Blank.gif">&nbsp;Also Visited</div>';
									str += '<table width="180" cellspacing="0" cellpadding="0" style="padding:0px; margin:0px;">';
									str += strItems;
									str += '</table>';
								str += '</div>';
							str += '</div>';
						}
						//		-- end links
					str += '</div>';
				
					// LINE 2: RESOURCES/DEPARTMENTS
					//		-- heading
					var fDisplay = getMenuState('nav_resources',false);
					var strDisplay = getMenuDisplay(fDisplay);
					str += getSubMenuToggleHeaderHTML('', 'nav_resources', gstrSchoolNameShort+' Departments', fDisplay);
					str += '<div id="nav_resources" style="'+strDisplay+'">';
						// 		-- start links
						str += '<div class="nav_menubox">';
							var fFirstHeader = true;
							var strTip = 'Write to people affiliated with this resource...';
							for (var c = 0; c < aPBResLinks.length - 1; c++) {
								var aNL = aPBResLinks[c].split('|');
								var strFlag			= aNL[0];
								var idCmd	 		= aNL[1];
								var strCmdName	  	= aNL[2];
								var strDesc 		= aNL[3];
								var strPhotoURL		= aNL[4];
								var strFolder		= aNL[5];
								var idRT	 		= aNL[6];
								var strRT	 		= aNL[7];
								var fIsEd	  		= aNL[8];
								var fIsPub	  		= aNL[9];
								var strDisplay = strCmdName;
								if (fIsEd != 0) { strDisplay += ' (ed.)'; }
								strDisplay = trimStringCenter(strDisplay, nTMax);
								if (strFlag == 'ripheading') { 
									if (idCmd >= 99) { continue; }
									if (idCmd < 100) {
										if (fFirstHeader) { 
											fFirstHeader = false; 
										} else { 
											str += '</div><div class="nav_menuheader"><img src="bits/Blank.gif">&nbsp;'+ strDisplay+ '</div>';
										}
										str += '<div class="nav_commands">';
									}
								} else if (strFlag == 'rip') {
									if (idRT >= 99) { continue; }
									str += '<table width="180" cellspacing="0" cellpadding="0" style="padding:0px;margin:0px;">';
									str += '<tr><td width="13"><img src="bits/Blank.gif"></td><td>&nbsp;';
									str += '<a href="javascript:showRIP('+idCmd+')" class="navlink_off">'+strDisplay+'</a>';
									str += '</td><td align="right">';
									str += '</td></tr></table>';
									// update page array
									aGPageLinks[aGPageLinks.length] = '0|'+idCmd+'|'+strCmdName;
									if (fIsPub != 1) {
										gaPublicResources.pop();
										aNL.shift();
										gaPublicResources.push(aNL.join('|'));
										gaPublicResources.push("***");
									}
								}
							}
							str += '</div>';
							//		-- end links
						str += '</div>';
					str += '</div>';
					
					// LINE 3: LOCATIONS
					//		-- heading
					var fDisplay = getMenuState('nav_locations',false);
					var strDisplay = getMenuDisplay(fDisplay);
					str += getSubMenuToggleHeaderHTML('', 'nav_locations',gstrSchoolNameShort+' Locations', fDisplay);
					str += '<div id="nav_locations" style="'+strDisplay+'">';
						// 		-- start links
						str += '<div class="nav_menubox" style="padding-top:0px;">';
							var fFirstHeader = true;
							var strTip = 'Write to people affiliated with this location...';
							for (var c = 0; c < aPBResLinks.length - 1; c++) {
								var aNL = aPBResLinks[c].split('|');
								var strFlag			= aNL[0];
								var idCmd	 		= aNL[1];
								var strCmdName	  	= aNL[2];
								var strDesc 		= aNL[3];
								var strPhotoURL		= aNL[4];
								var strFolder		= aNL[5];
								var idLT	 		= aNL[6];
								var strLT	 		= aNL[7];
								var fIsEd	  		= aNL[8];
								var strDisplay = strCmdName;
								if (fIsEd != 0) { strDisplay += ' (ed.)'; }
								strDisplay = trimStringCenter(strDisplay, nTMax);
								if (strFlag == 'lipheading') { 
									if (fFirstHeader) { 
										fFirstHeader = false; 
									} else { 
										str += '</div><div class="nav_menuheader"><img src="bits/Blank.gif">&nbsp;'+ strDisplay+ '</div>';
									}
									str += '<div class="nav_commands">';
								} else if (strFlag == 'lip') { 
									str += '<table width="180" cellspacing="0" cellpadding="0" style="padding:0px; margin:0px;"><tr><td width="13"><img src="bits/Blank.gif"></td><td>&nbsp;';
									str += '<a href="javascript:showLIP('+idCmd+')" class="navlink_off">'+strDisplay+'</a>';	
									str += '</td><td align="right">';
									str += '</td></tr></table>	';
									// update page array
									aGPageLinks[aGPageLinks.length] = '3|'+idCmd+'|'+strCmdName;
								}
							}
							str += '</div>';
						str += '</div>';
					str += '</div>';
				str += '</div>';
			str += '</div>';
		str += '</div>';

		return str;
		// document.writeln(str);
	}
	function csstobool(d) {
		return !(d.display == 'none' || !d.display || d.width == '0px');
	}
	function booltocss(f) {
		if (f) { return 'block'; }
		return 'none';
	}
	function animOpen (id) {
		var d = getDOM(id,1);
		d.myval = Math.min(d.myval + d.mychunk, d.mymax);
		d.height = d.myval + 'px';
		var ms = new Date().getTime();
		if (d.myval == d.mymax || (ms - d.msstart) > 100) {
			d.height = '';
			d.overflow = '';
			eval('clearInterval('+id+'_open)');
		}
		d.msstart = ms;
	}
	function animClose (id) {
		var d = getDOM(id,1);
		d.myval = Math.max(d.myval - d.mychunk, 0);
		d.height = d.myval + 'px';
		var ms = new Date().getTime();
		if (d.myval == 0 || (ms - d.msstart) > 100) {
			d.display = 'none';
			d.height = '';
			d.overflow = '';
			eval('clearInterval('+id+'_close)');
		}
		d.msstart = ms;
	}
	function installAnim(id,f) {
		var ob = getDOM(id,0); 
		var d = ob.style;
		d.width 	= '100%';
		d.display 	= 'block';
		d.overflow 	= 'hidden';
		d.height 	= '';
		d.mymax 	= ob.offsetHeight;
		d.msstart	= new Date().getTime();
		if (f) {
			d.height = '0px';
			d.myval = 0;
			d.mychunk = parseInt(d.mymax/10);
			eval(id+'_open = setInterval(\'animOpen("'+id+'")\', 10)');
		} else {
			d.myval = d.mymax;
			d.mychunk = parseInt(d.mymax/3);
			eval(id+'_close = setInterval(\'animClose("'+id+'")\', 20)');
		}
	}
	function switchDiv(id,d,f,f2) {
		var d_off = getDOM(id+'_off',1);
		var d_on = getDOM(id+'_on',1);
		d_off.display 	= booltocss(!f); 
		d_on.display 	= booltocss( f);
		if (f2) {
			installAnim(id,f);
		} else {
			d.display 	= booltocss( f);
		}
	}
	function multiToggleDiv(id,n) {
		multiTogDiv(id,n,false);
	}
	function multiToggleDivSticky(id,n) {
		multiTogDiv(id,n,true);
	}
	function multiTogDiv(id,n,fsticky) {
		if (n <= 0) { return; }
		var d = getDOM(id+0,1); // use sense of first
		var f = csstobool(d);
		for (var i = 0; i < n; i++) {
			d = getDOM(id+i,1);
			switchDiv(id+i,d,!f,false);
			if (fsticky) {
				SetCookie(id+i,!f);
			}
		}
		d = getDOM(id+'_on',1);
		d.display = booltocss(!f); 
		d = getDOM(id+'_off',1);
		d.display = booltocss(f); 
		if (fsticky) {
			SetCookie(id,!f);
		}
	}
	function toggleDiv(id) {
		var d = getDOM(id,1);
		var f = csstobool(d);
		switchDiv(id,d,!f,false);
	}
	function toggleDivSticky(id) {
		var d = getDOM(id,1);
		var f = csstobool(d);
		switchDiv(id,d,!f,true);
		SetCookie(id,!f);
	}
	function toggleHideShow(id) {
		var d = getDOM(id,1);
		var f = csstobool(d);
		d.display = booltocss(!f); 
	}
	function visinvis(id,f) {
		var d = getDOM(id,1);
		var s = 'hidden'; if (f) { s = 'visible'; }
		d.visibility = s; 
	}
	function getTranslateHTML () {
		var str = '';
		var strsnip = '';
		var strdisabled = '';
		if (typeof google == 'undefined') {
			strdisabled = ' DISABLED ';
		}
		var transcode = GetCookie('transcode');
		var transcodename = GetCookie('transcodename');
		if (transcode && transcodename) {
			strsnip += '<option SELECTED value="'+transcode+'">'+transcodename+'</option><option disabled value="">---------------------</option>';
		}
		str += '<form name="frmTRANS" method="POST" action="" enctype="multipart/form-data">';
		str += '<select name="langlist" id="langlist" '+strdisabled+' tabindex="0" onChange="translatePage(this.options[this.selectedIndex].value,this.options[this.selectedIndex].text)">'+strsnip+'<option value="en">Translate (English)</option><option value="sq">Shqipe (Albanian)</option><option value="ar">&#1575;&#1604;&#1593;&#1585;&#1576;&#1610;&#1577; (Arabic)</option><option value="bg">&#1041;&#1098;&#1083;&#1075;&#1072;&#1088;&#1089;&#1082;&#1080; (Bulgarian)</option><option value="ca">Catal&#224; (Catalan)</option><option value="zh-CN">&#20013;&#25991; (Chinese)</option><option value="hr">Hrvatski (Croatian)</option><option value="cs">&#268;e&#353;tina (Czech)</option><option value="da">Dansk (Danish)</option><option value="nl">Nederlands (Dutch)</option><option value="et">Eesti (Estonian)</option><option value="tl">Filipino (Filipino)</option><option value="fi">Suomi (Finnish)</option><option value="fr">Fran&#231;ais (French)</option><option value="gl">Galego (Galician)</option><option value="de">Deutsch (German)</option><option value="el">&#917;&#955;&#955;&#951;&#957;&#953;&#954;&#940; (Greek)</option><option value="iw">&#1506;&#1489;&#1512;&#1497;&#1514; (Hebrew)</option><option value="hu">Magyar (Hungarian)</option><option value="id">Indonesia (Indonesian)</option><option value="it">Italiano (Italian)</option><option value="ja">&#26085;&#26412;&#35486; (Japanese)</option><option value="ko">&#54620;&#44397;&#50612; (Korean)</option><option value="lv">Latvie&#353;u (Latvian)</option><option value="lt">Lietuvi&#371; (Lithuanian)</option><option value="mt">Malti (Maltese)</option><option value="no">Norsk (Norwegian)</option><option value="pl">Polski (Polish)</option><option value="pt">Portughez&#259; (Portugese)</option><option value="ro">Rom&#226;ni (Romanian)</option><option value="ru">&#1056;&#1086;&#1089;&#1089;&#1080;&#1081;&#1089;&#1082;&#1072;&#1103; (Russian)</option><option value="sr">Srpski (Serbian)</option><option value="sk">Slovensk&#225; (Slovak)</option><option value="sl">Slovenska (Slovenian)</option><option value="es">Espa&#241;ol (Spanish)</option><option value="sv">Svenska (Swedish)</option><option value="th">&#3652;&#3607;&#3618; (Thai)</option><option value="tr">T&#252;rk&#231;e (Turkish)</option><option value="uk">&#1059;&#1082;&#1088;&#1072;&#1111;&#1085;&#1089;&#1100;&#1082;&#1072; (Ukrainian)</option><option value="vi">Ti&#7871;ng Vi&#7879;t (Vietnamese)</option></select>'; // <option value="hi">&nbsp;&#2361;&#2367;&#2344;&#2381;&#2342;&#2368; (Hindi)</option><option value="xx-bork">Bork, bork, bork!</option><option value="xx-elmer">Elmer Fudd</option><option value="eo">Esperanto</option><option value="xx-hacker">Hacker</option><option value="xx-piglatin">Pig Latin</option><option value="xx-pirate">Pirate</option><option value="xx-klingon">Klingon</option></select>';
		str += '</form>';
		return str;
	}
	function translate(str) {
		// google license limits to 1,000 chars
		var transcode = GetCookie('transcode'); if (!transcode) { return; }
		google.language.translate(str.substring(0, 1000), '', transcode,
			function (result) {
				if (result.message) {
					// alert(result.message);
				}
				if (result.translation) {
					var aT = result.translation.split('|');
					for (var i = 0; i < aT.length; i=i+2) {
						var id 		= aT[i];
						var strT 	= aT[i+1];
						if (id) {
							id = id.replace(/[^A-Za-z0-9_<>!-]/g, '');
							strT = strT.replace(/^ | $/g, '');
							var aI = id.split('<!>');
							id 			= aI[0].replace(/[<>]/g, '');
							var tokn 	= aI[1]; 
							var ob 	= getDOM(id,0);
							if (ob) {
								var fappend = (ob.transcode == transcode);
								if (fappend) {
									strT = ob.innerHTML.replace(tokn,strT);
								}
								ob.innerHTML = strT;
								ob.transcode = transcode;
							}
						}
					}
				}
			}
		);
	}
	function transOb(ob) {
		var transcode = GetCookie('transcode'); if (!transcode) { return; }
		if (transcode.toLowerCase() == 'en') {
			if (ob.transHTML) { 
				ob.innerHTML = ob.transHTML;
			}
			return;
		}
		if (!ob.transHTML) {
			ob.transHTML = ob.innerHTML;
		}
		var str = ob.transHTML;
		if (str.length <= 1000) {
			translate('<'+ob.id+'>' + '|' + str + '|'); return;
		}
		ob.innerHTML = '';
		ob.transcode = transcode;
		var n1 = 0;
		var nsec = 0;
		while (n1 < str.length) {
			nmax = Math.min(n1+1000,str.length);
			for (var n2 = nmax; n2 > nmax-200; n2--) {
				if (n2 == str.length) {
					break;
				}
				if (str.charAt(n2-1) == '.') {
					break;
				}
			}
			var tokn = '<!--sub'+nsec+'trans-->';
			ob.innerHTML += tokn;
			translate('<'+ob.id+'>'+'<!>'+tokn+ '|' + str.substring(n1, n2) + '|'); 
			n1 = (n2+1);
			nsec++;
		}
	}
	function translateSeries(id) {
		var i = 0;
		var ob = 1;
		var str = '';
		while (ob) {
			ob = getDOM(id+i+'_full',0);
			if (ob) { 
				if (ob.innerHTML) {
					transOb(ob); 
				}
			}
			i++;
		}
		i = 0; ob = 1;
		while (ob) {
			ob = getDOM(id+i+'_trim',0);
			if (ob) { 
				if (ob.innerHTML) {
					transOb(ob); 
				}
			}
			i++; 
		}
		i = 0; ob = 1;
		while (ob) {
			ob = getDOM(id+i+'_text',0);
			if (ob) { 
				if (ob.innerHTML) {
					transOb(ob); 
				}
			}
			i++; 
		}
		i = 0; ob = 1;
		while (ob) {
			ob = getDOM(id+i+'_pieces',0);
			if (ob) { 
				if (ob.innerHTML) {
					transOb(ob); 
				}
			}
			i++; 
		}
	}
	function translateObject(id) {
		ob = getDOM(id,0);
		if (ob) {
			if (ob.innerHTML) {
				transOb(ob); 
			}
		}
	}
	function translatePage(transcode,transcodename) {
		SetCookie('transcode',transcode);
		SetCookie('transcodename',transcodename);
		translateSeries('reference_top');
		translateSeries('preview');
		translateSeries('event');
		translateSeries('upcoming');
		translateSeries('schedDay');
		translateSeries('s0');
		translateSeries('s1');
		translateSeries('s2');
		translateSeries('s3');
		translateSeries('s4');
		translateSeries('s5');
		translateSeries('s6');
		translateSeries('notice');
		translateSeries('invite');
		translateSeries('bulletin');
		translateSeries('bulletin0');
		translateSeries('bulletin1');
		translateSeries('bulletin2');
		translateSeries('reference');
		translateSeries('ref_0_');
		translateSeries('ref_1_');
		translateSeries('ref_2_');
		translateSeries('ref_3_');
		translateSeries('ref_4_');
		translateSeries('ref_5_');
		translateSeries('ref_6_');
		translateSeries('ref_7_');
		translateSeries('ref_8_');
		translateSeries('ref_0_f_');
		translateSeries('ref_1_f_');
		translateSeries('ref_2_f_');
		translateSeries('ref_3_f_');
		translateSeries('ref_4_f_');
		translateSeries('ref_5_f_');
		translateSeries('ref_6_f_');
		translateSeries('ref_7_f_');
		translateSeries('ref_8_f_');
		translateSeries('searchitem0_');
		translateSeries('searchitem1_');
		translateSeries('searchitem2_');
		translateSeries('searchitem3_');
		translateSeries('searchitem4_');
		translateSeries('searchitem5_');
		translateSeries('searchitem6_');
		translateSeries('searchitem7_');
		translateSeries('searchitem8_');
		translateObject('pagedesc');
		translateObject('sysnotetext');
	}

	// savelinks
	function getSaveLinksHTML(strhrefgoog,strhrefvcal) {
		var str = '';
		str += '<div class="savelinks">';
			str += '<div class="savelinksprompt">Save to Your To Do List</div>';
			str += '<div class="savelink">';
				str += '<a target="_blank" href="'+ strhrefgoog +'">Google Calendar...</a>';
			str += '</div>';
			str += '<div class="savelink">';
				str += '<a href="'+ strhrefvcal +'">iCalendar (Outlook, iCal, etc.)...</a>';
			str += '</div>';
		str += '</div>';
		return str;
	}
	// external release
	function getXReleaseFormHTML(nType,id) {
		var str = '';
		// var fDisplay = getMenuState('releaseform',false);
		var fDisplay = false;
		var strDisplay = getMenuDisplay(fDisplay);
		str += getSubMenuToggleHeaderHTML('nav_submenutoggle_top', 'releaseform', 'Send E-Mail Link', fDisplay);
		str += '<div class="releaseform">';
			str += '<div id="sendstatus" class="releaseformsendmsg">';
				str += 'Sending...';
			str += '</div>';
			str += '<div id="releaseform" style="'+strDisplay+'">';
				str += '<form name="frmxr" method="POST" action="" enctype="multipart/form-data" onSubmit="return checkReleaseData(this)">';
				var strName = "";
				if (nType == 0) { strName = "REFERENCEID"; }
				if (nType == 1) { strName = "BULLETINID"; }
				if (nType == 2) { strName = "EVENTID"; }
				if (nType == 3) { strName = "NOTICEID"; }
				str += '<input type="hidden" name="'+strName+'" value="'+id+'">';
				str += '<div class="releaseformprompt">';
					str += 'Share this outside '+gstrSchoolNameShort+' for...'; 
				str += '</div>';
				str += '<div class="releaseformpubselects">';
					str += '<select type="select" name="PUBDAYS">';
					str += '<option value="1">1 Day</option>';
					str += '<option value="2">2 Days</option>';
					str += '<option value="3">3 Days</option>';
					str += '<option value="4">4 Days</option>';
					str += '<option value="5">5 Days</option>';
					str += '<option value="6">6 Days</option>';
					str += '<option value="7" SELECTED>1 Week</option>';
					str += '<option value="14">2 Weeks</option>';
					str += '<option value="21">3 Weeks</option>';
					str += '<option value="28">4 Weeks</option>';
					str += '</select>';
					str += '&nbsp;/&nbsp;';
					str += '<select type="select" name="PUBVIEWS">';
					str += '<option value="1">1 View</option>';
					str += '<option value="2">2 Views</option>';
					str += '<option value="3">3 Views</option>';
					str += '<option value="4">4 Views</option>';
					str += '<option value="5">5 Views</option>';
					str += '<option value="6">6 Views</option>';
					str += '<option value="7">7 Views</option>';
					str += '<option value="8">8 Views</option>';
					str += '<option value="9">9 Views</option>';
					str += '<option value="10">10 Views</option>';
					str += '<option value="20">20 Views</option>';
					str += '<option value="30">30 Views</option>';
					str += '<option value="40">40 Views</option>';
					str += '<option value="50">50 Views</option>';
					str += '<option value="100">100 Views</option>';
					str += '<option value="-1" SELECTED>Unlimited</option>';
					str += '</select>';
				str += '</div>';
				str += '<div class="releaseformtextarea">';
					str += '<div class="releaseformtextfld">';
						str += 'Recipient E-Mail<br><input type="text" name="PUBTO" maxlength="256" class="releaseformtextinput" onblur="enableReleaseSubmit()">';
					str += '</div>';
					str += '<div style="padding-top:4px;">';
						str += 'Name<br><input type="text" name="PUBTONAME" maxlength="80" class="releaseformtextinput" onblur="enableReleaseSubmit()">';
					str += '</div>';
					str += '<div class="releaseformtextfld">';
						str += 'From<br><input type="text" name="PUBFROM" maxlength="256" value="'+strEmail+'" disabled class="releaseformtextinput" onblur="enableReleaseSubmit()">';
					str += '</div>';
					str += '<div class="releaseformtextfld">';
						str += 'Subject<br><input type="text" name="PUBSUBJECT" maxlength="256" class="releaseformtextinput">';
					str += '</div>';
					str += '<div class="releaseformtextfld">';
						str += 'Note<br><textarea wrap="soft" rows="4" cols="10" class="releaseformtextinput" name="PUBTEXT" Title="Type your comment here." class="discussion_textarea" onKeyPress="limitText(this,32000);"  onfocus="clearTextArea(this)">';
						str += 'Type a note here.';
						str += '</textarea>';
					str += '</div>';
				str += '</div>';
				str += '<div class="discussion_conformity">';
					str += '<input type="SUBMIT" name="SUBMITRELEASE" value="Send E-Mail With Link" disabled class="discussion_button">';
				str += '</div>';
				str += '</form>';
			str += '</div>';
		str += '</div>';
		return str;
	}
	function limitText(txtarea,nChars) {
		// limits the amount of text that can be typed into text field
		if (txtarea.value.length > nChars) {
			var szT = txtarea.value;
			txtarea.value = szT.substring(0, (nChars-1));
		}
	}
	function clearTextArea (txtarea) {
		txtarea.value = '';
	}
	function enableReleaseSubmit() {
		document.frmxr.SUBMITRELEASE.disabled = (!document.frmxr.PUBTO.value); 
	}
	function checkReleaseData(frmxr) {
		var fReturn = true;
		frmxr.PUBTEXT.value = cleanStr(frmxr.PUBTEXT.value);
		if (!frmxr.PUBFROM.value) {
			alert ("Sorry, you must have an e-mail address to send this release."); // this shouldn't be necessary.
			fReturn = false;
		} else if (!frmxr.PUBTO.value) {
			frmxr.PUBTO.focus();
			alert ("Please provide a e-mail address for the release.");
			fReturn = false;
		} else if (!validEmailname(frmxr.PUBTO.value)) {
			frmxr.PUBTO.focus();
			alert ("The E-Mail field contains an invalid e-mail address. Please correct and resubmit.");
			fReturn = false;
		} else if (!validEmailname(frmxr.PUBFROM.value)) {
			frmxr.PUBFROM.focus();
			alert ("The FROM field contains an invalid e-mail address. Please correct and resubmit.");
			fReturn = false;
		} else if (!frmxr.PUBSUBJECT.value) {
			alert ("Please type a subject line for the release.");
			fReturn = false;
		} else if (!frmxr.PUBTONAME.value) {
			alert ("Please describe who the release is to.");
			fReturn = false;
		} else if (frmxr.PUBTEXT.value.length > 32000) {
			alert ("Sorry, the maximum length for the note of your release note is 32,000 characters and you have entered " + frmxr.PUBTEXT.value.length + ". Please shorten your entry and resubmit.");
			fReturn = false;
		}
		if (fReturn) {
			var d1 = getDOM("releaseform",1);
			d1.display="none";
			var d2 = getDOM("sendstatus",1);
			d2.display="block";
			frmxr.action = gCGIPath+"submit_release_new.cgi";
			return true;
		} else {
			return false;
		}
	}
	// end xrelease
	function trimTitle(ob) {
		var fFirst = true;
		var strSave = ob.innerHTML;
		while (parseInt(ob.parentNode.offsetHeight) > 20) {
			var str = ob.innerHTML;
			if (str.length < 4) {
				ob.innerHTML = strSave; break;
			}
			if (!fFirst) { str = str.substring(0, str.length-4); }
			var fEsc = (str.charAt(str.length-1) == ';');
			while (fEsc) {
				str = str.substring(0, str.length-2);
				fEsc = (str.charAt(str.length-1) != '&');
			}
			str = cleanStr(str.substring(0, str.length-2));
			ob.innerHTML = str + "...";
			fFirst = false;
		}
	}
	function trimTog(id) {
		var ob = getDOM(id+'_trim',0);
		if (ob) { trimTitle(ob); }
	}
	function trimToggle(id,nCnt) {
		for (var i = 0; i <= nCnt; i++) {
			trimTog(id+i);
		}
	}
	function getTitleMultiToggleHTML(idToggle, strTitle, strDesc, strClass, isOn, isNew, nCnt) {
		var str = '';
		var strN = '';
		var strT = cleanStr(strTitle);
		strT = stripHTML(strT);
		if (isNew) {
			strN += '<nobr>&nbsp;<img src="bits/updated2.gif" width="11" height="11" title="Updated or New..." alt="" border="0"></nobr>';
		}
		str += '<div class="'+strClass+'">';
			str += '<a href="javascript:noop()" id="'+idToggle+'_on" style="display:'+booltocss(isOn)+';cursor:pointer;" onmousedown="multiToggleDiv(\''+idToggle+'\','+nCnt+')" >';
				str += '<img src="bits/menu5_on.gif" border="0">&nbsp;';
				str += '<span id="'+idToggle+'_full">' + strT + '</span>' + strN;
			str += '</a>';
			str += '<a href="javascript:noop()" id="'+idToggle+'_off" style="display:'+booltocss(!isOn)+';cursor:pointer;" onmousedown="multiToggleDiv(\''+idToggle+'\','+nCnt+')" >';
				str += '<img src="bits/menu5_off.gif" border="0">&nbsp;';
				str += '<span id="'+idToggle+'_trim">' + strT + '</span>' + strN;
			str += '</a>';
		str += '</div>';
		return str;
	}
	function getTitleTogHTML(idToggle, strTitle, strDesc, strClass, isOn, isNew, isSticky, noIcon, nostrip) {
		var str = '';
		var strN = '';
		var strT = strTitle;
		if (!nostrip) {
			strT = cleanStr(strT);
			strT = stripHTML(strT);
		}
		if (isNew) {
			strN += '<nobr>&nbsp;<img src="bits/updated2.gif" width="11" height="11" title="Updated or New..." alt="" border="0"></nobr>';
		}
		var jsTog = 'toggleDiv';
		if (isSticky) {
			jsTog = 'toggleDivSticky';
		}
		str += '<div class="'+strClass+'">';
			str += '<a href="javascript:noop()" id="'+idToggle+'_on" style="display:'+booltocss(isOn)+';cursor:pointer;" onmousedown="'+jsTog+'(\''+idToggle+'\')" >';
				if (!noIcon) { str += '<img src="bits/menu5_on.gif" border="0">&nbsp;'; }
				str += '<span id="'+idToggle+'_full">' + strT + '</span>' + strN;
			str += '</a>';
			str += '<a href="javascript:noop()" id="'+idToggle+'_off" style="display:'+booltocss(!isOn)+';cursor:pointer;" onmousedown="'+jsTog+'(\''+idToggle+'\')" >';
				if (!noIcon) { str += '<img src="bits/menu5_off.gif" border="0">&nbsp;'; }
				str += '<span id="'+idToggle+'_trim">' + strT + '</span>' + strN;
			str += '</a>';
		str += '</div>';
		return str;
	}
	function getTitleToggleStickyHTML(idToggle, strTitle, strDesc, strClass, isOn, isNew) {
		return getTitleTogHTML(idToggle, strTitle, strDesc, strClass, isOn, isNew, true, false, false);
	}
	function getTitleToggleHTML(idToggle, strTitle, strDesc, strClass, isOn, isNew) {
		return getTitleTogHTML(idToggle, strTitle, strDesc, strClass, isOn, isNew, false, false, false);
	}
	function getTitleToggleNoStripHTML(idToggle, strTitle, strDesc, strClass, isOn, isNew) {
		return getTitleTogHTML(idToggle, strTitle, strDesc, strClass, isOn, isNew, false, false, true);
	}
	function getTitleToggleNoIconHTML(idToggle, strTitle, strDesc, strClass, isOn, isNew) {
		return getTitleTogHTML(idToggle, strTitle, strDesc, strClass, isOn, isNew, false, true, false);
	}
	function getMenuToggleHeaderHTML(idDiv, idToggle, strHeaderName, isOn, strX) {
		var str = '';
		str += '<div id="'+idDiv+'" name="menubar'+idDiv+'" onmousedown="toggleDivSticky(\''+idToggle+'\')" '+strX+' onmouseover="hiliteMenubar(event, this)" onmouseout="unhiliteMenubar(event, this)">';
			str += '<table name="menubarTable" cellspacing="0" cellpadding="0" class="page_sectionhead_table_narrow"><tr name="menubarTR"><td name="menubarTD">';
			str += '<a id="'+idToggle+'_on" href="javascript:noop()" name="menubarLink" class="navlink_on_reverse" style="display:'+booltocss(isOn)+';cursor:pointer;"  onmouseover="hiliteMenubar(event, this)">';
				str += '<img src="bits/ArrowOpenBlack.gif" border="0">&nbsp;'+strHeaderName;
			str += '</a>';
			str += '<a id="'+idToggle+'_off" href="javascript:noop()" name="menubarLink" class="navlink_off" style="display:'+booltocss(!isOn)+';cursor:pointer;"  onmouseover="hiliteMenubar(event, this)">';
				str += '<img src="bits/ArrowClosedBlack.gif" border="0">&nbsp;'+strHeaderName;
			str += '</a>';
			str += '</td></tr></table>';
		str += '</div>';
		return str;
	}
	function getSubMenuToggleHeaderHTML(strClass, idToggle, strHeaderName, isOn) {
		if (!strClass) { strClass = 'nav_submenutoggle'; }
		var str = '';
		str += '<div class="'+strClass+'">';
			str += '<a href="javascript:noop()" id="'+idToggle+'_on" class="navlink_on" style="display:'+booltocss(isOn)+';cursor:pointer;" onmousedown="toggleDivSticky(\''+idToggle+'\')">';
				str += '<img src="bits/ArrowOpenBlack.gif" border="0"> '+strHeaderName;
			str += '</a>';
			str += '<a href="javascript:noop()" id="'+idToggle+'_off" class="navlink_off" style="display:'+booltocss(!isOn)+';cursor:pointer;" onmousedown="toggleDivSticky(\''+idToggle+'\')">';
				str += '<img src="bits/ArrowClosedBlack.gif" border="0">&nbsp;'+strHeaderName;
			str += '</a>';
		str += '</div>';
		return str;
	}
	function getSubMenuCommandHTML(strFunctionCall, strCommandName, strIconName) {
		if (!strIconName) { strIconName = "Blank.gif"; }
		var str = '';
		str += '<a href="javascript:'; 
		str += strFunctionCall;
		str += '" class="navlink_off" onMouseOver="menu_t = 2;"  onclick="menu_t = 0; delayHide();">'; //onMouseOut="menu_t = 1; delayHide()" 
		str += '<img src="bits/'+strIconName+'" width="13" height="13" border="0">&nbsp;'+strCommandName;
		str += '</a><br>';
		return str;
	}
	function getAccessStr (nAccess) {
		if (nAccess < 1) 		{ return 'Offline - Editors Only'; 		}
		else if (nAccess < 2) 	{ return 'Online - Restricted'; 	}
		else 					{ return 'Online - Open to Everyone';	}
	}
	function getAccessRolesStr (strRoleAccessList) {
		var str = '';
		if (strRoleAccessList) {
			str += 'You must be signed in as ';
			var aRoleAccess = strRoleAccessList.split('::');
			var mx = aRoleAccess.length-1;
			for (var i = 0; i < mx; i++) {
				str += aRoleAccess[i];
				if (i < mx-1) { str += ', '; }
			}
			str += ' or be a member ';
			str += 'to access its information.';
		}
		return str;
	}

	function getDetailsLabel(f) {
		if (f) { return 'hide details'; }
		return 'show details';
	}
	function getMenuState (id,d) {
		var f = GetCookie(id);
		if (f == null) { return d; }
		return (f == 'true');
	}
	function getMenuDisplay (f) {
		if (f) { return 'display:block;'; }
		return 'display:none;';
	}
	function getSponserBlockHTML (n) {
		var str = '';
		for (var i = 0; i < gaSponsorships.length - 1; i++) {
			var aSP = gaSponsorships[i].split('|');
			var SponsorshipTypeId = aSP[0];
			if (SponsorshipTypeId == n) {
			
				var SponsorName 	= aSP[1];
				var ImageFile	 	= aSP[2];
				var ImageURL	 	= aSP[3];
				var ImageCaption	= aSP[4];
				var xPix			= aSP[5];
				var yPix			= aSP[6];
				var startDate		= aSP[7];
				var endDate			= aSP[8];
				var afid			= aSP[9];
				var aftag			= aSP[10];

				var aF = getFileInfo(ImageFile);
				var fIsAcceptedType = aF[0];
				var fIsImage 		= aF[1];
				var strExt 			= aF[2];
				var strExtName 		= aF[3];
				
				ImageFile = unescape(ImageFile);
				
				if (afid && aftag) {
					if (ImageURL.match(/\?/)) { ImageURL += '&'; } else { ImageURL += '?'; }
					ImageURL += aftag+'='+afid;
				}
				
				if (strExtName == 'xobject') { 
					str += ImageFile.replace(/>/g, ' class="sponsorimage" border="0" style="width:'+xPix+'px;height:'+yPix+'px;" width="'+xPix+'" height="'+yPix+'">');
				} else if (strExtName == 'xcontent') { 
					str += '<a href="javascript:showWebsite(\''+escape(ImageURL)+'\',0,0)"><img class="sponsorimage" style="width:'+xPix+'px;height:'+yPix+'px" src="'+ImageFile+'" width="'+xPix+'", height="'+xPix+'", title="'+ImageCaption+'" alt="'+SponsorName+'" border="0"></a>';
				} else if (ImageFile) {
					str += '<a href="javascript:showWebsite(\''+escape(ImageURL)+'\',0,0)"><img class="sponsorimage"  src="'+pubPixDir()+'/sponsors/'+ImageFile+'" , title="'+ImageCaption+'" alt="'+SponsorName+'" border="0"></a>';
				}
				
			}
		}
		return str;
	}
	function drawSponserCol () {
		var str = '';
		var strRightLinks = '<a href="'+gstrSponsorLink+'" >'+gstrSponsorLinkLabel+'</a>';
		str += getSubHeadWithRightHTML(gstrSponsorHead,'',2,'site',strRightLinks);
		str += getSponserBlockHTML(0);
		str += '<div class="rip_colbox_narrow">';
			str += '<div class="rip_text_main">';
				str += gstrSponsorText;
				//var cSponsorsCmdId = 68;
				//var fIsSponsorsAdmin = hasAdminCmd(cSponsorsCmdId);
				//if (fIsSponsorsAdmin) {
					//str += '<div class="nav_extraz"><a href="javascript:adminCommand(cSponsorsCmdId, 0)">Manage Sponsorships...</a></div>';
				//}
			str += '</div>';
		str += '</div>';
		document.writeln(str);
	}
	function drawBrand() {
		var str = '';
		str += '<div class="brand" id="brand" onmouseover="showFooterDetails(event,\'brand\')" onmouseout="hideFooterDetails(event,\'brand\')">';
			str += '<a target="_blank" href="'+gstrInterpelago+'">interpelago</a>';
			str += '<div class="brandlink" id="brandbot" style="visibility:hidden">';
				str += '<a href="javascript:tellafriend()">tell a friend...</a>';
			str += '</div>';
		str += '</div>'
		document.writeln(str);
		SetCookie('transcode','');
	}
	function getOneResourceHTML(aR,i,fExternal) {
		var idRes			= aR[0];
		var strTitle 		= aR[1];
		var strDescription 	= aR[2];
		var strPhotoURL		= aR[3];
		var strFolderName	= aR[4];
		var idResType		= aR[5];
		var strResTypeName	= aR[6];
		var isEditor		= aR[7];
		var isContact		= aR[8];
		var str = '';
		var idTag = 'res';
		if (fExternal) { idTag += 'x'; }
		var iconRT = "ResourceBlack.gif";
		var iconTip = 'Member';
		if (isContact == 1) { 
			iconTip = 'Primary Contact';
		}
		if (isEditor) {
			iconTip += ' & Editor';
		}
		iconTip += '. Click to view...';
		if (!gfRDetails && !fExternal) {
			str += '<div class="myresource_text">';
				str += '<a class="myplainlink" href="javascript:showRIP('+idRes+')" title="'+iconTip+'"><img src="/bits/'+iconRT+'" border="0"> '+trimStringCenter(strTitle,28)+'</a>';
			str += '</div>';
			return str;
		}
		if (!strPhotoURL) {
			strPhotoURL = 'resourcetype-'+idResType+'.jpg';
		}
		var strRTip = '';
		var strJSCall = 'showExternalRIP';
		if (hasSession()) {
			strJSCall = 'showRIP';
		}
		if (!fExternal) {
			str += '<div id="'+idTag+i+'" onmouseover="showCellDetails(event,\''+idTag+i+'\')" onmouseout="hideCellDetails(event,\''+idTag+i+'\')">';
		} else {
			str += '<div id="'+idTag+i+'">';
		}
			str += '<table cellspacing="0" cellpadding="0">';
			str += '<tr>';
			// PHOTO
			var urlThumb = getThumbURL('RIP',strPhotoURL) 
			str += '<td class="mygroup_thumbnail"><a href="javascript:'+strJSCall+'('+idRes+')" title="'+strRTip+'" alt=""><img src="'+urlThumb+'" class="pixtdmediumright"></a></td>';
			str += '<td class="mygroup_contactinfo">';
			str += '<div class="mygroup_text">';
				if (!fExternal) {
					str += '<div id="'+idTag+i+'top" style="visibility:hidden;">';
						str += '<img src="/bits/'+iconRT+'" border="0"  title="'+iconTip+'" >';
						if (isEditor) {
							var iconEd = "PencilBlack.gif"; 
							str += '&nbsp;<img src="/bits/'+iconEd+'" border="0"  title="'+iconTip+'" >';
						}
						str += '&nbsp;';
					str += '</div>';
				}
				str += '<a id="pub'+i+'_trim" class="mygroup_namelink" href="javascript:'+strJSCall+'('+idRes+')" title="'+strRTip+'" alt="">'+strTitle+'</a>';
				if (!fExternal) {
					str += '<div id="'+idTag+i+'bot" style="visibility:hidden;">';
						str += '<a class="cellinfo" href="javascript:'+strJSCall+'('+idRes+')" title="'+strRTip+'" alt="">go to page</a>';
						str += '&nbsp;';
					str += '</div>';
				}
			str += '</div>';
			str += '</td></tr>';
			str += '</table>';
		str += '</div>';
		return str;
	}
	function getOneLocationHTML(aR,i) {
		var idLoc			= aR[0];
		var strTitle 		= aR[1];
		var strDescription 	= aR[2];
		var strPhotoURL		= aR[3];
		var strFolderName	= aR[4];
		var idLocType		= aR[5];
		var strResTypeName	= aR[6];
		var isEditor		= aR[7];
		var isContact		= aR[8];
		var str = '';
		var idTag = 'loc';
		var iconRT = "LocationBlack.gif";
		var iconTip = 'Member';
		if (isContact == 1) { 
			iconTip = 'Primary Contact';
		}
		if (isEditor) {
			iconTip += ' & Editor';
		}
		iconTip += '. Click to view...';
		if (!gfLDetails) {
			str += '<div class="mylocation_text">';
				str += '<a class="myplainlink" href="javascript:showLIP('+idLoc+')" title="'+iconTip+'"><img src="/bits/'+iconRT+'" border="0"> '+trimStringCenter(strTitle,28)+'</a>';
			str += '</div>';
			return str;
		}
		if (!strPhotoURL) {
			strPhotoURL = 'locationtype-'+idLocType+'.jpg';
		}
		var strRTip = '';
		var strJSCall = 'showLIP';
		str += '<div id="'+idTag+i+'" onmouseover="showCellDetails(event,\''+idTag+i+'\')" onmouseout="hideCellDetails(event,\''+idTag+i+'\')">';
			str += '<table cellspacing="0" cellpadding="0">';
			str += '<tr>';
			// PHOTO
			var urlThumb = getThumbURL('LIP',strPhotoURL) 
			str += '<td class="mygroup_thumbnail"><a href="javascript:'+strJSCall+'('+idLoc+')" title="'+strRTip+'" alt=""><img src="'+urlThumb+'" class="pixtdmediumright"></a></td>';
			str += '<td class="mygroup_contactinfo">';
			str += '<div class="mygroup_text">';
				str += '<div id="'+idTag+i+'top" style="visibility:hidden;">';
					str += '<img src="/bits/'+iconRT+'" border="0"  title="'+iconTip+'" >';
					if (isEditor) {
						var iconEd = "PencilBlack.gif"; 
						str += '&nbsp;<img src="/bits/'+iconEd+'" border="0"  title="'+iconTip+'" >';
					}
				str += '</div>';
				str += '<a id="pub'+i+'_trim" class="mygroup_namelink" href="javascript:'+strJSCall+'('+idLoc+')" title="'+strRTip+'" alt="">'+strTitle+'</a>';
				str += '<div id="'+idTag+i+'bot" style="visibility:hidden;">';
					str += '<a class="cellinfo" href="javascript:'+strJSCall+'('+idLoc+')" title="'+strRTip+'" alt="">go to page</a>';
				str += '</div>';
			str += '</div>';
			str += '</td></tr>';
			str += '</table>';
		str += '</div>';
		return str;
	}
	function drawExtraz() {
		var str = '';
		str += '<div class="nav_commands" style="border-top: 1px solid white; ">';
			str += '<table cellspacing="0" cellpadding="0" class="page_sectionhead_table_narrow"><tr><td>';
				str += '<div class="nav_extraz" >';
					for (var i = 0; i < gaPublicResources.length - 1; i++) {
						var aR = gaPublicResources[i].split('|');
						str += getOneResourceHTML(aR,i,true);
					}
				str += '</div>';
			str += '</td></tr></table>';
		str += '</div>';
		document.writeln(str);
	}
	//
	// Page-specific menus to fit under Links
	//
	function drawSiteAdminMenus (idPage) {
		var str = getSiteAdminMenusHTML(idPage);
		document.writeln(str);
	}
	function drawPageAdminMenus (strName, nType, idPage, fsticky) {
		var str = getPageAdminMenusHTML(strName, nType, idPage, fsticky);
		document.writeln(str);
	}
	function viewPageDefault (nType) {
		for (var i = 0; i < aPBResLinks.length - 1; i++) { // rip|734|Site Setup|99|0
			var aNL = aPBResLinks[i].split('|');
			var strType 	= aNL[0];
			var id 			= aNL[1];
			var nT 			= aNL[3];
			if ((strType == 'rip') && (nT == (100 + nType))) {
				showRIP(id);
			}
		}
	}
	function plugadmin (ob,strName,nType,idPage) {
		ob.parentNode.innerHTML = getPageAdminMenusHTML(strName,nType,idPage,false);
	}
	function getPageAdminMenuPlugHTML(strName, nType, idPage) {
		return '<div id="'+idPage+'" class="nav_submenutoggle_top" onmouseover="plugadmin(this,\''+strName+'\',\''+nType+'\',\''+idPage+'\')"><img src="bits/ArrowClosedBlack.gif" border="0"> '+strName+'</div>';
	}
	function getPageAdminMenusHTML (strName, nType, idPage, fsticky) {
		var strItems = '';
		for (var i = 6; i < aPBOther.length - 1; i++) {
			var aCmds = aPBOther[i].split('|');
			var idCmd		= aCmds[0];
			var strHeader	= aCmds[1];
			var strTitle	= aCmds[2];
			var nPageType	= aCmds[3];
			if (nPageType == nType) {
				strItems += getSubMenuCommandHTML('adminCommand('+idCmd+','+idPage+')',strTitle,'Blank.gif');
			}
		}
		var str = '';
		if (strItems) {
			var strMenuId = 'padmin_'+nType+'_'+idPage+'_admin';
			var fDisplay = getMenuState(strMenuId,false);
			if (!fsticky) { fDisplay = false; }
			var strDisplay = getMenuDisplay(fDisplay);
			str += getSubMenuToggleHeaderHTML('nav_submenutoggle_top', strMenuId, strName, fDisplay);
			str += '<div id="'+strMenuId+'" style="'+strDisplay+'">';
				str += '<div class="nav_menubox_top">';
					str += '<div class="nav_commands_top">';
						str += strItems;
					str += '</div>';
				str += '</div>';
			str += '</div>';
		}
		return str;
	}
	function getSiteAdminMenusHTML (idPage) {
		var strItems = '';
		var strCurHeader = '';
		var nMenu = 100;
		for (var i = 6; i < aPBOther.length - 1; i++) {
			var aCmds = aPBOther[i].split('|');
			var idCmd		= aCmds[0];
			var strHeader	= aCmds[1];
			var strTitle	= aCmds[2];
			var nPageType	= aCmds[3];
			if (nPageType == -1) {
				if ((strHeader != strCurHeader) || !strHeader)  {
					if (strCurHeader) {
						strItems += '</div>';
					}
					var fDisplay = getMenuState('admintools'+nMenu,false);
					var strDisplay = getMenuDisplay(fDisplay);
					strItems += getSubMenuToggleHeaderHTML('nav_submenutoggle_top', 'admintools'+nMenu, strHeader, fDisplay);
					strItems += '<div class="nav_commands_top" id="admintools'+nMenu+'" style="'+strDisplay+'">';
					strCurHeader = strHeader;
					nMenu++;
				}
				strItems += getSubMenuCommandHTML('adminCommand('+idCmd+','+idPage+')',strTitle,'Blank.gif');
			}
		}
		if (strCurHeader) {
			strItems += '</div>';
		}
		return strItems;
	}
	function getDistLink(nType,id) {
		var str = '';
		str += ' <a href="javascript:dlgGroupItemDistribution('+nType+','+id+')" title="Click to see the distribution groups for this item..." class="cellinfo">(dist.)</a>';
		return str;
	}
	//var aDiscussions = new Array();
	function getCommentLink(idBulletin, strCategoryName, nComments, fAllowComments) {
		var str = '';
		if (fAllowComments || (nComments > 0)) { 
			var strName = nComments + ' Comments';
			var strTitle = 'Click to read this discussion...';
			if (fAllowComments) {
				var strid = 'clink'+idBulletin;
				strName = '<span id="'+strid+'" class="surveylink_live">'+strName+'</span>';
				strTitle = 'Click to participate in this discussion...';
				//aDiscussions.push(strid);
			}
			str += '<a href="Javascript:showBulletin('+idBulletin+')" title="Click to participate in this discussion...">'+strName+'</a>';
		}
		return str;
	}
	//function glowDiscussions() {
	//	for (var i = 0; i < aDiscussions.length; i++) {
	//		setInterval('doGlow("'+aDiscussions[i]+'")',100);
	//	}
	//}
	
//================================
//
//	SEARCH & POST MENUS
//
//================================

	function drawPlanMenu (aEvents, fShowPostLinks, idG, fShowComments, idUser) {
		// Mini Calendar
		return;
		if (fShowPostLinks) {
			var str = '';
			var fDisplay = getMenuState('nav_plan',false);
			var strDisplay = getMenuDisplay(fDisplay);
			str += getMenuToggleHeaderHTML('nav_plan_menu','nav_plan','Plan', fDisplay, '');
			str += '<div id="nav_plan" style="'+strDisplay+'">';
				str += '<div id="gip_calendar_area" style="border-top: 1px solid white">';
					str += '<div id="calendarbox">';
						str += '<div id="calmonth1">';
							str += getMiniCalMonthHTML(0, aEvents, fShowPostLinks, idG, fShowComments, idUser);
						str += '</div>'; // end calmonth1
						str += '<div id="calmonth2">';
							str += getMiniCalMonthHTML(1, aEvents, fShowPostLinks, idG, fShowComments, idUser);
						str += '</div>';
					str += '</div>';
				str += '</div>';
			str += '</div>';
			document.writeln(str);
		}
	}
	function drawCommMenus(idG, fShowPostLinks) {
		return;
		if (fGCanEdit || fShowPostLinks) {
			var str = '';
			var fDisplay = getMenuState('nav_com',false);
			var strDisplay = getMenuDisplay(fDisplay);
			str += getMenuToggleHeaderHTML('nav_com_menu','nav_com', 'Post', fDisplay, '');
			str += '<div id="nav_com" style="'+strDisplay+'">';
				str += '<div class="nav_menubox">';
					str += '<div class="nav_commands" style="padding-top:4px;">';
						str += getSubMenuCommandHTML('addEvent(0,0,0,'+idG+',0,0,0)','Upcoming Event or Meeting...', 'EventBlack.gif');
						str += getSubMenuCommandHTML('addGroupMessage('+idG+')','Short Notice or Survey...', 'NoticeBlack.gif');
						str += getSubMenuCommandHTML('addBulletin('+idG+')','Detailed Bulletin or Discussion...', 'BulletinBlack.gif');
					str += '</div>';
				str += '</div>';
			str += '</div>';
			document.writeln(str);
		}
	}
	function drawSearchMenus(isOn) {

		var aStart = gstrStart.split('-');
		var nStartYear 	= aStart[0];
		var nStartMonth = aStart[1];
		var nStartDay 	= aStart[2];
		
		var aEnd = gstrEnd.split('-');
		var nEndYear	= aEnd[0];
		var nEndMonth	= aEnd[1];
		var nEndDay		= aEnd[2];
		
		if (!gstrSearchText) { gstrSearchText = ''; }

		var str = '';
		var strX = 'onmouseup=\"setSearchFocus()\"';
		var fDisplay = getMenuState('nav_search',isOn);
		var strDisplay = getMenuDisplay(fDisplay);
		str += getMenuToggleHeaderHTML('nav_search_menu','nav_search','Search', fDisplay, strX);
		str += '<div id="nav_search" style="'+strDisplay+'">';
			str += '<div class="nav_menubox" >';
				str += '<form style="margin:0px;" name="frmFS" method="POST" action="" enctype="multipart/form-data" onSubmit="return checkFindSiteBox();">';
				str += '<div class="nav_findarea">';
					str += '<input type="text" name="SEARCHTEXT" maxlength="750" class="nav_editbox" value="'+gstrSearchText+'" onKeyPress="return checkSubmit(event)" onblur="SetCookie(\'gstrSearchText\',this.value)">';
					str += '&nbsp;<input type="IMAGE" src="bits/SearchBlack.gif" title="Click to search...">';
				str += '</div>';
				var fDisplay = getMenuState('nav_search_for',true);
				var strDisplay = getMenuDisplay(fDisplay);
				str += getSubMenuToggleHeaderHTML('', 'nav_search_for', 'Search', fDisplay);
				str += '<div class="nav_commands" id="nav_search_for" style="'+strDisplay+'">';
					str += '<img src="bits/Blank.gif"><input type="checkbox" name="SEARCHR" value="0" class="nav_checkbox" '+getChkStr(gfDoR)+'> Libraries<br>';
					str += '<img src="bits/Blank.gif"><input type="checkbox" name="SEARCHB" value="0" class="nav_checkbox" '+getChkStr(gfDoB)+'> Group Bulletins<br>';
					str += '<img src="bits/Blank.gif"><input type="checkbox" name="SEARCHE" value="0" class="nav_checkbox" '+getChkStr(gfDoE)+'> Group Events<br>';
					str += '<img src="bits/Blank.gif"><input type="checkbox" name="SEARCHN" value="0" class="nav_checkbox" '+getChkStr(gfDoN)+'> Group Notices<br>';
					str += '<img src="bits/Blank.gif"><input type="checkbox" name="SEARCHG" value="0" class="nav_checkbox" '+getChkStr(gfDoG)+'> Private Libraries<br>';
					str += '<img src="bits/Blank.gif"><input type="checkbox" name="SEARCHP" value="0" class="nav_checkbox" '+getChkStr(gfDoP)+'> People and Places<br>';
				str += '</div>';
				var fDisplay = getMenuState('nav_search_options',false);
				var strDisplay = getMenuDisplay(fDisplay);
				str += getSubMenuToggleHeaderHTML('', 'nav_search_options', 'Other Search Options', fDisplay);
				str += '<div class="nav_commands" id="nav_search_options" style="'+strDisplay+'">';
					str += '<table cellspacing="0" cellpadding="0" >';
						str += '<tr><td width="13"><img src="bits/Blank.gif"></td><td></td><td></td><td align="center">m</td><td align="center">d</td><td align="center">year</td></tr>';
						str += '<tr><td width="13"><img src="bits/Blank.gif"></td><td align="right">from</td><td>&nbsp;</td>';
						str += '<td><input type="text" name="SEARCHSTARTMONTH" maxlength="2"  class="nav_datebox2" onKeyPress="return forcenum(event);" value="'+nStartMonth+'"></td>';
						str += '<td><input type="text" name="SEARCHSTARTDAY" maxlength="2"  class="nav_datebox2" onKeyPress="return forcenum(event);" value="'+nStartDay+'"></td>';
						str += '<td><input type="text" name="SEARCHSTARTYEAR" maxlength="4"  class="nav_datebox4" onKeyPress="return forcenum(event);" value="'+nStartYear+'"></td>';
						str += '</tr>';
						str += '<tr><td height="2"></td></tr>';
						str += '<tr><td width="13"><img src="bits/Blank.gif"></td><td align="right">to</td><td>&nbsp;</td>';
						str += '<td><input type="text" name="SEARCHENDMONTH" maxlength="2"  class="nav_datebox2" onKeyPress="return forcenum(event);" value="'+nEndMonth+'"></td>';
						str += '<td><input type="text" name="SEARCHENDDAY" maxlength="2"  class="nav_datebox2" onKeyPress="return forcenum(event);" value="'+nEndDay+'"></td>';
						str += '<td><input type="text" name="SEARCHENDYEAR" maxlength="4"  class="nav_datebox4" onKeyPress="return forcenum(event);" value="'+nEndYear+'"></td>';
						str += '</tr>';
						str += '<tr><td height="6"></td></tr>';
					str += '</table>';
					str += '<img src="bits/Blank.gif"><input type="checkbox" name="SEARCHARCHIVED" value="0" class="nav_checkbox" '+getChkStr(gfDoArchived)+'> Include Archived Pages';
				str += '</div>';
				str += '</form>';
			str += '</div>';
		str += '</div>';
		document.writeln(str);
	}
	function checkSubmit(e) {
		if (e.keyCode == 13) { 
			checkFindSiteBox(); 
			return false; 
		}
		return true;
	}
	function forcenum(e) {
		return (e.keyCode == 0 || e.keyCode == 8 || e.keyCode == 9 || (e.keyCode >= 48 && e.keyCode <= 57));
	}
	function setSearchFocus() {
		var ob = getDOM('nav_search',1);
		if (ob.display != 'none') {
			document.frmFS.SEARCHTEXT.focus();
			document.frmFS.SEARCHTEXT.select();
		}
	}
	function getChkStr(f) {
		if (f==1) { return 'checked'; }
		return '';
	}
	function getChk(strBox) {
		var fChecked = eval('document.frmFS.'+strBox+'.checked;');
		if (fChecked) { return 1; }
		return 0;
	}
	function getDate(strFld) {
		var strYear = eval('document.frmFS.SEARCH'+strFld+'YEAR.value;');
		var strMonth = eval('document.frmFS.SEARCH'+strFld+'MONTH.value;');
		var strDay = eval('document.frmFS.SEARCH'+strFld+'DAY.value;');
		return strYear+'-'+strMonth+'-'+strDay;
	}
	function checkFindSiteBox() {
		gstrSearchText = document.frmFS.SEARCHTEXT.value;
		gfDoP = getChk('SEARCHP');
		gfDoR = getChk('SEARCHR');
		gfDoG = getChk('SEARCHG');
		gfDoB = getChk('SEARCHB');
		gfDoE = getChk('SEARCHE');
		gfDoN = getChk('SEARCHN');
		SetCookie('SearchText',gstrSearchText);
		SetCookie('SearchFlags',gfDoP+':'+gfDoR+':'+gfDoG+':'+gfDoB+':'+gfDoE+':'+gfDoN+':');
		var gstrStart = getDate('START');
		var gstrEnd = getDate('END');
		var gfDoArchived = getChk('SEARCHARCHIVED');
		var strCGI = "show_search.cgi?SEARCHTEXT="+gstrSearchText+"&SEARCHR="+gfDoR+"&SEARCHG="+gfDoG+"&SEARCHB="+gfDoB+"&SEARCHE="+gfDoE+"&SEARCHN="+gfDoN+"&SEARCHP="+gfDoP+"&STARTDATE="+gstrStart+"&ENDDATE="+gstrEnd+"&SEARCHARCHIVED="+gfDoArchived;
		top.document.location = gCGIPath+strCGI;		
		return false;
	}
	function checkFindPersonBox(frm) {
		findPersonPowerbar(frm.SEARCHTEXT.value);
		return false;
	}
	function checkFindGroupBox(frm) {
		findGroupPowerbar(frm.SEARCHTEXT.value);
		return false;
	}
	
	function getRShelfLinks (idPage, nPageType, fHasRefs, nSec) {
		var str = '';
		if (fHasRefs) {
			str += '<a href="javascript:changeReferenceOrder('+idPage+','+nPageType+')" title="Change the order...">arrange</a>&nbsp;&middot;&nbsp;';
			str += '<a href="javascript:changeReferenceState('+idPage+','+nPageType+')" title="Show or hide details...">feature</a>&nbsp;&middot;&nbsp;';
			str += '<a href="javascript:removeReferences('+idPage+','+nPageType+')" title="Remove from this page...">remove</a>&nbsp;&middot;&nbsp;';
			// str += '&nbsp;&middot;&nbsp;<a href="javascript:autoUpdateReferences('+idPage+','+nPageType+')" title="Update system resources...">sync</a>&nbsp;&middot;&nbsp;';
		}
		str += '<a href="javascript:findReference('+idPage+','+nPageType+')" title="Add a resource posted elsewhere on the site...">find</a>&nbsp;&middot;&nbsp;';
		str += '<a href="javascript:addReferenceInline('+idPage+','+nPageType+',\'page_refpost'+nSec+'\')" title="Create a new resource for this page...">add</a>';
		return str;
	}


//================================
//
//	DATE FUNCTIONS
//
//================================

	function timeGetYear(dateIn) {
		// IE AND NETSCAPE RETURN DIFFERENT VALUES FOR GETYEAR()!
		var yearIn = dateIn.getYear();
		if (yearIn < 1900) {yearIn += 1900;}
		return yearIn;
	}
	function jsToMysqlDateTime(tDate) { 
		return timeGetYear(tDate) + '-' + (tDate.getMonth() + 1) + '-' + tDate.getDate(); 
	}

	// returns a date object set to "now" for the project's main timezone
	//	-- use this instead of javascript's getNow() to get date object for "now"
	//	-- server passes down current times as "seconds:minutes:hours:day:(month-1):(year-1900):dayOfYear:isDaylightSavings"
	// //	-- convert to local timezone by calculating an offset to the nearest hour on client clock
	var nHourOffset = 0;
	function getNow() {
		var aNow = gServerTime.split(':');
		var tNow = new Date(parseInt(aNow[5]) + 1900, aNow[4],aNow[3],parseInt(aNow[2]),aNow[1],aNow[0]);
		var nNowMs = tNow.getTime();
		// compare hour offset between client and server, then adjust server time.
		var tClient = new Date();
		nHourOffset = Math.round((nNowMs - tClient.getTime())/3600000)%24;
		tNow.setTime(nNowMs - (nHourOffset * 3600000));
		return tNow;
	}
	
	// ---------------------------------------------
	// GET MINI CALENDAR HTML
	//		Creates an HTML Calendar with event days highlighted using data from aEvents array
	//			1. Determine dayA and dayZ of the offset calendar month
	//			2. Look through each event passed in to find matching events for that month
	//			3. For each matching event get data
	//			4. Record which days have events
	//			5. Build calendar HTML
	//			6. Return HTML string
	//		parameters:
	// 			nMonthOffset = number of months +/- from current month
	// 			aEvents = format: "EventId|EventTypeId|EventTypeName|StartTime|EndTime|Author|Title|Description|Email|URL|Person.DisplayName"
	// 			fEditOK = allow clicks on days to bring up add event dialog
	//
	function getMiniCalMonthHTML(nMonthOffset, aEvents, fEditOK, idGroup, fShowComments, idUser) {

		var strHTMLCal = ""; 	//calendar table
		
		// ---------------------------------------
		// 1. Determine dayA and dayZ of the month
		// 		-- A Today's date
		var tToday =  getNow();
		var msecToday = tToday.getTime(); 		
		var nTodayDay = tToday.getDate();
		var nTodayMonth = tToday.getMonth()+1;
		var nTodayYear = timeGetYear(tToday);
		
		// 		-- B Displayed Calendar Month info
		//			 Offset from this month by nMonthOffset
		var tDayA = getNow();	// date object for first day of the month
		var tDayZ = getNow();	// date object for last day of month
		var tCal = getNow();	// date object for displayed calendar month. holds first day.
		var	nCalMonth; 			// 0-11 index of cal month
		var	nCalYear; 			// year (ex. 2002)
		var	nDayOneOfCal; 		// 0-6 index of weekday for first day in cal month
		var	nDaysInCalMonth;	// number of days in the cal month
		var	fCalThisMonth;		// true if displayed cal month is todays month
		var aCalClassSession = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
		var aCalGeneralEvent = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
		var aCalEventIdList  = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
				// OFFSET to day one of correct month
		tCal.setDate(1);
		tCal.setMonth(tToday.getMonth() + nMonthOffset); 
		tCal.setHours(12);
		tDayA.setTime(tCal.getTime());
				// determine if today is in this month
		nCalMonth = tCal.getMonth() + 1;
		nCalYear = timeGetYear(tCal);
		if (nCalYear < 1000) {nCalYear += 1900;} //netscape and ie give different values for getYear!
		fCalThisMonth = ((nCalMonth == nTodayMonth) && (nCalYear == nTodayYear));
				// get weekday of first day in cal month
		nDayOneOfCal = tCal.getDay(); 	// weekday number of first day of month
				// get number of days in cal month
		nDaysInCalMonth = getDaysInMonth(tCal);
		tCal.setMonth(nCalMonth-1);
		tCal.setDate(1);
				// determine last day of month
		tDayZ.setTime(tDayA.getTime());
		tDayZ.setDate(nDaysInCalMonth);			
		
		var strCalThisMonth = aMonths[nCalMonth-1];
		var strCalNextMonth = aMonths[nCalMonth];


		// ---------------------------------------
		//	2. check each event get data
		//
		for (var i = 0; i < aEvents.length - 1; i++) {
		
			var aP = aEvents[i].split("|");
			var idEvent			= aP[0];
			var strTitle 		= aP[3];
			var nType 			= aP[17];
			
			var strStartDate 	= aP[8];
			var aDInfo 			= parseMysqlDatetime(strStartDate);
			var nStartYear 		= aDInfo[0];
			var nStartMonth 	= aDInfo[1];
			var nStartDay 		= aDInfo[2];
			var nStartH 		= aDInfo[3];
			var nStartM 		= aDInfo[4];

			var strEndDate 		= aP[9];
			var aDInfo 			= parseMysqlDatetime(strEndDate);
			var nEndYear 		= aDInfo[0];
			var nEndMonth 		= aDInfo[1];
			var nEndDay 		= aDInfo[2];
			var nEndH 			= aDInfo[3];
			var nEndM 			= aDInfo[4];

			//  3. see if in correct year and month
			if (((nStartYear == nCalYear) && (nStartMonth == nCalMonth)) || ((nEndYear == nCalYear) && (nEndMonth == nCalMonth))) {
			
				for (var n = nStartDay; n <= nEndDay; n++) {
		
					//	4. Record event info for that day
					//		-- first record event title
					//		-- then record if classSession event on that day 
					if (nType == 2) { 
						aCalClassSession[n - 1] += '\n - '+ getTimeString (nStartH,nStartM) + ' ' + strTitle;
					} else {
						aCalGeneralEvent[n - 1] += '\n - '+ getTimeString (nStartH,nStartM) + ' ' + strTitle;
					}
					aCalEventIdList[n - 1] += ':'+idEvent+':';
					
				}
			}
			
		}
	
		// ---------------------------------------
		//	5. Build calendar HTML
		strHTMLCal = '';
		// month name and link to other month
		strHTMLCal = '<div class="mid_sectionhead_narrow">';
		strHTMLCal += '<table cellspacing="0" cellpadding="0" class="page_sectionhead_table_narrow"><tr>';
		// strHTMLCal += '<td class="dlg_sectionhead_text"><a class="cal_montharrow" href="javascript:showEventPreview(event,aEvents,aEventRecips,\'\',fShowPostLinks,fShowComments,\'\',1)" title="Click to view all the events for this month...">'+ strCalThisMonth+'</a></td>';
		if (fCalThisMonth) {
			strHTMLCal += '<td class="dlg_sectionhead_text_accent"><a href="javascript:viewPIPCalendarReport('+idUser+',0)" title="Click to open the large event calendar...">'+ strCalThisMonth+'</a></td>';
			strHTMLCal += '<td class="page_sectionhead_text" align="right"><img src="bits/calnext_off.gif" width="10" height="10"><span class="cal_subhead_links_accent"><a href="javascript:showCal(2);">&nbsp;next month</a></span></td>';
		} else {
			strHTMLCal += '<td class="dlg_sectionhead_text_accent"><a href="javascript:viewPIPCalendarReport('+idUser+',1)" title="Click to open the large event calendar...">'+ strCalThisMonth+'</a></td>';
			strHTMLCal += '<td class="page_sectionhead_text" align="right"><img src="bits/calprev_off.gif" width="10" height="10"><span class="cal_subhead_links_accent"><a class="cal_subhead_links_accent" href="javascript:showCal(1);">&nbsp;this month</a></span></td>';
		}
		strHTMLCal += '</tr></table>';
		strHTMLCal += '</div>';
		// calendar itself
		strHTMLCal += '<div class="cal_boxarea">';
		// DIMENSIONS
		var dxCALBOX = 200;
		var dyCALBOX = 150;
		var dxDAYBOX = 28;			// total width of the box
		var dxDAYBOXWEEKEND = 30;	// total width of the box
		var wDAYBOX = 25;			// 25(width) 	+ 2(pad-right) 	+ 1(border-right) 	= 28px = dxDAYBOX
		var wDAYBOXWEEKEND = 27;	// 27(width) 	+ 2(pad-right) 	+ 1(border-right) 	= 30px = dxDAYBOXWEEKEND
		var dyDAYBOX = 22;			// total height of the box
		var dyDAYNAMEBOX = 18;			// total height of the box
		var hDAYBOX = 19;			// 19(height) 	+ 2(pad-top) 	+ 1(border-top) 	= 22px;
		var hDAYNAMEBOX = 15;		// 15(height) 	+ 2(pad-top) 	+ 1(border-top) 	= 18px;
		// give box right size since everything else absolutely positioned
		strHTMLCal += '<img src="bits/spacer.gif" width="200" height="150" alt="" border="0">';
		// day names
		for (var j=0; j < 7; j++) {
			// -- create style for x,y,dx,dy for each cell
			var styleExtra = ' style ="position:absolute; height:15px; top: 0px;';
			if (j == 0) {
				styleExtra += ' left:0px;';
			} else { 
				styleExtra += ' left:'+(dxDAYBOXWEEKEND +((j-1)*dxDAYBOX))+'px;';
			}
			if ((j == 0) || (j == 6)) {
				styleExtra += ' width:27px;';
			} else {
				styleExtra += ' width:25px;';
			}
			styleExtra += '" ';
			// -- create the cell
			strHTMLCal += '<div class="cal_dayname"'+styleExtra+'>' + aDaysShort[j] + '</div>';
		}
		// day numbers
		var iDay = 0 - nDayOneOfCal; 				//0-based -- set to negative for number of blank days at start of month
		for (var iW=0; iW<6; iW++) {
			for (var iD=0; iD <7; iD++) {
				// -- create style for x,y,dx,dy for each cell
				var styleExtra = ' style ="position:absolute; height:19px;';
				var previewTitle = aDays[iD] + ', ' + (iDay+1) + ' ' + aMonths[nCalMonth-1]  + ' ' + nCalYear;
				if ((iD == 0) || (iD == 6)) {
					styleExtra += ' width:27px;';
				} else {
					styleExtra += ' width:25px;';
				}
				if (iD == 0) {
					styleExtra += ' left:0px;';
				} else { 
					styleExtra += ' left:'+(dxDAYBOXWEEKEND +((iD-1)*dxDAYBOX))+'px;';
				}
				styleExtra += ' top:'+((iW*dyDAYBOX)+dyDAYNAMEBOX)+'px;';
				styleExtra += '" ';
				
				// -- create the cell
				var fInPast = false;
				if ((iDay < 0) || (iDay >= nDaysInCalMonth)) {
					//blank day
					strHTMLCal += '<div class="tdcalempty"'+styleExtra+' onclick="hideEventPreview()">&nbsp;</div>';
				} else {
					// numbered day
					//		...does it have any events?
					var fHasClassEvents = false;
					var fHasGeneralEvents = false;
					if (aCalClassSession[iDay] != 0) {fHasClassEvents = true;}
					if (aCalGeneralEvent[iDay] != 0) {fHasGeneralEvents = true;}

					var strHREFDay = '';
					if (fEditOK) {
						strHREFDay += 'addEvent(';
					} else {
						strHREFDay += 'noaddEvent(';
					}
					strHREFDay += (iDay+1) + ',' + nCalMonth  + ',' + nCalYear + ',' + idGroup + ',0,0,0) ';
					// 		...first set correct stylesheet info
					if ((fCalThisMonth) && (iDay+1 == nTodayDay)) { 
						// today
						if (fHasGeneralEvents) {
							strHTMLCal += '<div class="tdcaltodayEvents"'+styleExtra+'>';
						} else {
							strHTMLCal += '<div class="tdcaltoday"'+styleExtra+'>';
						}
					} else if ((fCalThisMonth) && (iDay+1 < nTodayDay)) { 
						// in past
						if (fHasGeneralEvents) {
							strHTMLCal += '<div class="tdcalinpastEvents"'+styleExtra+'>';
						} else {
							strHTMLCal += '<div class="tdcalinpast"'+styleExtra+'>';
						}
						fInPast = true;
					} else {
						// in future
						if (fHasGeneralEvents || fHasClassEvents) {
							strHTMLCal += '<div class="tdcalfutureEvents"'+styleExtra+'>';
						} else {
							strHTMLCal += '<div class="tdcalfuture"'+styleExtra+'>';
						}
					}
					// -- put the ClassSession marker in if there are class session this day
					var strLinkTitle = "";
					if (fHasGeneralEvents) {
						strLinkTitle += '\n\nGENERAL EVENTS';
						var strTemp = aCalGeneralEvent[iDay];
						strLinkTitle += strTemp.substring(1,strTemp.length);
					}
					if (fHasClassEvents) {
						strLinkTitle += '\n\nREGULAR MEETINGS';
						var strTemp = aCalClassSession[iDay];
						strLinkTitle += strTemp.substring(1,strTemp.length);
					}
					if (fHasClassEvents || fHasGeneralEvents) {
						var strTemp = aCalClassSession[iDay];
						var idList = aCalEventIdList[iDay];
						if (fInPast) {
							strHTMLCal += '<img class="calCellIcon" src="bits/cal-mark4.gif" width="8" height="8" ';
						} else {
							strHTMLCal += '<img class="calCellIcon" src="bits/cal-mark3.gif" width="8" height="8" ';
						}
						strHTMLCal += 'onclick="showEventPreview(event,aEvents,aEventRecips,\''+idList+'\',fShowPostLinks,fShowComments,\''+previewTitle+'\',2)" alt="" title="Click to view the events for this day..." border="0">';
						//strHTMLCal += 'alt="Click to view these events...'+strLinkTitle+'" border="0">';
					}
					// -- create day number link
					var strClass = "";
					if (fHasGeneralEvents || fHasClassEvents) {
						if (fInPast) {
							strClass = 'calDayEventInPast';
						} else {
							strClass = 'calDayEvent';
						}
						
					} else {
						if (fInPast) {
							strClass = 'calDayNoEventInPast';
						} else {
							strClass = 'calDayNoEvent';
						}
					}
					strLinkTitle = '';
					if (fEditOK) {
						strLinkTitle = '...click to post an event on this day';
					}
					strHTMLCal += '<a class="'+strClass+'" href="javascript:'+strHREFDay+'"';
					strHTMLCal += ' title="'+ strLinkTitle +'">';
					strHTMLCal += (iDay+1);
					strHTMLCal += ' </a>';
					// -- finish cell
					strHTMLCal += '</div>';
				}
				iDay++;
			}
		}
		strHTMLCal += "</div>";
		
		// --------------------------
		// 6. RETURN HTML STRING
		return strHTMLCal;
	}
	function showCal(nCal) {
		var dom1 = getDOM("calmonth1",1);
		var dom2 = getDOM("calmonth2",1);
		if (nCal == 1) {
			dom1.zIndex = 10;
			dom2.zIndex = 8;
		} else {
			dom1.zIndex = 8;
			dom2.zIndex = 10;
		}
	}

	// ---------------------------------------
	// CREATE DATE CHOOSER MONTHS 
	//		-- 3x4 table
	//		-- each row 3 months
	//		-- one year starting with month containing in global gnSchoolYearSwitchMonth and year (nYear)
	//		-- each day has link that calls chosedate(strDate) where strDate = DD-MM-YYYY
	function getDateChooserHTML(nYear) {

		// -- GET FIRST DAY INFO 
		// 		1. dayA
		var iYear		= nYear;
		var iMonth 		= gnSchoolYearSwitchMonth - 1;
		var iStartDay 	= 1;
		var str = '';
		
		// START OUTER TABLE
		str += '<table cellpadding="1"><tr>';
		// FOR EACH MONTH
		for (var m = 0; m < 12; m++) {
		
			// -- start new row if needed
			if ((m%3 == 0)) {
				str += '</tr><tr>';
			}
		
			// -- FIGURE MONTH INFO
			var tDayA 			= new Date(iYear,iMonth,1, 0, 0, 0); 
			var nDayOneOfCal 	= tDayA.getDay(); 			// weekday number of first day of month
			var nDayZ 			= getDaysInMonth(tDayA);	// get number of days in cal month
			var iMonthLink		= iMonth + 1;
						
			// -- START EACH MONTH TABLE in own outer table td
			str += '<td valign="top">';
			str += '<table cellspacing="0" cellpadding="2" width="70" >';				
			str += '<tr>';
				for (var i = 0; i < 7; i++ ) {
					str += '<td><img src="bits/spacer.gif" width="10" height="1" alt="" border="0"></td>';
				}
			str += '</tr>';
			
			// -- MONTH NAME
			str += '<tr>';
				str += '<td colspan="7" style="font-weight: bold;"><span class="date_chooser_text">'+aMonths[iMonth]+' '+iYear+'</span></td>';
			str += '</tr>';
			
			// -- WEEKDAY NAMES
			str += '<tr>';
				for (var i = 0; i < 7; i++ ) {
					str += '<td class="date_chooser_weekdayname"><span class="date_chooser_text">'+aDaysInitial[i]+'</span></td>';
				}
			str += '</tr>';
			
			// -- DAY BOXES		
			var iDay = 1 - nDayOneOfCal; 				//0-based -- set to negative for number of blank days at start of month
			for (var row = 0; row < 6; row++ ) {
				if ((row == 5) && (iDay > nDayZ)) {
					// empty bottom row...skip it
					break;
				}
				str += '<tr>';
				for (var col = 0; col < 7; col++) {
					var strBorderStyle = 'date_chooser_weekday';
					if (col == 0) { strBorderStyle = 'date_chooser_sat'; }
					else if (col == 6) { strBorderStyle = 'date_chooser_sun'; }
					var strDayCodeStyle = 'DAY_'+iYear+'_'+iMonthLink+'_'+iDay;
					str += '<td align="right" class="'+strBorderStyle+'"><span class="date_chooser_text">';
					if ((iDay <= 0) || (iDay > nDayZ)) {
						// non-numbered day...just put space in it
						str += '&nbsp;';
					} else {
						// numbered day
						// -- ADD DAY NUMBER
						str += '<div class="'+strDayCodeStyle+'">';
							str += '<a class="date_chooser_daynum" href="javascript:chosedate(\''+iYear+'-'+iMonthLink+'-'+iDay+'\')">';
							str += iDay;
							str += '</a>';
						str += '</div>';
					}
					// -- END CELL FOR THIS DAY
					str += '</span></td>';
					iDay++;
				}
				// -- END ROW
				str += '</tr>';
			}

			str += '</table>';
			str += '</td>';
			iMonth++;
			if (iMonth >= 12) { 
				iMonth = 0; 
				iYear++;
			}
		} // --for each month
		
		// end table
		str += '</tr></table>';
		return str;
		
	}

	function chosedate(strDate) {
	// -- called by Date Chooser
		showDateChooser(false);
		// dateDisplay format yyyy-mm-dd
		SetCookie ('scheduleDay',strDate,null,'/',null,false); 
		clearDays();
		refreshPage();
	}

	function changeDateChooserYear(dYears) {
		nDateChooserYear = parseInt(nDateChooserYear) + parseInt(dYears);
		SetCookie ('dateChooserYear',nDateChooserYear,null,null,null,false); 
		showDateChooser(true);
	}

	function showDateChooser(fShow) {
		//	-- insert html and show preview box in correct location
		var domStyle = getDOM('date_chooser',1);
		if (fShow) {
			// get year to show
			// put into dialog
			var dom = getDOM('date_chooser_container',0);
			dom.innerHTML = getDateChooserHTML(nDateChooserYear);
			domStyle.display = 'block';		
		} else {
			domStyle.display = 'none';		
		}
	}

	// ---------------------------------------------
	// GET EVENT DATE HTML STRING
	// 		-- new mySQL date version
	//		-- strEStart and strEEnd format: 2003-06-28 09:00:00
	//		-- nFormat 
	//				1=long   ex: Wednesday, 31 May, 9:00a-2:00p
	//				0=short  ex: 31 May, 9:00a-2:00p
	function getEventDateHTML(strEStart, strEEnd, nFormat) {
		strReturn = '';

		//
		//	1. CALCULATE DATA
		//
		
		// get start date pieces
		var aD = parseMysqlDatetime(strEStart);
		var nStartYear 		= aD[0];
		var nStartMonth		= aD[1];
		var nStartDay 		= aD[2];
		var nStartHour		= aD[3];
		var nStartMinute	= aD[4];
		var nStartSecond	= aD[5];
		
		// get end date pieces
		aD = parseMysqlDatetime(strEEnd);
		var nEndYear 		= aD[0];
		var nEndMonth		= aD[1];
		var nEndDay 		= aD[2];
		var nEndHour		= aD[3];
		var nEndMinute		= aD[4];
		var nEndSecond		= aD[5];
		
		// 		-- today. set to mid-day so can compare safely to day start and day end of event days
		var tToday = getNow();
		tToday.setHours(12);
		var nTodayDay 		= tToday.getDate();
		var nTodayMonth 	= tToday.getMonth() + 1;
		var nTodayYear 		= timeGetYear(tToday);
		var msecTodayMidDay		= tToday.getTime();
		var msecTomorrowMidDay 	= msecTodayMidDay + msecOneDay; // ok to add msecOneDay because just need approx mid-day value
		
		// 		-- tE1: exact start time of event to the second
		var tE1 = new Date(nStartYear,nStartMonth-1,nStartDay, nStartHour, nStartMinute, nStartSecond); 
		var msecE1 = tE1.getTime();
		var nWeekday = tE1.getDay();
		
		// 		-- tE2: exact end time of event to the second
		var tE2 = new Date(nEndYear,nEndMonth-1,nEndDay, nEndHour, nEndMinute, nEndSecond); 
		var msecE2 = tE2.getTime();

		//		-- tE1DayBegins: first second in the day the event starts, for date comparisions
		var tE1DayBegins = new Date(nStartYear,nStartMonth-1,nStartDay, 0, 0, 0); 
		var msecE1DayBegins = tE1DayBegins.getTime();
		
		//		-- tE2DayEnds: last second in the day the event ends, for date comparisions
		var tE2DayEnds = new Date(nEndYear,nEndMonth-1,nEndDay, 23, 59, 59); 
		var msecE2DayEnds = tE2DayEnds.getTime();
		
		//
		//	2. BUILD STRING
		//
		
		// 		2a: TODAY, TOMORROW or DAYNAME
		//		-- only for long format
		if (nFormat == 1) {
			if ((msecTodayMidDay > msecE1DayBegins) && (msecTodayMidDay < msecE2DayEnds)) {
				strReturn += 'Today';				
			} else if ((msecTomorrowMidDay > msecE1DayBegins) && (msecTomorrowMidDay < msecE2DayEnds)) {
				strReturn += 'Tomorrow';										
			} else {
				strReturn += aDaysShort[nWeekday];
			}
			strReturn += ', ';
		}
		// nFormat 2: abbreviated to just the time, excluding day/date information
		if (nFormat != 2) {
			// 		2b: DAY MONTH or DAY MONTH - DAY MONTH
			//		-- ex: 31 May 
			//		-- ex: 9 May - 12 May
			//		-- ex: 31 May - 2 Jun
			strReturn += nStartDay + ' ' +  aMonthsShort[nStartMonth-1];
			if (nStartDay != nEndDay) {
				strReturn += ' - ' + nEndDay + ' ' + aMonthsShort[nEndMonth-1];
			}
			//		2c: YEAR
			//		-- if endYear is not this year then show it to avoid confusion
			//
			if (nTodayYear != nEndYear) { strReturn += ' '+nEndYear; }
		}
		// 		2c: HOUR:MIN A/P - HOUR:MIN A/P  or 'All Day';
		//		-- "All Day" if starts at midnight and ends one second before next midnight
		//		-- else 9:15a-10:30a format
		if (nStartDay == nEndDay) {
			if ((msecE1 == msecE1DayBegins) && (msecE2 == msecE2DayEnds)) {
				if (gstrCalAllDay) {
					if (strReturn) { 
						strReturn += ', '; 
					}
					strReturn += gstrCalAllDay;		
				}
			} else {
				if (strReturn) { 
					strReturn += ', '; 
				}
				strReturn += getTimeString(nStartHour, nStartMinute);
				var nMins = ((nEndHour-nStartHour) * 60) + (nEndMinute-nStartMinute);
				if (nMins > 5) {
					strReturn += '-' + getTimeString(nEndHour, nEndMinute);	
				}		
			}
		} else {
			if (strReturn) { 
				strReturn += ', '; 
			}
			strReturn += 'Multi-Day';
		}
		
		return strReturn;
	}
	
	// PARSE MYSQL DATETIME
	// 		-- new mySQL date version
	//		-- mysql datetime format: 2003-06-28 09:00:00
	//		-- returns an array of pieces
	//				[0] = year
	//				[1] = month
	//				[2] = day
	//				[3] = hour
	//				[4] = minute
	//				[5] = seconds
	function parseMysqlDatetime(datetime) {
		var aDT = new Array();
		// get start date pieces
		var aD = datetime.split(' ');
		if (aD.length == 1) { aD[1] = '00:00:01'; }
		var aDateIn	= aD[0].split('-');
		var aTimeIn	= aD[1].split(':');
		aDT[0] 		= aDateIn[0];
		aDT[1]		= parseInt(aDateIn[1],10);
		aDT[2]		= parseInt(aDateIn[2],10);
		aDT[3]		= parseInt(aTimeIn[0],10);
		aDT[4]		= parseInt(aTimeIn[1],10);
		aDT[5]		= parseInt(aTimeIn[2],10);
		
		return aDT;
	}
	function msecFromMysqlDatetime(datetime) {
		var aD = parseMysqlDatetime(datetime);
		var tDate = new Date(aD[0],(aD[1] - 1),aD[2],aD[3],aD[4],aD[5]);
		var msecDate = tDate.getTime();
		return msecDate;
	}
	function mysqlDateFromMsec(msec) {
		var tDate = new Date(msec);
		return jsToMysqlDateTime(tDate);
	}
	function getDaysInMonth(t) {
		var nReturn = 0;
		var aDaysInM = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
		var iMonth = t.getMonth();
		nDays = aDaysInM[iMonth];
		if (nDays > 28) { nReturn = nDays; }
		else {
			// 1. set to first day of next month
			var msect = t.getTime();
			var tNext = new Date(msect);
			tNext.setHours(0);
			tNext.setMinutes(0);
			tNext.setSeconds(0);
			tNext.setDate(1);
			tNext.setMonth(iMonth + 1);
			tNext.setDate(1);
			// 2. subtract two hours 
			msect = tNext.getTime() - 120000;
			tNext.setTime(msect);
			// 3. get date
			nDays = tNext.getDate();
			nReturn = nDays;
		}
		return nReturn;
		
	}
	
	function getTimeString (nH,nM) {
	
		var numH = parseInt(nH,0);
		var numM = parseInt(nM,0);
		
		// round up times that aren't given in 5 minute increments;
		// this will apply mainly to ending times; 
		// 3:00-5:00pm instead of 3:00-4:59p, for example.
		if (numM%5 != 0) { 
			numM = numM+1;
			if (numM == 60) {
				numM = 0;
				numH = numH+1; 
				if (numH == 24) {
					numH = 0;
				}
			}
		}
		
		var strReturn = '';
		var strAMPM = 'a';
		var strHour = numH;
		var strMinute = numM;
		var strExtra0 = '';

		if (numH > 11) { strAMPM = 'p'; }
		if (numM < 10) { strExtra0 = '0'; }
		if (numH == 0) { strHour = '12'; }
		else if (numH > 12) { strHour = numH - 12;}
		
		strReturn = strHour + ':' + strExtra0 + strMinute + '' + strAMPM;
		
		return strReturn;
	}
	function getCurWeek(nYear, nMonth, nDay) {
		//	-- count weeks from start of school year
		var evtYearStart = nYear;
		if (nMonth < gnSchoolYearSwitchMonth) { evtYearStart--; }
		var tStartDay = new Date(evtYearStart, gnSchoolYearSwitchMonth-1, gnSchoolYearSwitchDay, 0, 0, 0);
		var tEndDay = new Date(nYear, nMonth-1, nDay, 0, 0, 0); 
		var msecStart = tStartDay.getTime() - (tStartDay.getDay() * msecOneDay);
		var msecEnd = tEndDay.getTime() + ((7 - tEndDay.getDay()) * msecOneDay);
		var iWOffset = parseInt(Math.floor((msecEnd - msecStart)/(msecOneDay * 7)))-1;
		return iWOffset;
	}



//================================
//
//	TEXT AND NUMBER FUNCTIONS
//
//================================

	// ---------------------------------------------
	//	PARSE LOCATION INFO
	//		-- return html string to use
	//
	function getLocationDisplayString(strLocation, nLinkType, strDate) {
		var strLocationDisplay = '';
		if (strLocation) { 
			strLocationDisplay = strLocation;
			var aLocInfo = strLocation.split('::');
			if (aLocInfo.length > 1) {
				var idLoc	   = aLocInfo[0];
				var strLocName = aLocInfo[1];
				var nLocStatus = aLocInfo[2];
				strLocationDisplay = '';
				if (nLinkType == 1) { strLocationDisplay += '<a href="javascript:showLIP('+idLoc+',\''+strDate+'\')" >';	}
				if (nLinkType == 2) { strLocationDisplay += '<a href="javascript:calToLIP('+idLoc+',\''+strDate+'\')" >';	}
				strLocationDisplay += strLocName ;
				if (nLocStatus == -1) { strLocationDisplay += ' (not available)'; } 
				else if (nLocStatus == 0) { strLocationDisplay += ' (pending)'; } 
				else if (nLocStatus == 1) { strLocationDisplay += ' (confirmed)'; } 
				if (nLinkType > 0) { strLocationDisplay += '</a>';	}
			}
		}
		return strLocationDisplay;
	}
	
	// ---------------------------------------------
	// MAKE HYPERLINKS
	// 		looks through a string for website urls...if found turns into hyperlink before displaying
	//		-- looks for www. or http:// or https:// to start
	//		-- finds all urls
	//		-- then works backwards through string to add <a href="[foundurl]">[foundurl]</a> 
	function makeURLsHot(txt, strClassName) {
		// PART 1: SEARCH
		// init search vars
		txt += ' ';
		var strSearch = txt;	// this is string to search...shorten each time to remaining unsearched portion of the string
		var aURL = new Array();		// array of urls found
		var aposURL = new Array();  // array of url positions in txt
		var iURL = -1;				// index of current found url
		var indexLastMatch = 0;		// keeps track of where last match was 
		// create search reg ex
		//var regexWeb = /((https?:\/\/)?www\.[^< !:'"\)\]]*)./i;
		var regexWeb = /(((https?:\/\/www\.)|(www\.)|(local:[A-Za-z]+:[0-9]+(:?.+?[:\).,;"\'?])?)|(https?:\/\/)|(ftp?:\/\/))[^< !'"\)\]]*)./i;
		// do first search
		var reMatch = regexWeb.exec(strSearch);
		while (reMatch) {
			// found one -- save results
			iURL++;
			var strFound = reMatch[1];
			aURL[iURL] = strFound;
			aposURL[iURL] = indexLastMatch + reMatch.index;
			indexLastMatch = indexLastMatch + reMatch.index + strFound.length;
			// change search string to remaining part of string
			strSearch = txt.substring(indexLastMatch,txt.length);
			reMatch = regexWeb.exec(strSearch);
		}
		
		// PART 2: PUT IN HOT LINKS
		var strMatch = '';
		var lenMatch = 0;
		var iMatch = -1;
		var strPre = '';
		var strPost = '';
		var reLocal = /^local:/i;
		var reHTTP = /^http/i;
		var strHTTP = '';
		var strPunct = '\).,;"\'?';
		var strLast = '';
		for (var u = iURL; u >= 0; u--) {
			// get url string
			strMatch = aURL[u];
			// remove trailing punctuation if any (last char of string)
			strMatch = strMatch.replace(/&#41;/g, ")");
			lenMatch = strMatch.length;
			strLast = strMatch.charAt(lenMatch-1);
			while (strPunct.indexOf(strLast,0) != -1) { 
				lenMatch = lenMatch-1;
				strMatch = strMatch.substring(0,lenMatch); 
				strLast = strMatch.charAt(lenMatch-1);
			} 
			strMatch = strMatch.replace(/\)/g, "&#41;");
			var strMatchSave = strMatch;
			// figure position to put in link
			lenMatch = strMatch.length;
			iMatch = aposURL[u];
			// add http:// if not already in url
			var fLocal = reLocal.test(strMatch);
			if (!fLocal && (!reHTTP.test(strMatch))) {
				strMatch = 'http://'+strMatch;
			}
			// put in link
			strPre = txt.substring(0,(iMatch+lenMatch));
			strPost = txt.substring((iMatch+lenMatch),txt.length);
			txt = strPre + '</a>' + strPost;
			strPre = txt.substring(0,iMatch);
			strPost = txt.substring(iMatch,txt.length);
			// trunc original URL
			var strLabel = '';
			var aSubURL;
			if (fLocal) {
				strLabel = 'local link';
				aSubURL = strMatch.split(':');
				if (aSubURL[3]) {
					strLabel = aSubURL[3];
				}
			} else {
				strLabel = 'link';
				aSubURL = strMatch.split('.');
				if (aSubURL[1]) {
					strLabel = aSubURL[1];
				}
			}
			strLabel = trimStringCenter(strLabel, 100);
			strPost = strPost.replace(strMatchSave,strLabel);
			txt = strPre + '<a href="javascript:showWebsite(\''+escape(strMatch)+'\',0,0)" class="'+strClassName+'" title="'+strMatch+'">' + strPost;
		}
		return cleanStr(txt);
	}

	// ---------------------------------------------
	//	
	function getInt(strIn) {
		if (strIn.charAt(0) == '0') {strIn = strIn.charAt(1);} //needed for parseInt bug with '08';
		strIn = parseInt(strIn);
		return strIn;
	}
	function randomN(N) { 
		// returns a random number from 0...(N-1) inclusive
		return Math.floor(N*(Math.random()%1)) ;
	}
	function dequote(str) {
		str = str.replace(/['"]/g, "");
		str = str.replace(/&#39;/g, "");
		str = str.replace(/&#34;/g, "");
		return str;
	}
	function preTrim (str) {
		str = str.replace(/&#34;/g, '\"');
		str = str.replace(/&#39;/g, '\'');
		str = str.replace(/&#40;/g, '(');
		str = str.replace(/&#41;/g, ')');
		str = str.replace(/&[#a-zA-Z0-9]+;/g, ' ');
		return str;
	}
	function trimStringCenter (strIn, cchMax) {
		if (strIn) {
			var strReturn = strIn;
			strIn = preTrim(strIn);
			if (strIn.length > cchMax) {
				var sep = '...';
				var cch = strIn.length;
				var cchLeft = parseInt((cchMax * 2) / 4);
				var cchRight = cchMax - cchLeft - 3;
				var strLeft = cleanStr(strIn.substring(0,cchLeft));
				var cchStartRight = cch - cchRight;
				var strRight = cleanStr(strIn.substring(cchStartRight, cch));
				strReturn = strLeft + sep + strRight;
			}
			return strReturn;
		}
	}
	function trimStringEnd (strIn, cchMax) {
		if (strIn) {
			var strReturn = strIn;
			strIn = preTrim(strIn);
			if (strIn.length > cchMax) {
				strReturn = strIn.substring(0,cchMax-1) + '...';
			}
			return strReturn;
		}
	}
	function unescapeStr (str) {
		// sync with cgi 
		str = str.replace(/&#34;/g, '\"');
		str = str.replace(/&#39;/g, '\'');
		str = str.replace(/&#40;/g, '(');
		str = str.replace(/&#41;/g, ')');
		str = str.replace(/&#61;/g, '=');
		str = str.replace(/&#94;/g, '^');
		str = str.replace(/&#96;/g, '`');
		str = str.replace(/&#123;/g, '{');
		str = str.replace(/&#125;/g, '}');
		return str;
	}
	function cleanStr(str) {
		// trims leading spaces, periods, commas, and trailing whitespace and nonword chars
		return str.replace(/^[\.\,\- \t\n\r]+|[ \t\n\r]+$/g, "");
	}
	function stripHTML(str) {
		str = str.replace(/<[^>]+>/g, "");
		str = str.replace(/<.+$/g, "");
		return str;
	}
	function trimPartialTag(str) {
		var nOffset = str.lastIndexOf('<');
		return str.substring(0,nOffset-1);
	}
	function FNtoCaption(str) {
		str = str.replace(/_/g, " ");
		str = str.replace(/\..+$/g, "");
		return str;
	}
	function validEmailname(str) {
		var aN = str.split(',');
		for (var i = 0; i < aN.length; i++) {
			var strEmail = aN[i];
			if (!strEmail.match(/^[ +A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z +]{2,8}$/i)) { return false; }
		}
		return true;
	}


//================================
//
//	MISC
//
//================================

	function classoftoGrade (nClassOf) {
		var strGrade = '';
		// strGrade += 'Class of ' + nClassOf;
		var tToday = getNow();
		var yearToday 	= timeGetYear(tToday);
		var monthToday 	= tToday.getMonth();
		var dayToday 	= tToday.getDate();
		var dGradeYear 	= 0;
		if ((monthToday == (gnSchoolYearSwitchMonth - 1)) && (dayToday >= gnSchoolYearSwitchDay)) {
			dGradeYear = 1;
		} else if (monthToday > (gnSchoolYearSwitchMonth - 1)) {
			dGradeYear = 1;
		}
		var nGrade = (gnMaxGrade - (nClassOf - yearToday)) + dGradeYear;
		if (nGrade == 0) {
			strGrade += 'Kindergarten';
		} else if (nGrade <= gnMaxGrade) {
			strGrade += 'Grade ' + nGrade;
		} else {
			strGrade += 'Graduate';
		}
		return strGrade;
	}
	// ---------------------------------------------
	// IDinList
	//		-- general function that looks for a match to id in a list of ids
	//		-- id list format: id:id:id:id
	function idInList(id,idList) {
		return (idList.indexOf(':'+id+':',0) != -1);
	}

	// ---------------------------------------------
	//  EMAIL
	function emailPerson(idPerson) {
		alert('This would allow you to send email to this person. \n(not implemented yet)');
	}
	// get contents for mailto; "\n" marks a new line.
	function getMailToValue(strTo, strSubject, strBody, strPageType, idPage) {
		if (!strSubject) 	{ strSubject = ''; }
		if (!strBody) 		{ strBody = ''; }
		if (!strPageType) 	{ strPageType = ''; }
		if (!idPage) 		{ idPage = ''; }
		var strCGI = '';
		if (strPageType == 'GIP') { strCGI = gCGIPath+"show_gip.cgi?GIP="+idPage; }
		else if (strPageType == 'PIP') { strCGI = gCGIPath+"show_pip.cgi?PIP="+idPage; }
		else if (strPageType == 'RIP') { strCGI = gCGIPath+"show_page_rip.pl?RIP="+idPage; }
		else if (strPageType == 'LIP') { strCGI = gCGIPath+"show_page_lip.pl?LIP="+idPage; }
		else {
			strCGI = gWWWPath;
		}
		strBody += '\n\n\n_______________________________________\nWebsite Return Address:\n'+gstrSiteName+'\n'+strCGI+'\n';
		var strMailTo = 'MAILTO:'+escape(strTo)+'?SUBJECT='+escape(strSubject)+'&BODY='+escape(strBody);
		return strMailTo;
	}

	// ---------------------------------------------
	//  PASSWORD
	function passwordError(strPass, strPasswordType) {
		var fError = false;
		var reIllegals = /[^a-zA-Z0-9\!\@\#\$\%\*\&\?\:\;\+\=\-\_]/;
		var reNonLetter = /[^a-zA-Z]/;
		// empty
		if (!strPass) {
			alert ("Your "+strPasswordType+" password can't be empty. Please try again.");
			fError = true;
		} else 
		// too few characters
		if (strPass.length < 6) {
			alert ("Your "+strPasswordType+" password must have at least 6 characters. Please try again.");
			fError = true;		
		} else
		// too many
		if (strPass.length > 20) {
			alert ("Your "+strPasswordType+" password must have at fewer than 20 characters. Please try again.");
			fError = true;		
		} else
		// disallowed characters
		if (strPass.search(reIllegals) >= 0) {
			alert ("Your "+strPasswordType+" password contains characters that are not allowed. Please try again using only letters, numbers and accepted symbols.");
			fError = true;		
		} else
		// all letters
		if (strPass.search(reNonLetter) == -1) {
			alert ("Your "+strPasswordType+" password must contain at least one character that is not a letter. Please try again by adding a number or accepted symbol.");
			fError = true;		
		} 
		return fError;
	}

//================================
//
//	SCHEDULE
//
//================================

	// --------------------------
	// SCHEDULE FUNCTIONS
	
	function clearDays() {
		for (var i = 0; i < 7; i++) {
			SetCookie ('schedDay'+i,false,null,null,null,false);
		}
	}
	function changeSchedDays(dDays) {
		var n = parseInt(dDays);
		SetCookie ('schedDays',n,null,null,null,false); 
		refreshPage();
	}
	function incrementSchedDay(dDay) {
		var curDateDisplay 	= GetCookie('scheduleDay');
		if (!curDateDisplay) { 
			var tToday 	= getNow();
			curDateDisplay = timeGetYear(tToday)+ '-' + (tToday.getMonth() + 1) + '-' + tToday.getDate();
		}
		var aD = parseMysqlDatetime(curDateDisplay);
		var tNew = new Date(aD[0],(aD[1] - 1),aD[2],aD[3],aD[4],aD[5]);
		var nDayNew = parseInt(aD[2]) + parseInt(dDay);
		tNew.setDate(nDayNew);
		var newDateDisplay = timeGetYear(tNew)+ '-' + (tNew.getMonth() + 1) + '-' + tNew.getDate();
		SetCookie ('scheduleDay',newDateDisplay,null,'/',null,false); 
		clearDays();
		if (GetCookie('schedDays') == 1) {
			SetCookie ('schedDay'+tNew.getDay(),true,null,null,null,false);
		}
		refreshPage();
	}
	function changeSchedFromToday(nDaysFromToday) {
		var n = parseInt(1);
		SetCookie ('schedDays',n,null,null,null,false); 
		var tNew 		= getNow();
		var nDayNew = tNew.getDate() + parseInt(nDaysFromToday);
		tNew.setDate(nDayNew);
		var newDateDisplay = timeGetYear(tNew)+ '-' + (tNew.getMonth() + 1) + '-' + tNew.getDate();
		SetCookie ('scheduleDay',newDateDisplay,null,'/',null,false); 
		clearDays();
		if (GetCookie('schedDays') == 1) {
			SetCookie ('schedDay'+tNew.getDay(),true,null,null,null,false);
		}
		refreshPage();
	}
	function getScheduleHTML(aSchedule, dateDisplay, nDaysInSchedule, idGroup, idLoc, fExpand, fPostOK) {
	
		var str = '';
		
		var tToday 	= getNow();
		var msecNow = tToday.getTime();
		
		// -- FOR EACH DAY
		//		-- get first day of range to show
		//		-- if just one day then show it
		//		-- if week view then show monday-sunday for the week that schedule day is in
		var msecShow = msecFromMysqlDatetime(dateDisplay);
		var tShow = new Date(msecShow);
		tShow.setHours(0);
		tShow.setMinutes(0);
		tShow.setSeconds(0);
		msecShow = tShow.getTime();
		msecShow -= 1000;
		var tShowEnd = new Date(msecShow);
		tShowEnd.setDate(tShowEnd.getDate()+1);

		for (var nDay = 0; nDay < nDaysInSchedule; nDay++) {
		
			var nEvent = 0;
			var nHour = 8;
			var nMin = 0;

			// -- get date info for cur display day
			if (nDay != 0) { 
				var nNewDate = tShow.getDate() + 1;
				tShow.setDate(nNewDate);
				tShowEnd.setDate(nNewDate);
			}
			var msecD1 = tShow.getTime();
			var msecD2 = tShowEnd.getTime();
			var nDate = tShow.getDate();
			var nMonth = tShow.getMonth()+1;
			var nYear = timeGetYear(tShow);
			var fToday = false;
			var fTomorrow = false;
			if ((msecNow >= msecD1) && (msecNow <= msecD2)) {fToday = true; }
			if (((msecNow + msecOneDay) >= msecD1) && ((msecNow + msecOneDay) <= msecD2)) {fTomorrow = true; }
			
			var nDateLink 	= nDate;
			var nMonthLink 	= nMonth;
			var nYearLink 	= nYear;
			var nHourLink 	= nHour;
			var nMinLink 	= nMin;
			var strNewLinkId 	= 'clkaddnew';
			var strNewEvtHREF 	= 'addEventInline('+nDateLink+','+nMonthLink+','+nYearLink+','+idGroup+','+idLoc+','+nHourLink+','+nMinLink+',\''+strNewLinkId+'\',false)';
			var strNewEvtTitle 	= 'Click to post an event on this day...';
			var strNewEvtIcon 	= '<img src="bits/InsertBlack.gif" height="19" width="19" border="0" title="'+strNewEvtTitle+'">';

			// -- date string
			var strTitleDate = "";
			if (fToday) {strTitleDate += 'TODAY, ';}
			if (fTomorrow) {strTitleDate += 'TOMORROW, ';}
			if (nDay == 0) {
				strTitleDate += aDays[tShow.getDay()] + ', '+ tShow.getDate() + ' ' + aMonths[tShow.getMonth()] + ' ' + timeGetYear(tShow);
			} else {
				// var nDate = tShow.getDate();
				strTitleDate += aDays[tShow.getDay()] + ', '+ nDate;
				if 		(nDate == 1) { strTitleDate += ' '+ aMonths[tShow.getMonth()]; }
				else if ((nDate == 21) || (nDate == 31)) { strTitleDate += ' '+ aMonths[tShow.getMonth()]; }
				else if ((nDate == 2)  || (nDate == 22)) { strTitleDate += ' '+ aMonths[tShow.getMonth()]; }
				else if ((nDate == 3)  || (nDate == 23)) { strTitleDate += ' '+ aMonths[tShow.getMonth()]; }
				else { strTitleDate += ' '+ aMonths[tShow.getMonth()]; }
			}
	
			// -- CONTENT: schedule
			
			// 		-- date line
			var nHType = '';
			if (fToday) { nHType = '2'; }
			if (fTomorrow) { nHType = '3'; }
			var idToggle = 'schedDay'+tShow.getDay();
			var fDisplay = getMenuState(idToggle,fExpand);
			var strDisplay = getMenuDisplay(fDisplay);
			str += getTitleToggleStickyHTML(idToggle, strTitleDate, 'day', 'scheduleDayHeader'+nHType, fDisplay, false);
			
			str += '<div id="'+idToggle+'" style="'+strDisplay+'">';
			
				//		-- each event
				var strE = '';
				var nEvents = aSchedule.length - 1;
				var nEventsDisplayed = 0;
				for (var i = 0; i < nEvents; i++) {
				
					var strEventInfo = aSchedule[i];
					
					var aP = strEventInfo.split("|");
					var idEvent		 	= aP[0]; var fLocalEvent = (idEvent > 0);
					var strTitle 		= aP[1];
					var strText 		= aP[2];
					var strLocation		= aP[3];
					var strEmail		= aP[4];
					var strURL			= aP[5];
					var EStart		 	= aP[6];
					var EFinish 		= aP[7];
					var idMainRecip		= aP[8];
					var strMainRecipName = aP[9];
					var nRecipients		= aP[10];
					var nModifiedDays	= aP[11];
					var strPeriod		= aP[12];
					var nEmailStatus	= aP[13];
					var nStatus	 		= aP[14];
					var idAuthor	 	= aP[15];
					var strAuthor	 	= aP[16];
					var fShowPostLinks	= (aP[17] == 1 || fPostOK);
					var idLinkEvent		= aP[18];
		
					// -- determine hours to display
					var aDT = parseMysqlDatetime(EStart);
					var nStartYear 		= aDT[0];
					var nStartMonth 	= aDT[1];
					var nStartDay 		= aDT[2];
					var nStartHour		= aDT[3];
					var nStartMinute	= aDT[4];
					var nStartSecond	= aDT[5];
					
					aDT = parseMysqlDatetime(EFinish);
					var nEndYear 		= aDT[0];
					var nEndMonth 		= aDT[1];
					var nEndDay 		= aDT[2];
					var nEndHour		= aDT[3];
					var nEndMinute		= aDT[4];
					var nEndSecond		= aDT[5];
					
					var tE1 = new Date(nStartYear,nStartMonth-1,nStartDay, nStartHour, nStartMinute, nStartSecond); 
					var msecE1 = tE1.getTime();
					var tE2 = new Date(nEndYear,nEndMonth-1,nEndDay, nEndHour, nEndMinute, nEndSecond);
					var msecE2 = tE2.getTime();
					
					var t = new Date(msecE2+1000);
					var nDateLinkEvt 		= t.getDate();
					var nMonthLinkEvt 		= t.getMonth()+1;
					var nYearLinkEvt 		= timeGetYear(t);  // ns/ie
					var nHourLinkEvt 		= t.getHours();
					var nMinLinkEvt 		= t.getMinutes();

					// -- does event fall on current display day?
					var fOnThisDay = false;
					if ((msecE1 <= msecD2) && (msecE2 > msecD1)) { fOnThisDay = true; }
					if (fOnThisDay) {
						
						strText = fixTrimStr(strText,'showEvent',idEvent)
						strNewLinkId 	= 'clkadd'+nDay+i;
						strNewEvtHREF 	= 'addEventInline('+nDateLinkEvt+','+nMonthLinkEvt+','+nYearLinkEvt+','+idGroup+','+idLoc+','+nHourLinkEvt+','+nMinLinkEvt+',\''+strNewLinkId+'\',false)';
	
						// -- TIME STRING
						//		1. if started today
						//			a: list start time
						//			b: if ends today, list end time
						//			c: else add " on"
						//		2. if started before today
						//			a: if ends today list "til <end time>"
						//			b: else list "all day"
						//		
						var strTime = "";
						var fAllDay = false;
						if (msecE1 == msecE2) {
							if (nStartHour == 0 && nStartMinute == 0 && nEndHour == 0 && nEndMinute == 0) { fAllDay = true; strTime = gstrCalAllDay; }
							else { strTime += getTimeString(nStartHour, nStartMinute); }
						} else if (msecE1 >= msecD1 && msecE1 <= msecD2) { 
							// 	1. started today
							strTime += getTimeString(nStartHour, nStartMinute);
							if (msecE2 < msecD2) {
								if (nStartHour == 0 && nStartMinute == 0 && nEndHour == 23 && nEndMinute == 59) { fAllDay = true; strTime = gstrCalAllDay; }
								else if ((nStartHour == 0) && (nStartMinute == 0) && (nEndHour == 0) && (nEndMinute == 0)) { fAllDay = true; strTime = gstrCalAllDay; }
								else { strTime += '-' + getTimeString(nEndHour, nEndMinute); }
							} else {
								if (nStartHour == 0 && nStartMinute == 0) { fAllDay = true; strTime = gstrCalAllDay; }
								else { strTime += ' - on'; }
							}
						} else if (msecE1 < msecD1) {
							// 	2. started before today
							if (msecE2 < msecD2) {
								if ((nStartHour == 0) && (nStartMinute == 0) && (nEndHour == 23) && (nEndMinute == 59)) { fAllDay = true; strTime = gstrCalAllDay; }
								else if ((nStartHour == 0) && (nStartMinute == 0) && (nEndHour == 0) && (nEndMinute == 0)) { fAllDay = true; strTime = gstrCalAllDay; }
								else { strTime += 'til ' + getTimeString(nEndHour, nEndMinute); }
							} else {
								fAllDay = true; 
								strTime += gstrCalAllDay;
							}
						}
						
						// -- determine if event in past, present or future
						var strTimeStyle = 'Now';
						var nTimePeriod = 0;
						if 		(msecE1 > msecNow) { strTimeStyle = 'Future'; nTimePeriod =  1;  }
						else if (msecE2 < msecNow && !fAllDay) { strTimeStyle = 'Past';   nTimePeriod = -1;  }
						
						// -- create Location string
						var strLocationDisplay = getLocationDisplayString(strLocation, 1, EStart);
						
						// -- build html for this one event
						nEventsDisplayed++;
						var strTodayPlusStyle = '';
						if (fToday) { strTodayPlusStyle = ' style="font-weight:bold;" '; }
						if ((msecNow < msecD2) && fShowPostLinks) {
							strE += '<tr onmouseover="visinvis(\'t_'+strNewLinkId+'\',true)" onmouseout="visinvis(\'t_'+strNewLinkId+'\',false)" >';
						} else {
							strE += '<tr>';
						}
						// -- CELL 1: CLOCK
						if (!fAllDay) {
							strE += '<td class="tdSchedIcon" valign="top" ';
							if (fLocalEvent) {
								strE += ' onclick="editEvent('+idMainRecip+','+idEvent+')"';
							}
							strE += '>';
							if (nTimePeriod == 0) { 
								strE += '&nbsp;<img src="bits/cal-mark3.gif" width="8" height="8" alt="" border="0">';
							} else { 
								strE += '&nbsp;<img src="bits/icon-event-tiny.gif" width="8" height="8" alt="" border="0">';
							}
							strE += '</td>';
						}
			
						if (idEvent == 0) {
						
							// -- a cloaked event...just show busy

							// -- CELL 2: TIME
							strE += '<td class="tdSchedLeft" valign="top">';
								strE += '<span class="schedTime'+strTimeStyle+'" '+strTodayPlusStyle+'>&nbsp;';
									strE += strTime;
								strE += '</span>';
							strE += '</td>';
							// -- CELL 3: BUSY
							strE += '<td class="tdSchedRight" valign="top">';
								strE += '<span class="schedTitle'+strTimeStyle+'">';
								strE += gstrCalBusy;
								strE += '</span>';
							strE += '</td>';
							
						} else {
						
							// -- CELL 2: TIME
							var fNew = (nModifiedDays > 0);
							if (!fAllDay) {
								strE += '<td class="tdSchedLeft" valign="top">';
									strE += '<span class="schedTime'+strTimeStyle+'" '+strTodayPlusStyle+'>';
										if (fLocalEvent) {
											strE += '<a href="javascript:editEvent('+idMainRecip+','+idEvent+')" title="Click to change...">';
										}
										strE += strTime;
										if (fLocalEvent) {
											strE += '</a>';
										}
									strE += '</span>';
								strE += '</td>';
							}
							// -- CELL 3: TITLE
							// -- if full access show event title ...
							strCol = '';
							if (fAllDay) {
								strCol = 'colspan="4"';
								
							}
							strE += '<td '+strCol+' class="tdSchedRight" valign="top">';
								strTitle = cleanStr(strTitle);
								var strDisplay = '';
								if (strPeriod) {
									strDisplay += strPeriod;
									if (strTitle) {
										strDisplay += ' &middot; ';
									}
								}
								strDisplay += strTitle;
								strE += getTitleToggleStickyHTML('s'+nDay+nEvent, strDisplay, '', 'schedTitle'+strTimeStyle, false, fNew);
								strE += '<div id="s'+nDay+nEvent+'" style="display:none;">';
									//  	...and pop-open event text with group recipients
									var fAddDot = false;
									strE += '<div class="schedTextLocation'+strTimeStyle+'">';
										strText = strText.replace(/<br>$/ig, '');
										// LOCATION
										if (strLocationDisplay) { 
											strE += strLocationDisplay;
											if (strText) {
												strE += ' &middot; ';
											} else {
												strE += '<br>';
											}
										}
										// DESCRIPTION
										strE += '<span id="s'+nDay+nEvent+'_text">';
										strE += strText;
										strE += '</span>';
										if (strText) {
											strE += '<br>';
										}
										if (strMainRecipName) {
											if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
											strE += '<a href="javascript:showGIP('+idMainRecip+')" title="Click to go to the group &quot;'+strMainRecipName+'&quot;..." class="schedGroupLink'+strTimeStyle+'">';
											strE += strMainRecipName;
											strE += '</a>';
											fAddDot = true;
										}
										if (fLocalEvent) {
											if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
											strE += '<a href="javascript:showPerson('+idAuthor+')" title="Click to go to '+strMainRecipName+'\'s page..." class="schedGroupLink'+strTimeStyle+'">';
											strE += strAuthor;
											strE += '</a>';
											fAddDot = true;
										}
									strE += '</div>';
									
									fAddDot = false;
									if (nRecipients > 1) { 
										if (fLocalEvent) {
											if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
											strE += getDistLink(2,idEvent); 
											fAddDot = true;
										}
									}
									if (nEmailStatus == 1) {
										if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
										strE += '<img src="bits/MailSentPendingBlack.gif" height="13" width="13" title="E-mail notification pending..." alt="" border="0">';
										fAddDot = true;
									} else if (nEmailStatus == 2) {
										if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
										strE += '<img src="bits/MailSentBlack.gif" height="13" width="13" title="E-mail notification sent..." alt="" border="0">';
										fAddDot = true;
									}
									// OPEN
									if (fLocalEvent) {
										if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
										strE += '<a class="cellinfo" href="javascript:showEvent('+idEvent+')" title="Click to open this event in a separate window...">open</a>';
										fAddDot = true;
									}
									// WEBSITE LINK
									if (strURL) { 
										if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
										strE += '<a href="javascript:showWebsite(';
										strE += "'" + escape(strURL) +"'";
										strE += ','+idMainRecip+',1)" title="Click to go to '+strURL+'...">link</a>';
										fAddDot = true;
									}
									// EMAIL REPLY
									if (strEmail) { 
										if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
										strE += '<a href="';
										strE += getMailToValue(strEmail,strTitle,"","",0);
										strE += '" title="Click to write an e-mail message to '+strEmail+'...">reply</a>';
										fAddDot = true;
									}
									if (fLocalEvent) {
										if (fShowPostLinks) {
											if (nStatus == 0) {
												if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
												strE += '<a class="cellinfo" href="JavaScript:restoreEvent('+idEvent+')" title="Click to restore this event...">restore</a>';
												fAddDot = true;
											} else {
												if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
												strE += '<a class="cellinfo" href="JavaScript:editEvent('+idMainRecip+','+idEvent+')" title="Click to edit this event...">change</a>';
												fAddDot = true;
												if (idLinkEvent == 0) {
													if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
													strE += '<a class="cellinfo" href="JavaScript:deleteEventInline('+idEvent+',\''+fShowPostLinks+'\',\'dlgevts'+nEvent+'\')" title="Click to remove this event...">delete</a>';
													fAddDot = true;
												} else {
													if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
													strE += '<a class="cellinfo" href="JavaScript:deleteEvent('+ idEvent + ')" title="Click to remove this event...">delete</a>';
													fAddDot = true;
												}
												if (fAddDot) { strE += '&nbsp;&middot;&nbsp;'; }
												strE += '<a class="cellinfo" href="JavaScript:copyEvent('+idMainRecip+','+idEvent+')" title="Click to create a new event like this one...">copy</a>';
												fAddDot = true;
											}
											strE += '<div id="dlgevts'+nEvent+'"></div>';
										}
									}
								strE += '</div>';
							strE += '</td>';

							nEvent++;

						}
						
						
						strE += '<td align="right" valign="bottom">';
						strE += '<div>';
							//if ((msecE2 >= msecNow) && fShowPostLinks) {
							if ((msecNow < msecD2) && fShowPostLinks) {
								strE += '<span id="t_'+strNewLinkId+'" onclick="'+strNewEvtHREF+'" style="cursor:pointer;visibility:hidden;">'+strNewEvtIcon+'</span>';
							}
						strE += '</div>';
						strE += '</td></tr>';
						strE += '<tr><td colspan="4" class="scheduleDivider"></td></tr>';
						strE += '<tr><td colspan="4" id="'+strNewLinkId+'"></td></tr>';
						
					} // single event
				} // all events on a day
				
				// end table
				if ((msecNow < msecD2) && fPostOK) {
					for (var e = nEventsDisplayed; e < nEventsDisplayed+1; e++){
						strNewLinkId 	= 'clkadd'+nDay+e;
						strNewEvtHREF 	= 'addEventInline('+nDateLink+','+nMonthLink+','+nYearLink+','+idGroup+','+idLoc+','+nHourLink+','+nMinLink+',\''+strNewLinkId+'\',false)';
						strE += '<tr><td colspan="4" align="right" >';
						strE += '<div id="'+strNewLinkId+'">' 
							strE += '<div onmouseover="visinvis(\'t_'+strNewLinkId+'\',true)" onmouseout="visinvis(\'t_'+strNewLinkId+'\',false)" >';
								strE += '<span id="t_'+strNewLinkId+'" onclick="'+strNewEvtHREF+'" style="cursor:pointer;visibility:hidden;" class="LinksBkgndRGB"><img src="bits/Blank.gif">'+strNewEvtTitle+'</span>';
							strE += '</div>';
						strE += '</div>';
						strE += '</td></tr>';
						strE += '<tr><td colspan="4" class="scheduleDivider"></td></tr>';
					}
				}

				// listing table
				str += '<table cellspacing="0" cellpadding="0" >';
				str += '<tr>';
				str += '<td><img src="bits/spacer.gif" width="15" height="6" alt="" border="0"></td>';
				str += '<td><img src="bits/spacer.gif" width="90" height="6" alt="" border="0"></td>';
				str += '<td><img src="bits/spacer.gif" width="230" height="6" alt="" border="0"></td>';
				str += '<td><img src="bits/spacer.gif" width="22" height="6" alt="" border="0"></td>';
				str += '</tr>';
				str += '<tr><td colspan="4" class="scheduleDivider"></td></tr>';
						
				// -- ADD DAY NUMBER
				var strDayCodeStyle = 'DAY_'+nYear+'_'+nMonth+'_'+nDate;
				var strDayCode = '&nbsp;';
				for (var c = 0; c < aCodedDays.length-1; c++ ) {
					var aDC = aCodedDays[c].split('|');
					if (aDC[0] == strDayCodeStyle) {
						strDayCode = aDC[1];
						break;
					}
				}
				var strWeekCode = '';
				var iWOffset = getCurWeek(nYear, nMonth, nDate);
				if (aWeeks.length > iWOffset) {
					strWeekCode = aWeeks[iWOffset];
				}
				if (!strWeekCode) {
					strWeekCode = 'Week ' + (iWOffset+1);
				}
				
				if (strWeekCode || strDayCode) {
					// -- determine if day in past, present or future
					var strTimeStyle = 'Now';
					if (msecNow < msecD1) 		{ strTimeStyle = 'Future';}
					else if (msecNow > msecD2) 	{ strTimeStyle = 'Past'; }
					str += '<tr>';
					// -- CELL 1: FLIP OPEN ALL DAY'S EVENTS
					str += '<td class="tdSchedIcon" valign="top">';
						if (nEvent > 0) {
							str += getTitleMultiToggleHTML('s'+nDay, '', '', 'schedTitle'+strTimeStyle, false, false, nEvent);
						}
					str += '</td>';
					// -- CELL 2: WEEK CODE
					str += '<td class="tdSchedLeft" valign="top">';
						if (nEvent > 0) {
							str += '<a class="schedTitle'+strTimeStyle+'" href="javascript:noop()" onmousedown="multiToggleDiv(\'s'+nDay+'\','+nEvent+')" title="">'+strWeekCode+'</a>';
						} else {
							str += '<a class="schedTitle'+strTimeStyle+'" href="javascript:'+strNewEvtHREF+'" title="'+strNewEvtTitle+'">'+strWeekCode+'</a>';
						}
					str += '</td>';
					// -- CELL 2: DAY CODE
					str += '<td class="tdSchedRight" valign="top">';
						str += '<a class="schedTitle'+strTimeStyle+'" href="javascript:'+strNewEvtHREF+'" title="'+strNewEvtTitle+'">'+strDayCode+'</a>';
					str += '</td>';
					// -- CELL 2: DAY SWATCH
					str += '<td class="tdSchedRight" align="right">';
						str += '<a class="'+strDayCodeStyle+'" href="javascript:'+strNewEvtHREF+'" title="'+strNewEvtTitle+'">&nbsp;&nbsp;&nbsp;&nbsp;</a>&nbsp;';
					str += '</td>';
					str += '</tr>';
					str += '<tr><td colspan="4" class="scheduleDivider"></td></tr>';
				}
				
				// all events
				str += strE;
				
				str += '</table>';
			str += '</div>';
		} // all days
		return str;
	}
	function showScheduleGridControls(aSchedule, idEventMatch, iGrid, strTimeStyle, strTime, nTimePeriod, y, x, idBar) {
		// event data
		for (var i = 0; i < aSchedule.length - 1; i++) {
			var aP = aSchedule[i].split("|");
			if (idEventMatch == aP[0]) {
				var idEvent		 		= aP[0];
				var strTitle 			= aP[1];
				var strText 			= aP[2];
				var strLocation			= aP[3];
				var strEmail			= aP[4];
				var strURL				= aP[5];
				var EStart		 		= aP[6];
				var EFinish 			= aP[7];
				var idMainRecip			= aP[8];
				var strMainRecipName	= aP[9];
				var nRecipients			= aP[10];
				var nModifiedDays		= aP[11];

				// -- create Location string
				strLocation = getLocationDisplayString(strLocation, 1, EStart);
				
				// build preview html
				var str = '<div class="preview_header_'+strTimeStyle+'" onclick="hideScheduleGridControls('+iGrid+')">'+strTime+'&nbsp;</div>';
				str += '<div class="gip_colbox_narrow" onclick="hideScheduleGridControls('+iGrid+')">';
					if (idEvent > 0) {
						str += '<div class="sched_preview_title">';
						str += cleanStr(strTitle);
						if (nModifiedDays > 0 ) {
							str += '<nobr>&nbsp;<img src="bits/updated2.gif" width="11" height="11" alt="" title="New or Updated" border="0"></nobr>';
						}
						str +='</div>';
						str += '<div class="sched_preview_text">';
							str += strText+' '+strLocation;
						str += '</div>';
						str += '<div class="footer_left">';
							str += '<a href="javascript:showGIP('+idMainRecip+')" title="Click to go to the group &quot;'+strMainRecipName+'&quot;...">';
							str += strMainRecipName;
							str += '</a>';
							if (nRecipients > 1) { str += getDistLink(2,idEvent); }
						str += '</div>';
					} else {
						str += '<div class="sched_preview_text">';
							str += gstrCalBusy;
						str += '</div>';
					}
				str += '</div>';
				// str += '<div id="event_preview_x"><a href="javascript:hideScheduleGridControls('+iGrid+');" title="Click to hide this box..."><img src="bits/x.gif" width="9" height="9" alt="" border="0"></a></div>';
				
				// show preview popup
				var domStyle = getDOM('event_preview'+iGrid,1);
				var dom = getDOM('event_preview'+iGrid+'_inner',0);
				var newTop = y + 14;
				var newLeft = getLeft(idBar) + 7;
				dom.innerHTML 	= str;
				domStyle.top 	= newTop+'px';
				domStyle.left 	= newLeft+'px';
				domStyle.visibility = 'visible';
				
				// end looping
				break;
			}
		}
	}
	
	function hideScheduleGridControls(iGrid) {
		var dom = getDOM('event_preview'+iGrid,1);
		dom.visibility = 'hidden';
	}
		
//================================
//
//	RESOURCE REFERENCES
//
//================================

	// SHOW REFERENCES List 
	function getTopReferencesHTML(aReferences, aReferencePieces, aRecips, idPage, nPageType, strSection, fShowComments, fShowDetails, fWelcome, fExcWelcome, fEditor) {
		var str = '';
		var nWelcome = 2;
		var nIndex = 0;
		var fForceOpen = false;
		// step through array grabbing the most recent nShow references
		for (var i = 0; i < aReferences.length - 1; i++) {
			var aReference = aReferences[i].split('|');
			var idRef 				= aReference[0];
			var nCategory 			= aReference[1];
			
			if (((fWelcome) && (nCategory != nWelcome)) || ((fExcWelcome) && (nCategory == nWelcome))) { continue; }

			// CHECK FOR PRESENCE ON A DEPARTMENT PAGE
			var idRes = 0;
			var strResName 			= '';
			for (var r = 0; r < aRecips.length - 1; r++) {
				var aR = aRecips[r].split('|');
				if (aR[0] == idRef) { 
					idRes 				= aR[1];
					strResName 			= aR[2];
					break;
				}
			}
			var fSComments = fShowComments;
			var fSDetails = fShowDetails;
			if (idRes != 0) { 
				// belongs to a resoure page, so don't show details or comments.
				fSComments = false;
				fSDetails = false;
			}
			// CONTENT
			str += getOneReferenceHTML(aReference, aReferencePieces, idRes, strResName, strSection, fSComments, fSDetails, fForceOpen, nIndex, idPage, nPageType, fEditor); nIndex++ ;
		}
		gnScratch = nIndex;
		return str;
	}

	function getOneReferenceHTML(aReference, aReferencePieces, idRes, strResName, strSection, fShowComments, fShowDetails, fFeaturedReference, nIndex, idPage, nPageType, fEditor) {

		var fExternal = (gfExternal && !hasSession());

		var str = '';
		
		var idRef 				= aReference[0];
		var nCategory 			= aReference[1];
		var strCategoryName		= aReference[2];
		var strPostingDate		= aReference[3];
		var idBy 				= aReference[4];
		var strTitle 			= aReference[5];
		var strText 			= aReference[6];
		var strEmail 			= aReference[7];
		var strPix				= aReference[8];
		var strPixCaption		= aReference[9];
		var nDaysOld			= aReference[10];
		var strByName 			= aReference[11];
		var nModifiedDays		= aReference[12];
		var nModAfterPostDays	= aReference[13];
		var strModifiedDate		= aReference[14];
		var strComment			= aReference[15];
		var strPluralName		= aReference[16];
		var fTopPixSmall 		= aReference[17];
		var fState	 			= aReference[18];
		var fIsRequired	 		= aReference[19];
		var fEditorsOnly	 	= aReference[20];
		var fDivider		 	= aReference[21];
		var fWelcome		 	= aReference[22];
		var nStatus			 	= aReference[23];
		var nTMax = 24;
		
		fTopPixSmall = (fTopPixSmall > 0);
		fIsRequired = (fIsRequired > 0);
		fEditorsOnly = (fEditorsOnly > 0);
		fDivider = (fDivider > 0);
		fWelcome = (fWelcome > 0);
		
		strText = fixTrimStr(strText,'showReference',idRef)

		var strPieces = getLinksHTML(aReferencePieces, idRef, idPage, nPageType, 0);
		var strALink = '<a href="javascript:showReference('+idRef+')" target="_blank" title="Click to open the '+strCategoryName+' &quot;'+strTitle+'&quot;...">';

		// COVER ART
		//		-- for references above the fold, show the actual image
		//		-- below the fold, save info to show as icon
		if (strPix && !fTopPixSmall && (fWelcome || fFeaturedReference)) {
			str += '<div class="photobox_welcome">';
				str += getImageLinkHTML (strPix,1,'pixcoverlarge_welcome',strALink, 2, idRef, 0)
			str += '</div>';
		}

		//	ASSEMBLE REFERENCE LISTING
		//		-- comments
		//		-- title
		//		-- pop up div
		//			-- date
		//			-- text
		//			-- reference pieces
		//			-- weblinks
		//		-- footer
		//			-- left: 
		//				-- author
		//			-- right:  
		//				-- open | change | remove | feature
		// 
		str += '<div class="resource_area" id="'+strSection+'sub'+nIndex+'" ';
			if (!fExternal) {
				str += ' onmouseover="showFooterDetails(event,\''+strSection+'sub'+nIndex+'\')" onmouseout="hideFooterDetails(event,\''+strSection+'sub'+nIndex+'\')"';
			}
			str += '>';
			// COMMENT
			if (fShowComments) {
				// COMMENT
				if ((fShowComments) && (strComment)) {
					str += '<div class="comment">';
						str += strComment;
					str += '</div>'; 
				}
				// DATE in comment
				str += '<div class="comment"><a class="comment" href="javascript:showReference('+idRef+')">';
					if (fEditorsOnly) {
						str += 'Editors/Owners Only &middot; ';
					}
					if (fIsRequired) {
						str += 'Default &middot; ';
					}
					str += strPostingDate; 
					if (nModAfterPostDays > 0) { 
						str += ' &middot; Updated '+strModifiedDate; 
					}
				str += '</a></div>'; 
			}
			// DEPARTMENT PAGE
			str += '<span id="'+strSection+'sub'+nIndex+'top" style="visibility:visible;">';
				if (fShowDetails) {
					if (idRes != 0) {
						str += '<a class="bulletinfront_footerlink" href="javascript:showRIP('+idRes+')" title="Click to visit the '+strResName+' department page...">'+strResName +'</a>';
						str += ' &middot; ';
						str += strCategoryName;
						str += '<br>'; 
					}
				}
			str += '</span>'; 
			var strStyleOpen = '';
			var strDisplayVal = 'none';
			var fOpen = ((fState > 0) || (fFeaturedReference));
			if (fOpen) { 
				strStyleOpen = '_open';
				strDisplayVal = 'block';
			}
			// TITLE
			var displayTitle = strTitle;
			var fNew = (nModifiedDays > 0);
			str += getTitleToggleHTML(strSection+nIndex, displayTitle, strCategoryName, 'bulletinfront_title', fOpen, fNew);
			// SPRING OPEN DETAILS
			str += '<div id="'+strSection+nIndex+'" class="reference_details'+strStyleOpen+'" style="display:'+strDisplayVal+';">';
				if (strPix && !(fWelcome || fFeaturedReference)) {
					if (fTopPixSmall) {
						str += '<div class="photobox_thumb">';
							str += getImageLinkHTML (strPix,2,'pixcoversmall',strALink, 2, idRef, 0);
						str += '</div>';
					} else {
						str += '<div class="photobox">';
							str += getImageLinkHTML (strPix,1,'pixcoverlarge',strALink, 2, idRef, 0)
						str += '</div>';
					}
				}
				// PIECES
				if (strText) { str += '<div class="bulletinfront_text">'; }
					str += '<span id="'+strSection+nIndex+'_text">';
					str += strText;
					str += '</span>';
				if (strText) { str += '</div>'; }
				// PIECES
				if (!strPieces) {
					str += '<span id="'+strSection+nIndex+'_pieces"></span>';
				} else {
					str += '<div class="bulletinfront_links">';
						str += '<span id="'+strSection+nIndex+'_pieces">';
						str += strPieces;
						str += '</span>';
					str += '</div>';
				}
				// FOOTER
				if (fExternal) {
					// OPEN
					str += '<div class="bulletinfront_footer">';
					str += '<a class="cellinfo" href="javascript:showReference('+idRef+')" title="Click to open this '+strCategoryName+' in a separate window...">open</a>';
					str += '</div>';
				} else {
					str += '<div class="bulletinfront_footer">';
						str += '<table cellspacing="0" cellpadding="0" class="footer_wide"><tr>';
						// BY
						str += '<td align="left">';
							var strDisplay = trimStringCenter(strByName, nTMax);
							str += '<a class="cellinfo" href="javascript:showPIP('+idBy+')" title="Click to visit '+strByName+'\'s page...">'+strDisplay +'</a>';
						str += '</td>';
						str += '<td align="right">';
							str += '<span id="'+strSection+'sub'+nIndex+'bot" style="visibility:hidden;">';
							if (nStatus == 0) {
								if (fEditor && !fIsRequired) { // not on a department page, so show change link here.
									str += '<a class="cellinfo" href="javascript:restoreReference('+idRef+','+idPage+','+nPageType+')" title="Click to restore this '+strCategoryName+'...">restore</a>';
								}
							} else {
								// REPLY
								if (strEmail) {
									str += '<a class="AccentRGB" href="' + getMailToValue(strEmail,strTitle,"","",0) + '" title="Click to write an e-mail message to '+strEmail+'...">reply</a> &middot; ';
								} 
								// OPEN
								str += '<a class="cellinfo" href="javascript:showReference('+idRef+')" title="Click to open this '+strCategoryName+' in a separate window...">open</a>';
								// DISTRIBUTE
								if ((idRes == idPage) && fGCanEdit) {
									str += '&nbsp;&middot;&nbsp;';
									str += '<a class="cellinfo" href="JavaScript:bulkDistributeReferences('+idRef+','+idRes+')" title="Click to place this '+strCategoryName+' in the libraries of the group pages you edit...">distribute</a>';
								}
								if (fEditor && !fIsRequired) { // not on a department page, so show change link here.
									// CHANGE
									str += '&nbsp;&middot;&nbsp;';
									str += '<a class="cellinfo" href="javascript:editReference('+idRef+','+idPage+','+nPageType+')" title="Click to edit this '+strCategoryName+'...">change</a>';
									// DELETE
									str += '&nbsp;&middot;&nbsp;';
									str += '<a class="cellinfo" href="javascript:deleteReference('+idRef+','+idPage+','+nPageType+')" title="Click to delete this '+strCategoryName+'...">delete</a>';
									if (idRes == idPage) {
										// FEATURED REFERENCE
										str += '&nbsp;&middot;&nbsp;';
										if (fFeaturedReference) {
											str += '<a href="javascript:featureReference('+ idRef + ','+idRes+',0)"><img src="bits/unfeature.gif" width="8" height="7" alt="Click to move this resource from the top of the page..." border="0"></a>';
										} else {
											str += '<a href="javascript:featureReference('+ idRef + ','+idRes+',1)"><img src="bits/feature.gif" width="8" height="7" alt="Click to move this resource to the top of the page..." border="0"></a>';
										}
									}
								}
							}
							str += '</span>';
						str += '</tr></table>';
					str += '</div>';
				}
			str += '</div>';
		str += '</div>';
		// DIVIDER
		if (fDivider) {
			str += '<div class="divider-wide">&nbsp;</div>';
		}
		return str;
	}

	// DESCRIPTIVE TEXT FOR REFERENCES, BULLETINS, EVENTS, NOTICES
	// 		-- fix extra <cr>s.
	//		-- make urls hot
	//		-- close tags left open by truncation
	//		-- truncation is handled by mysql
	function fixTrimStr (str,jsCall,id) {
		str = makeURLsHot(str,"inline_link");
		str = str.replace(/<br><br>/gi, '<br>');
		str = str.replace(/<p><br><\/p>/gi, '');
		str = str.replace(/<br>$<\/p>/gi, '');
		str = str.replace(/\s\s/g,'&nbsp;&nbsp;');
		str = str.replace(/^[\.\,\- \t\n\r]+|[ \t\n\r]+$/g, ""); //same as cleanstr
		var ftrunc = str.match(/\.\.\.$/);
		if (str.match(/<.+>/)) {
			var aTags = new Array('p','div','b','i','u','s','tt','span','big','small','strike','strong','center','blink','sub','sup','h1','h2','h3','h4','h5','h6');
			for (var i = 0; i < aTags.length; i++) {
				str = closeTag(aTags[i], str);
			}
			str = str.replace(/<+.\.\.\.$/g, '...');
			str = str.replace(/[^a-zA-Z]\.\.\.$/g, '...');
			if (ftrunc && jsCall) {
				str += ' <a href="javascript:'+jsCall+'(\''+id+'\')"  title="Click to continue reading in a separate window...">(Continues...)</a>';
			}

		}
		return str;
	} 
	function closeTag (tag, str) {
		var re1 = new RegExp('< *'+tag+'[ >]','ig');
		var re2 = new RegExp('<\/ *'+tag+' *>','ig');
		var s1 = str.match(re1);
		var s2 = str.match(re2);
		var n1 = 0;
		var n2 = 0;
		if (s1) { n1 = s1.length; } 
		if (s2) { n2 = s2.length; }
		for (var i = 0; i < n1-n2; i++) {
			str += '</'+tag+'>';
		}
		return str; 
	}

//================================
//
//	UPCOMING EVENTS
//
//================================

	function getOneEventHTML (strEvent, strPageType, fEditingPassword, fShowComments, nStyle, strId, i) {
	
		var str = '';
		
		var aU = strEvent.split("|");
		var idEvent		 		= aU[0];
		var idBy		 		= aU[1];
		var strByName			= aU[2];
		var strTitle 			= aU[3];
		var strText 			= aU[4];
		var strLocation			= aU[5];
		var strEmail			= aU[6];
		var strURL				= aU[7];
		var EStart		 		= aU[8];
		var EFinish 			= aU[9];
		var idMainRecip			= aU[10];
		var strMainRecipName 	= aU[11];
		var nRecipients			= aU[12];
		var nModifiedDays		= aU[13];
		var strComment			= aU[14];
		var fEditable			= aU[15];
		var strPeriod			= aU[16];
		var idEventType			= aU[17];
		var strEventTypeName 	= aU[18];
		var nEmailStatus	 	= aU[19];
		var nStatus	 			= aU[20];
		var fShowPostLinks	 	= (aU[21] == 1);
		var idLinkEvent			= aU[22];
		
		strTitle = stripHTML(strTitle); // menu string will be formatted, so do this here
		strTitle = cleanStr(strTitle);
		
		strText = fixTrimStr(strText,'showEvent',idEvent)
		
		var strDisplayLocation = getLocationDisplayString(strLocation, 1, EStart);
		var strDisplayDate = getEventDateHTML(EStart, EFinish, 1);
		var strTitleClass = 'noticefront_title';
		var strTextClass = 'noticefront_text';

		str += '<div class="notice_area" id="e'+i+'" onmouseover="showFooterDetails(event,\'e'+i+'\')" onmouseout="hideFooterDetails(event,\'e'+i+'\')">';
		
			str += '<div class="'+strPageType+'_colbox_wide">';
				// COMMENT
				if (fShowComments && strComment) {
					str += '<div class="comment">';
						str += strComment;
					str += '</div>';
				}
				var str2 = '';
				var nTMax = 64;
				if (nStyle == 2) {
					strTitleClass = 'noticefront_title_tight';
					strTextClass = 'noticefront_text_padded';
					nTMax = nTMax - strDisplayDate.length;
					// GROUP
					if (strMainRecipName) {
						var strDisplayRecipName = trimStringCenter(strMainRecipName, nTMax);
						if (strText) { strText += ' &middot; '; }
						strText += '<a class="inlinelink" href="javascript:showGIP(' + idMainRecip +')" title="Click to go to the group &quot;'+strMainRecipName+'&quot;...">(' + strDisplayRecipName + ')</a>';
						nTMax = nTMax-8;
					}
					// WEBSITE
					if (strURL) {
						if (strText) { strText += ' &middot; '; }
						strText += '<a class="inlinelink" href="javascript:showWebsite(\''+escape(strURL)+'\','+idMainRecip+',1)" title="Click to open this web link...">Link</a>';
						nTMax = nTMax-5;
					}
					// REPLY
					if (strEmail) {
						if (strText) { strText += ' &middot; '; }
						strText += '<a class="inlinelink" href="' + getMailToValue(strEmail,strTitle,"","",0) + '" title="Click to write an e-mail message to '+strEmail+'...">Reply</a>';
						nTMax = nTMax-6;
					} 
					// EMAIL STATUS
					if (nEmailStatus == 1) {
						if (strText) { strText += ' &middot; '; }
						strText += '<img src="bits/MailSentPendingBlack.gif" height="13" width="13" title="E-mail notification pending..." alt="" border="0">';
						nTMax = nTMax-3;
					} else if (nEmailStatus == 2) {
						if (strText) { strText += ' &middot; '; }
						strText += '<img src="bits/MailSentBlack.gif" height="13" width="13" title="E-mail notification sent..." alt="" border="0">';
						nTMax = nTMax-3;
					}
					var aDisplayDate = strDisplayDate.split(',');
					if (aDisplayDate.length == 3) { 
						strDisplayDate = aDisplayDate[0] + ', ' + aDisplayDate[2]; 
						if (strText) { strText += ' &middot; '; }
						strText += aDisplayDate[1];
					}
					if (strTitle.length < 40) 	{ strTitle = '<b>' + strTitle + '</b>'; }
					if (strTitle) 				{ strTitle += ' &middot; ' + strDisplayDate; }
				} else {
					str += '<div id="e'+i+'top" style="visibility:visible;">';
						// DATE
						str2 += '<a class="surveylink" href="javascript:showEvent('+idEvent+')">' + strDisplayDate + '</a>';
						nTMax = nTMax - strDisplayDate.length;
						// GROUP
						if (strMainRecipName) {
							var strDisplayRecipName = trimStringCenter(strMainRecipName, nTMax);
							str2 += ' <a class="surveylink" href="javascript:showGIP(' + idMainRecip +')" title="Click to go to the group &quot;'+strMainRecipName+'&quot;...">(' + strDisplayRecipName + ')</a>';
							nTMax = nTMax-8;
						}
						// WEBSITE
						if (strURL) {
							str2 += '&nbsp;&middot;&nbsp;<a class="surveylink" href="javascript:showWebsite(\''+escape(strURL)+'\','+idMainRecip+',1)" title="Click to go to '+strURL+'...">Link</a>';
							nTMax = nTMax-5;
						}
						// REPLY
						if (strEmail) {
							str2 += '&nbsp;&middot;&nbsp;<a class="surveylink" href="' + getMailToValue(strEmail,strTitle,"","",0) + '" title="Click to write an e-mail message to '+strEmail+'...">Reply</a>';
							nTMax = nTMax-6;
						} 
						// EMAIL STATUS
						if (nEmailStatus == 1) {
							str2 += '&nbsp;&middot;&nbsp;<img src="bits/MailSentPendingBlack.gif" height="13" width="13" title="E-mail notification pending..." alt="" border="0">';
							nTMax = nTMax-3;
						} else if (nEmailStatus == 2) {
							str2 += '&nbsp;&middot;&nbsp;<img src="bits/MailSentBlack.gif" height="13" width="13" title="E-mail notification sent..." alt="" border="0">';
							nTMax = nTMax-3;
						}
						str += str2;
					str += '</div>';
				}
				// TITLE TOGGLES TO HIDE/SHOW NOTICE TEXT; OPEN BY DEFAULT
				var displayTitle = '';
				var fNew = (nModifiedDays > 0);
				displayTitle += strTitle;
				str += getTitleToggleNoStripHTML(strId+i, displayTitle, 'notice', strTitleClass, false, fNew);
	
				// TEXT WITH WEBSITE LINK
				str += '<div id="'+strId+i+'" style="display:none;">'; 
					str += '<div class="'+strTextClass+'">';
						var strDisplay = '';
						if (strPeriod) {
							strDisplay += strPeriod;
							if (strText) { strDisplay += '&nbsp;&middot;&nbsp;'; }
						}
						strDisplay += strText;
						if (strDisplayLocation) {
							if (strText) { strDisplay += '&nbsp;&middot;&nbsp;'; }
							strDisplay += '<span class="cellinfo">' + strDisplayLocation + '</span>';
						}
						str += '<span id="'+strId+i+'_text">';
						str += strDisplay;
						str += '</span>';
					str += '</div>';
					// FOOTER
					str += '<div class="notice_footer">';
						str += '<table cellspacing="0" cellpadding="0" class="footer_wide"><tr>';
						str += '<td align="left">';
							var nTMax = 50;
							if (fShowPostLinks) {
								nTMax = nTMax - 20;
							}
							str += '<a class="cellinfo" href="javascript:showPIP(' + idBy +')" title="Click to visit '+strByName+'\'s page...">'+trimStringCenter(strByName, nTMax)+'</a>';
							if (nRecipients > 1) { str += getDistLink(2,idEvent); }
						str += '</td>';
						str += '<td align="right">';
							var fAddTilde = false;
							str += '<span id="e'+i+'bot" style="visibility:hidden;">';
							if (nStatus == 0) {
								if (fShowPostLinks) {
									// RESTORE
									str += '<a class="cellinfo" href="JavaScript:restoreEvent('+ idEvent + ')" title="Click to restore this event...">restore</a>';
								}
							} else {
								// OPEN
								str += '<a class="cellinfo" href="javascript:showEvent('+idEvent+')" title="Click to open this event in a separate window...">open</a>';
								fAddTilde = true;
								if (fShowPostLinks) {
									// CHANGE
									if (fAddTilde) { str += '&nbsp;&middot;&nbsp;'; }
									fAddTilde = true;
									str += '<a class="cellinfo" href="JavaScript:editEvent('+idMainRecip+','+idEvent+')" title="Click to edit this event...">change</a>';
									// DELETE
									if (fAddTilde) { str += '&nbsp;&middot;&nbsp;'; }
									fAddTilde = true;
									if (idLinkEvent != 0) {
										str += '<a class="cellinfo" href="JavaScript:deleteEventInline('+idEvent+',\''+fEditingPassword+'\',\'dlgevt'+idEvent+'\')" title="Click to remove this event...">delete</a>';
									} else {
										str += '<a class="cellinfo" href="JavaScript:deleteEvent('+idEvent+')" title="Click to remove this event...">delete</a>';
									}
									// COPY
									str += '&nbsp;&middot;&nbsp;';
									str += '<a class="cellinfo" href="JavaScript:copyEvent('+idMainRecip+','+idEvent+')" title="Click to create a new event like this one...">copy</a>';
								}
							}
							str += '</span>';
						str += '</td></tr></table>';
						str += '<div id="dlgevt'+idEvent+'"></div>';
					str += '</div>';
				str += '</div>';
			str += '</div>';
		str += '</div>';
		return str;
	}

//================================
//
//	NOTICES
//
//================================

	function getOneNoticeHTML(strNotice, i, aRecips, idUser, fShowComments, fEditingPassword) {

		var str = '';

		var aP = strNotice.split("|");
		var idNotice 			= aP[0];
		var PostingDate 		= aP[1];	// in format Jan 23
		var Expires 			= aP[2];	// in format Jan 24, 12:30 AM
		var strTitle 			= aP[3];
		var strText 			= aP[4];
		var strEmail 			= aP[5];
		var strURL 				= aP[6];
		var idBy 				= aP[7];
		var strByName 			= aP[8];
		var idMainRecip			= aP[9];
		var strMainRecipName	= aP[10];
		var nModifiedDays		= aP[11];
		var strComment			= aP[12];
		var nPriority			= aP[13];
		var fHasSurvey			= (aP[14] == 1);
		var nEmailStatus		= aP[15];
		var nStatus				= aP[16];
		var fShowPostLinks		= (aP[17] == 1);
		
		strText = fixTrimStr(strText,'showNotice',idNotice);

		var nRecipients = 0;
		for (var n=0; n < aRecips.length; n++) {
			var aR = aRecips[n].split('|');
			if (aR[0] == idNotice) {
				nRecipients = aR[1];
				break;
			}
		}
		
		var strStyleExtra = '';
		if (nPriority > 0) { strStyleExtra = '_priority'; }

		// ITEM AREA
		str += '<div class="notice_area'+strStyleExtra+'" id="n'+i+'" onmouseover="showFooterDetails(event,\'n'+i+'\')" onmouseout="hideFooterDetails(event,\'n'+i+'\')">';

			var strStyleOpen = '';
			// COMMENT
			if (fShowComments && strComment) {
				str += '<div class="comment">';
					str += strComment;
				str += '</div>';
			}
			str += '<div id="n'+i+'top" style="visibility:visible;">';
				var str2 = '';
				var nTMax = 50;
				// DATE
				str2 += '<span class="cellinfo">' + PostingDate + ' - ' + Expires + '</span>';
				// WEBSITE
				if (strURL) {
					str2 += ' &middot; <a class="surveylink" href="javascript:showWebsite(\''+escape(strURL)+'\','+idMainRecip+',1)" title="Click to go to '+strURL+'...">Link</a>';
				}
				// REPLY
				if (strEmail) {
					str2 += ' &middot; <a class="surveylink" href="' + getMailToValue(strEmail,strTitle,"","",0) + '" title="Click to write an e-mail message to '+strEmail+'...">Reply</a>';
					nTMax = nTMax-6;
				} 
				// SURVEY
				if (fHasSurvey) {
					str2 += ' &middot; <a class="surveylink_live" href="JavaScript:showNotice('+idNotice+')" title="Click to view the survey...">Survey</a>';
					nTMax = nTMax-6;
				}
				if (nEmailStatus == 1) {
					str2 += '&nbsp;&middot;&nbsp;<img src="bits/MailSentPendingBlack.gif" height="13" width="13" title="E-mail notification pending..." alt="" border="0">';
					nTMax = nTMax-3;
				} else if (nEmailStatus == 2) {
					str2 += '&nbsp;&middot;&nbsp;<img src="bits/MailSentBlack.gif" height="13" width="13" title="E-mail notification sent..." alt="" border="0">';
					nTMax = nTMax-3;
				}
				// MAIN GROUP
				if (strMainRecipName) {
					str += '<a class="cellinfo" href="javascript:showGIP(' + idMainRecip +')" title="Click to go to the group &quot;'+strMainRecipName+'&quot;...">'+trimStringCenter(strMainRecipName, nTMax)+'</a> &middot; ';
				}
				str += str2;
			str += '</div>';
			// TITLE TOGGLES TO HIDE/SHOW NOTICE TEXT
			var displayTitle = '';
			displayTitle += strTitle;
			var fNew = (nModifiedDays > 0);
			str += getTitleToggleHTML('notice'+i, displayTitle, 'notice', 'noticefront_title', false, fNew);
			// TEXT WITH WEBSITE LINK
			str += '<div id="notice'+i+'" class="notice_details'+strStyleOpen+'">'; 
				if (strText) { str += '<div class="noticefront_text'+strStyleExtra+'">'; }
					str += '<span id="notice'+i+'_text">';
					str += strText;
					str += '</span>';
				if (strText) { str += '</div>'; }
				// FOOTER
				str += '<div class="notice_footer">';
					var nTMax = 50;
					if (fShowPostLinks) {
						nTMax = nTMax - 20;
					}
					str += '<table cellspacing="0" cellpadding="0" class="footer_wide"><tr>';
					// BY
					str += '<td align="left">';
						str += '<a class="cellinfo" href="javascript:showPIP(' + idBy +')" title="Click to visit '+strByName+'\'s page...">'+trimStringCenter(strByName, nTMax)+'</a>';
						if (nRecipients > 1) { str += getDistLink(3,idNotice); }
					str += '</td>';
					str += '<td align="right">';
						str += '<span id="n'+i+'bot" style="visibility:hidden;">';
						if (nStatus == 0) {
							if (fShowPostLinks) {
								// RESTORE
								str += '<a class="cellinfo" href="JavaScript:restoreGroupMessage('+idNotice+')" title="Click to restore this notice...">restore</a>';
							}
						} else {
							// OPEN
							var strOpen = 'open';
							if (fHasSurvey) { strOpen += '/respond'; }
							str += '<a class="cellinfo" href="javascript:showNotice('+idNotice+')" title="Click to open this notice in a separate window...">'+strOpen+'</a>';
							if (fShowPostLinks) {
								// CHANGE
								str += ' &middot; <a class="cellinfo" href="JavaScript:editGroupMessage('+idMainRecip+','+idNotice+')" title="Click to edit this notice...">change</a>';
								// DELETE
								str += ' &middot; <a class="cellinfo" href="JavaScript:deleteGroupMessageInline('+idNotice+',\''+fEditingPassword+'\',\'dlggm'+idNotice+'\')" title="Click to remove this notice...">delete</a>';
								// COPY
								str += ' &middot; <a class="cellinfo" href="JavaScript:copyGroupMessage('+idMainRecip+','+idNotice+')" title="Click to create a new notice like this one...">copy</a>';
							}
						}
						str += '</span>';
					str += '</td>';
					str += '</tr></table>';
					str += '<div id="dlggm'+idNotice+'"></div>';
				str += '</div>';
			str += '</div>';		// notice_details
		str += '</div>';			// notice_area
		
		return str;
	}
	function getImageLinkHTML (strPix,nSize,strClass,strALink,nType,id,idGroup) {
		var strImgTag = '';
		var aF = getFileInfo(strPix);
		var fIsAcceptedType = aF[0];
		var fIsImage 		= aF[1];
		var strExt 			= aF[2];
		var strExtName 		= aF[3];
		strPix = unescape(strPix);
		if (strExtName == 'xobject') {
			strPix = strPix.replace(/width/g,"x-width");
			strImgTag += '<object>' + strPix.replace(/>/g,' class="'+strClass+'" border="0">') + '</object>'; 
		} else {
			if (strALink) {
				strImgTag += strALink;
			}
			if (strExtName == 'xcontent') { 
				strImgTag += '<img src="'+strPix+'" class="'+strClass+'" border="0">';
			} else {
				if (nType == 1) {
					strImgTag += '<img src="'+gCGIPath+'fetch_bulletin_pix.cgi?ID='+id+'&SIZE='+nSize+'&GIP='+idGroup+'" class="'+strClass+'" border="0">';
				} else if (nType == 2) {
					strImgTag += '<img src="'+gCGIPath+'fetch_reference_pix.cgi?ID='+id+'&SIZE='+nSize+'" class="'+strClass+'" border="0">';
				} else if (nType == 3) {
					strImgTag += '<img src="'+gCGIPath+'fetch_bulletin_piece.cgi?ID='+id+'&F=thumb_'+escape(strPix)+'" class="'+strClass+'" border="0">';
				} else if (nType == 4) {
					strImgTag += '<img src="'+gCGIPath+'fetch_reference_piece.cgi?ID='+id+'&F=thumb_'+escape(strPix)+'" class="'+strClass+'" border="0">';
				} else if (nType == 5) {
					strImgTag += '<img src="'+pubPixDir()+'/'+strPix+'" class="'+strClass+'" border="0">';
				}
			}
			if (strALink) {
				strImgTag += '</a>';
			}
		}
		return strImgTag;
	}

	// LIST OF LINKS FOR REFERENCES AND BULLETINS
	//		-- add all file attachments
	//		-- add all website links
	// 		-- nObType: 0=resource; 1=group
	function getLinksHTML (aAllPieces, id, idPage, nPageType, nObType) {
		// SELECT PIECES
		//		-- pull out just the pieces for this id
		//		-- create new array in reverse order so can add cover art if needed
		var aPieces = new Array();
		for (var n = aAllPieces.length - 1; n >=0; n--) {
			var aR 	= aAllPieces[n].split('|');
			var idR = aR[0];
			if (idR == id) {
				aPieces[aPieces.length] = aAllPieces[n];
			}
		}
		// LIST OF LINKS
		//		-- add all file attachments
		//		-- add all website links
		var str1 = '';
		var str2 = '';
		for (var n = aPieces.length-1; n >=0; n--) {
			var aP 			= aPieces[n].split('|');
			var strFile		= aP[1];
			var strCaption 	= aP[2];
			var nType 		= aP[3];
			if (strFile) {
				if (nType == 2) { 			// WEB LINKS
					if (!strCaption) { 
						strCaption = strFile;
					}
					str2 += '<div class="bulletindoclink">';
					str2 += '<a href="javascript:showWebsite(\''+escape(strFile)+'\','+idPage+','+nPageType+')" title="'+strFile+'">';
					str2 += '<img src="bits/html_icon.gif" height="16" width="16" title="'+strCaption+'" alt="'+strCaption+'" border="0">&nbsp;&nbsp;';
					str2 += trimStringCenter(strCaption, 64);
					str2 += '</a></div>';
				} else if (nType == 1) { 	// DOCUMENT LINKS
					var aF = getFileInfo(strFile);
					var fIsAcceptedType 	= aF[0];
					var fIsImage 			= aF[1];
					var strExt 				= aF[2];
					var strExtName 			= aF[3];
					var strhref = '';
					if (nObType == 0) {
						strhref = gCGIPath + getReferencePieceURL(strFile,id);
						if ((strExtName == 'xobject') || (strExtName == 'xcontent')) {
							strhref = 'javascript:showReference('+id+')';
							//strhref = strFile;
						}
					} else {
						strhref = gCGIPath + getBulletinPieceURL(strFile,id);
						if ((strExtName == 'xobject') || (strExtName == 'xcontent')) {
							strhref = 'javascript:showBulletin('+id+')';
							//strhref = strFile;
						}
					}
					if (!strCaption) {
						if (strExtName == 'xobject') {
							strCaption = 'External Web Object';
						} else if (strExtName == 'xcontent') {
							strCaption = 'External Content';
						} else {
							strCaption = FNtoCaption(strFile);
						}
					}
					str1 += '<div class="bulletindoclink">';
					str1 += '<a href="'+strhref+'" target="_blank" title="'+strFile+'">';
					str1 += '<img src="bits/'+strExt+'_icon.gif" height="16" width="16" title="'+strCaption+'" alt="'+strCaption+'" border="0">&nbsp;&nbsp;';
					str1 += trimStringCenter(strCaption, 64);
					str1 += '</a></div>';
				}
			}
		}
		return str1+str2;
	}
	function doFade (ob, nVal) {
		var nMinFade = 100;
		if (nVal > nMinFade) { return; }
		var obStyle = ob.style;
		obStyle.visibility 	= 'visible';
		obStyle.position 	= 'relative'; 	// messes up if absolute position div
		obStyle.width 		= '100%';		// sets IE hasLayout property
		// obStyle.height 	= '100%';		// sets IE hasLayout property
		obStyle.opacity = nVal/nMinFade;
		obStyle.KhtmlOpacity = nVal/nMinFade;
		obStyle.filter = 'alpha(opacity='+nVal+')';
	}
	function doGlow (id) { 
		var ob = getDOM(id,0);
		if (typeof ob.fadelevel == 'undefined') { ob.fadelevel = 150; }
		if (typeof ob.fadevalue == 'undefined') { ob.fadevalue = false; }
		doFade (ob, ob.fadelevel);
		if (ob.fadevalue) {
			ob.fadelevel = ob.fadelevel + 5;
		} else {
			ob.fadelevel = ob.fadelevel - 5;
		}
		if ((ob.fadelevel == 150) || (ob.fadelevel == 40)) { 
			ob.fadevalue = (!ob.fadevalue); 
		}
	}
	function doFadeIn (id) { 
		var ob = getDOM(id,0);
		if (typeof ob.fadeinlevel == 'undefined') { ob.fadeinlevel = 0; }
		ob.fadeinlevel = ob.fadeinlevel + 25;
		doFade (ob, ob.fadeinlevel);
		if (ob.fadeinlevel >= 100) {
			ob.fadeinlevel = 0;
			ob.style.visibility = 'visible';
			eval("fadeIn"+id+" = clearInterval(fadeIn"+id+");");
		}
	}
	function doFadeOut (id) { 
		var ob = getDOM(id,0);
		if (typeof ob.fadeoutlevel == 'undefined') { ob.fadeoutlevel = 100; }
		eval("if (typeof fadeIn"+id+" != 'undefined') { fadeIn"+id+" = clearInterval(fadeIn"+id+"); }");
		ob.fadeoutlevel = ob.fadeoutlevel - 5;
		doFade (ob, ob.fadeoutlevel);
		if (ob.fadeoutlevel <= 0) {
			ob.fadeoutlevel = 100;
			ob.style.visibility = 'hidden';
			eval("fadeOut"+id+" = clearInterval(fadeOut"+id+");");
		}
	}
	function isMouseWithin (e,id) {
		if (!e) { var e = window.event; }
		var ob = (e.toElement) ? e.toElement : e.relatedTarget;
		while (ob) {
			if (ob.id == id) { return true; }
			ob = ob.parentNode;
		}
		return false;
	}
	function isVisible (id) {
		var obStyle = getDOM(id,1);
		return (obStyle.visibility == 'visible');
	}
	function showDetails (e,idtarget,id1,id2,id3,id4) {
		//if (isMouseWithin(e,idtarget)) { 
			var msecs = 15;
			for (var i = 2; i <= 5; i++) {
				eval("if ((arguments["+i+"]) && (typeof fadeIn"+arguments[i]+" == 'undefined') && !isVisible(arguments["+i+"])) { fadeIn"+arguments[i]+" = setInterval('doFadeIn(\"'+arguments[i]+'\")', msecs); }");
			}
		//}
	}
	function hideDetails (e,idtarget,id1,id2,id3,id4) {
		if (!isMouseWithin(e,idtarget)) { 
			var msecs = 20;
			for (var i = 2; i <= 5; i++) {
				eval("if ((arguments["+i+"]) && (typeof fadeOut"+arguments[i]+" == 'undefined') ) { fadeOut"+arguments[i]+" = setInterval('doFadeOut(\"'+arguments[i]+'\")', msecs); }");
			}
		}
	}
	function showCellDetails (e,id) {
		showDetails (e,id,id+'top',id+'bot','','');
	}
	function hideCellDetails (e,id) {
		hideDetails (e,id,id+'top',id+'bot','','');
	}
	function showFooterDetails (e,id) {
		showDetails (e,id,id+'bot','','','');
	}
	function hideFooterDetails (e,id) {
		hideDetails (e,id,id+'bot','','','');
	}
	function showMenuDetails (e,idtarget,id) {
		showDetails (e,idtarget,id+'links','','','');
	}
	function hideMenuDetails (e,idtarget,id) {
		hideDetails (e,idtarget,id+'links','','','');
	}
	
	function getOnePersonHTML(aP, i) {
		var idP 			= aP[0];
		var strPName		= aP[1];
		var strPEmail		= aP[2];
		var fAllowENotes	= aP[3];
		var urlPhoto		= aP[4];
		var idRole			= aP[5];
		var strRole			= aP[6];
		var idRoleType		= aP[7];
		var fSignedIn		= aP[8];
		var strDescription	= aP[9];
		var fContact		= aP[10];
		var fEditor			= aP[11];
		var strNote			= aP[12];
		var strLastSession	= aP[13];
		var strContact1		= aP[14];
		var strContact2		= aP[15];
		var strContact3		= aP[16];
		gstrPeopleIds += idP + ':';

		var str = '';
		
		var fAllowENotes	= (fAllowENotes > 0);
		var fSignedIn		= (fSignedIn > 0);
		var fContact		= (fContact > 0);
		var fEditor			= (fEditor > 0);

		var goTip = 'Click to view...';

		var iconTip = strRole;
		if (fContact || fEditor) { 
			iconTip += ': ';
			if (fContact) 	{ iconTip += 'Contact'; }
			if (fContact && fEditor) { iconTip += ' & '; }
			if (fEditor) 	{ iconTip += 'Editor'; }
		}
		iconTip += '. '+goTip;

		if (!gfPDetails) {
			str += '<div class="myperson_text">';
				var iconRT = "RoleOtherBlack.gif";
				if (idRoleType == 1) { iconRT = "RoleStudentBlack.gif"; }
				else if (idRoleType == 2) { iconRT = "RoleParentBlack.gif"; }
				else if (idRoleType == 3) { iconRT = "RoleEmployeeBlack.gif"; }
				str += '<a class="myplainlink" href="javascript:showPIP('+idP+')" title="'+iconTip+'"><img src="/bits/'+iconRT+'" border="0"> '+trimStringCenter(strPName,28)+'</a>';
			str += '</div>';
			return str;
		}

		if (!urlPhoto) {
			urlPhoto = 'roletype-'+idRoleType+'.jpg';
		}
		if (!strDescription) {
			strDescription = strRole;
		}
		var urlThumb = getThumbURL('PIP',urlPhoto) 
		
		str += '<div id="p'+i+'" onmouseover="showFooterDetails(event,\'p'+i+'\')" onmouseout="hideFooterDetails(event,\'p'+i+'\')">';
		str += '<table cellspacing="0" cellpadding="0">';
		str += '<tr>';
		// PHOTO
		str += '<td class="myperson_thumbnail"><a href="javascript:showPIP('+idP+')" title="Click to go to '+strPName+'\'s page..." alt=""><img src="'+urlThumb+'" class="pixtdmedium"></a></td>';
		str += '<td class="myperson_contactinfo">';
		str += '<div class="myperson_text">';
			str += '<div id="p'+i+'top" style="visibility:visible;">';
				// GROUP NAME
				if (fContact) {
					str += '<img src="bits/GroupContactBlack.gif" title="Contact for this page..." width="13" height="13" border="0">&nbsp;';
				} else {
					// str += '<img src="bits/GroupMemberBlack.gif" title="Member of this page..." width="13" height="13" border="0">&nbsp;';
				}
				if (fEditor) {
					str += '<img src="bits/PencilBlack.gif" title="Editor of this page..." width="13" height="13" border="0">&nbsp;';
				}
				str += strDescription;


			str += '</div>';
			// LINE 2: display name 
			str += getTitleToggleHTML('person'+i, strPName, 'person', 'myperson_namelink', false, fSignedIn);
			// LINE 2: contact info 
			str += '<div id="person'+i+'" style="display:none;">';
				// LINE 0-1: note + role + page role
				if (strNote) { 
					str += strNote + '<br>'; 
				}
				str += '<div class="invite_text">';
					if (idRoleType == 2) {
						//	-- 2=parent so show home phone number
						var strContact	  		= strContact1;
						str += '<div class="invite_text">';
							str += '<div class="boldtext">Phone</div>';
							if (strContact) {
								str += '<a class="contact_text"  href="javascript:viewParentContactInfo('+idP+')" title="Click to see more of '+strPName+'\'s contact information...">';
								str += strContact;
								str += '</a>';
							} else { str += 'Not Available'; }
						str += '</div>';
					} else if (idRoleType == 3) {
						// -- 3 = employee so show office address and phone
						var strOfficePhone		= strContact1;
						var strOfficeAddress 	= strContact2;
						var strPosition 		= strContact3;
						str += '<div class="invite_text">';
							str += '<div class="boldtext">Position</div>';
							str += '<a class="contact_text"  href="javascript:viewEmployeeContactInfo('+idP+')" title="Click to see more of '+strPName+'\'s contact information...">';
							if (strPosition) {
								str += strPosition;
							} else { str += 'Not Available'; } 
							str += '</a>';
						str += '</div>';
						str += '<div class="invite_text">';
							str += '<div class="boldtext">Office</div>';
							str += '<a class="contact_text"  href="javascript:viewEmployeeContactInfo('+idP+')" title="Click to see more of '+strPName+'\'s contact information...">';
							if (strOfficeAddress) {
								str += strOfficeAddress;
							} else { str += 'Not Available'; } 
							str += '</a>';
						str += '</div>';
						str += '<div class="invite_text">';
							str += '<div class="boldtext">Phone</div>';
							str += '<a class="contact_text"  href="javascript:viewEmployeeContactInfo('+idP+')" title="Click to see more of '+strPName+'\'s contact information...">';
							if (strOfficePhone) {
								str += gstrPhonePrefix + strOfficePhone;
							} else { str += 'Not Available'; }
							str += '</a>';
						str += '</div>';
					} else if (idRoleType == 1) {
						// -- 1 = student 
						var nClassOf			= strContact1;
						if (nClassOf > 1900) { 
							str += '<div class="invite_text">';
								var strGrade = classoftoGrade(nClassOf);
								str += strGrade; 
							str += '</div>';
						}
					}
					str += '<div class="invite_text">';
						str += '<div class="boldtext">Last Signed In</div>';
						str += strLastSession;
					str += '</div>';
				str += '</div>';
			str += '</div>';
			str += '<div id="p'+i+'bot" style="visibility:hidden;">';
				str += '<a class="cellinfo" href="javascript:showPIP('+idP+')" title="Click to go to '+strPName+'\'s page...">go to page</a>';
				if (fAllowENotes) {
					str += '&nbsp;&middot;&nbsp;<a class="cellinfo" href="javascript:addPersonMessage('+idP+', \'\')" title="Click to write to '+strPName+'...">write</a>';
				}
			str += '</div>';
		str += '</div>';
		str += '</td></tr>';
		str += '</table>';
		str += '</div>';
		return str;
	}

//================================
//
//	POPUP MENUS
//
//================================
	
		// global menu variables
		var domMenu_cur = null;
		var domMenu_old = null;
		var menu_t = 0;
		var menu_lDelay = 3;
		var menu_lCount = 0;
		var menu_pause = 100;
		
		function showMenuFromDiv(menuName, e) {
			// check if from menubar div...if not don't pass on to menu function as it is bubbling from another source
			var strName = getEventTargetAttribute(e,'name');
			//alert ('showMenuFromDiv called by id '+strName);
			if ((strName) && (strName.indexOf('menubar') != -1)) { showMenu(menuName,e); }
		}
		
		function showMenu(menuName, e){
			if (e) { e.cancelBubble = true;  }
			if (isDHTML) {
				menu_t = 2;
				// hide any existing open menu
				if (domMenu_old) {
					//domMenu_old.visibility = 'hidden'; 
					domMenu_old.display = 'none'; 
					domMenu_old.zIndex = '0'; 
					menu_t = 2; 
					menu_lCount = 0;
				}
				// get DOM for new menu
				// set position and then show new menu
				domMenu_cur = getDOM(menuName,1);
				if (domMenu_old != domMenu_cur) {	
					//domMenu_cur.visibility = 'visible';
					domMenu_cur.display = 'block';
					domMenu_cur.zIndex = 1000;
					domMenu_old = domMenu_cur;
				}
				// Resets oldDom if it is the same as the current DOM
				else { domMenu_old = null; }
			}
			// Returns a 'null' value for non-DHTML Browsers 
			else { return null; }
		}
		
		function delayHide() {
			// Checks to see if there is a menu showing and whether 
			// the global variable 'menu_t' has been set to 0
		    if ((domMenu_old) && (menu_t == 0)) {
				// Hides the old menu, resets menu conditions, 
				// and stops the function running
		        //domMenu_old.visibility = 'hidden'; 
		        domMenu_old.display = 'none'; 
		        domMenu_old.zIndex = '0';
		        domMenu_old = null;
		        menu_lCount = 0; 
		        return false;
		    }
			// Interupts the function if another menu is opened
		    if (menu_t == 2) { menu_lCount = 0; return false; }
			// Repeats the function adding 1 to lCount each time until 
			// lCount is equal to lDelay and then sets 't' to 0 so that 
			// the menu will hide when it runs again
		    if (menu_t == 1) { 
		        menu_lCount = menu_lCount + 1;
		        if (menu_lDelay <= menu_lCount) { menu_t = 0; }
		        //if (menu_lDelay >= menu_lCount) { setTimeout('delayHide(' + menu_t + ')',menu_pause); }
		        setTimeout('delayHide()',menu_pause);
		    }
		}
		

		// Create Subhead with title text and menu link
		//	-- strPageType = "pip", "gip", "rip" etc...
		var gfHilite = false;
		function getSubHeadHTML(strTitle,strMenuID,nStyle,strPageType) {
			return getSubHeadWithRightHTML(strTitle,strMenuID,nStyle,strPageType,'');
		}
		function getSubHeadWithRightHTML(strTitle,strMenuID,nStyle,strPageType,strRight) {
			var str = '';
			// flag to create UI for multi-div opener
			var fMulti = ((strRight.length > 0) && (strRight.charAt(0) != '<'));
			var strDiv = '';
			var nItems = '';
			if (fMulti) { 
				nItems = strMenuID;
				strDiv = strRight;
			}
			var aDiv = strTitle.split("|");
			var fMultiExtra = aDiv.length > 1;
			if (fMultiExtra) {
				strTitle = aDiv[0];
				strDivExtra = aDiv[1];
			}
			var strdisplay1 = 'none';
			var strdisplay2 = 'block';
			if (!strDiv) {
				strDiv = strMenuID;
				//strdisplay1 = 'block';
				//strdisplay2 = 'none';
			}
			var fMenu = 	(!fMulti && strMenuID);
			var fExtra = 	( fMulti || strRight);
			// set correct styles
			var strDivClass = strPageType+'_sectionhead_narrow';
			var strTableClass = strPageType+'_sectionhead_table_narrow';
			var strLinkClass = strPageType+'_sectionhead_text';
			var strSubLinkClass = strPageType+'_subhead_links';
			var strToggle = 'toggleDiv';
			var strMultiToggle = 'multiToggleDiv';
			var nIcon = 4; // 1=white; 4=black
			if (nStyle == 2) { 
				strDivClass = strPageType+'_sectionhead_narrow_accent';
				strTableClass = strPageType+'_sectionhead_table_narrow';
				strLinkClass = strPageType+'_sectionhead_text_accent';
				strSubLinkClass = strPageType+'_subhead_links_accent';
				nIcon = 1;
			} else if 	(nStyle == 3) {
				strDivClass = strPageType+'_sectionhead_wide';
				strTableClass = strPageType+'_sectionhead_table_wide';
				strLinkClass = strPageType+'_sectionhead_text';
				strSubLinkClass = strPageType+'_subhead_links';
				nIcon = 4;
			} else if 	(nStyle == 4) {
				strDivClass = strPageType+'_sectionhead_wide_accent';
				strTableClass = strPageType+'_sectionhead_table_wide';
				strLinkClass = strPageType+'_sectionhead_text_accent';
				strSubLinkClass = strPageType+'_subhead_links_accent';
				nIcon = 1;
			}
			if (strPageType == 'page') {
				//nIcon = 4;
			}
			if (strDiv == 'schedDay') {
				strMultiToggle += 'Sticky';
			}
			// create html
			str = '<div id="menubarDiv_'+strDiv+'" name="menubarDiv_'+strDiv+'" class="'+strDivClass+'"';
				if (fMenu || fMulti) {
					str += ' style="cursor:pointer;" ';
					if (fMulti) {
						if (nItems == 0) {
							str += ' onmousedown="if (gfHilite) { '+strToggle+'(\''+strDiv+'\'); }" title="Click to expand or collapse this heading..." ';
						} else {
							str += ' onmousedown="if (gfHilite) { '+strMultiToggle+'(\''+strDiv+'\', \''+nItems+'\'); }" title="Click to expand or collapse all items under this heading..." ';
						}
					} else {
						str += ' onmousedown="if (gfHilite) { showMenuFromDiv(\''+strMenuID+'\', event); }" title="Click to open or close this menu..." ';
					}
					str += ' onmouseover="hiliteMenubar(event, this); gfHilite = true;" ';
					str += ' onmouseout="unhiliteMenubar(event, this); gfHilite = false;" ';
				}
				str += ' >';
					str += '<table cellspacing="0" cellpadding="0" class="'+strTableClass+'">';
						str += '<tr>';
							str += '<td class="'+strLinkClass+'" >';
								if (fMenu) {
									var fDisplay = getMenuState(strMenuID,false);
									str += '<a onmousedown="noop();" href="javascript:'+strToggle+'(\''+strMenuID+'\');" id="'+strMenuID+'_on" class="'+strLinkClass+'" style="'+getMenuDisplay(fDisplay)+';cursor:pointer;">';
										str += '<img src="bits/menu'+nIcon+'_on.gif" alt="" border="0"> '; // winIE will trash lineheight w/out span tags.
										str += strTitle;
									str += '</a>';
									str += '<a onmousedown="noop();" href="javascript:'+strToggle+'(\''+strMenuID+'\');" id="'+strMenuID+'_off" class="'+strLinkClass+'" style="'+getMenuDisplay(!fDisplay)+';cursor:pointer;">';
										str += '<img src="bits/menu'+nIcon+'_off.gif" alt="" border="0"> '; // winIE will trash lineheight w/out span tags.
										str += strTitle;
									str += '</a>';
								} else if (fMulti && (nItems > 1)) {
									var fDisplay = getMenuState(strDiv,false);
									str += '<a onmousedown="noop();" href="javascript:'+strMultiToggle+'(\''+strDiv+'\', \''+nItems+'\');" id="'+strDiv+'_on" class="'+strLinkClass+'" style="'+getMenuDisplay(fDisplay)+';cursor:pointer;" >';
										str += '<img src="bits/menu'+nIcon+'_on.gif" alt="" border="0"> ';
										str += strTitle;
									str += '</a>';
									str += '<a onmousedown="noop();" href="javascript:'+strMultiToggle+'(\''+strDiv+'\', \''+nItems+'\');" id="'+strDiv+'_off" class="'+strLinkClass+'" style="'+getMenuDisplay(!fDisplay)+';cursor:pointer;" >';
										str += '<img src="bits/menu'+nIcon+'_off.gif" alt="" border="0"> ';
										str += strTitle;
									str += '</a>';
								} else {
									str += strTitle;
								}
							str += '</td>';
							if (fExtra) {
								str += '<td align="right">';
								str += '<span class="'+strSubLinkClass+'" onmousedown="gfHilite = false;" id="'+strDiv+'links" style="visibility:hidden;">';
									if (!fMulti) {
										str += strRight;
									} else {
										if (fMultiExtra) {
											str += strDivExtra;
										}
									}
								str += '&nbsp;</span>';
								str += '</td>';
							}
						str += '</tr>'
					str += '</table>';
				str += '</div>';
			return str;
		}
		function noop() { void 0; }
		
	
//================================
//
//	COOKIES
//
//================================

	// "Internal" function to return the decoded value of a cookie
	function getCookieVal (offset) {
		var endstr = document.cookie.indexOf (";", offset);
		if (endstr == -1) { endstr = document.cookie.length; }
		return document.cookie.substring(offset, endstr);
	}
	//  get cookie specified by "name".
	function GetCookie (name) {
		var arg = name + "=";
		var alen = arg.length;
		var clen = document.cookie.length;
		var i = 0;
		while (i < clen) {
			var j = i + alen;
			if (document.cookie.substring(i, j) == arg) {
				return unescape(getCookieVal(j));
			}
			i = document.cookie.indexOf(" ", i) + 1;
			if (i == 0) { break; }
		}
		return null;
	}
	//  create or update a cookie.
	function SetCookie (name,value,expires,path,domain,secure) {
		if (gfAllCookiesSecure) { secure = true; }
		value = escape(value);
		document.cookie = name + "=" + value +
		((expires) ? "; expires=" + expires.toGMTString() : "") +
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		((secure) ? "; secure" : "");
	}
	// delete a cookie
	function DeleteCookie (name,path,domain) {
		while (GetCookie(name)) {
			document.cookie = name + "=" +
				((path) ? "; path=" + path : "") +
				((domain) ? "; domain=" + domain : "") +
				"; expires=Thu, 01-Jan-70 00:00:01 GMT";
		}
	}

	function GetAllCookies() {
		var str = '';
		var aC = document.cookie.split(';');
		aC.sort();
		for (var c = 0; c < aC.length; c++) {
			var aOneC = aC[c].split('=');
			var strCName = aOneC[0];
			var strCValue = aOneC[1];
			str += '<b>'+unescape(strCName)+'</b> = '+unescape(strCValue)+'<br>';
		}
		return(str);
	}
	
	//================================
	//
	//	DOM
	//
	//================================
	
	function checkIE () {
		var ua = navigator.userAgent.toLowerCase();
		return ((navigator.appName == 'Microsoft Internet Explorer') && (ua.indexOf('msie') > 0));
	}
	function checkMacIE () {
		var ua = navigator.userAgent.toLowerCase();
		return (checkIE () && (ua.indexOf('mac') > 0));
	}
	function checkWinIE () {
		var ua = navigator.userAgent.toLowerCase();
		return (checkIE () && (ua.indexOf('win') > 0));
	}
	
	var isDHTML = 0;
	var isID = 0;
	var isAll = 0;
	var isLayers = 0;
	
	if (document.getElementById) {isID = 1; isDHTML = 1;}
	if (document.all) {isAll = 1; isDHTML = 1;}
	browserVersion = parseInt(navigator.appVersion);
	if ((navigator.appName.indexOf('Netscape') != -1) && (browserVersion == 4)) {isLayers=1; isDHTML = 1;}
	
	// Get object's browser specific DOM reference
	function getDOM(objID,fStyle) {
		var d;
		if (fStyle == 1) {
			if (isID) { d = document.getElementById(objID).style;}
			else {
				if (isAll) { d = document.all[objID].style;}
				else {
					if (isLayers) { d = document.layers[objID];}
				}
			}
		} else {
			if (isID) { d = document.getElementById(objID);}
			else {
				if (isAll) { d = document.all[objID];}
				else {
					if (isLayers) { d = document.layers[objID];}
				}
			}	
		}
		return d;
	}
	function loadjsfile(fn) {
		var d = document.getElementsByTagName("head")[0];
		var r = d.getElementsByTagName("script");
		for (var i = 0; i < r.length; i++) {
			if (r[i].src.indexOf (fn, 0) != -1) { return; }
		}
		var fr = document.createElement('script');
		fr.setAttribute("type","text/javascript");
		fr.setAttribute("src", fn);
		d.appendChild(fr);
	 }
	function loadcssfile(fn) {
		var d = document.getElementsByTagName("head")[0];
		var r = d.getElementsByTagName("link");
		for (var i = 0; i < r.length; i++) {
			if (r[i].href.indexOf (fn, 0) != -1) { return; }
		}
		var fr = document.createElement("link");
		fr.setAttribute("rel", "stylesheet");
		fr.setAttribute("type", "text/css");
		fr.setAttribute("href", fn);
		d.appendChild(fr);
	 }
	
	// get value of attibute of the target of an event object	
	function getEventTargetAttribute(e, strAttName) {
		if (!e) { var e = window.event; }
		var strValue = ' ';
		if 		(e.target) 		{ strValue = e.target.getAttribute(strAttName);  	} 
		else if (e.srcElement) 	{ strValue = e.srcElement.getAttribute(strAttName);	}
		return strValue;
	}
	// get full style info from entire css cascade for an object
	function getOStyleValue(o, strStyleName) {
		var strValue = '';
		if 		(o.currentStyle) 		{ eval('strValue = o.currentStyle.'+strStyleName);  	} 
		else if (document.defaultView) 	{ eval('strValue = document.defaultView.getComputedStyle(o, null).'+strStyleName);	}
		return strValue;
	}
	function getLeft(objID){
		var dom = getDOM(objID,0);
		var domStyle = getDOM(objID,1);
		var xLeft = 0;
		if (domStyle.left) { xLeft = domStyle.left; }
		else if (domStyle.pixelLeft) { xLeft = domStyle.pixelLeft; }
		else if (dom.offsetLeft) { xLeft = dom.offsetLeft; }
		return parseInt(xLeft);
	}
	//	Returns array of info about the file
	//		[0] = fIsAcceptedType : true if either accepted general or image type
	//		[1] = fIsImage : one of the accepted image types
	//		[2] = strExt : file extension found	on end of filename
	//		[3] = strExtName : description of file extension
	function getFileInfo(strFile) {
		strFile = unescape(strFile);
		// set up data to fill in
		var fIsAcceptedType = false;
		var fIsImage = false;
		var strExt = '';
		var strExtName = '';
		var aReturn = new Array();
		// find extension if there is on
		var reExt = /\.(.{2,4})$/i;
		var reMatch = reExt.exec(strFile);
		if (reMatch) {
			// record extenstion found
			strExt = reMatch[1];
			strExt = strExt.toLowerCase();
			// check if accepted general
			for (var i = 0; i < gaFileExtsOKGeneral.length-1; i++) {
				var aE = gaFileExtsOKGeneral[i].split('|');
				if (aE[0].toLowerCase() == strExt) {
					fIsAcceptedType = true;
					strExtName = aE[1];
					break;
				}
			}
			// check if accepted image
			for (var i = 0; i < gaFileExtsOKImage.length-1; i++) {
				var aE = gaFileExtsOKImage[i].split('|');
				if (aE[0].toLowerCase() == strExt) {
					fIsAcceptedType = true;
					fIsImage = true;
					strExtName = aE[1];
					break;
				}
			}
		}
		if (strFile.indexOf ("<", 0) == 0) {
			fIsAcceptedType = true;
			fIsImage = true;
			strExtName = 'xobject';
			strExt = 'html';
		}
		if (strFile.indexOf ("http://", 0) == 0) {
			fIsAcceptedType = true;
			fIsImage = true;
			strExt = 'html';
			strExtName = 'xcontent';
		}
		// save data into array and return it
		aReturn[0] = fIsAcceptedType;
		aReturn[1] = fIsImage;
		aReturn[2] = strExt;
		aReturn[3] = strExtName;
		return aReturn;
	}

