/*
Script to create uniform page footer.  Created under Mozilla, modified to
work in IE6.  Used JScript lint to help with syntax and structure.  It is
much more stringent than Javascript lint. Should I take credit for this
awful kludge? Oh what the heck.  This script is copyright (c) 2007 Walter M.
Gregg (walt*w-gregg.juneau.ak.us).

May 2007: JSLint wants type coercion equality tests changes to strict
equality tests, but this fails in JavaScript 1.1 (Opera 3.62, Netscape 3.04)
and 1.0 (Internet Explorer 3 and Links 2). Change to abbreviated type
coercion compares.  that is, change if (x === 0) to if (!x), which is the
same as (x == 0); and if (x !== 0) to if (x), which is the same as (x != 0).
For strings, make an unequal(string1,string2) function that returns -1 if
string1 comes first, 0 if string1=string2, and +1 if string1 comes second.
Then replace any if (string1 === string2) constructs with if
(!unequal(string1,string2) constructs.  In the function, test for equality
by using if ((string1 <= string2) & (string1 >= string2)).  This hides the
nonstrict equality test from JSLint.
*/

// Declaration and set of generic info variables for non-W3C DOM browsers.
var jsMaster = true;
var siteRoot = "www.jimfowler.us/";
var siteContact = "www.jimfowler.us/latest/text/sitecontact.htm";

// Declaration and init of navigation variables
var vStart = '';      // 1-Mozilla Top [Home page of siblings]
var vUp = '';         // x-Mozilla Up (Home page of parent, if appliable)
var vFirst = '';      // x-Mozilla First
var vPrev = '';       // x-Mozilla Previous
var vNext = '';       // x-Mozilla Next
var vLast = '';       // x-Mozilla Last
                      // 2-Main Content (First H1 heading)
var vContents = '';   // 3-Mozilla More: Table of Contents [Contents]
var vSearch = '';     // 4-Mozilla More: Search
                      // 5-NavBar
var vHelp = '';       // 6-Mozilla More: Help
                      // 7-Reserved
var vCopyright = '';  // 8-Mozilla More: Copyright
var vMade = '';       // 9-Mozilla More: Author(s) [Feedback]
// Help#AccessKeys    // 0-Keys [AccessKeys]

// Declaration of document structure variables
var vTarget;     // ID of document element to be edited
var vNewElement; // HTML element to be created
var vNewContent; // Content of HTML element text to be created
var vParent;     // Parent HTML element

// Declaration and init of certain DC related variables
var dcCreator = '';
var dcTitle = '';
var dcDate = '';
var dcIdentifier = '';
var metaname = '';
var metacontent = '';
var metatable = '';

// Declaration of remaining global variables
var i;
var linkcontent;
var linkname;
var linktable;
var metascheme;
var newContent;
var newElement;

function unequal(string1,string2) {
    var status;
    if ((string1 <= string2) & (string1 >= string2)) {
        status = 0;
    }
    if (string1 < string2) {
        status = -1;
    }
    if (string1 > string2) {
        status = 1;
    }
    return status;
}

function appendDeadLink(targetid,text) {
    var target;
    var deadLink;
    if (document.getElementsByTagName) { // If W3C DOM available...

//  Option to produce placeholder dots, but why not just skip?
//    target = document.getElementById(targetid);
//    slash = document.createTextNode(' / ...');
//    target.appendChild(slash);

//  Option to produce dimmed readout, conflicts with accessibility
//	newElement = document.createElement('span');
//	newElement.setAttribute('style','color:bfbfbf;');
//      newContent = document.createTextNode(text);
//	newElement.appendChild(newContent);
//	target.appendChild(newElement);

    } // else do nothing (W3C DOM unavailable).
}

function appendLiveLink(targetid,title,url,text) {
    var target;
    var leftBracket;
    var rightBracket;
    if (document.getElementsByTagName) { // If W3C DOM available...
        target = document.getElementById(targetid);
        slash = document.createTextNode(' / ');
        target.appendChild(slash);
        newElement = document.createElement('a');
        newElement.setAttribute('href',url);
        newElement.setAttribute('title',title);
        newContent = document.createTextNode(text);
        newElement.appendChild(newContent);
        target.appendChild(newElement);
    } // else do nothing (W3C DOM unavailable).
}

