// Simplified Library of Congress translator for code4lib
// Target: https?://[^/]*catalog.loc.gov[^/]*/cgi-bin/Pwebrecon\.cgi

function detectWeb(doc, url) {
	var export_options = doc.forms.namedItem('frm').elements.namedItem('RD').options;
	for(var i in export_options) {
		if(export_options[i].text == 'MARC (Unicode/UTF-8)') {
			// We have an exportable record
			if(doc.forms.namedItem('frm').elements.namedItem('RC')) {
				// Form indicates a search result page
				return "multiple";
			} else {
				// Otherwise, assume we see a book
				return "book";
			}
		}
	}
}

function doWeb(doc, url) {
	var queryString = '';
	var form = doc.forms.namedItem('frm');
	
	if(form.elements.namedItem('RC')) {
		var items = new Object();
		var checkboxes = new Array();
		
		// Create namespace resolver and exectue XPath to find checkboxes, since
		// these are what the Voyager system uses to determine which items 
		// it should retrieve records for
		var nsResolver = doc.createNSResolver(doc.documentElement);
		var tableRows = doc.evaluate(
			'//form[@name="frm"]//table/tbody/tr[td/input[@type="checkbox"]]',
			doc, nsResolver, XPathResult.ANY_TYPE, null);

		// Go through table rows
		var tableRow;
		while(tableRow = tableRows.iterateNext()) {
			// CHK is the checkbox the user would click to save the 
			var input = doc.evaluate('./td/input[@name="CHK"]', tableRow,
				nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
			var chkValue = input.value;
			
			// Get the item title from the second link
			var links = tableRow.getElementsByTagName("a");
			items[chkValue] = links[1].textContent;
		}
		
		var items = Zotero.selectItems(items);
		// Leave translator user did not select any items to save
		if(!items) return true;
		
		// Mimic checking of checkboxes for items user selected to save in
		// query string
		for(var chkValue in items) {
			queryString += "CHK="+chkValue+"&";
		}
	}
	
	// Add all hidden form elements to query, since these let Voyager identify
	// our request
	for(var i=0; i<form.elements.length; i++) {
		if(form.elements[i].type && form.elements[i].type.toLowerCase() == 'hidden') {
			queryString += escape(form.elements[i].name)+'='+escape(form.elements[i].value)+'&';
		}
	}
	
	// Also add type of export and mimic clicking of save button
	queryString += 'RD=3&MAILADDY=&SAVE=Press+to+SAVE+or+PRINT';
	
	Zotero.Utilities.HTTP.doGet(form.action+'?'+queryString, function(text) {
		// Load translator for MARC to read output
		var marc = Zotero.loadTranslator("import");
		marc.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
		marc.setString(text);
		marc.setHandler("itemDone", function(obj, item) {
			item.extra = "Created with Simple LOC Translator";
			item.complete();
		});
		marc.translate();
		
		// Done with asynchronous requests
		Zotero.done();
	})
	
	// Don't finish immediately after function returns; wait until asynchronous
	// doGet request returns
	Zotero.wait();
}
