// ############################################################################
// ##
// ##  CUSTOM WEBSITE FUNCTIONS
// ##  (i.e. not standard white site functions)
// ##
// ############################################################################

// Put custom functions for your website here.

// ############################################################################
// ##
// ##  STANDARD WHITE SITE FUNCTIONS
// ##
// ############################################################################

// ####################################
// Navigation
// ####################################

// ====================
// Function:    NavPullDown
//
// Purpose:     Go to a URL that is selected from a form a pull-down form field
//
// Input:       strFormName - The ID of the form being used to select naviation
//              strFieldName - The ID of the field with URL select options
//
// Output:      Navigates to selected URL.
//
// Assumptions: -
//
// History:     DDSN created back in the Distant Past
// ====================
function NavFormSelect(strFormName,strFieldName)
{
	intSelected = document[strFormName].elements[strFieldName].options.selectedIndex;
	strURL = document[strFormName].elements[strFieldName].options[intSelected].value;
	document[strFormName].elements[strFieldName].options.selectedIndex = 0;
	if (strURL != "")
	{
		location.href = strURL;
	}
}

// ####################################
// Windows & Alerts
// ####################################

// ====================
// Function:    Popup
//
// Purpose:     Open a popup window with a series of option settings.
//
// Input:       strPage - The URL of the page to open in the popup window.
//              intWidth - The window width in pixels 
//              intHeight - The window height in pixels
//              strID - The ID of the popup window. (This is important if the
//                window may be called on by other functions or if there are
//                multiple popup windows in a site.)
//              strScrollbars - Switch visible scrollbars on/off ("yes"/"no")
//              strLocation - Switch visible location bar on/off ("yes"/"no")
//              strToolbar - Switch visible toolbar on/off ("yes"/"no")
//              strStatus - Switch visible status bar on/off ("yes"/"no")
//              strResizable - Window is resizable or not ("yes"/"no")
//
// Output:      Window opens containing the specified URL.
//
// Assumptions: -
//
// History:     DDSN created back in the Distant Past
// ====================
function Popup(strPage,intWidth,intHeight,strID,strScrollbars,strLocation,strToolbar,strStatus,strResizable)
{
	if (!strPage)
	{
		strPage = "/";
	}
	if (!intWidth)
	{
		intWidth = 500;
	}
	if (!intHeight)
	{
		intHeight = 320;
	}
	if (!strID)
	{
		strID = "PopupWindow";
	}
	if (!strScrollbars)
	{
		strScrollbars = "yes";
	}
	if (!strLocation)
	{
		strLocation = "no";
	}
	if (!strToolbar)
	{
		strToolbar = "no";
	}
	if (!strStatus)
	{
		strStatus = "no";
	}
	if (!strResizable)
	{
		strResizable = "yes";
	}
	//if (isLoaded == 0)
	//{
	//	location.reload();
	//}
	idPopup = window.open(strPage,strID,"width="+intWidth+",height="+intHeight+",scrollbars="+strScrollbars+",location="+strLocation+",toolbar="+strToolbar+",status="+strStatus+",resizable="+strResizable);
	if (window.focus)
	{
		idPopup.focus();
	}
	return false;
}

// ====================
// Function:    PopdownLink
//
// Purpose:     Open a link in a popup window in a specified main window and
//              close the popup window. If the specified link window does not
//              exist it is created. If no window is specified the link is
//              targeted to the original opener of the popup window.
//
// Input:       strURL - The URL of the page to open
//              strWindowID - The ID of the window in which to open the link
//
// Output:      Navigates to selected URL in selected window and closes current
//              window.
//
// Assumptions: -
//
// History:     DDSN created back in the Distant Past
//              2004 Multiple window targets added. (Previously could only
//                   target the opener.)
// ====================
function PopdownLink(strURL,strWindowID)
{
	if (!strWindowID)
{
		top.opener.location.href = strURL;
}
	else
{
		if (strWindowID.location)
	{
			strWindowID.location.href = strURL;
	}
		else
	{
			window.open(strURL,strWindowID);
	}
}
	top.close();
}

// ====================
// Function:    RequireKeywords
//
// Purpose:     Checks any search form to make sure keywords are entered before
//              the form can be submitted. 
//
// Input:       strFormName - The ID of the form with the keywords field in it
//              strFieldName - The ID of the keywords field within the form 
//
// Output:      Give an error if no keywords are presented.
//
// Assumptions: -
//
// History:     20040109 RW Created to replace local code in site templates.
// ====================
function RequireKeywords(strFormID,strFieldName)
{
	if (document.forms[strFormID].elements[strFieldName].value.length <= 3)
	{
		alert("Please alter your requested keyword(s) in the search form.\nThe search phrase must be 3 characters or more in length.")
		return false;
	}
}

