//	Contents copyright © 1999-2010  Terrance R. Cassidy, Merrimack, New Hampshire, USA
//					all rights reserved.


					// $Id: ipMe.php 1.1 2004/12/14 14:13:27 tc Exp $
var ipMe		= "38.107.191.99";

					// $Id: DeObfuscate.php 1.1 2004/12/14 14:13:27 tc Exp $
var sAlphabetClear	= new String (" 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@.:/${}()|~`!#%^*_+=,?;");
function DeObfuscate (sInAll)
{var sOut = new String ("");
 var sIn = new String ("");
 var sAlphabetObfuscated = new String ("");
 var i;
 var index;

 sAlphabetObfuscated = sInAll.substr (0, sAlphabetClear.length);
 sIn = sInAll.substr (sAlphabetClear.length);
 for (i = 0; i < sIn.length; i++)
   {c = sIn.substr (i, 1);
    index = sAlphabetObfuscated.indexOf (c);
    if (index < 0)
       {sOut += c;}
      else
       {index += sAlphabetClear.length;		// would not need this were modulus arithmetically correct (- MSIE failing)
	index -= (i % sAlphabetClear.length);	//  nor this modulus
        index %= sAlphabetClear.length;
	sOut += sAlphabetClear.substr (index, 1);};};
 return sOut;};
function BrowserIsMSIE ()		// $Id: BrowserIsMSIE.js 1.1 2004/12/14 14:13:04 tc Exp $
// {return (SafeTypeOf ("document.all") != "undefined");} lets Opera through
{return (   (SafeTypeOf ("navigator.appName") != "undefined")
         && (navigator.appName == "Microsoft Internet Explorer"));};

function BrowserIsOpera ()		// $Id: BrowserIsOpera.js 1.1 2004/12/14 14:13:04 tc Exp $
{return (typeof (top.frames) == "function");};

					// $Id: CookieBake.js 1.1 2004/12/14 14:13:04 tc Exp $
function CookieBake (sCookieName, sPath, tDaysExpire)
{var tExpireCookie	= new Date ();
 var index;
 var sId;
 var iVisits;
 var tNow		= new Date ();
 var cookie		= new String ();
 if (tDaysExpire == null)
    tDaysExpire = 999;
 tExpireCookie.setTime (tExpireCookie.getTime () + (tDaysExpire*24*60*60*1000));
 cookie = CookieGet (sCookieName);
 if (cookie == null)
    cookie = new String (ipMe + "." + tNow.getTime () + "-0");
 index = cookie.indexOf ("-");
 sId = cookie.substr (0, index);
 iVisits = cookie.substr (index + 1);
 iVisits++;
 cookie = sId + "-" + iVisits;
 CookieSet (sCookieName, cookie, tExpireCookie, sPath);
 return cookie;};

function CookieGet (sName)		// $Id: CookieGet.js 1.1 2004/12/14 14:13:04 tc Exp $
{var sArg	= sName + "=";
 var lenArg	= sArg.length;
 var lenCookie	= document.cookie.length;
 var i		= 0;
 while (i < lenCookie)
   {var j	= i + lenArg;
    if (document.cookie.substring (i, j) == sArg)
       {var endstr	= document.cookie.indexOf (";", j);
	if (endstr == -1)
	    endstr = document.cookie.length;
	return unescape (document.cookie.substring (j, endstr));};
    i = document.cookie.indexOf (" ", i) + 1;
    if (i == 0)
	break;}
 return null;}

					// $Id: CookieSet.js 1.1 2004/12/14 14:13:04 tc Exp $
function CookieSet (sName, sValue, tExpires, sPath, sDomain, vSecure)
{var cookie	= sName + "=" + escape (sValue);
 if (tExpires != null)
    cookie += "; expires=" + tExpires.toGMTString();
 if (sPath != null)
    cookie += "; path=" + sPath;
 if (sDomain != null)
    cookie += "; domain=" + sDomain;
 if (vSecure)
    cookie += "; secure";
 document.cookie = cookie;};

