// -------------------------------------------------------------------- //
// Website:	Marlowe Society
// Author:	Mark Abbott
// Filename: 	msartidx.js
// Filetype: 	Javascript
// Date: 		12 Oct 2009
// Version: 	3
// -------------------------------------------------------------------- //

// -------------------------------------------------------------------- //
// ** EXCEPTION HANDLING ** //
// -------------------------------------------------------------------- //
var MSX_BASE = 900;
var MSX_XMLLOADFAIL = MSX_BASE + 1;
var MSX_NONXMLBROWSER = MSX_BASE + 2;

var MSX_MSG_NOCATSORTING = "The Library Catalogue cannot be processed on this browser using the 'Sort Books By:' selection criteria above, or the alphabetic filtering buttons on the left. Instead the entire catalogue is displayed below, sorted alphabetically by Author.";

function writeWarningPara (warningText) {
	document.write ("<p class='warning'>" + warningText + "</p>");
}

// Create an object type MarSocException
function MarSocException (id, message, descr)
{
	// Message is directed at user, description at debugging
	this.number=id;
	this.message=message;
	this.description=descr;
	this.name="MarSocException";
}
// Make the exception convert to a pretty string for display to user on the browser.
MarSocException.prototype.toString = function ()
{
	  return '<p class="warning">' + this.message + '</p>';
}
// Make the exception convert to a pretty string for display to user on the browser.
function WriteFullMarSocException (e)
{
	  document.write ('<strong>' + e.name + '[' + e.number + ']' + ':</strong> ' + e.description + '<br /><strong>User Msg:</strong> "' + e.message + '"');
}

function writeBrowserDetails () {
		  document.write ("<p>Browser details:<br />");
		  document.write ("UserAgent:" + navigator.userAgent + "<br />");
		  document.write ("Vendor:" + navigator.vendor + "<br />");
		  document.write ("App Name:" + navigator.appName + "<br />");
		  document.write ("Version:" + navigator.appVersion + "<br />");
		  document.write ("Browser is IE? " + is_ie + "<br />");
		  document.write ("Browser is Navigator? " + is_nav + "<br />");
		  document.write ("Browser is Mozilla? " + is_moz + ": " + is_moz_ver + "<br />");
		  document.write ("Browser is FireFox? " + is_fx + "<br />");
		  document.write ("Browser is Opera? " + is_opera + "<br />");
		  document.write ("Browser is Safari? " + is_safari + "<br />");
		  document.write ("</p>");
}

// -------------------------------------------------------------------- //
// ** Article Index ** //
// -------------------------------------------------------------------- //

// Publication Types //
var pubIdxNwl  = 0;  //Newsletter//
var pubIdxJnl  = 1;  //Research Journal//
var pubIdxGuide  = 2;  //Marlowe Guide//
var NUMPUBTYPES = 3;
var pubString = new Array("Newsletter", "Journal", "Guide");
var pubTitle = new Array("Newsletter", "Research Journal", "Marlowe Guide");
var pubSubDirString = new Array("newsltr", "journal", "guide");
var pubFilenameString = new Array("newsltr", "journal", "marloweguide");
var pubFieldPrefix = new Array("nwlt", "jrnl", "guide");

// Issue Ids:
idxBaselineNwl = 1000;  //Newsletter 1 Idx = 1001, etc//
idxBaselineJnl = 2000;  //Journal 1 Idx = 2001, etc//
idxBaselineGuide = 3000;  //Marlowe Guide//

// Date of Publication //
idxDateMon = 0;
idxDateYr = 1;
idxDateAvail = 2;

// Back Issue Availability Flags //
PUBNOTAVAILABLE = 0;
PUBAVAILABLE = 1;

// Currently have content listings for printed Journals 1 to 4, and online Journal 5-7.
firstGuideIdx = 1;
lastGuideIdx = 2;
numGuide = lastGuideIdx - firstGuideIdx + 1;
var DiscountedGuideIdx = 2;
var guidePubDates = new Array ();
guidePubDates[1] = new Array ("", "", PUBAVAILABLE);
guidePubDates[2] = new Array ("(Members)", "", PUBAVAILABLE);

// Currently have content listings for printed Journals 1 to 4, and online Journal 5-7.
firstJnlIdx = 1;
lastJnlIdx = 7;
numJnl = lastJnlIdx - firstJnlIdx + 1;
var jnlPubDates = new Array ();
jnlPubDates[1] = new Array ("December", "2004", PUBAVAILABLE);
jnlPubDates[2] = new Array ("September", "2005", PUBAVAILABLE);
jnlPubDates[3] = new Array ("November", "2005", PUBAVAILABLE);
jnlPubDates[4] = new Array ("September", "2006", PUBAVAILABLE);
jnlPubDates[5] = new Array ("Online", "2008", PUBNOTAVAILABLE);
jnlPubDates[6] = new Array ("Online", "2009", PUBNOTAVAILABLE);
jnlPubDates[7] = new Array ("Online", "2010", PUBNOTAVAILABLE);
jnlPubDates[8] = new Array ("Online", "2011", PUBNOTAVAILABLE);

// Currently have content listings for Newsletters 21 to 28
firstNwlIdx = 21;
lastNwlIdx = 34;
numNwl = lastNwlIdx - firstNwlIdx + 1;
var nwlPubDates = new Array ();
nwlPubDates[21] = new Array ("Autumn", "2003", PUBNOTAVAILABLE);
nwlPubDates[22] = new Array ("Spring", "2004", PUBNOTAVAILABLE);
nwlPubDates[23] = new Array ("Autumn", "2004", PUBNOTAVAILABLE);
nwlPubDates[24] = new Array ("Spring", "2005", PUBNOTAVAILABLE);
nwlPubDates[25] = new Array ("Autumn", "2005", PUBNOTAVAILABLE);
nwlPubDates[26] = new Array ("Spring", "2006", PUBAVAILABLE);
nwlPubDates[27] = new Array ("Autumn", "2006", PUBAVAILABLE);
nwlPubDates[28] = new Array ("Spring", "2007", PUBAVAILABLE);
nwlPubDates[29] = new Array ("Autumn", "2007", PUBAVAILABLE);
nwlPubDates[30] = new Array ("Spring", "2008", PUBAVAILABLE);
nwlPubDates[31] = new Array ("Autumn", "2008", PUBAVAILABLE);
nwlPubDates[32] = new Array ("Spring", "2009", PUBAVAILABLE);
nwlPubDates[33] = new Array ("Autumn", "2009", PUBAVAILABLE);
nwlPubDates[34] = new Array ("Spring", "2010", PUBAVAILABLE);
nwlPubDates[35] = new Array ("Autumn", "2010", PUBAVAILABLE);

// Total Number of Publication Issues for which index data exists
numPubIssues = numNwl + numJnl;

// Some dimensioning and other constants //
var MAXNUMARTICLESPERISSUE = 15;
var MAXNUMPUBORDER = 5;
var MAXNUMKEYWORDS = 5;
var NULLKEYWORD = "??";
var NULLARTICLE = -1;

//----------------//

function genPubNumString (pubno) {
	var numStr = "";
	if (pubno<10) {
		numStr="0"+pubno;
	}
	else {
		numStr=""+pubno;
	}
	return (numStr);
}

// -------------------------------------------------------------------- //
// ** Publication Back Issue Ordering ** //
// -------------------------------------------------------------------- //


// Back Issue Costs Data //
var postTyUk  = 0;
var postTyEurope  = 1;
var postTyWorld  = 2;
var firstPostTy = postTyUk;
var lastPostTy = postTyWorld;
var defaultPostTy = postTyUk;
var numPostTypes = 3;
var pubCostData = new Array (numPostTypes);
var pidxTitle  = 0;
var pidxCost  = 1;
var pidxGuideCost  = 2;
// ** Marlowe Society Members eligible for discount on Marlowe Guide
var GUIDEMEMBERDISCOUNT = 1;
// ** Update Publication Order Cost in following table (GBP): ** //
pubCostData[postTyUk] = new Array ("United Kingdom", 3.0, 4.95);
pubCostData[postTyEurope] = new Array ("Europe", 3.5, 5.45);
pubCostData[postTyWorld] = new Array ("Outside Europe", 4.0, 5.95);

// ---------------- //
// ** Functions ** //
// ---------------- //

function genPriceString (val) {
	var pounds = Math.floor(val);
	var pence = Math.round((val-pounds)*100);
	var priceStr = "£" + pounds + ".";
	if (pence<10) {
		priceStr = priceStr + "0" + pence;
	}
	// Add trailing zero if cost is divisble by 10p
	else {
		priceStr = priceStr + pence;
	}
	return (priceStr);
}

function writePubCost (idxPostTy, pubType) {
	if (pubType==pubIdxGuide) {
		document.write(genPriceString(pubCostData[idxPostTy][pidxGuideCost]));
	}
	else {
		document.write(genPriceString(pubCostData[idxPostTy][pidxCost]));
	}
}
function writePostalType (idxPostTy) {
	document.write(pubCostData[idxPostTy][pidxTitle]);
}

function writePostalTypeSelectOptions () {
	var i;
	document.write('<label for="PostRegion">Postal Region:</label>');
	document.write('<select name="PostRegion" id="PostRegion" onchange="updateOrderTotals();" >');
	for (i=firstPostTy; i<=lastPostTy; i++) {
		document.write('<option ');
		if (i==defaultPostTy) document.write('selected="selected" ');
		document.write('value="');
		writePostalType (i);
		document.write('">');
		writePostalType (i);
		document.write('</option>');
	}
	document.write('</select>');
}

//----------------//

function getPubTitleDateString (pubType, pubNo) {
	var str = "" + pubTitle[pubType];
	if (pubType==pubIdxGuide) {
		str = str + " " + guidePubDates[pubNo][idxDateMon];
	}
	else if (pubType==pubIdxNwl) {
		str = str + " " + genPubNumString(pubNo) + " - " + nwlPubDates[pubNo][idxDateMon] + " " + nwlPubDates[pubNo][idxDateYr];
	}
	else {
		str = str + " " + genPubNumString(pubNo) + " - " + jnlPubDates[pubNo][idxDateMon] + " " + jnlPubDates[pubNo][idxDateYr];
	}
	return (str);
}

function getGuideTitleString (discount) {
	var str = "" + pubTitle[pubIdxGuide];
	if (discount) {
		str = str + " (Society Members)";
	}
	return (str);
}

function isBackIssueAvailable (pubType, pubNo) {
	var available = false;
	if (pubType==pubIdxNwl) available = (nwlPubDates[pubNo][idxDateAvail]==PUBAVAILABLE);
	if (pubType==pubIdxJnl) available = (jnlPubDates[pubNo][idxDateAvail]==PUBAVAILABLE);
	if (pubType==pubIdxGuide) available = (guidePubDates[pubNo][idxDateAvail]==PUBAVAILABLE);
	return (available);
}

//----------------//