// ====================
// Function:    CS
//
// Purpose:     Display a "coming soon" message for sections of a website that
//              have not been created yet. This function is sometimes used in
//              development to make links active before a site is finished.
//
//              Note: This is an evil funciton, it should not be used! It
//              encourages bad development habits.
//
// Input:       -
//
// Output:      Show a "coming soon" message.
//
// Assumptions: -
//
// History:     DDSN created back in the Distant Past
// ====================
function CS()
{
	alert("That function is coming soon.");
}

// ####################################
// Image Manipulation
// ####################################

// ====================
// Function:    ImageSwap
//
// Purpose:     Swap any image to another.
//
// Input:       strImageID - ID of the image being swapped
//              strNewImageSrc - Source of the new image being loaded
//
// Output:      Swaps images.
//
// Assumptions: Images with all specified IDs exist and are pre-loaded.
//
// History:     DDSN created back in the Distant Past
// ====================
function ImageSwap(strImageID,strNewImageSrc)
{
	if (document.images)
	{
		document.images[strImageID].src = eval(strNewImageSrc+".src");
	}
}

// ====================
// Function:    ImageSwapFX
//
// Purpose:     Swap any image to another using an optional fade effect. Can
//              also be called with the transition effect disabled, i.e. just
//              swap the images.
//
// Input:       strImageID - ID of the image being swapped
//              strNewImageSrc - Source of the new image being loaded
//              blnDisableTrans - Switch the transition off or on (1/0)
//
// Output:      Swaps images with optional fade effect.
//
// Assumptions: - Images with all specified IDs exist and are pre-loaded.
//              - Requires fading transition style to be set first on image tag
//              - Only works for IE5.5+ but falls back nicely
//              - Javascript Globals: blnToggleTrans
//
// History:     2003 DDSN Created
//              2004 Updated with more standard naming structures
// ====================
function ImageSwapFX(strImageID,strNewImageSrc,blnDisableTrans)
{
	if (blnDisableTrans || !document.images[strImageID].filters || blnIE50)
	{
		if (document.images)
		{
			document.images[strImageID].src = eval(strNewImageSrc+".src");
		}
	}
	else
	{
		// After setting Apply, changes to the object are not displayed
		// until Play is called.
		document.images[strImageID].filters[0].Apply();

		if (blnToggleTrans)
		{
			blnToggleTrans = 0;
			document.images[strImageID].src = eval(strNewImageSrc+".src");
		}
		else
		{
			blnToggleTrans = 1;
			document.images[strImageID].src = eval(strNewImageSrc+".src");
		}
		document.images[strImageID].filters[0].Play();
	}
}

// ####################################
// Layer Manipulation
// ####################################

// ====================
// Function:    LayerVisibility
//
// Purpose:     Turn visibility of any layer on or off.
//
// Input:       strLayerID - ID of the layer being altered
//              strState = "visible" or "hidden"
//
// Output:      Turns specified layer on or off.
//
// Assumptions: Specified layer exists in document hierarchy.
//
// History:     DDSN created back in the Distant Past
// ====================
function LayerVisibility(strLayerID,strState)
{
	if (blnNS4)
	{
		if (document.layers[strLayerID])
		{
			document.layers[strLayerID].visibility = strState;
		}
	}
	else if (blnDOM)
	{
		if (document.getElementById(strLayerID))
		{
			document.getElementById(strLayerID).style.visibility = strState;
		}
	}
	else if (blnIE)
	{
		if (document.all[strLayerID])
		{
			document.all[strLayerID].style.visibility = strState;
		}
	}
}

// ####################################
// Printing
// ####################################