function dcMetadata() {
// Displays the Dublin Core 15 basic elements in a new window
// All DC elements can be repeated, and can have 'schemes.'
// But we want one variable to hold each element, so use HTML 2.0 form:
//   Schemes are prepended to values in the form '(SCHEME=xx)'.
//   Multiple values are appended to values with a semicolon space delimiter.
// Some dcVariables are globally defined instead of here.
    var dcPublisher = '';
    var dcRights = '';
    var dcContributor = '';
    var dcCoverage = '';
    var dcDescription = '';
    var dcSubject = '';
    var dcType = '';
    var dcFormat = '';
    var dcLanguage = '';
    var dcSource = '';   // Source might be the catalog ID of a scanned book
    var dcRelation = ''; // Relation might be related URLs
    var myWindow;
// Set global dcVariables to the empty string too
    dcCreator = '';
    dcTitle = '';
    dcDate = '';
    dcIdentifier = '';

    if (document.getElementsByTagName) { // If W3C DOM available...
// Get variables
        metatable = document.getElementsByTagName("meta");    // Fill array
        for (i = 0; i < metatable.length;i++) {               // Step through array
            metaname = metatable[i].getAttribute("name");       // Get meta name
            metacontent = metatable[i].getAttribute("content"); // Get meta content
            metascheme = metatable[i].getAttribute("scheme");   // Get meta scheme
            if (metaname) { // In case it is a meta http-equiv instead of name
                if (!metascheme) {     // If undefined some interpreters make it null
                    metascheme = '';   // but it is supposed to be the empty string.
                }
    
                if (!unequal(metaname.toUpperCase(),'DC.CONTRIBUTOR')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcContributor) {
                        dcContributor = metacontent;
                    } else {
                        dcContributor = dcContributor + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.COVERAGE')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcCoverage) {
                        dcCoverage = metacontent;
                    } else {
                        dcCoverage = dcCoverage + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.CREATOR')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcCreator) {
                        dcCreator = metacontent;
                    } else {
                        dcCreator = dcCreator + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.DATE')) {		
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcDate) {
                        dcDate = metacontent;
                    } else {
                        dcDate = dcDate + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.DESCRIPTION')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcDescription) {
                        dcDescription = metacontent;
                    } else {
                        dcDescription = dcDescription + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.FORMAT')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcFormat) {
                        dcFormat = metacontent;
                    } else {
                        dcFormat = dcFormat + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.IDENTIFIER')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcIdentifier) {
                        dcIdentifier = metacontent;
                    } else {
                        dcIdentifier = dcIdentifier + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.LANGUAGE')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcLanguage) {
                        dcLanguage = metacontent;
                    } else {
                        dcLanguage = dcLanguage + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.PUBLISHER')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcPublisher) {
                        dcPublisher = metacontent;
                    } else {
                        dcPublisher = dcPublisher + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.RELATION')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcRelation) {
                        dcRelation = metacontent;
                    } else {
                        dcRelation = dcRelation + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.RIGHTS')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcRights) {
                        dcRights = metacontent;
                    } else {
                        dcRights = dcRights + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.SOURCE')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcSource) {
                        dcSource = metacontent;
                    } else {
                        dcSource = dcSource + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.SUBJECT')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcSubject) {
                        dcSubject = metacontent;
                    } else {
                        dcSubject = dcSubject + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.TITLE')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcTitle) {
                        dcTitle = metacontent;
                    } else {
                        dcTitle = dcTitle + '; ' + metacontent;
                    }
                }
  
                if (!unequal(metaname.toUpperCase(),'DC.TYPE')) {
                    if (metascheme) {
                        metacontent = '(SCHEME=' + metascheme + ') ' + metacontent;
                    }
                    if (!dcType) {
                        dcType = metacontent;
                    } else {
                        dcType = dcType + '; ' + metacontent;
                    }
                }
            } // Closing the check for http-equiv, which would otherwise break this.
        }
// Now open up a window and display the data

        myWindow = window.open("","PopUp","height=400,width=600,menubar=yes,scrollbars=yes");
        myWindow.focus();
        myWindow.document.write('<html><head><title>Dublin Core Metadata</title></head>');
        myWindow.document.write('<body><h1>Dublin Core Metadata</h1>');
        myWindow.document.write('<dl>');
  
        if (dcPublisher) {
            myWindow.document.write('<dt>DC.publisher<dd>' + dcPublisher);
        }
  
        if (dcRights) {
            myWindow.document.write('<dt>DC.rights<dd>' + dcRights);
        }
        if (dcCreator) {
            myWindow.document.write('<dt>DC.creator<dd>' + dcCreator);
        }
        if (dcContributor) {
            myWindow.document.write('<dt>DC.contributor<dd>' + dcContributor);
        }
        if (dcTitle) {
            myWindow.document.write('<dt>DC.title<dd>' + dcTitle);
        }
        if (dcCoverage) {
            myWindow.document.write('<dt>DC.coverage<dd>' + dcCoverage);
        }
        if (dcDate) {
            myWindow.document.write('<dt>DC.date<dd>' + dcDate);
        }
        if (dcIdentifier) {
            myWindow.document.write('<dt>DC.identifier<dd>' + dcIdentifier);
        }
        if (dcDescription) {
            myWindow.document.write('<dt>DC.description<dd>' + dcDescription);
        }
        if (dcSubject) {
            myWindow.document.write('<dt>DC.subject<dd>' + dcSubject);
        }
        if (dcType) {
            myWindow.document.write('<dt>DC.type<dd>' + dcType);
        }
        if (dcFormat) {
            myWindow.document.write('<dt>DC.format<dd>' + dcFormat);
        }
        if (dcLanguage) {
            myWindow.document.write('<dt>DC.language<dd>' + dcLanguage);
        }
        if (dcSource) {
            myWindow.document.write('<dt>DC.source<dd>' + dcSource);
        }
        if (dcRelation) {
            myWindow.document.write('<dt>DC.relation<dd>' + dcRelation);
        }
        myWindow.document.write('</dl></body></html>');
        myWindow.document.close();
    } // else do nothing (W3C DOM unavailable).
}