function ElementDimension (iHeight, iWidth)	// $Id: ElementDimension.js 1.1 2005/10/20 15:36:35 tc Exp $
{this.iHeight = iHeight;
 this.iWidth = iWidth;};

function ElementDimensionGet (sIdElement)	// $Id: ElementDimensionGet.js 1.2 2005/10/20 15:47:07 tc Exp $
{var oElement;
 var iHeight;
 var iWidth;
 var iLength;

 oElement = document.getElementById (sIdElement);
 if (oElement == undefined)
   {alert ("Error accessing " + sIdElement + " for ElementDimensionGet");
    return;};
 iHeight = oElement.style.height;
 if (iHeight == undefined)
    return;
 iLength = iHeight.length;
 if (iHeight.substr (iLength - 2) != "px")
   {alert ("Unexpected value " + iHeight + " for Height of " + sIdElement);
    return;};
 iHeight = iHeight.substr (0, iLength - 2);
 iWidth = oElement.style.width;
 if (iWidth == undefined)
    return;
 iLength = iWidth.length;
 if (iWidth.substr (iLength - 2) != "px")
   {alert ("Unexpected value " + iWidth + " for Width of " + sIdElement);
    return;};
 iWidth = iWidth.substr (0, iLength - 2);
 return new ElementDimension (iHeight, iWidth);};

function ElementDimensionSet (sIdElement, oElementDimension)	// $Id: ElementDimensionSet.js 1.2 2005/10/20 15:47:07 tc Exp $
{var oElement;
 oElement = document.getElementById (sIdElement);
 if (oElement == undefined)
   {alert ("Error accessing " + sIdElement + " for ElementDimensionSet");
    return;};
 oElement.style.height = oElementDimension.iHeight + "px";
 oElement.style.width = oElementDimension.iWidth + "px";};

function HTMLAnchor (sHref, sContents)	// $Id: HTMLAnchor.js 1.1 2004/12/16 05:33:28 tc Exp $
{								// Note the tab added past href=
								// This gets around a problem discovered on unix platform
								// where the session id was being added. Not sure what the
								// correct behaviour really is.
 document.open ();
 document.write ("<a href=	'" + sHref + "'>" + sContents + "</a>");
 document.close ();};

function HTMLBoolean (v)		// $Id: HTMLBoolean.js 1.1 2005/10/25 20:01:09 tc Exp tc $
{if (v)
    return "1";
  else
    return "";};
					// $Id: HTMLCheckClearAllId.js 1.2 2005/10/20 16:31:12 tc Exp $
function HTMLCheckClearAllId (sIdTable, iColumn)
{HTMLCheckSetAllId (sIdTable, iColumn, false);};

					// $Id: HTMLCheckSelectAllId.js 1.2 2005/10/20 16:31:17 tc Exp $
function HTMLCheckSelectAllId (sIdTable, iColumn)
{HTMLCheckSetAllId (sIdTable, iColumn, true);};

					// $Id: HTMLCheckSetAllId.js 1.3 2005/10/25 20:01:09 tc Exp tc $
function HTMLCheckSetAllId (sIdTable, iColumn, vValue)
{var iRow;
 var oTable;
 var aoBodies;
 var oBody;
 var aoRows;
 var aoCheckRows;
 var iRow;
 var aoInputs;
 var oInput;
 oTable = document.getElementById (sIdTable);
 aoBodies = HTMLGetChildrenByTag (oTable, "TBODY");
 if (aoBodies.length != 1)
   {alert ("Logic error - " + aoBodies.length + " Table Bodies in HTMLCheckSetAllId");
    return;};
 oBody = aoBodies[0];
 aoRows = HTMLGetChildrenByTag (oBody, "TR");
 if (aoRows.length <= 0)
   {return "";};
 aoCheckRows = HTMLTableGetColumnItems (aoRows, iColumn);
// for (iRow in aoRows)				Alas - this breaks in Opera
 for (iRow = 0; iRow < aoRows.length; iRow++)
   {aoInputs = HTMLGetChildrenByTag (aoCheckRows[iRow], "INPUT");
    if (aoInputs.length != 1)
       {alert ("Logic error - " + aoInputs.length + " Inputs at row " + iRow + " in HTMLCheckSetAllId");
	return;};
    oInput = aoInputs[0];
    oInput.checked = vValue;};
 return;};