// ====================
// Function:    LoadVBPrinter
//
// Purpose:     Load Visual Basic printing commands for VB enabled browsers.
//
// Input:       -
//
// Output:      Loads (writes out) visual basic printing functions.
//
// Assumptions: Javascript Globals: blnIE, blnCanPrint, blnMac
//
// History:     DDSN created back in the Distant Past
// ====================
//function LoadVBPrinter()
//{
	if (blnIE && !blnCanPrint && !blnMac) with (document)
	{
		writeln('<OBJECT ID="WB" WIDTH="0" HEIGHT="0" CLASSID="clsid:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>');
		writeln('<' + 'SCRIPT LANGUAGE="VBScript">');
		writeln('Sub window_onunload');
		writeln('    On Error Resume Next');
		writeln('    Set WB = nothing');
		writeln('End Sub');
		writeln('Sub vbPrintPage');
		writeln('    OLECMDID_PRINT = 6');
		writeln('    OLECMDEXECOPT_DONTPROMPTUSER = 2');
		writeln('    OLECMDEXECOPT_PROMPTUSER = 1');
		writeln('    On Error Resume Next');
		writeln('    WB.ExecWB OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER');
		writeln('End Sub');
		writeln('<' + '/SCRIPT>');
	}
//}

// ====================
// Function:    PrintPage
//
// Purpose:     Opens the print dialog window or shows a fallback message for
//              unsupported browsers
//
// Input:       -
//
// Output:      Opens the print dialog window or shows a fallback message for
//              unsupported browsers.
//
// Assumptions: Javascript Globals: blnCanPrint, blnIE, blnMac
//
// History:     DDSN created back in the Distant Past
// ====================
function PrintPage()
{
	if (blnCanPrint)
	{
		window.print();
	}
	else if (blnIE && !blnMac)
	{
		vbPrintPage();
	}
	else
	{
		alert("Your web browser does not appear to support the automatic\nPrint function. To print this page, please select the \"Print\"\noption from the \"File\" menu of your web browser.");
	}
}

// ##################
// HTML Manipulation
// ##################

// Strip all HTML tags from a string, and optionally line breaks too
function StripHTML(strOldString,blnStripLineBreaks)
{
	var strNewString = strOldString.replace(/(<([^>]+)>)/ig,"");

	// Strip non breaking spaces
	strNewString = strNewString.replace(/\&nbsp\;/g," ");

	// Replace carriage returns and line feeds
	if (blnStripLineBreaks == 1)
	{
		strNewString = strNewString.replace(/\r\n/g," ");
		strNewString = strNewString.replace(/\n/g," ");
		strNewString = strNewString.replace(/\r/g," ");
	}

	// Trim string
	//strNewString = trim(strNewString);


	return strNewString;
}

