
/* captures extraneous info from each record */

var subjectCache = {};
var authorCache = {};
var seriesCache = {};

function resultBuildCaches(records) {
	for( var r in records ) {
		var rec = records[r];
		for( var s in rec.subject() ) 
			subjectCache[s] == null ? subjectCache[s] = 1 : subjectCache[s]++;
		authorCache[rec.author()] = 1;
		for( var s in rec.series() ) seriesCache[rec.series()[s]] = 1;
	}
}

function resultSortSubjects(a, b) { return -(a.count - b.count); } /* sort in reverse */
function resultDrawSubjects() {

	var subjs = [];
	for( var s in subjectCache )
		subjs.push( { sub : s, count : subjectCache[s] } );
	subjs.sort(resultSortSubjects);

	var ss = [];
	for( var s in subjs ) ss.push(subjs[s].sub);

	resultDrawSidebarTrees( 
		STYPE_SUBJECT, 
		"subjectSidebarTree", ss, 
		$("subject_tree_sidebar"), 
		$("subject_sidebar_tree_div") );
}

function resultDrawAuthors() {
	var auths = new Array();
	for( var s in authorCache ) auths.push(s);

	resultDrawSidebarTrees( 
		STYPE_AUTHOR, 
		"authorSidebarTree", auths.sort(), 
		$("author_tree_sidebar"), 
		$("author_sidebar_tree_div") );
}

function resultDrawSeries() {
	var sers = new Array();
	for( var s in seriesCache ) sers.push(s);
	resultDrawSidebarTrees( 
		STYPE_SERIES, 
		"seriesSidebarTree", sers.sort(), 
		$("series_tree_sidebar"), 
		$("series_sidebar_tree_div") );
}

var IESux = true;

function resultDrawSidebarTrees( stype, treeName, items, wrapperNode, destNode ) {
	eval("tree = " + treeName);

	var xrefCache = [];
	var found = false;
	var x = 0;
	for( var i in items ) {

		if(isNull(items[i])) continue;

		/* again, IE is a turd */
		if(IE) { if(x++ > 5) break; }
		else { if(x++ > 7) break; }

		found = true;

		var item = normalize(truncate(items[i], 65));
		var args = {};
		var href = resultQuickLink( items[i], stype );
		tree.addNode( stype + "_" + items[i], treeName + 'Root', item, href );

//		if( !IE ) resultFireXRefReq(treeName, stype, items[i]);

		var a = {};
		a.type = stype;
		a.term = item;
		xrefCache.push(a);
	}

	if(found) {
		unHideMe(wrapperNode);
//		if(IE) resultFireXRefSingle(treeName, xrefCache, stype);
		/* XXX */ // disabled auth lookups for now

		if( DO_AUTHORITY_LOOKUPS ) {
			resultFireXRefBatch(treeName, xrefCache, stype);
		}
	}
}

/* XXX */
function resultFireXRefBatch(treeName, xrefCache, stype) {
	var query = [];
	for( var i = 0; i != xrefCache.length; i++ ) {
		var topic = xrefCache[i];
		query.push( [ topic.type, topic.term ] );
	}
	var req = new Request(FETCH_CROSSREF_BATCH, query);
	var tree;
	eval('tree=' + treeName);
	req.request._tree = tree;
	req.request._stype = stype;
	req.callback(resultRenderXRefTree);
	req.send();
}

var xrefCacheIndex = {};
xrefCacheIndex['subject'] = 0;
xrefCacheIndex['author'] = 0;
xrefCacheIndex['series'] = 0;

function resultHandleXRefResponse(r) {
	resultFireXRefSingle( r._treename, r._cache, r._stype );
	resultAppendCrossRef(r);
}


function resultFireXRefSingle( treeName, xrefCache, stype ) {
	var i = xrefCacheIndex[stype]++;
	if(xrefCache[i] == null) return;
	var item = xrefCache[i].term;
	var tree;
	eval('tree=' + treeName);
	var req = new Request(FETCH_CROSSREF, stype, item);
	req.request._tree = tree;
	req.request._item = item;
	req.request._stype = stype;
	req.request._cache = xrefCache;
	req.request._treename = treeName;
	req.callback(resultHandleXRefResponse);
	req.send();
}

function resultFireXRefReq( treeName, stype, item ) {
	var tree;
	eval('tree=' + treeName);
	var req = new Request(FETCH_CROSSREF, stype, item);
	req.request._tree = tree;
	req.request._item = item;
	req.request._stype = stype;
	req.callback(resultAppendCrossRef);
	req.send();
}


function resultQuickLink( term, type ) {
	var args = {};
	if(SHOW_MR_DEFAULT) {
		args.page = MRESULT;
	} else {
		args.page = RRESULT;
		args[PARAM_RTYPE] = type;
	}
	args[PARAM_OFFSET] = 0;
	args[PARAM_TERM] = term;
	args[PARAM_STYPE] = type;
	return buildOPACLink(args);
}

/* XXX */
function resultRenderXRefTree(r) {
	var tree = r._tree;
	var res = r.getResultObject();
	var stype = r._stype;

	for( var c in res ) {
		var cls = res[c];
		for( var t in cls ) {
			var term = res[c][t];
			var froms = term['from'];
			var alsos = term['also'];
			var total = 0;

			for( var i = 0; (total++ < 5 && i < froms.length); i++ ) {
				var string = normalize(truncate(froms[i], 45));
				if($(stype + '_' + froms[i])) continue;
				tree.addNode(stype + '_' + froms[i], 
					stype + '_' + t, string, resultQuickLink(froms[i],stype));
			}
			for( var i = 0; (total++ < 10 && i < alsos.length); i++ ) {
				var string = normalize(truncate(alsos[i], 45));
				if($(stype + '_' + alsos[i])) continue;
				tree.addNode(stype + '_' + alsos[i], 
					stype + '_' + t, string, resultQuickLink(alsos[i],stype));
			}
		}
	}
}


/* Addes the see-from/see-also entries for this subject item */
function resultAppendCrossRef(r) {
	var tree		= r._tree
	var item		= r._item
	var stype	= r._stype;
	var result	= r.getResultObject();
	if(!result) return;
	var froms	= result['from'];
	var alsos	= result['also'];

	var total = 0;

	for( var i = 0; (total++ < 5 && i < froms.length); i++ ) 
		resultAddXRefItem( tree, item, stype, froms, i );

	for( var i = 0; (total++ < 10 && i < alsos.length); i++ ) 
		resultAddXRefItem( tree, item, stype, alsos, i );
}

/**
 * Adds a single entry into the see-from/also sidebar tree 
 */
var collectedStrings = [];
function resultAddXRefItem(tree, rootItem, stype, arr, idx) {

	var string = normalize(truncate(arr[idx], 45));

	if( string == rootItem ) return;

	if( grep( collectedStrings, 
		function(a) { return (a == string); }) ) return;

	if($(stype + '_' + arr[idx])) return;

	tree.addNode(stype + '_' + arr[idx], 
		stype + '_' + rootItem, string, resultQuickLink(arr[idx],stype));

	collectedStrings.push(string);
}