function writePubOrderLines (pubType) {
	var i=0;
	var firstPub, lastPub;
	if (pubType==pubIdxGuide) {
		firstPub=firstGuideIdx;
		lastPub=lastGuideIdx;
	}
	else if (pubType==pubIdxNwl) {
		firstPub=firstNwlIdx;
		lastPub=lastNwlIdx;
	}
	else {
		firstPub=firstJnlIdx;
		lastPub=lastJnlIdx;
	}
	document.write('<fieldset id="' + pubFieldPrefix[pubType] + 'Order" class="pubsformfieldset" title="Publication Back Issues Order Application Form - ' + pubTitle[pubType] + 's">');
	document.write('<h3>' + pubTitle[pubType] + 's</h3>');
	document.write('<table class="pubsordertable" cellspacing="0" summary="' + pubTitle[pubType] + ' Availability and Ordering">');

	for (i=firstPub; i<=lastPub; i++) {
		// Only display publication details if back issue is available //
		if (isBackIssueAvailable (pubType,i)) {
			document.write('<tr>');
			// Publication Name Field //
			document.write('<td class="pubnamecol">');
			var pubPageURL = "";
			if (pubType==pubIdxGuide) {
				pubPageURL = "./" + pubSubDirString[pubType] + "/" + pubFilenameString[pubType] + ".html";
			}
			else {
				pubPageURL = "./" + pubSubDirString[pubType] + "/" + pubFilenameString[pubType] + genPubNumString(i) + ".html";
			}
			document.write('<a href="' + pubPageURL + '">');
			document.write(getPubTitleDateString(pubType,i) + '</a></td>');
			// Publication Quantity //
			document.write('<td class="pubqtycol"><select class="selectqtyfield" ');
			document.write('name="' + pubFieldPrefix[pubType] + genPubNumString(i) + '_Qty" ');
			document.write('id="' + pubFieldPrefix[pubType] + genPubNumString(i) + '_Qty" ');
			document.write('onchange="updateOrderTotals();" >');
			for (q=0; q<=MAXNUMPUBORDER; q++) {
				document.write('<option ');
				if (q==0) document.write('selected="selected" ');
				document.write('value="' + q + '">' + q + '</option>');
			}
			document.write('</select></td>');
			// Publication Cost //
			document.write('<td class="pubcostcol"><input readonly="readonly" class="totcostfield" type="text" ');
			document.write('name="' + pubFieldPrefix[pubType] + genPubNumString(i) + '_Cost" ');
			document.write('id="' + pubFieldPrefix[pubType] + genPubNumString(i) + '_Cost" />');
			document.write('</td>');
			document.write('</tr>');
		}
	}

	// Sub Total Line //
	document.write('<tr>');
	document.write('<td class="pubnamecol">Sub-total:</td>');
	document.write('<td class="pubqtycol">&nbsp;</td>');
	document.write('<td class="pubcostcol"><input readonly="readonly" class="totcostfield" type="text" ');
	document.write('name="' + pubFieldPrefix[pubType] + 'Total_Cost" ');
	document.write('id="' + pubFieldPrefix[pubType] + 'Total_Cost" /></td>');
	document.write('</tr>');

	document.write('</table>');
	document.write('</fieldset>');
}

//----------------//

function updateOrderTotals () {
	var i, p;
	var firstPub, lastPub;
	var qtyElt, costElt, selQtyIdx, selQtyValue, subTotCostElt, totCostElt, totQtyElt;
	var itemCost=0;
	var qtyRunTot = 0;
	var costRunTots = new Array (0, 0, 0);

	var postalRegionElt = document.getElementById("PostRegion");
	selQtyIdx = postalRegionElt.selectedIndex;
	var issueRate = 0;
	// var issueRate = pubCostData[postalRegionElt.selectedIndex][pidxCost];

	for (p=pubIdxNwl; p<=pubIdxGuide; p++) {
		if (p==pubIdxGuide) {
			firstPub=firstGuideIdx;
			lastPub=lastGuideIdx;
		}
		else if (p==pubIdxNwl) {
			firstPub=firstNwlIdx;
			lastPub=lastNwlIdx;
		}
		else {
			firstPub=firstJnlIdx;
			lastPub=lastJnlIdx;
		}
		for (i=firstPub; i<=lastPub; i++) {
			if (isBackIssueAvailable (p,i)) {
				// Get user selected quantity for this issue
				qtyElt = document.getElementById(pubFieldPrefix[p] + genPubNumString(i) + "_Qty");
				selQtyIdx = qtyElt.selectedIndex;
				selQtyValue = parseInt(qtyElt.options[selQtyIdx].value);
				costElt = document.getElementById(pubFieldPrefix[p] + genPubNumString(i) + "_Cost");
				// Calculate Issue Rate
				if (p==pubIdxGuide) {
					issueRate = pubCostData[postalRegionElt.selectedIndex][pidxGuideCost];
					if (i==DiscountedGuideIdx) {
						issueRate = issueRate - GUIDEMEMBERDISCOUNT;
					}
				}
				else {
					// Costs of Newsletters and Journals the same
					issueRate = pubCostData[postalRegionElt.selectedIndex][pidxCost];
				}
				if (selQtyValue > 0) {
					itemCost = selQtyValue * issueRate;
					costElt.value = genPriceString(itemCost);
				}
				else {
					itemCost = 0;
					costElt.value = "";
				}
				qtyRunTot = qtyRunTot + selQtyValue;
				costRunTots[p] = costRunTots[p] + itemCost;
			}
		}
		// Update sub-total for this publication type
		subTotCostElt = document.getElementById(pubFieldPrefix[p] + "Total_Cost");
		subTotCostElt.value = genPriceString(costRunTots[p]);
	}
	// Update Overall Totals
	totQtyElt = document.getElementById("OrderTotal_Qty");
	totQtyElt.value = qtyRunTot;
	totCostElt = document.getElementById("OrderTotal_Cost");
	totCostElt.value = genPriceString(costRunTots[pubIdxJnl]+costRunTots[pubIdxNwl]+costRunTots[pubIdxGuide]);
   
}

// -------------------------------------------------------------------- //
// ** Article Database ** //
// -------------------------------------------------------------------- //

var aidxPubType = 0;
var aidxPubNo = 1;
var aidxPgNo = 2;
var aidxTitle = 3;
var aidxAuthor = 4;
var aidxKeyWds = 5;

var msArtDb = new Array (numPubIssues);

// Each publication issue takes the next free Dim1 Index //
// Dim2 is article index //

// Declare 2-D array for next issue //
// msArtDb[IssueIdx] = new Array (MAXNUMARTICLESPERISSUE);

// Article record definition is: //
// msArtDb[IssueIdx][ArtIdx] = new Array (PubType, PubNo, PgNo, Title, Author, (Keyword1, Keyword2, Keyword3, Keyword4, Keyword5))