function goThere() { // Javascript Bible page 105
    var list;
    if (document.getElementsByTagName) { // If W3C DOM available...
// IE6 demands that the reference be to an ID, not a name.
        list = document.forms[0].NavBarFormSelect1;
        location.href = list.options[list.selectedIndex].value;
    } // else do nothing (W3C DOM unavailable).
}

// End of function definitions; main script starts.

if (document.getElementsByTagName) { // If W3C DOM available...
// GetSelectedLinkTypes
// Variables in order of Mozilla bar and accesskeys
// 2 is often skip navigation; here it's jump to first H1, subtly different.
// Initialize variables to empty strings, in case a previous script set them.
// Set selected link variables.
// Script fails if a link lacks both (rel or rev) and href.

    linktable = document.getElementsByTagName("link");
    for (i = 0; i < linktable.length;i++) {          // Fill Array
        linkname = linktable[i].getAttribute("rel");     // Get link rel name
        if (!linkname) {                                  // Or link rev name
            linkname = linktable[i].getAttribute("rev");
        }
        linkcontent = linktable[i].getAttribute("href");  // Get href value

// And proceed to set selected variables based on the above

        if ((!vStart) & (!unequal(linkname.toUpperCase(),'START'))) {
            vStart = linkcontent;
        }
        if ((!vUp) & (!unequal(linkname.toUpperCase(),'UP'))) {
            vUp = linkcontent;
        }
        if ((!vFirst) & (!unequal(linkname.toUpperCase(),'FIRST'))) {
            vFirst = linkcontent;
        }
        if ((!vPrev) & (!unequal(linkname.toUpperCase(),'PREV'))) {
            vPrev = linkcontent;
        }
        if ((!vNext) & (!unequal(linkname.toUpperCase(),'NEXT'))) {
            vNext = linkcontent;
        }
        if ((!vLast) & (!unequal(linkname.toUpperCase(),'LAST'))) {
            vLast = linkcontent;
        }
        if ((!vContents) & (!unequal(linkname.toUpperCase(),'CONTENTS'))) {
            vContents = linkcontent;
        }
        if ((!vSearch) & (!unequal(linkname.toUpperCase(),'SEARCH'))) {
            vSearch = linkcontent;
        }
        if ((!vHelp) & (!unequal(linkname.toUpperCase(),'HELP'))) {
            vHelp = linkcontent;
        }
        if ((!vCopyright) & (!unequal(linkname.toUpperCase(),'COPYRIGHT'))) {
            vCopyright = linkcontent;
        }
        if ((!vMade) & (!unequal(linkname.toUpperCase(),'MADE'))) {
            vMade = linkcontent;
        }
    }

} // else do nothing (W3C DOM unavailable).

