public static string FormatDocumentLinks (IEnumerable<IDocument> documents, ViewModelContext context, string itemTemplate, string listTemplateOne, string listTemplateMany, string microdata, DocumentGroupPlacement groupPlacement, GetDocumentTitle getDocumentTitle = null)
        {
            var markupBuilder = new StringBuilder ();
            var count = 0;
            foreach (var document in documents) {
                var linkMarkup = document.FormatDocumentLink_WithMicrodata (
                    (getDocumentTitle == null)? document.Title : getDocumentTitle (document),
                    Localization.GetString ("LinkOpen.Text", context.LocalResourceFile),
                    true,
                    groupPlacement,
                    context.Module.TabId,
                    context.Module.ModuleId,
                    microdata,
                    HttpContext.Current.Timestamp
                );

                if (!string.IsNullOrEmpty (linkMarkup)) {
                    markupBuilder.Append (string.Format (itemTemplate, linkMarkup));
                    count++;
                }
            }

            var markup = markupBuilder.ToString ();
            if (!string.IsNullOrEmpty (markup)) {
                return string.Format ((count == 1)? listTemplateOne : listTemplateMany, markup);
            }

            return string.Empty;
        }
        public static string FormatDocumentLinks(IEnumerable <IDocument> documents, ViewModelContext context, string itemTemplate, string listTemplateOne, string listTemplateMany, string microdata, DocumentGroupPlacement groupPlacement, GetDocumentTitle getDocumentTitle = null)
        {
            var markupBuilder = new StringBuilder();
            var count         = 0;

            foreach (var document in documents)
            {
                var linkMarkup = document.FormatDocumentLink_WithMicrodata(
                    (getDocumentTitle == null)? document.Title : getDocumentTitle(document),
                    Localization.GetString("LinkOpen.Text", context.LocalResourceFile),
                    true,
                    groupPlacement,
                    context.Module.TabId,
                    context.Module.ModuleId,
                    microdata,
                    HttpContext.Current.Timestamp
                    );

                if (!string.IsNullOrEmpty(linkMarkup))
                {
                    markupBuilder.Append(string.Format(itemTemplate, linkMarkup));
                    count++;
                }
            }

            var markup = markupBuilder.ToString();

            if (!string.IsNullOrEmpty(markup))
            {
                return(string.Format((count == 1)? listTemplateOne : listTemplateMany, markup));
            }

            return(string.Empty);
        }
        public static string FormatDocumentLink_WithMicrodata (this IDocument document, string documentTitle,
            string defaultTitle, bool preferDocumentTitle, DocumentGroupPlacement groupPlacement, int tabId, int moduleId, string microdata, DateTime now)
        {
            var title = (preferDocumentTitle && !string.IsNullOrWhiteSpace (documentTitle)) 
                ? ((groupPlacement == DocumentGroupPlacement.InTitle)
                    ? TextUtils.FormatList (": ", document.Group, documentTitle)
                    : documentTitle)
                : ((groupPlacement == DocumentGroupPlacement.InTitle && !string.IsNullOrWhiteSpace (document.Group))
                    ? document.Group
                    : defaultTitle);
              
            if (!string.IsNullOrWhiteSpace (document.Url)) {
                var linkMarkup = "<a href=\"" + UniversityUrlHelper.LinkClickIdnHack (document.Url, tabId, moduleId) + "\" "
                + TextUtils.FormatList (" ", !document.IsPublished (now) ? "class=\"u8y-not-published-element\"" : string.Empty, microdata)
                + " target=\"_blank\">" + title + "</a>";
                
                if (groupPlacement == DocumentGroupPlacement.BeforeTitle) {
                    return TextUtils.FormatList (": ", document.Group, linkMarkup);
                }

                if (groupPlacement == DocumentGroupPlacement.AfterTitle) {
                    return TextUtils.FormatList (": ", linkMarkup, document.Group);
                }

                return linkMarkup;
            }

            return string.Empty;
        }
        public static string FormatDocumentLink_WithMicrodata(this IDocument document, string documentTitle,
                                                              string defaultTitle, bool preferDocumentTitle, DocumentGroupPlacement groupPlacement, int tabId, int moduleId, string microdata, DateTime now)
        {
            var title = (preferDocumentTitle && !string.IsNullOrWhiteSpace(documentTitle))
                ? ((groupPlacement == DocumentGroupPlacement.InTitle)
                    ? TextUtils.FormatList(": ", document.Group, documentTitle)
                    : documentTitle)
                : ((groupPlacement == DocumentGroupPlacement.InTitle && !string.IsNullOrWhiteSpace(document.Group))
                    ? document.Group
                    : defaultTitle);

            if (!string.IsNullOrWhiteSpace(document.Url))
            {
                var linkMarkup = "<a href=\"" + UniversityUrlHelper.LinkClickIdnHack(document.Url, tabId, moduleId) + "\" "
                                 + TextUtils.FormatList(" ", !document.IsPublished(now) ? "class=\"u8y-not-published-element\"" : string.Empty, microdata)
                                 + " target=\"_blank\">" + title + "</a>";

                if (groupPlacement == DocumentGroupPlacement.BeforeTitle)
                {
                    return(TextUtils.FormatList(": ", document.Group, linkMarkup));
                }

                if (groupPlacement == DocumentGroupPlacement.AfterTitle)
                {
                    return(TextUtils.FormatList(": ", linkMarkup, document.Group));
                }

                return(linkMarkup);
            }

            return(string.Empty);
        }