function HTMLDisplayInits (sInits, vComplain)	// $Id: HTMLDisplayInits.js 1.2 2005/10/03 23:54:49 tc Exp $
{var i;
 vComplain = (   (typeof (vComplain) != "undefined")
	      && vComplain);
 for (i = 0; i < sInits.length; i++)
   {HTMLDisplaySelectNext (sInits[i], false, vComplain);};};

					// $Id: HTMLDisplaySelectNext.js 1.5 2005/10/25 20:01:09 tc Exp tc $
function HTMLDisplaySelectNext (sIdContainer, vScrollToBottom, vComplain)
{var oContainer;
 var iCount;
 var iChild;
 var oChild;
 var oTaggedChildren = new Array;
 vScrollToBottom= (   (typeof (vScrollToBottom) != "undefined")
		   && vScrollToBottom);
 vComplain = (   (typeof (vComplain) != "undefined")
	      && vComplain);
 oContainer = document.getElementById (sIdContainer);
 if (oContainer == undefined)
   {if (vComplain)
       {alert ("Error accessing " + sIdContainer + " for HTMLDisplaySelectNext");};
    return;};
 iCount = oContainer.childNodes.length;
 for (iChild = 0; iChild < iCount; iChild++)
   {oChild = oContainer.childNodes[iChild];
    if (oChild.tagName == undefined)
       {continue;};
    oTaggedChildren = oTaggedChildren.concat (oChild);};
 iCount = oTaggedChildren.length;
 if (iCount < 2)
   {if (vComplain)
       {alert ("Error - " + sIdContainer + " has too few (" + iCount + ") tagged children in HTMLDisplaySelectNext");};
    return;};
 for (iChild = 0; iChild < iCount; iChild++)
   {oChild = oTaggedChildren[iChild];
    if (oChild.style.display != "none")
       {oChild.style.display = "none";
	iChild += 1;
	iChild %= iCount;
	oChild = oTaggedChildren[iChild];
	oChild.style.display = "block";
	break;};};
 if (vScrollToBottom)
   {window.scrollBy (0,9999);};};
					// $Id: HTMLDisplaySet.js 1.1 2004/12/14 14:13:04 tc Exp $
function HTMLDisplaySet (oObject, sState)
{oObject.style.display = sState;};

function HTMLDisplaySetBoolean (sIdDisplay, sIdBoolean, oFalse, oTrue)	// $Id: HTMLDisplaySetBoolean.js 1.1 2005/10/25 20:01:09 tc Exp tc $
{var v;
 var oInput;
 var o;

 v = HTMLInputBoolean (sIdBoolean);
 oInput = document.getElementById (sIdDisplay);
 if (oInput == undefined)
   {alert ("Error accessing " + sIdDisplay + " for HTMLDisplaySetBoolean");
    return;};

 if (v)
    o = oTrue;
  else
    o = oFalse;

 oInput.src = o.sSrc;
 oInput.alt = o.sAlt;};

					// $Id: HTMLDisplaySetId.js 1.3 2005/10/25 20:01:09 tc Exp tc $
function HTMLDisplaySetId (sIdElement, sState, vComplain)
{var oElement;
 if (vComplain == undefined)
   {vComplain = false};
 oElement = document.getElementById (sIdElement);
 if (oElement == undefined)
   {if (vComplain)
       {alert ("Error accessing " + sIdElement + " for HTMLDisplaySetId");};
    return;};
 HTMLDisplaySet (oElement, sState);};

					// $Id: HTMLGetChildrenByTag.js 1.1 2004/12/14 14:13:04 tc Exp $