if (document.getElementsByTagName) { // If W3C DOM available...
// Insert First/Prev/Next/Last into Navbar
// Skip, Start=top, up, and e-mail (webmaster) must be in non-javascript HTML
// Our default HTML navigation bar is SKIP TOP UP E-MAIL (WEBMASTER).
// The first three are in span id NavBarPrefix.

    if (vFirst) {
        appendLiveLink("NavBarPrefix","First page",vFirst,"First");
    } else {
        appendDeadLink("NavBarPrefix","first");
    }

    if (vPrev) {
        appendLiveLink("NavBarPrefix","Previous page",vPrev,"Previous");
    } else {
        appendDeadLink("NavBarPrefix","previous");
    }

    if (vNext) {
        appendLiveLink("NavBarPrefix","Next page",vNext,"Next");
    } else {
        appendDeadLink("NavBarPrefix","next");
    }

    if (vLast) {
        appendLiveLink("NavBarPrefix","Last page",vLast,"Last");
    } else {
        appendDeadLink("NavBarPrefix","last");
    }
} // else do nothing (W3C DOM unavailable).

if (document.getElementsByTagName) { // If W3C DOM available...
// AddSelectBox
// Drop existing NavBar into empty form
// Also add accesskey, if link element is present

// Surround existing navigation map with form
    vTarget = document.getElementById("map1");
    vNewElement = document.createElement("form");
    vNewElement.setAttribute('id','NavBarForm');
    vNewElement.setAttribute('action','#');
    vNewElement.setAttribute('style','display:inline');
    vParent = vTarget.parentNode;
    vParent.replaceChild(vNewElement, vTarget);
    vNewElement.appendChild(vTarget);

// Append a select box that is a map of access keys.
// But assign access keys elsewhere; they can't be made to select box options.

    vTarget = document.getElementById("NavBarSuffix");
    vNewElement = document.createElement("select");
    vNewElement.setAttribute('name', 'urlList');
    vNewElement.setAttribute('id', 'NavBarFormSelect1');
    vNewElement.setAttribute('title', 'Shortcut keys');
    vNewElement.setAttribute('class', 'xx-small');
    vTarget.appendChild(vNewElement);

// Populate select box
    vTarget = document.getElementById("NavBarFormSelect1");

    if (vStart) { // Select box 1=Home
        vNewElement = document.createElement("option");        //1
        vNewContent = document.createTextNode("1. Home page");  //2
        vNewElement.setAttribute('value',vStart);            //3
        vNewElement.appendChild(vNewContent);                //4
        vTarget.appendChild(vNewElement);                    //5
    }

// Select box 2=Skip to main content (DEFAULT)
// "selected","selected" is said to be correct to make default.
    vNewElement = document.createElement("option");
    vNewContent = document.createTextNode("2. Skip to main content");
    vNewElement.setAttribute('value','#h1');
    vNewElement.setAttribute('selected','selected');
    vNewElement.appendChild(vNewContent);
    vTarget.appendChild(vNewElement);

    if (vContents) { // Select box 3=Contents
        vNewElement = document.createElement("option");
        vNewContent = document.createTextNode("3. Sitemap");
        vNewElement.setAttribute('value',vContents);
        vNewElement.appendChild(vNewContent);
        vTarget.appendChild(vNewElement);
    }

    if (vSearch) { // Select box 4=Search
        vNewElement = document.createElement("option");
        vNewContent = document.createTextNode("4. Site search");
        vNewElement.setAttribute('value',vSearch);
        vNewElement.appendChild(vNewContent);
        vTarget.appendChild(vNewElement);
    }

// Select box 5=Skip to site menu (You are here)
    vNewElement = document.createElement("option");
    vNewContent = document.createTextNode("5. Skip to site menu");
    vNewElement.setAttribute('value','#menu');
    vNewElement.appendChild(vNewContent);
    vTarget.appendChild(vNewElement);

    if (vHelp) { // Select box 6=Help
        vNewElement = document.createElement("option");
        vNewContent = document.createTextNode("6. Site help");
        vNewElement.setAttribute('value',vHelp);
        vNewElement.appendChild(vNewContent);
        vTarget.appendChild(vNewElement);
    }

// Select box 7=Skip to page menu (unused)

    if (vCopyright) { // Select box 8=Copyright
        vNewElement = document.createElement("option");  
        vNewContent = document.createTextNode("8. Terms of Use");
        vNewElement.setAttribute('value',vCopyright);
        vNewElement.appendChild(vNewContent);
        vTarget.appendChild(vNewElement);
    }

    if (vMade) { // Select box 9=Author(s)
        vNewElement = document.createElement("option");
        vNewContent = document.createTextNode("9. Contact page");
        vNewElement.setAttribute('value',vMade);
        vNewElement.appendChild(vNewContent);
        vTarget.appendChild(vNewElement);
    }

    if (vHelp) { // Select box 0=List access keys
        vNewElement = document.createElement("option");  
        vNewContent = document.createTextNode("0. Shortcut key help");
        vNewElement.setAttribute('value',vHelp + '#AccessKeys');
        vNewElement.appendChild(vNewContent);
        vTarget.appendChild(vNewElement);
    }

// Make a Go button using 'input' inside the form
    vTarget = document.getElementById("NavBarSuffix");
    vNewElement = document.createElement("input");
    vNewElement.setAttribute('type','Button');
    vNewElement.setAttribute('value','Go');
    vNewElement.setAttribute('class','xx-small');
    vNewElement.onclick = goThere;
    vTarget.appendChild(vNewElement);

} // else do nothing (W3C DOM unavailable).