// Take a HTML string and lay it out nicely. This is not intended to be an
// advanced function, but it does make unreadable HTML code created by
// various HTML editors much easier to use.
function MakePrettyHTML(objHTML)
{

	//allHTML = tbContentElement.DOM.body.innerHTML;
	allHTML = objHTML;

	// add quotes around attributes
	//allHTML = allHTML.replace(/<([^<>]*)=([^\"][^<>]*?)(\s|>)/g,"<$1=\"$2\"$3");
	allHTML = allHTML.replace(/<img/gi,"||<img");
	allHTML = allHTML.replace(/<br>/gi,"||<br>");
	allHTML = allHTML.replace(/<\/a>/gi,"||</a>");
	allHTML = allHTML.replace(/<em>/gi,"||<em>");
	allHTML = allHTML.replace(/<strong>/gi,"||<strong>");
	allHTML = allHTML.replace(/<b>/gi,"||<b>");
	allHTML = allHTML.replace(/<i>/gi,"||<i>");
	allHTML = allHTML.replace(/<\/td>/gi,"||</td>");
	allHTML = allHTML.replace(/<\/li>/gi,"||</li>");

	allHTML = allHTML.replace(/></gi,">\n<");

	allHTML = allHTML.replace(/\|\|<img/gi,"<img");
	allHTML = allHTML.replace(/\|\|<br>/gi,"<br>");
	allHTML = allHTML.replace(/\|\|<\/a>/gi,"</a>");
	allHTML = allHTML.replace(/\|\|<em>/gi,"<em>");
	allHTML = allHTML.replace(/\|\|<strong>/gi,"<strong>");
	allHTML = allHTML.replace(/\|\|<b>/gi,"<b>");
	allHTML = allHTML.replace(/\|\|<i>/gi,"<i>");
	allHTML = allHTML.replace(/\|\|<\/td>/gi,"</td>");
	allHTML = allHTML.replace(/\|\|<\/li>/gi,"</li>");

	allHTML = allHTML.replace(/<p/gi,"<p");
	allHTML = allHTML.replace(/<\/p>/gi,"</p>");
	allHTML = allHTML.replace(/ <\/p>/gi,"</p>");
	allHTML = allHTML.replace(/<h1/gi,"<h1");
	allHTML = allHTML.replace(/<h2/gi,"<h2");
	allHTML = allHTML.replace(/<h3/gi,"<h3");
	allHTML = allHTML.replace(/<h4/gi,"<h4");
	allHTML = allHTML.replace(/<h5/gi,"<h5");
	allHTML = allHTML.replace(/<h6/gi,"<h6");
	allHTML = allHTML.replace(/<ul/gi,"<ul");
	allHTML = allHTML.replace(/<ol/gi,"<ol");
	allHTML = allHTML.replace(/<blockquote/gi,"<blockquote");
	allHTML = allHTML.replace(/<img/gi,"<img");
	allHTML = allHTML.replace(/<font/gi,"<font");
	allHTML = allHTML.replace(/<\/font>/gi,"</font>");
	allHTML = allHTML.replace(/<a /gi,"<a ");
	allHTML = allHTML.replace(/<strong/gi,"<strong");
	allHTML = allHTML.replace(/<\/strong>/gi,"</strong>");
	allHTML = allHTML.replace(/<b/gi,"<b");
	allHTML = allHTML.replace(/<\/b>/gi,"</b>");
	allHTML = allHTML.replace(/<i/gi,"<i");
	allHTML = allHTML.replace(/<\/i>/gi,"</i>");
	allHTML = allHTML.replace(/<em/gi,"<em");
	allHTML = allHTML.replace(/<\/em>/gi,"</em>");
	allHTML = allHTML.replace(/<br>/gi,"<br>\n");
	allHTML = allHTML.replace(/<\/h1>/gi,"</h1>\n");
	allHTML = allHTML.replace(/<\/h2>/gi,"</h2>\n");
	allHTML = allHTML.replace(/<\/h3>/gi,"</h3>\n");
	allHTML = allHTML.replace(/<\/h4>/gi,"</h4>\n");
	allHTML = allHTML.replace(/<\/h5>/gi,"</h5>\n");
	allHTML = allHTML.replace(/<\/h6>/gi,"</h6>\n");
	allHTML = allHTML.replace(/<\/p>/gi,"</p>\n");
	allHTML = allHTML.replace(/<table(.*)>/gi,"<table$1>");
	allHTML = allHTML.replace(/<tbody/gi,"  <tbody");
	allHTML = allHTML.replace(/<tr/gi,"  <tr");
	allHTML = allHTML.replace(/<td/gi,"    <td");
	allHTML = allHTML.replace(/<\/tr>/gi,"  </tr>");
	allHTML = allHTML.replace(/<\/table>/gi,"</table>");
	allHTML = allHTML.replace(/<\/tbody>/gi,"  </tbody>");
	allHTML = allHTML.replace(/<li>/gi,"  <li> ");
	allHTML = allHTML.replace(/<\/li>/gi,"</li>\n");
	allHTML = allHTML.replace(/<\/ul>/gi,"</ul>\n");
	allHTML = allHTML.replace(/<\/ol>/gi,"</ol>\n");
	allHTML = allHTML.replace(/<\/blockquote>/gi,"</blockquote>\n");

	//allHTML = allHTML.replace(/<p><table/gi,"<table");
	//allHTML = allHTML.replace(/<\/table><\/p>/gi,"</table>\n");

	if (blnMozHTMLEditor)
	{
		// What a hack! There is a better way to do this...
		allHTML = allHTML.replace(/\n\n/gi,"\n");
		allHTML = allHTML.replace(/\n\n/gi,"\n");
		allHTML = allHTML.replace(/  /gi," ");
	}

	return allHTML;
}