function HTMLGetChildrenByTag (oNode, sTag)
{var oChildren = new Array;
 var iChild;
 var oChild;

// for (iChild in oNode.childNodes)				Alas - this breaks in Opera
 for (iChild = 0; iChild < oNode.childNodes.length; iChild++)
   {oChild = oNode.childNodes [iChild];
    if (oChild.tagName == sTag)
       {oChildren.push (oChild);};};

 return oChildren;};

function HTMLInputBoolean (sId, vToggleIn)		// $Id: HTMLInputBoolean.js 1.1 2005/10/25 20:01:09 tc Exp tc $
{var oInput;
 var vToggle;

 oInput = document.getElementById (sId);
 if (oInput == undefined)
   {alert ("Error accessing " + sId + " for HTMLInputToggle");
    return;};
 vToggle = (vToggleIn != undefined) && vToggleIn;
 oInput.value = HTMLBoolean ((oInput.value == "1") ^ vToggle);
 return oInput.value};
var sHTMLMouseFieldName;		// $Id: HTMLMouse.js 1.1 2005/10/25 20:01:09 tc Exp tc $
var sHTMLMouseValue;
var sHTMLMouseOverValue;

function HTMLMouseOver (o, sFieldName, sValue)
{sHTMLMouseFieldName = sFieldName;
 eval ("sHTMLMouseValue = o." + sFieldName + ";");
 eval ("o." + sFieldName + " = '" + sValue + "';");
 eval ("sHTMLMouseOverValue = o." + sFieldName + ";");};

function HTMLMouseOut (o)
{var sValue;
 eval ("sValue = o." + sHTMLMouseFieldName + ";");
 if (sValue != sHTMLMouseOverValue)
    return;
 eval ("o." + sHTMLMouseFieldName + " = '" + sHTMLMouseValue + "';");};
					// $Id: HTMLTableDisplaySetId.js 1.4 2005/10/25 20:01:09 tc Exp tc $
function HTMLTableDisplaySetId (sIdTable, iColumn, sState, vComplain)
{var oTable;
 var iGroup;
 var oGroup;
 var iRow;
 var oRow;
 var iColumnCurrent;
 var iItemColumn;
 var oColumn;
 var iColumnColgroup;
 var oColgroup;
 var vColgroupColumnEncountered;
 var iSpan;
 if (vComplain == undefined)
   {vComplain = false};
 oTable = document.getElementById (sIdTable);
 if (oTable == undefined)
   {if (vComplain)
       {alert ("Error accessing " + sIdTable + " for HTMLTableDisplaySetId");};
    return;};
 iColumnColgroup = 0;
 vColgroupColumnEncountered = false;
// for (iGroup in oTable.childNodes)			Alas - this breaks in Opera
 for (iGroup = 0; iGroup < oTable.childNodes.length; iGroup++)
   {oGroup = oTable.childNodes[iGroup];
    if (oGroup.tagName == "COLGROUP")
       {if (vColgroupColumnEncountered)
	   {continue;};
    if (   (oGroup.tagName != "COLGROUP")		// Firefox harbours other entities
        && (oGroup.tagName != "THEAD")
        && (oGroup.tagName != "TFOOT")
        && (oGroup.tagName != "TBODY"))
	   {continue;};
	oColgroup = oGroup;
	if (oColgroup.childNodes.length <= 0)
	   {iSpan = 1;
	    if (oColgroup.span != undefined)
	       {iSpan = oColgroup.span;};
	    iColumnColgroup += iSpan;
	    vColgroupColumnEncountered = (iColumnColgroup > iColumn);
	    if (!vColgroupColumnEncountered)
	       {continue;};
	    HTMLDisplaySet (oColgroup, sState);
	    continue;};
//	for (iItemColumn in oColgroup.childNodes)	Alas - this breaks in Opera
	for (iItemColumn = 0; iItemColumn < oColgroup.childNodes.length; iItemColumn++)
	   {oCol = oColgroup.childNodes[iItemColumn];
	    if (oCol.tagName != "COL")
	       {alert ("Help - we are lost - expecting a <COL> but got <" + oCol.tagName + "> in HTMLTableDisplaySetId");
		return;};
	    iSpan = 1;
	    if (oCol.span != undefined)
	       {iSpan = oCol.span;};
	    iColumnColgroup += iSpan;
	    vColgroupColumnEncountered = (iColumnColgroup > iColumn);
	    if (!vColgroupColumnEncountered)
	       {continue;};
	    HTMLDisplaySet (oCol, sState);
	    break;};
	continue;};
//  for (iRow in oGroup.childNodes)			Alas - this breaks in Opera
    for (iRow = 0; iRow < oGroup.childNodes.length; iRow++)
       {oRow = oGroup.childNodes[iRow];
	if (oRow.tagName != "TR")			// Firefox harbours other entities
	   {continue;};
	iColumnCurrent = 0;
//	for (iItemColumn in oRow.childNodes)	Alas - this breaks in Opera
	for (iItemColumn = 0; iItemColumn < oRow.childNodes.length; iItemColumn++)
	   {oColumn = oRow.childNodes[iItemColumn];
	    if (   (oColumn.tagName != "TD")
		&& (oColumn.tagName != "TH"))
	       {continue};
	    iSpan = 1;
	    if (oColumn.colspan != undefined)
	       {iSpan = oColumn.colspan;};
	    iColumnCurrent += iSpan;
	    if (iColumnCurrent > iColumn)
	       {HTMLDisplaySet (oColumn, sState);
		break;};};};};};

					// $Id: HTMLTableGetColumnItems.js 1.1 2004/12/14 14:13:04 tc Exp $