if (document.getElementsByTagName) { // If W3C DOM available...
// InsertAddressBlock

    metatable = document.getElementsByTagName("meta");    // Fill array
    for (i = 0; i < metatable.length;i++) {               // Step through array
        metaname = metatable[i].getAttribute("name");       // Get meta name
        metacontent = metatable[i].getAttribute("content"); // Get meta content
        if (metaname) { // In case it is a meta http-equiv instead of name
            if ((!dcCreator) & (!unequal(metaname.toUpperCase(),'DC.CREATOR'))) {
                dcCreator = metacontent;
            }
            if ((!dcTitle) & (!unequal(metaname.toUpperCase(),'DC.TITLE'))) {
                dcTitle = metacontent;
            }
            if ((!dcDate) & (!unequal(metaname.toUpperCase(),'DC.DATE'))) {
                dcDate = metacontent;
            }
            if ((!dcIdentifier) & (!unequal(metaname.toUpperCase(),'DC.IDENTIFIER'))) {
                dcIdentifier = metacontent;
            }
        }
    }

    document.write('<div style="text-align:left;"> ');
    document.write('<address class="xx-small" style="font-style:normal;">');
// CONTACT DATA DESTINATION (Need accesskeys here for ac companion to see)
    document.write('<a accesskey="8" title="Terms of Use" ');
    document.write('href="' + vCopyright + '">Copyright</a>: ');
    document.write(dcCreator + ', ' );
    document.write('<cite>' + dcTitle + '</cite>; ' + dcDate );
    document.write('; ' + dcIdentifier + '.<br>');
    document.write('<a accesskey="9" title="Contact page" ');
    document.write('href="' + vMade + '">Contacts</a>: ' + vMade );
    document.write('</p> ');
    document.write('</address> ');
    document.write('</div> ');

} else { // W3C DOM unavailable, use site-specific generic data...
// For Lynx, Links, IE3, NN3.04, OP3.62, NN4.08, NN4.61

    document.write('<div style="text-align:left;"> ');
    document.write('<address class="xx-small" ');
    document.write('style="font-style:normal;text-align:left; ');
    document.write(' border:none;display:inline;"> ');
    document.write('<a href="http://' + siteRoot + '">Copyright</a>: ');
    document.write(siteRoot + '<br>' );
    document.write('<a href="http://' + siteContact + '">Contacts</a>: ');
    document.write(siteContact);
    document.write('<br>');
    document.write('</address> ');
    document.write('</div> ');
}

