internal static MatchingBibTeXRecord LocateBibTexForCitationItem(string reference_key, WebLibraryDetail primary_library)
        {
            // First try in the preferred library
            if (null != primary_library)
            {
                MatchingBibTeXRecord item = LocateBibTexForCitationItem_FOCUS(reference_key, primary_library);
                if (null != item)
                {
                    return(item);
                }
            }

            // Failing that, look in all libraries
            foreach (WebLibraryDetail web_library_detail in WebLibraryManager.Instance.WebLibraryDetails_WorkingWebLibraries)
            {
                // Don't repeat a search of the preferred library
                if (primary_library != web_library_detail)
                {
                    MatchingBibTeXRecord item = LocateBibTexForCitationItem_FOCUS(reference_key, web_library_detail);
                    if (null != item)
                    {
                        return(item);
                    }
                }
            }

            return(null);
        }
        /**
         * Returns a map from citation reference_key -> PDFDocument
         */
        internal static Dictionary <string, MatchingBibTeXRecord> Find(List <CitationCluster> citation_clusters, WebLibraryDetail primary_library)
        {
            Dictionary <string, MatchingBibTeXRecord> bitex_items = new Dictionary <string, MatchingBibTeXRecord>();

            foreach (CitationCluster citation_cluster in citation_clusters)
            {
                foreach (CitationItem citation_item in citation_cluster.citation_items)
                {
                    if (!bitex_items.ContainsKey(citation_item.reference_key))
                    {
                        MatchingBibTeXRecord bitex_item = LocateBibTexForCitationItem(citation_item.reference_key, primary_library);
                        bitex_items[citation_item.reference_key] = bitex_item;
                    }
                }
            }

            return(bitex_items);
        }