%
def subtitle = 'Index'
def title = subtitle + (props.windowTitle ? " (${props.windowTitle})" : "")
def letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_' as char[]
def elementTypes = [
    "Method" : { it.methods() },
    "Constructor" : { it.constructors() },
    "Field" : { it.fields() },
    "Property" : { it.properties() },
    "Enum Constant" : { it.enumConstants() },
]
def encode = { org.codehaus.groovy.tools.groovydoc.SimpleGroovyClassDoc.encodeAngleBrackets(it) }
def isVisible = { it.isPublic() || (it.isProtected() && props.protectedScope == 'true') || (!it.isProtected() && !it.isPrivate() && props.packageScope == 'true') || props.privateScope == 'true' }
def paramsOf = { n, classDoc, boolean brief -> n.parameters().collect{ param -> encode(param.isTypeAvailable()?param.type().typeName():param.typeName()) }.join(", ") }
def nameFromParams = { n -> n.name() + '(' + n.parameters().collect{ param -> param.isTypeAvailable()?param.type().qualifiedTypeName():param.typeName() }.join(', ') + ')' }
%>
    
        
<% letters.each { letter -> %>
${letter}
<% } %>
<%
letters.each { letter ->
    def entries = [] as TreeMap
    def upperLower = "$letter${letter.toLowerCase()}"
    for (classDoc in rootDoc.classes()) {
        def classLower = classDoc.name().toLowerCase()
        if (isVisible(classDoc)) {
            if (upperLower.contains(classDoc.name()[0])) {
                def packageOrInnerName = classDoc.qualifiedTypeName() - ('.' + classDoc.simpleTypeName())
                def packageName = classDoc.qualifiedTypeName() - ('.' + classDoc.name())
                def desc = classDoc.typeDescription + ' in '
                entries.put(classLower, """
${classDoc.name()} - ${desc}${packageName}
${classDoc.firstSentenceCommentText()}
""")
            }
            elementTypes.each { k, v ->
                def elements = v(classDoc)
                elements.each { e ->
                    if (isVisible(e) && upperLower.contains(e.name()[0])) {
                        def packageOrInnerName = classDoc.qualifiedTypeName() - ('.' + classDoc.simpleTypeName())
                        def packageName = classDoc.qualifiedTypeName() - ('.' + classDoc.name())
                        def desc = k + ' in '
                        switch (k) {
                        case 'Method':
                        case 'Constructor':
                            entries[e.name().toLowerCase()+'_'+classLower] = """
${e.name()}(${paramsOf(e, classDoc, true)}) - ${desc}${classDoc.name()}
 ${e.firstSentenceCommentText()}
"""
                            break
                        case 'Field':
                        case 'Property':
                        case 'Enum Constant':
                            entries[e.name().toLowerCase()+'_'+classLower] = """
${e.name()} - ${desc}${classDoc.name()}
 ${e.firstSentenceCommentText()}
"""
                            break
                        }
                    }
                }
            }
        }
    }
%>
${letter}
<%
    entries.each{ k, v ->
        %>${v}<%
    }
%>
    <% } %>