if (document.getElementsByTagName) { // If W3C DOM available...
// InsertIconBlock
    document.write('<br>'); // Extra space for Opera/Win98 above icon block.
    document.write('<div style="text-align:left;"> ');

// DC.Metadata -- new
    document.write('<a style="vertical-align:bottom;" ');
    document.write('title="Show Dublin Core metadata" ');
    document.write('"target="_top" ');
    document.write('onClick="dcMetadata();return false;" ');
    document.write('href="#" name="dcMetadata"><img src= ');
    document.write('"../../latest/text/image/dc-metadata.gif" alt= ');
    document.write('"Dublin Core Metadata" height="32" width="91"></a> ');

// Spacer
    document.write('<img src="../../latest/text/image/spacer.gif" alt= ');
    document.write('"&nbsp;/&nbsp;"> ');

// The W3C Markup Validation Service
// Original Alt Text: Valid HTML 4.01
    document.write('<a style="vertical-align:bottom;" ');
    document.write('title="Run the W3C Markup Validation Service / validator.w3.org" ');
    document.write('"target="_top" ');
    document.write('href="http://validator.w3.org/check/referer"><img src= ');
    document.write('"../../latest/text/image/valid-html401.gif" alt= ');
    document.write('"Revalidate hypertext markup language 4.01 / validator.w3.org" ');
    document.write('height="32" width="91"></a> ');

// Spacer
    document.write('<img src="../../latest/text/image/spacer.gif" alt= ');
    document.write('"&nbsp;/&nbsp;"> ');

// The W3C CSS Validation Service
// Original Alt text: 'Valid CSS 2'
    document.write('<a style="vertical-align:bottom;" ');
    document.write('title="Run the W3C CSS Validation Service / jigsaw.w3.org" ');
    document.write('"target="_top" href= ');
    document.write('"http://jigsaw.w3.org/css-validator/check/referer"><img src=');
    document.write('"../../latest/text/image/valid-css.gif" alt= ');
    document.write('"Revalidate cascading style sheets / jigsaw.w3.org" ');
    document.write('height="32" width="91"></a> ');

//Spacer
    document.write('<img src="../../latest/text/image/spacer.gif" alt= ');
    document.write('"&nbsp;/&nbsp;"> ');

// ATRC Web Accessibility Checker
// Original alt text: Tested--Checker A
    document.write('<a style="vertical-align:bottom" ');
    document.write('title="Run the ATRC Web Accessibility Checker / checker.atrc.utoronto.ca" ');
    document.write('"target="_top" href= ');
    document.write('"http://checker.atrc.utoronto.ca/servlet/Checkacc?file=referer&amp;guide=wcag-1-0-a&amp;lang=eng"> ');
    document.write('<img src="../../latest/text/image/checkerA.png" alt= ');
    document.write('"Review accessibility A @ checker.atrc.utoronto.ca" ');
    document.write('height="32" width="102"></a> ');

    document.write('</div> ');

} // else do nothing (W3C DOM unavailable).
