
function initNav(category, topic, subtopic)
{
    if (getUrlParameter("print") != "") {
        // We're printing -- hide navigation and don't center
        hideElement("bannerTable");
        hideElement("footer");
        setParameter(document.body, "className", "print");
        setParameter("content", "className", "print");
        window.print();
    } else {
        // Highlight category in top menu
        setClass("Top_" + category, "topLinkChosen");
        var leftMenu = document.getElementById("menu_" + category);
        if (leftMenu != undefined) {
            // Reveal category-specific left menu, and any subtopics
            showElement(leftMenu);
            showElement("menu_" + category + "_" + topic);
            var menuTopicId = category + "_" + topic;
            if (subtopic != undefined)
                menuTopicId = menuTopicId + "_" + subtopic;
            // Highlight topic in left menu
            setClass(menuTopicId, "leftLinkChosen");
        }
    }
}

// ------------------------------------------------------------------------
// Create index

function emitIndexItem(id, title) {
    document.write("<div class='indexLink'>\n");
    document.write("  <a class='indexLink' name='indexLink' id='indexLink_" + id + "'\n");
    document.write("     href='javascript:void(0)' onclick='showItem(this, \"" + id + "\")'>" + title + "</a>\n");
    document.write("</div>\n");
}

// ------------------------------------------------------------------------
// A collection item URL's hash specifies the item (e.g. http://rickmohr.net/Contra/Dances.asp#NightSail)
// so it can be updated without reloading when clicking a different item. (See http://ajaxpatterns.org/Unique_URLs)
// But switching items via "back" or a bookmark doesn't reload the page, so we use a timer.

function initCollectionPage() {
    reallyInitCollectionPage();
    setInterval(reallyInitCollectionPage, 500);
}

var currentItemId = "";

function reallyInitCollectionPage()
{
    var itemId = window.location.hash.replace("#","");
    if (itemId == "")
        itemId = getIdOfItemContainingSearchTerms();
    if (itemId == "")
        itemId = "Introduction";
    if (itemId != currentItemId) {
        currentItemId = itemId;
        var indexLinkElement = document.getElementById("indexLink_" + itemId);
        showItem(indexLinkElement, itemId);
        if (getUrlParameter("print") != "") {
            hideElement("index");
            setStyleParameter("content", "marginLeft", "0");
            //setStyleParameter("content", "width", "0");
        }
    }
}

function showItem(indexLinkElement, itemId)
{
    // Hide all items
    var parent = document.getElementById("collection");
    if (parent != undefined) {
        var nodes = parent.childNodes;
        for (var i = 0; i < nodes.length; i++)
            if (nodes[i].nodeType == 1)
                nodes[i].style.display = "none";
    }

    // Unchoose all links
    var nodes = document.getElementsByName("indexLink");
    for (var i = 0; i < nodes.length; i++)
        nodes[i].className = "indexLink";

    // Show the item we want
    showElement("div_" + itemId);
    setClass(indexLinkElement, "indexLinkChosen");

    // Store the item ID in the URL
    window.location.hash = itemId;

    // Fix the "Print" link button
    setParameter("linkButton_Print", "href", "?print=1#" + itemId);
}

// ------------------------------------------------------------------------
// If loading a collection page (e.g. my dances) via a search engine, show item containing search terms.

function getIdOfItemContainingSearchTerms() {
    var terms = getSearchTerms();
    if (terms == null)
        return "";
    else
    {
        var item = findItemWithMostTerms(terms);
        return item.id.substring(4); // trim leading "div_"
    }
}

function getSearchTerms() {    // http://www.kryogenix.org/code/browser/searchhi/
    var searchTermsKey = null;
    if (document.referrer.indexOf('google.') != -1 || document.referrer.indexOf('bing.') != -1)
        searchTermsKey = 'q';
    else if (document.referrer.indexOf('yahoo.') != -1)
        searchTermsKey = 'p';
    if (searchTermsKey != null) {
        var urlParts = document.referrer.split('?');
        if (urlParts[1]) { 
            var urlArgs = urlParts[1].split('&');
            for (var i = 0; i < urlArgs.length; i++) {
                var keyval = urlArgs[i].split('=');
                if (keyval[0] == searchTermsKey) {
                    var terms = decodeUrl(keyval[1]).replace(/\"/g,"");
                    var termsArray = terms.split(' ');
                    for (var i = 0; i < termsArray.length; i++) {
                        termsArray[i] = termsArray[i].toLowerCase();
                    }
                    return termsArray;
                }
            }
        }
    }
    return null;
}

function decodeUrl(url) {
    return unescape(url.replace(/\+/g,' '));
}

function findItemWithMostTerms(terms) {
    var parent = document.getElementById("collection");
    var bestItem = null;
    var bestMatchCount = 0;
    if (parent != undefined) {
        var nodes = parent.childNodes;
        for (var i = 0; i < nodes.length; i++) {
            if (nodes[i].nodeType == 1) {
                var matchCount = findTerms(nodes[i], terms);
                if (matchCount > bestMatchCount) {
                    bestMatchCount = matchCount;
                    bestItem = nodes[i];
                }
            }
        }
    }
    return bestItem;
}

function findTerms(node, terms) {
    var nFound = 0;
    for (var i in terms)
        if (findTerm(node, terms[i]))
            nFound++;
    return nFound;
}

function findTerm(node, term) {
    for (var i = 0; i < node.childNodes.length; i++) {
        child = node.childNodes[i];
        if (child.nodeType == 3) {
            var data = child.data.toLowerCase();
            if (data.indexOf(term) != -1)
                return true;
        } else if (findTerm(child, term)) // recurse
            return true;
    }
    return false;
}

// ------------------------------------------------------------------------
// Utilities

function writeEmailLink(firstPart, secondPart, className) {
    var address = firstPart + "@" + secondPart;
    document.write("<a class='" + className + "' href='mailto:" + address + "'>" + address + "</a>");
}

function getUrlParameter(name)
{
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( window.location.href );
    if( results == null )
        return "";
    else
        return results[1];
}

function hideElement(object) { setStyleParameter(object, "display", "none"); }
function showElement(object) { setStyleParameter(object, "display", "block"); }
function setClass(object, name) { setParameter(object, "className", name); }

function setStyleParameter(object, parameter, value)
{
    var element = object;
    if (isString(object))
        element = document.getElementById(object);
    if (element != undefined)
        element.style[parameter] = value;
}

function setParameter(object, parameter, value)
{
    var element = object;
    if (isString(object))
        var element = document.getElementById(object);
    if (element != undefined)
        element[parameter] = value;
}

function isString(object) {
    return (typeof object == 'string');
}

