/*
Title: allissues.js
Date: May, 2007
Author: jrh
Summary: This JavaScript file will be used by the All Issues
        pages for all the Journals distributions. It's purpose
        is to dynamically generate a menu system from an array
        of data passed in my JRNL_TOOLBAR_NAV.pm called issueArray.
Constants:      TABLE_FORMAT - boolean - format for table structure
Globals:        issueArray - read from template, the data for the menu
                html_root - read from template, the root directory
                path - read from template, the distribution
                toc_name - read from template, the html page name
                year - the issue year
                volume - the issue volume number
                issue - the issue number
                rowStart - html to add to start of each row
                rowEnd - html to add to end of each row
*/

var TABLE_FORMAT = 1;

var year = "";
var volume = "";
var issue = "";

var specialCaseNames = new Array;
// ['journal-year-volume-issue'] = 'issue display name'
specialCaseNames['bull-1921-27-09'] = '9-10';
specialCaseNames['bull-1922-28-01'] = '1-2';
specialCaseNames['bull-1924-30-01'] = '1-2';
specialCaseNames['bull-1924-30-03'] = '3-4';
specialCaseNames['bull-1924-30-05'] = '5-6';
specialCaseNames['bull-1924-30-09'] = '9-10';
specialCaseNames['bull-1925-31-01'] = '1-2';
specialCaseNames['bull-1925-31-03'] = '3-4';
specialCaseNames['bull-1925-31-05'] = '5-6';
specialCaseNames['bull-1925-31-09'] = '9-10';

var rowStart = "<br />";
var rowEnd = "";

if (TABLE_FORMAT) {
    rowStart = "<tr><td>";
    rowEnd = "</td></tr>";
}

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (return value of -1 indicates the use of a real browser).
{
  var rv = -1; // Return value assumes failure.
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}

// This creates a table row with one cell, and inserts 
// a single DOM element as its child.
// It returns the table row as a return value
function insertContentIntoCenteredSingletonTableCell(e) {
    var thisRow = document.createElement('tr');
    var thisColumn = document.createElement('td');
    thisColumn.setAttribute('align', 'center');
    thisRow.appendChild(thisColumn);
    thisColumn.appendChild(e);
    return(thisRow);
}

function numberSort(a, b) { return a - b; }

// Create the dropdown list of years. To be run by onLoad.
function loadYears() {
    var count = 0;
    var i;
    var j;
    var thisYear;
    var inFreeYears = false;
    var inSubYears = false;
    var yearElement = document.getElementById('year');
    var currentParent = yearElement;
    var haveFreeYears = false;
    for (thisYear in freeYearsArray) {
        haveFreeYears = true;
        break;
    }
    // This should not be necessary, but Google Chrome's iteration
    // of object properties is unstable. 
    // (see http://code.google.com/p/chromium/issues/detail?id=20144)
    var issueYears = new Array(issueArray.length);
    for (thisYear in issueArray) {
        issueYears.push(thisYear);
    }
    issueYears.sort(numberSort);
    var versionOfLameMicrosoftBrowser = getInternetExplorerVersion();
    // Special Case, arrrrr!
    // mosc only has one volume per year and one issue per volume.
    if (path == "mosc") {
        var currentTable = document.createElement('table');
        currentTable.id = 'movingWall';
        currentTable.setAttribute('border', '0');
        var yearData = document.getElementById('yearData');
        yearData.parentNode.parentNode.removeChild
            (yearData.parentNode.parentNode.firstChild);
        yearData.setAttribute('width', '95%');
        yearData.parentNode.removeChild(yearData.nextSibling);
        yearData.parentNode.removeChild(yearData.nextSibling);
        yearData.removeChild(document.getElementById('year'));
        if ( versionOfLameMicrosoftBrowser >= 8.0 || 
             versionOfLameMicrosoftBrowser < 0) {
            yearData.appendChild(currentTable);
            currentTable.appendChild
                (insertContentIntoCenteredSingletonTableCell
                 (document.createTextNode
                  ("Subscription Issues")));
        } else {
            yearData.innerHTML = ''
        }
        for (i = issueYears.length-1; i >= 0; --i) {
            thisYear  = issueYears[i];
            if (thisYear == undefined) continue;
            // This works since there is only one volume per year.
            for (thisVolume in issueArray[thisYear]) { };
            var issueURL = html_root+"/"+path+"/"+thisYear+"-"+
                thisVolume+"-00/"+toc_name;
            if ( versionOfLameMicrosoftBrowser >= 8.0 || 
                 versionOfLameMicrosoftBrowser < 0) {
                if (freeYearsArray[thisYear] && !inFreeYears) {
                    currentTable = document.createElement('table');
                    currentTable.id = 'freeArchive';
                    currentTable.setAttribute('border', '0');
                    yearData.appendChild(currentTable);
                    currentTable.appendChild
                        (insertContentIntoCenteredSingletonTableCell
                         (document.createTextNode('Free Archive')));
                    inFreeYears = true;
                }
                var thisAnchor = document.createElement('a');
                thisAnchor.setAttribute('href', 
                                        issueURL);
                thisText = document.createTextNode(thisYear);
                thisAnchor.appendChild(thisText);
                currentTable.appendChild
                    (insertContentIntoCenteredSingletonTableCell
                     (thisAnchor));
            } else {
                // Using brain-dead version of lame Microsoft browser
                yearData.innerHTML +=
                    '<a href="'+issueURL+'">'+thisYear+'</a><br />\n';
            }
        }
        return;
    }
    // It would have been simpler to iterate an object, but Chrome
    // does not have a stable sort order for such an iteration.
    for (i = issueYears.length-1; i >= 0; --i) {
        thisYear  = issueYears[i];
        if (thisYear == undefined) continue;
        if ( versionOfLameMicrosoftBrowser >= 8.0 || 
             versionOfLameMicrosoftBrowser < 0) {
            if ( !inFreeYears && freeYearsArray[thisYear] ) {
                var freeOptionGroup = document.createElement('optgroup');
                freeOptionGroup.id = 'freeArchive';
                freeOptionGroup.setAttribute('label', 'Free Archive');
                yearElement.appendChild(freeOptionGroup);
                currentParent = freeOptionGroup;
                inFreeYears = true;
                inSubYears = false;
            } else if ( !inSubYears && !freeYearsArray[thisYear] 
                        && haveFreeYears
                        ) {
                var payOptionGroup = document.createElement('optgroup');
                payOptionGroup.id = 'movingWall';
                payOptionGroup.setAttribute('label', 'Subscription Issues');
                yearElement.appendChild(payOptionGroup);
                currentParent = payOptionGroup;
                inFreeYears = false;
                inSubYears = true;
            }
            // We should be able to use "new Option(...)", but brain-dead
            // browsers (i.e. IE) don't know what it means. 
            // Microsoft is populated by a bunch of complete idiots.
            var thisOption = document.createElement('option');
            thisOption.nodeValue = thisYear;
            thisOption.appendChild(document.createTextNode(thisYear));
            currentParent.appendChild(thisOption);
            count++;
        } else {
        // Using an old version of IE. Cannot accommodate with optgroups
            document.getElementById('year').options[count] = 
                new Option(thisYear,thisYear);
            count++;
        }
    }
}