// ** NEWSLETTER 21 - Autumn 2003 ** //
msArtDb[0] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[0][0] = new Array (pubIdxNwl, 21, 3, "Welcome to our New President and Vice-Presidents", "Mike Frohnsdorff", new Array ("Rylance, Mark", "Pickering, Kenneth", "Honan, Park", "Batho, Gordon", NULLKEYWORD) );
msArtDb[0][1] = new Array (pubIdxNwl, 21, 5, "Shakespeare and Ignorance", "Joan Modlin", new Array ("Jew of Malta", "Twelfth Night", "Gnostic", NULLKEYWORD, NULLKEYWORD) );
msArtDb[0][2] = new Array (pubIdxNwl, 21, 7, "The Globe Authorship Conference 2003", "Mike Frohnsdorff", new Array ("Authorship", "Rylance, Mark", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[0][3] = new Array (pubIdxNwl, 21, 10, "Marlowe Under Scrutiny", "Frieda Barker &amp; Marie Mitchell", new Array ("Oxford Study Course", "Conferences", "Edward II", "Dido, Queen of Carthage", NULLKEYWORD) );
msArtDb[0][4] = new Array (pubIdxNwl, 21, 13, "Marlowe Relived", "Anthony Barnett", new Array ("Poetry Society", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[0][5] = new Array (pubIdxNwl, 21, 14, "The Cryptogram of 1609", "Chris Gamble", new Array ("Sonnets", "Wraight, A.D.", "Shakespeare, William", NULLKEYWORD, NULLKEYWORD) );
msArtDb[0][6] = new Array (pubIdxNwl, 21, 21, "Review: Edward II at The Globe", "Joan Modlin", new Array ("Edward II", "Globe Theatre", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[0][7] = new Array (pubIdxNwl, 21, 23, "Massacre - Notes on an Opera by Wolfgang Mitterer", "Valerie Colin-Russ", new Array ("Massacre at Paris", "Opera", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[0][8] = new Array (pubIdxNwl, 21, 24, "Report on Marlowe Day 2003", "Roger Hards", new Array ("Marlowe Day", "Rose, Marlowe", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[0][9] = new Array (pubIdxNwl, 21, 29, "Review: A Life of the Bard by Magnus Inferall", "Benedict", new Array ("Inferall, Magnus", "Biography", "Shakespeare, William", NULLKEYWORD, NULLKEYWORD) );
msArtDb[0][10] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 22 - Apring 2004 ** //
msArtDb[1] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[1][0] = new Array (pubIdxNwl, 22, 5, "Marlowe Memorial Day - Deptford 2004", "Roger Hards", new Array ("Memorial Day", "Deptford", "St.Nicholas Church, Deptford", NULLKEYWORD, NULLKEYWORD) );
msArtDb[1][1] = new Array (pubIdxNwl, 22, 6, "AGM Report 2004", "Roger Hards", new Array ("Marlowe Society AGM", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[1][2] = new Array (pubIdxNwl, 22, 9, "Marlowe in Padua", "Christian Lanciai", new Array ("Padua", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[1][3] = new Array (pubIdxNwl, 22, 11, "<em>'Mr W.H'</em>, the <em>'Dark Lady'</em>, and the <em>'Lovely Boy'</em> (Pt 1)", "Chris Gamble", new Array ("Sonnets", "Shakespeare, William", "Lanier, Emilia", "Herbert, William", NULLKEYWORD) );
msArtDb[1][4] = new Array (pubIdxNwl, 22, 15, "Small Clues in the Shrews", "Isabel Gort&aacute;zar", new Array ("Shakespeare, William", "Authorship", "Death, Marlowe's", "Taming of the Shrew, The", NULLKEYWORD) );
msArtDb[1][5] = new Array (pubIdxNwl, 22, 19, "Review: The Beard of Avon at NY Theatre Workshop", "James A. Baffico", new Array ("Beard of Avon, The", "Freed, Amy", "Authorship", "Oxford, Earl of", NULLKEYWORD) );
msArtDb[1][6] = new Array (pubIdxNwl, 22, 23, "Review: Tamburlaine - Read not Dead at The Globe", "John Grant", new Array ("Tamburlaine", "Globe Theatre", "Read not Dead", NULLKEYWORD, NULLKEYWORD) );
msArtDb[1][7] = new Array (pubIdxNwl, 22, 25, "Review: Othello at The Swan, Stratford", "Beverley Lawrence", new Array ("Othello", "Shakespeare, William", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[1][8] = new Array (pubIdxNwl, 22, 29, "Hero's Missing Speech", "Beatrix", new Array ("Hero", "Much Ado About Nothing", "Female Roles in Shakespeare", NULLKEYWORD, NULLKEYWORD) );
msArtDb[1][9] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 23 - Autumn 2004 ** //
msArtDb[2] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[2][0] = new Array (pubIdxNwl, 23, 4, "Report on Marlowe Day 2004", "Roger Hards", new Array ("Marlowe Day", "Jew of Malta", "Solti, Ildi", NULLKEYWORD, NULLKEYWORD) );
msArtDb[2][1] = new Array (pubIdxNwl, 23, 5, "<em>'Mr W.H'</em>, the <em>'Dark Lady'</em>, and the <em>'Lovely Boy'</em> (Pt 2)", "Chris Gamble", new Array ("Sonnets", "Shakespeare, William", "Lanier, Emilia", "Herbert, William", NULLKEYWORD) );
msArtDb[2][2] = new Array (pubIdxNwl, 23, 10, "Arden of Faversham", "Christian Lanciai", new Array ("Arden of Faversham", "Shakespeare, William", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[2][3] = new Array (pubIdxNwl, 23, 12, "Who's Afraid of Kit Marlowe", "Isabel Gort&aacute;zar", new Array ("Persona, Marlowe's", "Edward II", "Dido, Queen of Carthage", NULLKEYWORD, NULLKEYWORD) );
msArtDb[2][4] = new Array (pubIdxNwl, 23, 18, "Shakespeare's Monument", "Peter Farey", new Array ("Stratford Monument", "Shakespeare, William", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[2][5] = new Array (pubIdxNwl, 23, 24, "Thomas Watson, Poet (c.1556-1592)", "Albert Chatterley", new Array ("Watson, Thomas", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[2][6] = new Array (pubIdxNwl, 23, 28, "Of Malaprops or Misprints", "Roger Hards", new Array ("Malapropisms", "Misprints", "Shakespeare, William", NULLKEYWORD, NULLKEYWORD) );
msArtDb[2][7] = new Array (NULLARTICLE, NULLARTICLE);

// ** JOURNAL 01 - December 2004 ** //
msArtDb[3] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[3][0] = new Array (pubIdxJnl, 1, 3, "Research Journal Dedication to A.D. Wraight", "Mike Frohnsdorff", new Array ("Research Journal", "Dedication", "Wraight, A.D.", NULLKEYWORD, NULLKEYWORD) );
msArtDb[3][1] = new Array (pubIdxJnl, 1, 4, "Marigold Emblem, The", "Roger Hards", new Array ("Marigold", "Hero and Leander", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[3][2] = new Array (pubIdxJnl, 1, 6, "Hero and Leander: the Background", "Yvonne Adams", new Array ("Hero and Leander", "Source", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[3][3] = new Array (pubIdxJnl, 1, 14, "Origins of the Shakespeare Authorship Debate", "Daryl Pinksen", new Array ("Shakespeare, William", "Authorship", "Sonnets", NULLKEYWORD, NULLKEYWORD) );
msArtDb[3][4] = new Array (pubIdxJnl, 1, 28, "The Clue in the Shrew", "Isabel Gort&aacute;zar", new Array ("Shakespeare, William", "Authorship", "Death, Marlowe's", "Taming of the Shrew, The", NULLKEYWORD) );
msArtDb[3][5] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 24 - Spring 2005** //
msArtDb[4] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[4][0] = new Array (pubIdxNwl, 24, 4, "Marlowe Apocrypha - Four Lost Plays", "Mike Frohnsdorff", new Array ("Lost Plays", "Lust's Dominion", "Hannibal", "Maiden's Holiday, The", "Scanderbeg") );
msArtDb[4][1] = new Array (pubIdxNwl, 24, 8, "Lust's Dominion - A Summary and Review", "Mike Frohnsdorff", new Array ("Lust's Dominion", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[4][2] = new Array (pubIdxNwl, 24, 15, "Marlowe Memorial Day - Deptford 2005", "Roger Hards", new Array ("Memorial Day", "Deptford", "St.Nicholas Church, Deptford", NULLKEYWORD, NULLKEYWORD) );
msArtDb[4][3] = new Array (pubIdxNwl, 24, 16, "AGM Report 2005", "Roger Hards", new Array ("Marlowe Society AGM", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[4][4] = new Array (pubIdxNwl, 24, 20, "Fifty Years of the Marlowe Society", "Frieda Barker", new Array ("Marlowe Society", "Golden Jubilee", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[4][5] = new Array (pubIdxNwl, 24, 21, "Review: Doctor Faustus at Freman College", "Beverley Lawrence", new Array ("Doctor Faustus", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[4][6] = new Array (pubIdxNwl, 24, 22, "Review: The World of Christopher Marlowe by David Riggs", "Roberta Ballantine", new Array ("Biography", "Riggs, David", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[4][7] = new Array (pubIdxNwl, 24, 24, "The Faustus Legacy: Christopher Marlowe in Hidden Allusions", "Mike Frohnsdorff", new Array ("Doctor Faustus", "Epigrams", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[4][8] = new Array (NULLARTICLE, NULLARTICLE);

// ** JOURNAL 02 - September 2005 ** //
msArtDb[5] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[5][0] = new Array (pubIdxJnl, 2, 3, "Marlowe and the Marigold", "Mike Frohnsdorff", new Array ("Marigold", "Hero and Leander", "Sidney, Mary", NULLKEYWORD, NULLKEYWORD) );
msArtDb[5][1] = new Array (pubIdxJnl, 2, 9, "The Earl of Nottingham's Men &amp; the 'A' Text of Doctor Faustus", "Robert A. Albano", new Array ("Doctor Faustus", "A-Text", "B-Text", "Nottingham, Earl of, Players", "Birde, William") );
msArtDb[5][2] = new Array (pubIdxJnl, 2, 17, "'An Ironized Tearme': William Warner's Albion's England", "Lisa Hopkin", new Array ("Warner, William", "Albion's England", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[5][3] = new Array (pubIdxJnl, 2, 27, "Marlowe's Sudden &amp; Fearful End: Self-Defence, Murder or Fake?", "Peter Farey", new Array ("Death, Marlowe's", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[5][4] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 25 - Autumn 2005 ** //
msArtDb[6] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[6][0] = new Array (pubIdxNwl, 25, 4, "Report on Marlowe Day 2005", "Roger Hards", new Array ("Marlowe Day", "Touchstone", "America", "Persona, Marlowe's", NULLKEYWORD) );
msArtDb[6][1] = new Array (pubIdxNwl, 25, 7, "The Golden Jubilee at Chislehurst", "Roger Hards", new Array ("Golden Jubilee", "ODAS", "Scadbury", "Chislehurst", NULLKEYWORD) );
msArtDb[6][2] = new Array (pubIdxNwl, 25, 10, "Lust's Dominion - A Summary; The Authorship Question", "Mike Frohnsdorff", new Array ("Lust's Dominion", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[6][3] = new Array (pubIdxNwl, 25, 14, "Marlowe and The Jew of Malta", "Isabel Gort&aacute;zar", new Array ("Jew of Malta", "Merchant of Venice", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[6][4] = new Array (pubIdxNwl, 25, 22, "The Play's the Thing: Marlowe and the Archbishop", "Alex Jack", new Array ("Hamlet", "Whitgift, Archbishop John", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[6][5] = new Array (pubIdxNwl, 25, 26, "Review: Water Lane by John Passfield", "Benedict", new Array ("Water Lane", "Passfield, John", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[6][6] = new Array (pubIdxNwl, 25, 27, "Review: Operation Woolsack by J.Aelwyn Roberts", "Benedict", new Array ("Operation Woolsack", "Roberts, J.Aelwyn", "Authorship", NULLKEYWORD, NULLKEYWORD) );
msArtDb[6][7] = new Array (NULLARTICLE, NULLARTICLE);

// ** JOURNAL 03 - November 2005** //
msArtDb[7] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[7][0] = new Array (pubIdxJnl, 3, 3, "Marlowe's First Book of Lucan", "Mike Frohnsdorff", new Array ("Lucan, First Book of", "Dating", "Criticism, Literary", NULLKEYWORD, NULLKEYWORD) );
msArtDb[7][1] = new Array (pubIdxJnl, 3, 11, "Thomas Thorpe's Dedicatory Epistle to Marlowe's First Book of Lucan", "Mike Frohnsdorff", new Array ("Lucan, First Book of", "Dedication", "Thorpe, Thomas", "Blount, Edward", "Walsingham, Thomas") );
msArtDb[7][2] = new Array (pubIdxJnl, 3, 22, "Was Marlowe's Inquest Void?", "Peter Farey", new Array ("Death, Marlowe's", "Danby, William", "Inquest, Coroner's", NULLKEYWORD, NULLKEYWORD) );
msArtDb[7][3] = new Array (pubIdxJnl, 3, 28, "A Cabalistic &amp; Numerological Subtext to Tamburlaine", "Peter Bull", new Array ("Tamburlaine", "Cabala", "Numerology", NULLKEYWORD, NULLKEYWORD) );
msArtDb[7][4] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 26 - Spring 2006 ** //
msArtDb[8] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[8][0] = new Array (pubIdxNwl, 26, 4, "AGM Report 2006", "Roger Hards", new Array ("Marlowe Society AGM", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[8][1] = new Array (pubIdxNwl, 26, 6, "Marlowe Memorial Day - Deptford 2006", "Roger Hards", new Array ("Memorial Day", "Deptford", "St.Nicholas Church, Deptford", NULLKEYWORD, NULLKEYWORD) );
msArtDb[8][2] = new Array (pubIdxNwl, 26, 7, "William Vaughan and Christopherus Marlerus", "Isabel Gort&aacute;zar", new Array ("Vaughan, William", "Golden Grove", "Whitgift, Archbishop John", NULLKEYWORD, NULLKEYWORD) );
msArtDb[8][3] = new Array (pubIdxNwl, 26, 12, "Review: The Knight of the Burning Pestle", "Michael McEvoy", new Array ("Knight of the Burning Pestle, The", "Beaumont, Francis", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[8][4] = new Array (pubIdxNwl, 26, 13, "Marlowe's Rose", "Doug Weeks", new Array ("Rose Theatre", "Devilish Exercise, A", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[8][5] = new Array (pubIdxNwl, 26, 14, "All Is Not True: The Truth Will Out by Brenda James and William D. Rubenstein", "Mark Abbott", new Array ("Authorship", "James, Brenda", "Rubenstein, William D.", "Neville, Sir Henry", "Shakespeare, William") );
msArtDb[8][6] = new Array (pubIdxNwl, 26, 19, "Review: Christopher Marlowe: Poet &amp; Spy by Park Honan", "Roger Hards", new Array ("Biography", "Honan, Park", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[8][7] = new Array (pubIdxNwl, 26, 21, "Ralph Crane's Encomium for Marlowe", "Roberta Ballantine", new Array ("Crane, Ralph", "Authorship", "Folio, The First", NULLKEYWORD, NULLKEYWORD) );
msArtDb[8][8] = new Array (pubIdxNwl, 26, 24, "Words of Mercury - Correction &amp; Update", "Peter Nockolds", new Array ("Astronomy", "Henry IV Part II", "Harriot, Thomas", NULLKEYWORD, NULLKEYWORD) );
msArtDb[8][9] = new Array (pubIdxNwl, 26, 27, "Play Workshops at The Globe", "Barbara Wooding", new Array ("Globe Theatre", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[8][10] = new Array (pubIdxNwl, 26, 31, "Edward Alleyn in Bronze at Dulwich", "Colin Niven", new Array ("Alleyn, Edward", "Dulwich College", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[8][11] = new Array (NULLARTICLE, NULLARTICLE);

// ** JOURNAL 04 - September 2006 ** //
msArtDb[9] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[9][0] = new Array (pubIdxJnl, 4, 3, "Jonson, Shakespeare &amp; Marlowe: Every Man Out of His Humour", "Daryl Pinksen", new Array ("Shakespeare, William", "Authorship", "Every Man Out of His Humour", "As You Like It", "Jonson, Ben") );
msArtDb[9][1] = new Array (pubIdxJnl, 4, 24, "An Examination of the Boy's Song from The Two Noble Kinsmen", "Sandra Lauder", new Array ("Two Noble Kinsmen, The", "Marigold", "Dating", "Oxford, Earl of", NULLKEYWORD) );
msArtDb[9][2] = new Array (pubIdxJnl, 4, 31, "The Tempest: A Play by Christopher Marlowe?", "Isabel Gort&aacute;zar", new Array ("Tempest, The", "Authorship", "Cabala", "Numerology", "Masonic") );
msArtDb[9][3] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 27 - Autumn 2006 ** //
msArtDb[10] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[10][0] = new Array (pubIdxNwl, 27, 5, "Report on Marlowe Day 2006", "Roger Hards", new Array ("Marlowe Day", "Drama, Key Concepts", "Canterbury", "Lust's Dominion", NULLKEYWORD) );
msArtDb[10][1] = new Array (pubIdxNwl, 27, 8, "Review: Two Gentlemen of Verona (Rio)", "Mike Frohnsdorff", new Array ("Shakespeare's Complete Works at Stratford", "Two Gentlemen of Verona", "Rio de Janeiro", NULLKEYWORD, NULLKEYWORD) );
msArtDb[10][2] = new Array (pubIdxNwl, 27, 9, "Review: Love's Labour's Lost (Washington)", "Mike Frohnsdorff", new Array ("Shakespeare's Complete Works at Stratford", "Love's Labour's Lost", "Washington", NULLKEYWORD, NULLKEYWORD) );
msArtDb[10][3] = new Array (pubIdxNwl, 27,11, "Marlowe's Colourful Language", "Barbara Wooding", new Array ("Colour Symbolism", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[10][4] = new Array (pubIdxNwl, 27, 15, "Come Sing With Me", "Eileen Vasey", new Array ("Corkine, William", "Come Live With Me", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[10][5] = new Array (pubIdxNwl, 27, 18, "That Fine Madness", "Roger Hards", new Array ("Vandenberg, David", "Painting", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[10][6] = new Array (pubIdxNwl, 27, 20, "Review: Dido, Queen of Carthage", "Valerie Colin-Russ", new Array ("Dido, Queen of Carthage", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[10][7] = new Array (pubIdxNwl, 27, 21, "Review: Dido, Queen of Carthage", "Barbara Wooding", new Array ("Dido, Queen of Carthage", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[10][8] = new Array (pubIdxNwl, 27, 24, "The Trust Deed of The Hoffman Prize", "Roger Hards", new Array ("Hoffman, Calvin", "King's School", "Authorship", NULLKEYWORD, NULLKEYWORD) );
msArtDb[10][9] = new Array (pubIdxNwl, 27, 26, "Let's Talk of Graves, of Worms, &amp; Epitaphs", "Isabel Gort&aacute;zar", new Array ("Stratford Monument", "Shakespeare, William", "Othello", "Death, Marlowe's", "Digges, Leonard") );
msArtDb[10][10] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 28 - Spring 2007 ** //
msArtDb[11] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[11][0] = new Array (pubIdxNwl, 28, 6, "Poets' Corner Service 2006", "Roger Hards", new Array ("Poets' Corner", "Westminster Abbey", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[11][1] = new Array (pubIdxNwl, 28, 9, "AGM Report 2007", "Roger Hards", new Array ("Marlowe Society AGM", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[11][2] = new Array (pubIdxNwl, 28, 12, "Review: Much Ado About Nothing", "Michael McEvoy", new Array ("Much Ado About Nothing", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[11][3] = new Array (pubIdxNwl, 28, 13, "Review: Faustus at Hampstead", "Valerie Colin-Russ", new Array ("Doctor Faustus", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[11][4] = new Array (pubIdxNwl, 28, 14, "Review: Faustus at Hampstead", "Mark Abbott", new Array ("Doctor Faustus", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[11][5] = new Array (pubIdxNwl, 28, 16, "Review: Faustus at Hampstead", "Michael McEvoy", new Array ("Doctor Faustus", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[11][6] = new Array (pubIdxNwl, 28, 18, "Review: Midsummer Night's Dream", "Michael McEvoy", new Array ("Midsummer Night's Dream", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[11][7] = new Array (pubIdxNwl, 28, 20, "Marlowe's Plays - Editions and Additions", "Barbara Wooding", new Array ("Texts", "Publishing", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[11][8] = new Array (pubIdxNwl, 28, 23, "Jonson, Shakespeare &amp; Marlowe - A Riposte", "Barbara Wooding", new Array ("Shakespeare, William", "Authorship", "Every Man Out of His Humour", "As You Like It", "Jonson, Ben") );
msArtDb[11][9] = new Array (pubIdxNwl, 28, 26, "A New Key to the Cryptograms of the 1623 First Folio", "Chris Gamble", new Array ("Folio, The First", "Jonson, Ben", "Cryptogram", NULLKEYWORD, NULLKEYWORD) );
msArtDb[11][10] = new Array (pubIdxNwl, 28, 28, "Notes on the Anthony Bacon Papers", "Chris Gamble", new Array ("Bacon, Anthony", "Doux, Monsieur le", "Perez, Antonio", "Love's Labour's Lost", "Maurice, Prince of Nassau") );
msArtDb[11][11] = new Array (pubIdxNwl, 28, 31, "Comments on: Let's Talk of Graves, of Worms, &amp; Epitaphs", "Isabel Gort&aacute;zar", new Array ("Stratford Monument", "Shakespeare, William", "Othello", "Death, Marlowe's", "Digges, Leonard") );
msArtDb[11][12] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 29 - Autumn 2007 ** //
msArtDb[12] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[12][0] = new Array (pubIdxNwl, 29, 4, "Report on Marlowe Day 2007", "Roger Hards", new Array ("Marlowe Day", "Marlowe Theatre", "Marlowe Memorial", "Act of Will, An", "Hoffman, Calvin") );
msArtDb[12][1] = new Array (pubIdxNwl, 29, 7, "M. Le Doux and The Wheel of Fortune", "Isabel Gort&aacute;zar", new Array ("Doux, Monsieur Le", "Dekker, Thomas", "Fortunatus", NULLKEYWORD, NULLKEYWORD) );
msArtDb[12][2] = new Array (pubIdxNwl, 29, 12, "Come Live With Me ... and its Music", "Eileen Vasey", new Array ("Corkine, William", "Come Live With Me", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[12][3] = new Array (pubIdxNwl, 29, 22, "The Turks in The Jew of Malta &amp; Tamburlaine", "Author", new Array ("Turks", "Jew of Malta", "Tamburlaine", NULLKEYWORD, NULLKEYWORD) );
msArtDb[12][4] = new Array (pubIdxNwl, 29, 29, "Review: I am Shakespeare at Chichester", "Valerie Colin-Russ", new Array ("I am Shakespeare", "Authorship", "Rylance, Mark", NULLKEYWORD, NULLKEYWORD) );
msArtDb[12][5] = new Array (pubIdxNwl, 29, 31, "Move In With Me... (A Parody)", "Benedict", new Array ("Come Live With Me", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[12][6] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 30 - Spring 2008 ** //
msArtDb[13] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[13][0] = new Array (pubIdxNwl, 30, 4, "AGM Report 2008", "Roger Hards", new Array ("Marlowe Society AGM", "Globe Theatre", "Solti, Ildi", NULLKEYWORD, NULLKEYWORD) );
msArtDb[13][1] = new Array (pubIdxNwl, 30, 6, "Elizabethan Theatre in Cambridge", "Yvonne Adams", new Array ("Staging", "Cambridge", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[13][2] = new Array (pubIdxNwl, 30, 10, "Three Conquerors of the Early Modern Stage", "Barbara Wooding", new Array ("Tamburlaine", "Cyrus, Wars of", "Arbaces", "King and No King, A", NULLKEYWORD) );
msArtDb[13][3] = new Array (pubIdxNwl, 30, 17, "Clues About Marlowe's Sexuality", "Donna N. Murphy", new Array ("Sexuality", "Davies, John", "Epigrams", "Cobler of Canterburie, The", NULLKEYWORD) );
msArtDb[13][4] = new Array (pubIdxNwl, 30, 22, "All They That Love Not Tobacco &amp; Boies Were Fooles", "Dr. Stewart Young", new Array ("Baines, Richard", "Spelling", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[13][5] = new Array (pubIdxNwl, 30, 25, "Review: The Masscare at Paris", "Eileen Vasey", new Array ("Masscare at Paris", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[13][6] = new Array (pubIdxNwl, 30, 27, "Review: Upstart Crows", "John Grant", new Array ("Upstart Crows", "Dulwich College", "Alleyn, Edward", NULLKEYWORD, NULLKEYWORD) );
msArtDb[13][7] = new Array (pubIdxNwl, 30, 28, "Review: The Tempest", "Michael McEvoy", new Array ("Tempest, The", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[13][8] = new Array (pubIdxNwl, 30, 29, "Review: Much Ado About Nothing", "Michael McEvoy", new Array ("Much Ado About Nothing", "Hytner, Nicholas", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[13][9] = new Array (pubIdxNwl, 30, 31, "Review: Marlowe Up Close by Roberta Ballantine", "Isabel Gort&aacute;zar", new Array ("Marlowe Up Close", "Ballantine, Roberta", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[13][10] = new Array (pubIdxNwl, 30, 32, "Review: Marlowe Up Close by Roberta Ballantine", "Roger Hards", new Array ("Marlowe Up Close", "Ballantine, Roberta", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[13][11] = new Array (pubIdxNwl, 30, 33, "Review: The Lodger by Charles Nicholl", "Roger Hards", new Array ("Lodger, The", "Nicholl, Charles", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[13][12] = new Array (pubIdxNwl, 30, 34, "The Notorious Note", "Benedict", new Array ("Baines, Richard", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[13][13] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 31 - Autumn 2008 ** //
msArtDb[14] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[14][0] = new Array (pubIdxNwl, 31, 4, "Report on Marlowe Day 2008", "Roger Hards", new Array ("Marlowe Day", "Faversham", "Arden of Faversham", "Anti-Semitism", NULLKEYWORD) );
msArtDb[14][1] = new Array (pubIdxNwl, 31, 6, "Hero &amp; Leander - A Relineation", "Dr. Stewart Young", new Array ("Hero and Leander", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[14][2] = new Array (pubIdxNwl, 31, 8, "Authorship of the Continuation of Hero &amp; Leander", "Donna N. Murphy", new Array ("Hero and Leander", "Chapman, George", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[14][3] = new Array (pubIdxNwl, 31, 9, "The Deptford Jury", "Peter Farey", new Array ("Deptford", "Inquest, Coroner's", "Walsingham, Thomas", "Draper, Nicholas", NULLKEYWORD) );
msArtDb[14][4] = new Array (pubIdxNwl, 31, 13, "Review: Dido, Queen of Carthage at Kensington Palace", "Roger Hards", new Array ("Dido, Queen of Carthage", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[14][5] = new Array (pubIdxNwl, 31, 16, "Review: Tragedy of Gorboduc - Staged Reading at The Globe", "Barbara Wooding", new Array ("Gorboduc, Tragedy of", "Globe Theatre", "Read Not Dead", "Norton, Thomas", "Sackville, Thomas") );
msArtDb[14][6] = new Array (pubIdxNwl, 31, 19, "Review: Placing the Plays of Christopher Marlowe by Deats &amp; Logan", "Isabel Gort&aacute;zar", new Array ("Deats, Sara Munson", "Logan, Robert A.", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[14][7] = new Array (pubIdxNwl, 31, 21, "Review: Christopher Marlowe, Renaissance Dramatist by Lisa Hopkins", "Michael McEvoy", new Array ("Hopkins, Lisa", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[14][8] = new Array (pubIdxNwl, 31, 22, "Review: 1599 - A Year in the Life of William Shakespeare by James Shapiro", "Roger Hards", new Array ("Shapiro, James", "Shakespeare, William", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[14][9] = new Array (pubIdxNwl, 31, 24, "Review: Marlowe's Ghost by Daryl Pinksen", "Roger Hards", new Array ("Pinksen, Daryl", "Authorship", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[14][10] = new Array (pubIdxNwl, 31, 25, "A New Marlowe Theatre for Canterbury?", "Ken Pickering", new Array ("Marlowe Theatre", "Canterbury", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[14][11] = new Array (pubIdxNwl, 31, 27, "An Inspired Choice", "Michael McEvoy", new Array ("Act of Will, An", "Flowerpot Tavern", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[14][12] = new Array (pubIdxNwl, 31, 30, "More About &quot;Boies or Booze&quot;", "Roger Hards", new Array ("Baines, Richard", "Spelling", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[14][13] = new Array (NULLARTICLE, NULLARTICLE);

// ** JOURNAL 05 - ONLINE - 2008 ** //
msArtDb[15] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[15][0] = new Array (pubIdxJnl, 5, 1, "Marigolds - A Few Stray Petals", "Eileen Vasey", new Array ("Marigold", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[15][1] = new Array (pubIdxJnl, 5, 2, "Christopher Marlowe and the Golden Age of England", "Michael J. Kelly", new Array ("Humanism", "History, Theatre", "Shakespeare - Marlowe's Relationship With", "Raleigh, Sir Walter", "Nietzsche, Friedrich") );
msArtDb[15][2] = new Array (pubIdxJnl, 5, 3, "The Influences of Elizabethan Society on the Writings of Christopher Marlowe", "Jeffrey Scott", new Array ("Elizabethan Society", "Catholicism, Anti-", "Social Mobility", NULLKEYWORD, NULLKEYWORD) );
msArtDb[15][3] = new Array (pubIdxJnl, 5, 4, "Land, Law and Desire in Marlowe's Edward II", "Arvind Thomas", new Array ("Edward II", "Sodomy", "Law", NULLKEYWORD, NULLKEYWORD) );
//msArtDb[15][4] = new Array (pubIdxJnl, 5, 5, "The Profound Abysm of Sonnet 112", "Cynthia Morgan", new Array ("Authorship", "Shakespeare, William", "Sonnets", NULLKEYWORD, NULLKEYWORD) );
msArtDb[15][4] = new Array (pubIdxJnl, 5, 5, "Gorboduc", "Barbara Wooding", new Array ("Gorboduc, Tragedy of", "Sackville, Thomas", "Norton, Thomas", "Shakespeare, William", NULLKEYWORD) );
msArtDb[15][5] = new Array (NULLARTICLE, NULLARTICLE);

// ** JOURNAL 06 - ONLINE - 2009 ** //
msArtDb[16] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[16][0] = new Array (pubIdxJnl, 6, 1, "The Clue in the Shrew (Revised)", "Isabel Gort&aacute;zar", new Array ("Shakespeare, William", "Authorship", "Death, Marlowe's", "Taming of the Shrew, The", NULLKEYWORD) );
msArtDb[16][1] = new Array (pubIdxJnl, 6, 2, "A Summary of the Shakespeare Problems", "Christian Lanciai", new Array ("Shakespeare, William", "Authorship", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[16][2] = new Array (pubIdxJnl, 6, 3, "Was Robert Greene's &quot;Upstart Crow&quot; the Actor Edward Alleyn?", "Daryl Pinksen", new Array ("Greene, Robert", "Alleyn, Edward", "Groatsworth of Wit" , "Upstart Crow", "Tambercam") );
msArtDb[16][3] = new Array (pubIdxJnl, 6, 4, "The Batillus, the Player, and the Upstart Crow", "Peter Farey", new Array ("Greene, Robert", "Alleyn, Edward", "Groatsworth of Wit" , "Upstart Crow", "Faire Em") );
msArtDb[16][4] = new Array (pubIdxJnl, 6, 5, "The French Connection: New Leads on 'Monsieur Le Doux'", "Christopher Gamble", new Array ("Doux, Monsieur le", "Bacon, Anthony", "Perez, Antonio", "Buzanval, Paul Choart, Seigneur de", "Love's Labour's Lost") );
msArtDb[16][5] = new Array (pubIdxJnl, 6, 6, "The Curious Connection between Nashe, Dekker, and Freemasonry", "Donna N. Murphy", new Array ("Nashe, Thomas", "Dekker, Thomas", "Freemasonry", NULLKEYWORD, NULLKEYWORD) );
msArtDb[16][6] = new Array (pubIdxJnl, 6, 7, "Tamburlaine's Sonnets", "Isabel Gort&aacute;zar", new Array ("Tamburlaine", "Authorship", "Sonnet 37", "Sonnet 89", "Gibbon") );
//msArtDb[16][2] = new Array (pubIdxJnl, 6, 5, "The Profound Abysm of Sonnet 112", "Cynthia Morgan", new Array ("Authorship", "Shakespeare, William", "Sonnets", NULLKEYWORD, NULLKEYWORD) );
msArtDb[16][7] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 32 - Spring 2009 ** //
msArtDb[17] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[17][0] = new Array (pubIdxNwl, 32, 4, "Poets' Corner Service 2008", "Roger Hards", new Array ("Poets' Corner", "Westminster Abbey", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[17][1] = new Array (pubIdxNwl, 32, 6, "The Rose Theatre Project", "Roger Hards", new Array ("Rose Theatre", "Genius of Christopher Marlowe, The", "Film", NULLKEYWORD, NULLKEYWORD) );
msArtDb[17][2] = new Array (pubIdxNwl, 32, 7, "AGM Report 2009", "Roger Hards", new Array ("Marlowe Society AGM", "Machiavelli", "Burton, Andrew", "Mysteries of Marlowe", "Wales, Peter") );
msArtDb[17][3] = new Array (pubIdxNwl, 32, 11, "Tobacco, Booze &amp; Women - Kit Marlowe's Dangerous Living", "Isabel Gort&aacute;zar", new Array ("Baines, Richard", "Every Man Out of His Humour", "Tobacco", NULLKEYWORD, NULLKEYWORD) );
msArtDb[17][4] = new Array (pubIdxNwl, 32, 17, "Review: Guy of Warwick - A Staged Reading", "Barbara Wooding", new Array ("Guy of Warwick", "Malone Society Conference", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[17][5] = new Array (pubIdxNwl, 32, 20, "Review: The Reckoning of Kit &amp; Little Boots", "Andrew Fingland", new Array ("Cassidy, Nat", "Gallery Theatre Players", "Caligula", NULLKEYWORD, NULLKEYWORD) );
msArtDb[17][6] = new Array (pubIdxNwl, 32, 22, "Review: Dido, Queen of Carthage at The National Theatre", "Michael McEvoy", new Array ("Dido, Queen of Carthage", "McDonald, James", "Hille, Anastasia", "Bonnar, Mark", NULLKEYWORD) );
msArtDb[17][7] = new Array (pubIdxNwl, 32, 24, "Review: Faust by E.A.Bucchianeri", "Roger Hards", new Array ("Doctor Faustus", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[17][8] = new Array (pubIdxNwl, 32, 25, "Ten Days to Live", "Mike Frohnsdorff", new Array ("Death, Marlowe's", "Burghley, Lord", "Whitgift, Archbishop John", NULLKEYWORD, NULLKEYWORD) );
msArtDb[17][9] = new Array (pubIdxNwl, 32, 3, "Artistic Licence and Textual Authority", "Barbara Wooding", new Array ("Globe Education", "Contention, The First Part of", "Cade, Jack", "Textual Variants", NULLKEYWORD) );
msArtDb[17][10] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 33 - Autumn 2009 ** //
msArtDb[18] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[18][0] = new Array (pubIdxNwl, 33, 4, "Marlowe's Blank Verse: His Mighty Line", "Mike Frohnsdorff", new Array ("Verse, Dramatic Blank", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][1] = new Array (pubIdxNwl, 33, 6, "Doubt About Will?", "Roger Hards", new Array ("Authorship", "Shakespeare Authorship Coalition", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][2] = new Array (pubIdxNwl, 33, 7, "Divine Musaeus", "Barbara Wooding", new Array ("Hero and Leander", "Read Not Dead", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][3] = new Array (pubIdxNwl, 33, 9, "Stratfordian Straws", "Isabel Gort&aacute;zar", new Array ("Authorship", "Nichols, John", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][4] = new Array (pubIdxNwl, 33, 13, "Elizabethan Mysteries at Anglesey Abbey", "Mike Frohnsdorff", new Array ("Anglesey Abbey", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][5] = new Array (pubIdxNwl, 33, 15, "Report on Marlowe Day 2009", "Roger Hards", new Array ("Marlowe Day", "Lyly, John", "Arden of Faversham", "Death, Marlowe's", NULLKEYWORD) );
msArtDb[18][6] = new Array (pubIdxNwl, 33, 18, "Review: Shakespeare's Wife by Germaine Greer", "Roger Hards", new Array ("Greer, Germaine", "Shakespeare's Wife", "Hathaway, Anne", NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][7] = new Array (pubIdxNwl, 33, 19, "Review: The Cartographic Imagination by D.K.Smith", "Roger Hards", new Array ("Smith, D.K.", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][8] = new Array (pubIdxNwl, 33, 19, "Review: The Nine Lives of Christopher Marlowe by Jennifer Margrave", "Roger Hards", new Array ("Margrave, Jennifer", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][9] = new Array (pubIdxNwl, 33, 20, "The George Inn, Borough High St", "Roger Hards", new Array ("George Inn, The", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][10] = new Array (pubIdxNwl, 33, 21, "ALS AGM 2009", "Claire Naylor", new Array ("Alliance of Literary Societies", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][11] = new Array (pubIdxNwl, 33, 25, "Marlowe's Works", "Mike Frohnsdorff", new Array ("Works, Marlowe's", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][12] = new Array (pubIdxNwl, 33, 27, "NOSBI for Short", "Benedict", new Array ("Jew of Malta", "Barabas", "Machiavel", NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][13] = new Array (pubIdxNwl, 33, 29, "Disappeared, Rumoured Dead", "Roger Hards", new Array ("Death, Marlowe's", "Inquest, Coroner's", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[18][14] = new Array (NULLARTICLE, NULLARTICLE);

// ** JOURNAL 07 - ONLINE - 2010 ** //
msArtDb[19] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[19][0] = new Array (pubIdxJnl, 7, 1, "A New Interpretation of Sonnet 112", "Cynthia Morgan", new Array ("Authorship", "Shakespeare, William", "Sonnet 112", "Death, Marlowe's", NULLKEYWORD) );
msArtDb[19][1] = new Array (pubIdxJnl, 7, 2, "&quot;Quod me Nutrit me Destruit&quot; - Relationships in Marlowe's Dido, Queen of Carthage", "Philip Ford", new Array ("Dido, Queen of Carthage", "Quod me Nutrit me Destruit", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[19][2] = new Array (pubIdxJnl, 7, 3, "Evidence that Marlowe was Gregorio", "Prof. Robert U. Ayres", new Array ("Monti, Gregorio de", "Authorship", "Death, Marlowe's", NULLKEYWORD, NULLKEYWORD) );
msArtDb[19][3] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 34 - Spring 2010 ** //
msArtDb[20] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[20][0] = new Array (pubIdxNwl, 34, 4, "AGM Report 2010", "Roger Hards", new Array ("Marlowe Society AGM", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[20][1] = new Array (pubIdxNwl, 34, 8, "Dangerous Marlowe", "Mike Frohnsdorff", new Array ("Marlowe Society AGM", "Honan, Park", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[20][2] = new Array (pubIdxNwl, 34, 10, "Studying Doctor Faustus", "Barbara Wooding", new Array ("Doctor Faustus", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[20][3] = new Array (pubIdxNwl, 34, 14, "The Curious History of the Chancel in Trinity Church, Stratford", "Isabel Gort&aacute;zar", new Array ("Shakespeare, William", "Authorship", "Stratford Monument", NULLKEYWORD, NULLKEYWORD) );
msArtDb[20][4] = new Array (pubIdxNwl, 34, 17, "Fulke Greville, Lord Brooke (1554-1628) - Another Authorship Controversy?", "Mike Frohnsdorff", new Array ("Greville, Fulke", "Brooke, Lord", "Warwick", "Authorship", NULLKEYWORD) );
msArtDb[20][5] = new Array (pubIdxNwl, 34, 24, "Review: Doctor Faustus at the Greenwich Theatre", "Barbara Wooding", new Array ("Doctor Faustus", "Stage on Screen", "Treloar, Tim", "Kennerley, Gareth", NULLKEYWORD) );
msArtDb[20][6] = new Array (pubIdxNwl, 34, 27, "An 'Upstart Crow' and an 'Upstart Portrait'", "Andrew Fingland", new Array ("Upstart Crow", "Alleyn, Edward", "Shakespeare, William", "Sanders, John", NULLKEYWORD) );
msArtDb[20][7] = new Array (pubIdxNwl, 34, 29, "Shakespeare's Final Play", "Christian Lanciai", new Array ("Shakespeare, William", "Fletcher, John", "Two Noble Kinsmen, The", NULLKEYWORD, NULLKEYWORD) );
msArtDb[20][8] = new Array (NULLARTICLE, NULLARTICLE);

// ** NEWSLETTER 35 - Autumn 2010 ** //
msArtDb[21] = new Array (MAXNUMARTICLESPERISSUE);
msArtDb[21][0] = new Array (pubIdxNwl, 35, 1, "Title", "Roger Hards", new Array ("Keyword1", NULLKEYWORD, NULLKEYWORD, NULLKEYWORD, NULLKEYWORD) );
msArtDb[21][1] = new Array (NULLARTICLE, NULLARTICLE);


// ---------------- //
// ** Functions ** //
// --------------- //

var CHARNOTFOUND = -1;
var NOTMATCHED = -1;

/* Array for Retrieving and sorting articles */
var selectedArticles = new Array();
var numSelectedArticles = 0;

// QueryName for Letter parameter
var ltrQueryName = "ltr";
var ALLLTRSQUERYVALUE = "all";
var ALLLETTERSCHAR = "*";
var XLSTSEARCHALLPARAM = "";
var DEFAULTLETTER = "a";

// QueryName for Filter Field parameter
var fldQueryName = "fld";
var NULLFLDQUERYTXT = "";

// ** Following is for Article Index, most of which not used at the moment //
// Search criteria //
var SEARCHBYTITLE = 0;
var SEARCHBYKEYWORD = 1;
var DEFAULTSEARCHTYPE = SEARCHBYKEYWORD;
var firstSrchTy = SEARCHBYTITLE;
var lastSrchTy = SEARCHBYKEYWORD;
var srchTypeText = new Array("Article Titles", "Key Words");
var srchTypeValues = new Array("cscSrchTyTitle", "cscSrchTyKey");
// Initial/Default Search Type is by Key Word
var currentSearchType = DEFAULTSEARCHTYPE;

// Output Mode - Normal or Generate HTML Markup 
var MODENORMAL=0;
var MODEGENMARKUP=1;
var articleOutputMode = MODENORMAL;
var startTagChar = new Array("<", "&lt;");


//----------------//

// URL String functions

function getQueryParamValue (stringURL, queryName, defaultParamValue)
{
  // If don't find query string, then there is none, so return default value specified
  var paramValue = "" + defaultParamValue;
  // Locate query string in URL
  var idxQuestionMark= stringURL.lastIndexOf('?');
  var queryNameLength=queryName.length;
  var idxStartChar = stringURL.indexOf('?' + queryName +'=');
  if (idxStartChar == CHARNOTFOUND) {
	// Didn't find query string starting with '?' so look for a '&'
	idxStartChar = stringURL.indexOf ('&' + queryName +'=');
  }
  // If found query string, strip out parameter value following '='
  if (idxStartChar != CHARNOTFOUND) {
	idxStartChar = idxStartChar + queryNameLength + 2;
	// See if there is further query string appended
	var idxEndChar = stringURL.indexOf ('&', idxStartChar);
	// Otherwise end is end of string
	if (idxEndChar == CHARNOTFOUND) {
		idxEndChar = stringURL.length;
	}  
	paramValue = stringURL.slice (idxStartChar, idxEndChar) ;
  }
  // Return parameter value, either the one stripped out, or the supplied default
  return paramValue;
}

function getCoreURL (stringURL)
{
  // Function to strip any query strings off a URL
  // If there aren't any query strings, then supplied URL does not need amending 
  var coreURL = "" + stringURL;
  // Locate query string in URL
  var idxQuestionMark= stringURL.lastIndexOf('?');
  if (idxQuestionMark != CHARNOTFOUND) {
	// Return URL up until '?'
	coreURL = stringURL.slice (0, idxQuestionMark) ;
  }
  return coreURL;
}

function getQueryValuesForThisPage ()
{
	// Following script determines the currently selected letter and field by
	// extracting the Query Parameter values from the current URL string, e.g.
    //   http://www.marlowe-society.org/marsoclib/mslibcatalog.html?ltr=c&fld=1
	var currentURL = "" + location.href;
	// Extract selected letter 
    var ltr = getQueryParamValue (currentURL, ltrQueryName, DEFAULTLETTER);
	// Will handle special case of ltr=all
	if (ltr==ALLLTRSQUERYVALUE) ltr = ALLLETTERSCHAR;
	// Extract selected field, if present 
    var fld = getQueryParamValue (currentURL, fldQueryName, DEFAULTCATSEARCHTYPE);
	// Store the latest selections in global params
	gblCatCurrQueryLtr = ltr;
	gblCatCurrQueryFld = fld;
	//document.writeln("<p>Params=[" + gblCatCurrQueryLtr + "][" + gblCatCurrQueryFld + "]</p>");

	// return currently selected letter
	return (ltr);
}

//----------------//

// Draw a list of list letter button links with currently selected button disabled

function drawFullLetterLinks (selectedChar, fldQueryTxt) {
	// The alphabetic letter links are laid out as an unordered list:
	//       <ul>
	//         <li><a href="<currentURL>?ltr=all<fldQueryTxt>">*</a></li>
	//         <li><a href="<currentURL>?ltr=a<fldQueryTxt>">A</a></li>
	//         <li><a href="<currentURL>?ltr=b<fldQueryTxt>">B</a></li>
	//         <li>C</li>
	//         etc. Current letter provides no link, as shown by C above
	//		   <fldQueryTxt> is e.g. &fld=1 or may be null string
	//       </ul>

	var coreURL = getCoreURL(location.href);
	document.write ('<ul>');
	
	// First draw the all-letters option
	document.write ('<li>');
	if (selectedChar!=ALLLETTERSCHAR) document.write ('<a href="' + coreURL + '?' + ltrQueryName + '=' + ALLLTRSQUERYVALUE + fldQueryTxt +'">');
	document.write (ALLLETTERSCHAR);
	if (selectedChar!=ALLLETTERSCHAR) document.write ('</a>');
	document.write ('</li>');
	
	// Then all the remaining letters
	var letter = "a";
	var letterCode = 0;
	for (letterCode="a".charCodeAt(0); letterCode<="z".charCodeAt(0); letterCode++) {
		letter = String.fromCharCode(letterCode);
		document.write ('<li>');
		var isThisChar = (letter == selectedChar.toLowerCase());
		if (!isThisChar) {
			document.write ('<a href="' + coreURL + 
							'?' + ltrQueryName + '=' + letter + 
							fldQueryTxt +'">');
		}
		document.write (letter.toUpperCase());
		if (!isThisChar) {
			document.write ('</a>');
		}
		document.write ('</li>');
	}
	document.write ('</ul>');
}

function drawLetterLinks (selectedChar) {
	// Draw letter links without any field query e.g. for article index
	drawFullLetterLinks (selectedChar, NULLFLDQUERYTXT);
}

//----------------//

// ** XML LIBRARY CATALOGUE LOAD, XSLT TRANSFORM AND DISPLAY ** //

// Catalogue data and transformation documents in the cat sub-folder //
var relLibCatPath = "./cat/"
var fullLibCatPath = "http://www.marlowe-society.org/marsoclib/cat/"
var locaLibCatPath = "C:/Abbo/webprojects/marsoc/marlowesociety/marsoclib/"
var libCatPath = relLibCatPath;
var htmlLibCatFile = "mslibcattable.html";
var fullLibCatHtmlPage = "msfullcatalog.html";
var xmlLibCatDoc = "mslibcatalog.xml";
var xslLibCatDoc = "catalogtoweblist.xsl";
var htmlLibCatURL = locaLibCatPath + htmlLibCatFile;
var xmlLibCatURL = libCatPath + xmlLibCatDoc;
var xslLibCatURL = libCatPath + xslLibCatDoc;


// **** Function to load, transform and render data in an XML document

function loadXmlDocAndTransform (xmlURL, xslURL, p1name, p1value, p2name, p2value) {	
	var xmlDoc;
	var xslDoc;
	var xslt;
	var xslProc;
	var xmlBrowser = true;
	
	// Create the XML and XSLT document objects

	// For IE browsers use Msxml2 - not supporting old IE5 XMLDOM
	if (window.ActiveXObject) {
        xmlDoc = new ActiveXObject("Msxml2.DomDocument");
		xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
	}
	// For Mozilla based (standards compliant) browsers, including Opera:
	else if (document.implementation && document.implementation.createDocument) {
    	xmlDoc = document.implementation.createDocument("","doc",null);
    	xslDoc = document.implementation.createDocument("","doc",null);
	}
	else {
		xmlBrowser = false;
	}

	if (xmlBrowser) {
		
		// Load XML document
		xmlDoc.async = false;
		xmlDoc.resolveExternals = false;
		try {
			xmlDoc.load(xmlURL);
		}
		catch(e) {
			throw new MarSocException(MSX_XMLLOADFAIL, MSX_MSG_NOCATSORTING, "Loading the Library Catalogue XML document at " + xmlURL + " failed. Either it could not be loaded or it failed to validate as XML.");
		}

		// Load XLST document
		xslDoc.async = false;
		xslDoc.resolveExternals = false;
		try {
			xslDoc.load(xslURL);
		}
		catch(e) {
			throw new MarSocException(MSX_XMLLOADFAIL, MSX_MSG_NOCATSORTING, "Loading the Library Catalogue XSLT document at " + xslURL + " failed. Either it could not be loaded or it failed to validate as XML.");
		}

		// For IE browsers use Msxml2 - not supporting old IE5 XMLDOM
		if (window.ActiveXObject) {
			xslt = new ActiveXObject("Msxml2.XSLTemplate");
			xslt.stylesheet = xslDoc;
			// Set up XSLT Processor to process input XML document
			xslProc = xslt.createProcessor();
			xslProc.input = xmlDoc;
			// Add two supplied XLS parameters: 
			xslProc.addParameter(p1name, p1value); 
			xslProc.addParameter(p2name, p2value); 
			// Transform XML document into HTML table using XLST
			xslProc.transform();
			// Render resulting HTML fragment
			//document.write(xslProc.output);
			var catalogelt = document.getElementById("libcatalogpanel");
			catalogelt.innerHTML = xslProc.output;
		}
		
		// For Mozilla based (standards compliant) browsers:
		else if (document.implementation && document.implementation.createDocument) {
			// Set up XLST processor to process input XML document
 		   	xsltProc = new XSLTProcessor();
			xsltProc.importStylesheet(xslDoc);
			// Add two supplied XLS parameters: 
			xsltProc.setParameter(null, p1name, p1value);
			xsltProc.setParameter(null, p2name, p2value);
			// Transform XML document into HTML table using XLST
			var frag = xsltProc.transformToFragment(xmlDoc, document);
			// Render resulting HTML fragment
			var serializer = new XMLSerializer();
			xsltOutputDoc = serializer.serializeToString(frag);
			//document.write(xsltOutputDoc); 
			var catalogelt = document.getElementById("libcatalogpanel");
			catalogelt.innerHTML = xsltOutputDoc;
		}
	}
	else {
		// Browser does not support the required XML processing
		//document.write("<p>Unable to display XML output using this browser.</p>");
		throw new MarSocException(MSX_NONXMLBROWSER, MSX_MSG_NOCATSORTING, "Browser does not support XSLT transformations of XML to form HTML elements:<br />UserAgent:" + navigator.userAgent + "<br />Vendor:" + navigator.vendor + "<br />App Name:" + navigator.appName + "<br />Version:" + navigator.appVersion);
		// Other debug values of potential interest:
		//document.write("[window.ActiveXObject="+window.ActiveXObject+"]<br />");
		//document.write("[typeof XSLTProcessor = " + typeof XSLTProcessor + "]<br />");
		//document.write("[document.implementation="+document.implementation+"]<br />");
		//document.write("[document.implementation.createDocument=" + document.implementation.createDocument+"]<br />");
		//document.write("[document.implementation.hasFeature=" + document.implementation.hasFeature+"]<br />");
	}
}

function genFileIECatTableHtmlFromXml (xmlURL, xslURL, p1name, p1value, p2name, p2value, outfilename) {	
	// This writes HTML output to file.
	// Must be run in IE6 or later.
	var xmlDoc;
	var xslDoc;
	var xslt;
	var xslProc;
	// Create the XML and XSLT document objects
    xmlDoc = new ActiveXObject("Msxml2.DomDocument");
	xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
	// Load XML document
	xmlDoc.async = false;
	xmlDoc.resolveExternals = false;
	xmlDoc.load(xmlURL);
	// Load XLST document
	xslDoc.async = false;
	xslDoc.resolveExternals = false;
	xslDoc.load(xslURL);
	xslt = new ActiveXObject("Msxml2.XSLTemplate");
	xslt.stylesheet = xslDoc;
	// Set up XSLT Processor to process input XML document
	xslProc = xslt.createProcessor();
	xslProc.input = xmlDoc;
	// Add two supplied XLS parameters: 
	xslProc.addParameter(p1name, p1value); 
	xslProc.addParameter(p2name, p2value); 
	// Transform XML document into HTML table using XLST
	xslProc.transform();
	// Write HTML fragment to output file
	var fout = new ActiveXObject("Scripting.FileSystemObject");
	var file = fout.CreateTextFile(outfilename,1);
	file.write(xslProc.output);
	file.close();
}

function LoadCatalogFromIframe (introText) {
	// This routine displays the HTML table (stored in the HTML snippet file)
	// defining the full MarSoc Library Catalogue, sorted alphabetically be author.
	// The HTML snippet file is created locally (as part of development) using
	// mslib_gencattablefile.html which calls genFullLibCatalogueFromXml, which
	// calls genFileIECatTableHtmlFromXml to generate the HTML data.
	// To enable this to work in as many browsers as possible, this function 
	// accesses the HTML contents of the file via a somewhat circuitous route:
	// - a hidden iFrame (id=libcatalogiframe) is used to load the contents of
	//   the file which contains the HTML snippet into the document,
	// - DOM methods are then used to extract the HTML table element,
	// - and copy it to the libcatalogpanel DIV for display
	// Simply opening a file to read the contents has all sorts of browser 
	// compatibility problems which makes such an approach unusable.
	//
	// This function can thus be used when it is not possible to process the XML with 
	// XSLT (e.g. Safari browser does not support), or an error is encountered 
	// (e.g an exception is raised in Opera trying to load the XML file). 
	// This function thus provides an alternative method for at least displaying 
	// the full catalogue, albeit without the sort/filter facilities.
	
	// Prefix catalog table with intro para. This is a warning since we only do 
	// this if we haven't been able to do the XML/XSLT stuff.
	var introPara = "";
	if (introText != "") introPara = "<p class='warning'>" + introText + "</p>";
	
	// Extract the HTML table element from the hidden iFrame:
	// 1. Identify the hidden iFrame element object in the document
	var catFrame = document.getElementById('libcatalogiframe');
	// 2. Extract the contents of this object into a document, taking
	//    account of whether we are IE (contentWindow) or other (contentDocument)
	var catDocObj = (catFrame.contentWindow || catFrame.contentDocument);
	// 3. And this for Safari...
	if (catDocObj.document) catDocObj = catDocObj.document;
	var catTableEltByTagName = catDocObj.getElementsByTagName("tr");
	// 4. Extract table (id=catalogtable) from iframe doc - parentNode means
	//    we include the table tag as well as inner nodes
	var catTableElt = catDocObj.getElementById("catalogtable").parentNode;
	// 5. Identify the libcatalogpanel DIV where we want to display catalog
	var catalogelt = document.getElementById("libcatalogpanel");
	// 6. Copy across HTML table element containing catalog data
	catalogelt.innerHTML = introPara + catTableElt.innerHTML;
}

function redirectToFullCat () {
		window.location = fullLibCatHtmlPage;
}

function drawFullCatByAuthorHtml (introText) {
	try {
		LoadCatalogFromIframe (introText);
	}
	catch (e) {
		// We have failed to load the HTML via the iFrame.
		// Note this seems to happen in Safari as iFrame will not load until all
		// javascript has executed. Can't seem to resolve at the moment.
		// As a last resort, just redirect to the simple full catalogue page.
		redirectToFullCat();
	}
}

function drawLibCatalogueFromXml () {
	// Set up parameters for XSLT
	// 1. Selected Letter (when 'all', set to empty string to retrieve all records)
	// 2. Selected Field
	var selectedLtr = gblCatCurrQueryLtr;
	if (selectedLtr==ALLLETTERSCHAR) selectedLtr = XLSTSEARCHALLPARAM;
	// Pass in the FieldValue string rather than index
	var selectedFldValue = catSrchFieldOptions[gblCatCurrQueryFld];

	// Call function to load, transform and render XML with specific 
	// XML, XSL and XSL parameters' names and values for Library Catalogue data
	try
	{
		// Opera just seems to hang: redirect until can resolve
		if (is_opera) {
			redirectToFullCat();
		}
		else {
			loadXmlDocAndTransform (xmlLibCatURL, xslLibCatURL, "ltrfilter", selectedLtr, "fieldfilter", selectedFldValue);
		}
	}
	catch(e)
	{
		// An error has occurred trying to load / tranform XML catalogue
		// Warn user that cannot use search criteria and just draw full table as plain HTML
		// document.write ("<p class='warning'>" + e.toString() + "</p>");
		// Debug: WriteFullMarSocException (e);
		//drawFullCatByAuthorHtml (e.toString());
		
		// In fact, just redirect to full catalogue list page
		redirectToFullCat();
	}
}

// ** Version to generate full alternate HTML table catalog in output file for noscript case etc ** //
// ** CAN ONLY BE RUN LOCALLY TO GENERATE FILE ** //
// Instructions:
// 1. Open mslib_gencattablefile.html locally in IE browser
// 2. Confirm that ActiveXControl can run to create local file
// 3. Any errors will be reported in browser window, otherwise:
// 4. Creates HTML source in:
//    C:/Abbo/webprojects/marsoc/marlowesociety/marsoclib/mslibcattable.html 
//    As a test that file is then opened and contents displayed on the gen broser
//    page via a call to drawFullCatByAuthorHtml.
// 5. Tidy up the raw source text as follows:
//    - Globally replace ' with &#39;
//    - Repeat for Word's curly apostrophes
//    - Replace <br> with <br /> (these get in even though XSLT specifies <br />!!!
// 6. This source file should be uploaded to website as it is potentially accessed by
//    drawFullCatByAuthorHtml when browser does not support XML/XSLT processing.
// 7. Cut any paste the HTML source to MsLibCatFullTable.lbi
function genFullLibCatalogueFromXml () {
	var selectedLtr = XLSTSEARCHALLPARAM;
	var selectedFldValue = catSrchFieldOptions[DEFAULTCATSEARCHTYPE];
	document.write ("<p class='clearimageabove'>Writing HTML Library catalogue table to: " + htmlLibCatURL + "...</p>");
	try
	{
		genFileIECatTableHtmlFromXml (xmlLibCatURL, xslLibCatURL, "ltrfilter", selectedLtr, "fieldfilter", selectedFldValue, htmlLibCatURL);
	}
	catch(e)
	{
		document.write ("<p class='warning'>" + e.toString() + "</p>");
		WriteFullMarSocException (e);
	}
}

//----------------//

// **** Catalogue Search Selection **** //

// Catalogue Index: Field to order on //
var CATSEARCHBYCATNO = 0;
var CATSEARCHBYTITLE = 1;
var CATSEARCHBYAUTHOR = 2;
//var CATSEARCHBYISBN = 2;
var CATSEARCHBYPUBLISHER = 3;
var CATSEARCHBYPUBDATE = 4;
var CATSEARCHBYDONOR = 5;
var CATSEARCHBYKEYWORD = 6;
var DEFAULTCATSEARCHTYPE = CATSEARCHBYAUTHOR;
var firstCatSrchTy = CATSEARCHBYCATNO;
var lastCatSrchTy = CATSEARCHBYKEYWORD;
var catSrchFieldOptions = new Array("Catalogue No", "Title", "Author", "Publisher", "Publication Date", "Donor", "Keyword");

// Global variables holding current selections for Library Catalogue
var gblCatCurrQueryLtr = "";
var gblCatCurrQueryFld = DEFAULTCATSEARCHTYPE;

function drawLibCatalogLetterLinks () {
	// Draw letter links with current field query appended
	var fldQuery = "&" + fldQueryName + "=" + gblCatCurrQueryFld;
	drawFullLetterLinks (gblCatCurrQueryLtr, fldQuery);
}

function drawCatalogSearchTypeSelect () {
	// Draw the drop-down menu with current Field type initially selected
	document.write('<select name="catSearchType">');
	for (i=firstCatSrchTy; i<=lastCatSrchTy; i++) {
		document.write('<option value="' + catSrchFieldOptions[i] + '"');
		if (i==gblCatCurrQueryFld) document.write(' selected="selected"');
		document.write('>' + catSrchFieldOptions[i] + '</option>');
	}
	document.write('</select>');
	// Draw the Go button, which triggers refreshCatalogPage if clicked
	document.write ('<input type="button" class="msformbutton" value=" Go " onClick="refreshCatalogPage();" />');
	drawLibCatHelpButton();
}

function drawLibCatHelpButton () {
		document.write ('<input type="button" class="msformbutton" value="Help" onClick="popUp(&quot;help_libcatalog.html&quot;,700,500,25,25,1);"/>');
}

function getSelectedCatSearchFieldIdx () {
	// Following shows how to get selected menu option index and text
	//var selIdx = document.catSearchCritForm.catSearchType.selectedIndex;
	//var selVal = document.catSearchCritForm.catSearchType.options[selIdx].value;
	return (document.catSearchCritForm.catSearchType.selectedIndex);
}

// NOT needed so far
// function getCatSearchFieldIdxFromValue (fldValue) {
// 	var srchFieldIdx = DEFAULTCATSEARCHTYPE;
// 	// Search for supplied Field string and return index
// 	for (i=firstCatSrchTy; i<=lastCatSrchTy; i++) {
// 		if (fldValue==catSrchFieldOptions[i]) srchFieldIdx=i;
// 	}
// 	return (srchFieldIdx);
// }

function refreshCatalogPage () {
	// Get index of newly selected field
	gblCatCurrQueryFld = getSelectedCatSearchFieldIdx ();
	// Handle selected letter = all
	var selectedLtr = gblCatCurrQueryLtr;
	if (selectedLtr==ALLLETTERSCHAR) selectedLtr=ALLLTRSQUERYVALUE;

	// Construct new URL using current letter and newly selected field
	var coreURL = "" + getCoreURL(location.href);
	var newURL = coreURL + "?" + ltrQueryName + "=" + selectedLtr +
		"&" + fldQueryName + "=" + gblCatCurrQueryFld;
	// Display the page applying new selection
	window.location.href = newURL;
}

//----------------//

function titleSortFn(a,b) {
	// This function enables the sort to execute on the title column of the array
	// Note that each thing we are passed is an array, so we don't compare the things
	// we're passed; instead, we compare their second column
	if (a[aidxTitle]<b[aidxTitle]) return -1;
	if (a[aidxTitle]>b[aidxTitle]) return 1;
	return 0;
}

function keywordSortFn(a,b) {
	// This function enables the sort to execute on the title column of the array
	// Note that each thing we are passed is an array, so we don't compare the things
	// we're passed; instead, we compare their second column
	if (a[aidxKeyWds]<b[aidxKeyWds]) return -1;
	if (a[aidxKeyWds]>b[aidxKeyWds]) return 1;
	if ((a[aidxKeyWds]==b[aidxKeyWds]) && (a[aidxPubNo]<b[aidxPubNo])) return -1;
	if ((a[aidxKeyWds]==b[aidxKeyWds]) && (a[aidxPubNo]>b[aidxPubNo])) return 1;
	return 0;
}

//----------------//

function searchMatch (article, selectedLetter, searchType) {
	var stringToMatch = "";
	var firstLtr = 'A';
	var lcSelLtr = selectedLetter.charAt(0).toLowerCase();
	var idxKey;
	var matchKey = NOTMATCHED;
	var finished = false;

	if (searchType==SEARCHBYTITLE) {
		stringToMatch=article[aidxTitle];
		firstLtr = stringToMatch.charAt(0).toLowerCase();
		if (firstLtr==lcSelLtr) {
			// For a title match, just display the first key word
			matchKey=0;
		}
	}

	if (searchType==SEARCHBYKEYWORD) {
		idxKey=0;
		while (!finished) {
			if (article[aidxKeyWds][idxKey]==NULLKEYWORD) {
				finished=true;
			}
			else {
				stringToMatch=article[aidxKeyWds][idxKey];
				firstLtr = stringToMatch.charAt(0).toLowerCase();
				if (firstLtr==lcSelLtr) {
					matchKey=idxKey;
					// Only search for first matching key word
					finished=true;
				}
				else {
					idxKey++;
					finished=(idxKey==MAXNUMKEYWORDS);
				}
			}
			
		}
	}
	return (matchKey);
}

function findNextArtKeyword (article, startIdxKey, selectedLetter) {
	var stringToMatch = "";
	var firstLtr = 'A';
	var lcSelLtr = selectedLetter.charAt(0).toLowerCase();
	var idxKey = startIdxKey;
	var matchKey = NOTMATCHED;
	var finished = (startIdxKey>=MAXNUMKEYWORDS);

	// Search for next Keyword in Article starting with same Letter
	while (!finished) {
		if (article[aidxKeyWds][idxKey]==NULLKEYWORD) {
			finished=true;
		}
		else {
			stringToMatch=article[aidxKeyWds][idxKey];
			firstLtr = stringToMatch.charAt(0).toLowerCase();
			if (firstLtr==lcSelLtr) {
				matchKey=idxKey;
				// Only searching for next matching key word
				finished=true;
			}
			else {
				idxKey++;
				finished=(idxKey==MAXNUMKEYWORDS);
			}
		}
			
	}
	return (matchKey);
}

function addArticleToList (d, a, k) {
	numSelectedArticles++;
	selectedArticles[numSelectedArticles-1] = new Array (msArtDb[d][a][aidxPubType], msArtDb[d][a][aidxPubNo], msArtDb[d][a][aidxPgNo], msArtDb[d][a][aidxTitle], msArtDb[d][a][aidxAuthor], msArtDb[d][a][aidxKeyWds][k]);
}

function retrieveArticleList (selectedLetter, searchType) {
	var doc=0;
	var art=0;
	var readallarticles = false;
	var idxKey, nextIdxKey;
	var firstLtr, lastLtr, ltr;
	numSelectedArticles=0;
	
	if (selectedLetter==ALLLETTERSCHAR) {
		firstLtr = "a";
		lastLtr = "z";
	}
	else {
		firstLtr = selectedLetter;
		lastLtr = selectedLetter;
	}
		
	var letterCode = 0;
	for (letterCode=firstLtr.charCodeAt(0); letterCode<=lastLtr.charCodeAt(0); letterCode++) {
		ltr = String.fromCharCode(letterCode);
		// Search through all pub articles for items beginning with this letter
		for (doc=0; doc<numPubIssues; doc++) {
			art=0;
			readallarticles = false;
			while (!readallarticles) {
				idxKey = searchMatch(msArtDb[doc][art], ltr, searchType);
				if (idxKey != NOTMATCHED) {
					// Matches start letter so add article to retrieved list
					addArticleToList (doc, art, idxKey);

					// For Keywords, add duplicate entries for each keyword beginning with selected letter //
					if (searchType==SEARCHBYKEYWORD) {
						while (idxKey != NOTMATCHED) {
							nextIdxKey=idxKey+1;
							idxKey = findNextArtKeyword (msArtDb[doc][art], nextIdxKey, ltr);
							if (idxKey != NOTMATCHED) addArticleToList (doc, art, idxKey);
						}
					}
				}
				if ((art+1)==MAXNUMARTICLESPERISSUE) {
					readallarticles=true;
				}
				else {
					art++;
					readallarticles=(msArtDb[doc][art][aidxPubType]== NULLARTICLE);
				}
			}
		}
	}
	// Sort Selected Articles array by appropriate field
	if (searchType==SEARCHBYTITLE) {
		selectedArticles.sort(titleSortFn);
	}
	if (searchType==SEARCHBYKEYWORD) {
		selectedArticles.sort(keywordSortFn);
	}
}

//----------------//

function writeArticleDetails (article) {
	document.write(startTagChar[articleOutputMode]+'tr>');
	document.write(startTagChar[articleOutputMode]+'td class="colkeyword">' + article[aidxKeyWds].toUpperCase() + startTagChar[articleOutputMode] + '/td>');
	document.write(startTagChar[articleOutputMode]+'td class="coltitle">' + article[aidxTitle] + startTagChar[articleOutputMode] + '/td>');
	document.write(startTagChar[articleOutputMode]+'td class="colauthor">' + article[aidxAuthor] + startTagChar[articleOutputMode] + '/td>');
	// The issue details provide a link to the relevant publication's contents list
	document.write(startTagChar[articleOutputMode]+'td class="colissue">');
	document.write(startTagChar[articleOutputMode]+'a href="' + relHomeLink + '/pubs/' + pubSubDirString[article[aidxPubType]] + '/');
	document.write(pubFilenameString[article[aidxPubType]] + genPubNumString(article[aidxPubNo]) + '.html">');
	document.write(pubString[article[aidxPubType]] + ' ' + article[aidxPubNo] + startTagChar[articleOutputMode] + '/a>');
	document.write(startTagChar[articleOutputMode]+'/td>');
	document.write(startTagChar[articleOutputMode]+'td class="colpage">' + article[aidxPgNo] + startTagChar[articleOutputMode] + '/td>');
	document.writeln(startTagChar[articleOutputMode]+'/tr>');
}

//----------------//

function writeSelectedArticleList (selectedLetter, searchType) {
	var art = 0;
	var srchResultsSummaryStr = 'Articles Found [' + numSelectedArticles + ']: ' + 
		srchTypeText[searchType] + ' beginning with {' + selectedLetter.charAt(0).toUpperCase() + '}';

	if (numSelectedArticles>0) {

		// List the retrieved articles in a table
		document.write(startTagChar[articleOutputMode]+'table id="catalogtable" cellspacing="0" summary="Index of Articles: ');
		document.write(srchTypeText[searchType]+' ');
		document.writeln('beginning with ' + selectedLetter.charAt(0).toUpperCase() + '">');

		// Table caption summarises results of search
		document.write(startTagChar[articleOutputMode]+'caption>' + srchResultsSummaryStr + startTagChar[articleOutputMode]+'/caption>');

		// Write table column headings
		document.write(startTagChar[articleOutputMode]+'tr>');
		document.write(startTagChar[articleOutputMode]+'th class="colkeyword" scope="col">Key Word'+startTagChar[articleOutputMode]+'/th>');
		document.write(startTagChar[articleOutputMode]+'th class="coltitle" scope="col">Article Title'+startTagChar[articleOutputMode]+'/th>');
		document.write(startTagChar[articleOutputMode]+'th class="colauthor" scope="col">Author'+startTagChar[articleOutputMode]+'/th>');
		document.write(startTagChar[articleOutputMode]+'th class="colissue" scope="col">Issue'+startTagChar[articleOutputMode]+'/th>');
		document.write(startTagChar[articleOutputMode]+'th class="colpage" scope="col">Pg'+startTagChar[articleOutputMode]+'/th>');
		document.writeln(startTagChar[articleOutputMode]+'/tr>');

		// Write details of each matching article
		for (art=0; art<numSelectedArticles; art++) {
			writeArticleDetails (selectedArticles[art]);
		}

		document.writeln(startTagChar[articleOutputMode]+'/table>');
	}
	else {
		// Report no articles found
		document.write('<p class="searchresultssummary">' + srchResultsSummaryStr + '</p>');
	}
}

//----------------//

function drawArticleList (selectedLetter) {
	//currentSearchType=getSearchType();
	//document.write("<p>** Search By " + srchTypeText[currentSearchType] + " **</p>");
	// Retrieve articles with keywords beginning with the current letter
	retrieveArticleList (selectedLetter, currentSearchType);
	// Write list of retrieved articles
	writeSelectedArticleList(selectedLetter, currentSearchType);
}

//----------------//

// ** TEST Function to generate noscript links ** //
//    Produces a list of all articles ordered by title //
function genFullArticleList () {

	var doc=0;
	var art=0;
	var readallarticles = false;
	numSelectedArticles=0;

	// Retrieve all articles, each with first keyword
	for (doc=0; doc<numPubIssues; doc++) {
		art=0;
		readallarticles = false;
		while (!readallarticles) {
			numSelectedArticles++;
			selectedArticles[numSelectedArticles-1] = new Array (msArtDb[doc][art][aidxPubType], msArtDb[doc][art][aidxPubNo], msArtDb[doc][art][aidxPgNo], msArtDb[doc][art][aidxTitle], msArtDb[doc][art][aidxAuthor], msArtDb[doc][art][aidxKeyWds][0]);
			if ((art+1)==MAXNUMARTICLESPERISSUE) {
				readallarticles=true;
			}
			else {
				art++;
				readallarticles=(msArtDb[doc][art][aidxPubType]== NULLARTICLE);
			}
		}
	}
	// Sort Selected Articles array by keyword
	selectedArticles.sort(keywordSortFn);

	// Write out list of all articles
	writeSelectedArticleList('*', SEARCHBYTITLE);
}

// -------------------------------------------------------------------- //
// END OF FILE //
// -------------------------------------------------------------------- //