function HTMLTableGetColumnItems (aoRows, iColumn)
{var aoItems = new Array;
 var iRow;
 var iColumnCurrent;
 var iItemColumn;
 var oTest;
 var iSpan;
// for (iRow in aoRows)				Alas - this breaks in Opera
 for (iRow = 0; iRow < aoRows.length; iRow++)
   {oRow = aoRows[iRow];
    iColumnCurrent = 0;
//  for (iItemColumn in oRow.childNodes)		Alas - this breaks in Opera
    for (iItemColumn = 0; iItemColumn < oRow.childNodes.length; iItemColumn++)
       {oTest = oRow.childNodes[iItemColumn];
	if (   (oTest.tagName != "TD")
	    && (oTest.tagName != "TH"))
	   {continue};
	iSpan = 1;
	if (oTest.colspan != undefined)
	   {iSpan = oTest.colspan;};
	iColumnCurrent += iSpan;
	if (iColumnCurrent > iColumn)
	   {aoItems = aoItems.concat (oTest);
	    break;};};};
 return aoItems;};

					// $Id: HTMLTableBuildNamesId.js 1.4 2005/10/25 20:01:09 tc Exp tc $
function HTMLTableBuildNamesId (sIdTable, iColumnName, iColumnCheck, sFnExtractName)
{var iRow;
 var sNames	= "";
 var oTable;
 var aoBodies;
 var oBody;
 var aoRows;
 var aoNameRows;
 var aoCheckRows;
 var iRow;
 var oName;
 var aoInputs;
 var oInput;
 if (sFnExtractName == null)
   {sFnExtractName = "_HTMLTableBuildNamesIdExtractName";};
 oTable = document.getElementById (sIdTable);
 aoBodies = HTMLGetChildrenByTag (oTable, "TBODY");
 if (aoBodies.length != 1)
   {alert ("Logic error - " + aoBodies.length + " Table Bodies in HTMLTableBuildNamesId");
    return;};
 oBody = aoBodies[0];
 aoRows = HTMLGetChildrenByTag (oBody, "TR");
 if (aoRows.length <= 0)
   {return "";};
 aoNameRows = HTMLTableGetColumnItems (aoRows, iColumnName);
 aoCheckRows = HTMLTableGetColumnItems (aoRows, iColumnCheck);
// for (iRow in aoRows)				Alas - this breaks in Opera
 for (iRow = 0; iRow < aoRows.length; iRow++)
   {oName = aoNameRows[iRow];
    aoInputs = HTMLGetChildrenByTag (aoCheckRows[iRow], "INPUT");
    if (aoInputs.length != 1)
       {alert ("Logic error - " + aoInputs.length + " Inputs at row " + iRow + " in HTMLTableBuildNamesId");
	return;};
    oInput = aoInputs[0];
    if (oInput.checked)
       {sNames += "," + eval (sFnExtractName + " (oName)");};};
 if (sNames == "")
   {return "";}
  else
   {return sNames.substr (1);};};