// Clean up HTML including Word tags, span and class tags, style attributes,
// font tags, and anchors from a HTML string. Different methods available.
function CleanHTML(objHTML,cleanWord,cleanSpanTags,cleanClassAttributes,cleanStyleAttributes,cleanDivs,cleanFontTags,cleanFaceAttributes,cleanAnchors,cleanImages,cleanTables)
{
	if (blnIE)
	{
		for (var index = 0; index < objHTML.all.length; index++)
		{
			tag = objHTML.all[index];
			if (cleanClassAttributes == 1)
			{
				tag.removeAttribute("className","",0);
			}
			if (cleanStyleAttributes == 1)
			{
				tag.removeAttribute("style","",0);
			}
			if (cleanFaceAttributes == 1)
			{
				tag.removeAttribute("face","",0);
			}
		}	
	}
	else
	{
		// Regex method for non-IE browser is not as safe. This one
		// keeps tags, strips class and style attributes.
		objHTML.innerHTML = objHTML.innerHTML.replace(/ class=[^\s|>]*/gi,'').
			replace(/ style=\"[^>]*\"/gi,'');
	}

	// Put everything on one line. Helps with regex cleaning??
	objHTML.innerHTML = objHTML.innerHTML.replace(/\r\n/g, ' ').
		replace(/\n/g, ' ').
		replace(/\r/g, ' ');

	// Clean comment tags. Do this before the Word stuff to catch
	// all that Word scripting rubbish.
	objHTML.innerHTML = objHTML.innerHTML.replace(/<!--.*?-->/gi, "");

	// Replace deprecated tags
	objHTML.innerHTML = objHTML.innerHTML.replace(/<b>/gi,'<strong>').
		replace(/<\/b>/gi,'</strong>');

	if (cleanWord == 1)
	{
		//objHTML.innerHTML = objHTML.innerHTML.replace(/<o:p>&nbsp;<\/o:p>/gi, "");
		//objHTML.innerHTML = objHTML.innerHTML.replace(/<o:.*?>/gi, "");
		//objHTML.innerHTML = objHTML.innerHTML.replace(/<v:.*?>/gi, "");
		//objHTML.innerHTML = objHTML.innerHTML.replace(/<w:.*?>/gi, "");
		//objHTML.innerHTML = objHTML.innerHTML.replace(/<st1:.*?>/g, "");

		// This xml tag expression doesn't seem to work, but the Word xml tags
		// are removed by the "o:" expression above. This is still a mystery...
		// 7-6-2003
		//objHTML.innerHTML = objHTML.innerHTML.replace(/<\?xml:.*?>/g, "");

		objHTML.innerHTML = objHTML.innerHTML.replace(/<\?xml:[^>]*>/g, '').       // Word xml
			replace(/<\/?st1:[^>]*>/g,'').     // Word SmartTags
			replace(/<\/?[a-z]\:[^>]*>/g,'');  // All other funny Word non-HTML stuff
	}

	if (cleanSpanTags == 1)
	{
		//objHTML.innerHTML = objHTML.innerHTML.replace(/<span.*?>/gi, "");
		//objHTML.innerHTML = objHTML.innerHTML.replace(/<\/span>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<\/?span[^>]*>/gi,' ');
	}

	if (cleanDivs == 1)
	{
		//objHTML.innerHTML = objHTML.innerHTML.replace(/<div.*?>/gi, "");
		//objHTML.innerHTML = objHTML.innerHTML.replace(/<\/div>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<\/?div[^>]*>/gi,' ');
	}

	if (cleanFontTags == 1)
	{
		//objHTML.innerHTML = objHTML.innerHTML.replace(/<font.*?>/gi, "");
		//objHTML.innerHTML = objHTML.innerHTML.replace(/<\/font>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<\/?font[^>]*>/gi,'');
	}

	if (cleanAnchors == 1)
	{
		objHTML.innerHTML = objHTML.innerHTML.replace(/<a .*?>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<\/a>/gi, "");
	}

	if (cleanImages == 1)
	{
		objHTML.innerHTML = objHTML.innerHTML.replace(/<img.*?>/gi, "");
	}

	if (cleanTables == 1)
	{
		objHTML.innerHTML = objHTML.innerHTML.replace(/<table.*?>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<tbody.*?>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<thead.*?>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<tr.*?>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<td.*?>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<\/td>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<\/tr>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<\/tbody>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<\/thead>/gi, "");
		objHTML.innerHTML = objHTML.innerHTML.replace(/<\/table>/gi, "");
	}

	// Clean double tags
	oldlen = objHTML.innerHTML.length + 1;
	while(oldlen > objHTML.innerHTML.length)
	{
		oldlen = objHTML.innerHTML.length;
		objHTML.innerHTML = objHTML.innerHTML.replace(/<([a-z][a-z]*)> *<\/\1>/gi,' ').
			replace(/<([a-z][a-z]*)> *<([a-z][^>]*)> *<\/\1>/gi,'<$2>');
	}
	objHTML.innerHTML = objHTML.innerHTML.replace(/<([a-z][a-z]*)><\1>/gi,'<$1>').
		replace(/<\/([a-z][a-z]*)><\/\1>/gi,'<\/$1>');

	// Clean double spaces
	objHTML.innerHTML = objHTML.innerHTML.replace(/  */gi,' ');

	return objHTML.innerHTML;
}
	

// Load Visual Basic printing commands for VB enabled browsers
//LoadVBPrinter()

// ####################################
// Fun Stuff / Easter Eggs
// ####################################

// No easter eggs currently present. :-)