// Read in a year or volume and generate the menus.
function makeMenu(option,value) {
    if (option == 'year') {
        year = value;
        // Clear the current volume and issue menus.
        document.getElementById('volume').innerHTML = "";
        document.getElementById('issue').innerHTML = "";

        numVolumes = 0;
        volumeMenu = '';

        noIssues = true;

        for (thisVolume in issueArray[year]) {
            if (issueArray[year][thisVolume].length > 1) {
                noIssues = false;
            }
        }

        for (thisVolume in issueArray[year]) {
            volumeName = thisVolume;

            // Drop leading zeroes...

            volumeName = volumeName.replace(/^0+/, "");

            // ...unless it's all zeroes.

            if (volumeName.length == 0) {
                volumeName = "0";
            }

            // Volumes with no issues.

            if (issueArray[year][thisVolume] == '-1') {
                volumeLink = "<a href=\""+html_root+"/"+path+"/home-"+year+".html\">"+volumeName+"</a>";
                volumeMenu += rowStart+volumeLink+rowEnd;
            }

            // Volumes with only a '00' issue.

            else if (noIssues && issueArray[year][thisVolume] == '00') {
                volumeLink = "<a href=\""+html_root+"/"+path+"/"+year+"-"+thisVolume+"-00/"+toc_name+"\">"+volumeName+"</a>";
                volumeMenu += rowStart+volumeLink+rowEnd;

                numVolumes++;
            }

            // Normal Volumes with issues.

            else {
                volumeLink = "<a href=\"javascript:makeMenu('volume','"+thisVolume+"')\">"+volumeName+"</a>";
                volumeMenu += rowStart+volumeLink+rowEnd;

                numVolumes++;
            }
        }

        // If we only have one volume, auto generate the list of issues.

        if (numVolumes == 1) {
            volumeMenu = rowStart+volumeName+rowEnd;
            makeMenu('volume',thisVolume);
        }

        document.getElementById('volume').innerHTML = document.getElementById('volume').innerHTML + volumeMenu;
    }
    else if (option == 'volume') {
        volume = value;
        document.getElementById('issue').innerHTML = "";

        issueMenu = '';
        for (thisIssue in issueArray[year][volume]) {
            issue = issueArray[year][volume][thisIssue];
            issueLink = issue;
            issueName = issue;

            if (year != '' && volume != '' && issue != '') {
                if (issue == "00") {
                    // issueName = "Miscellaneous";
                    issueName = "0";
                }

                // Handle Special Case issue names.
                if (specialCaseNames[path + '-' + year + '-' + volume + '-' + issue]) {
                    issueName = specialCaseNames[path + '-' + year + '-' + volume + '-' + issue];
                }

                // Drop leading zeroes...

                issueName = issueName.replace(/^0+/, "");

                // ...unless it's all zeroes.

                if (issueName.length == 0) {
                    issueName = "0";
                }

                issueLink = "<a href=\""+html_root+"/"+path+"/"+year+"-"+volume+"-"+issue+"/"+toc_name+"\">"+issueName+"</a>";
            }

            if (issueName == "0") {
                issueMenu = rowStart + issueLink + rowEnd + issueMenu;
            }
            else {
                issueMenu = issueMenu + rowStart + issueLink + rowEnd;
            }

            //issueMenu += rowStart+issueLink+rowEnd;
        }

        document.getElementById('issue').innerHTML = document.getElementById('issue').innerHTML + issueMenu;
    }
}

if (window.addEventListener) {
    window.addEventListener('load', loadYears, false);
} else if (window.attachEvent) {
    window.attachEvent('onload', loadYears);
} else {
    window.onload=loadYears;
}