function _HTMLTableBuildNamesIdExtractName (oName)
{return oName.innerHTML;};
function Keys (object)				// $Id: Keys.js 1.1 2005/11/03 00:50:07 tc Exp tc $
{var sKeys = new Array ();
 var sProperty;

 for (sProperty in object)
    sKeys.push (sProperty);

 return sKeys;};
function ReleaseMe ()			// $Id: ReleaseMe.js 1.2 2005/09/23 17:53:34 tc Exp $
  {if (top.location != document.location)
   {top.location = document.location;};};
function SafeObjectOf (sField)		// $Id: SafeObjectOf.js 1.1 2004/12/14 14:13:04 tc Exp $
{var sFieldIn		= new String (sField);
 var sSubField;
 var iSep;
 var sType;
 var rParent;
 var vNoParent		= true;
// alert ("in SOO");
 while (sFieldIn != "")
   {sType = typeof (rParent);
    if (   !vNoParent
        && (sType != "object")
        && (sType != "function"))
       {return;};
    iSep = sFieldIn.indexOf (".");
    if (iSep == -1)
       {iSep = sFieldIn.length;};
    sSubField = sFieldIn.slice (0, iSep);
    sFieldIn = sFieldIn.slice (iSep + 1);
// alert (sType + "->" + sSubField );
    if (vNoParent)
       {eval ("rParent = " + sSubField + ";");
	vNoParent = false;}
      else
       {if (sType == "function")
	   {
// alert ("---" + typeof (rParent));
eval ("rParent = rParent (sSubField);");
// alert ("+++" + typeof (rParent));
// alert (rParent);
}
	  else
	   {eval ("rParent = rParent." + sSubField + ";");};};};
// alert ("---" + typeof(rParent));
// alert (rParent);
// alert (rParent.parent);
 return (rParent);};

function SafeTypeOf (sField)		// $Id: SafeTypeOf.js 1.1 2004/12/14 14:13:04 tc Exp $
{// alert ("in STO"); 
// alert (typeof (SafeObjectOf (sField)));
return typeof (SafeObjectOf (sField));};

function TransferValue (sIdIn, sIdOut)	// $Id: TransferValue.js 1.1 2006/06/26 19:36:30 tc Exp tc $
 {var oIn, oOut;
  oIn = document.getElementById (sIdIn);
  oOut = document.getElementById (sIdOut);
  oOut.value = oIn.value;};

function URLEncode (sIn)		// $Id: URLEncode.js 1.1 2004/12/14 14:13:04 tc Exp $
{var sOut	= new String ("");
 var sEscapeIn	= new String (' `~!@#$%^&*()+={}|[]:;"\'<>?,/');
 var sEscapeOut= new String ("%20%60%7E%21%40%23%24%25%5E%26%2A%28%29%2B%3D%7B%7D%7C%5B%5D%3A%3B%22%27%3C%3E%3F%2C%2F");
 var i;
 var index;
 var c;

 for (i = 0; i < sIn.length; i++)
   {c = sIn.substr (i, 1);
    index = sEscapeIn.indexOf (c);
    if (index >= 0)
        sOut += sEscapeOut.substr (3 * index, 3);
      else
       {if (c == " ")
	    sOut += "+";
	  else
	    sOut += c;};};
 return sOut;};

function zzzEOF ()			// $Id: zzzEOF.js 1.1 2004/12/14 14:13:04 tc Exp $
{return "EOF";};

