<?xml version="1.0" encoding="UTF-8" ?>
<document>
 <properties>
  <title>&lt;${component.name}&gt;</title>
 </properties>
 <body>
  <section name="Summary">
  <p>
   <b>Tag name:</b> &lt;${component.name}&gt;
   <br/>
#set ($javadocPath = "../apidocs/" + $component.getClassName().replace('.', '/') )
   <b>UIComponent class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${component.className}</a>
   <br/>
#if ($component.tagClass)
#set ($javadocPath = "../apidocs/" + $component.getTagClass().replace('.', '/') )
   <b>Tag class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${component.tagClass}</a>
   <br/>
#end
#if ($faceletTag)
   <b>Facelet Tag Handler:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${faceletTag.className}</a>
   <br/>  
#end
   <b>Component type:</b> ${component.type}
   <br/>
   <b>Component family:</b> ${component.family}
   <br/>
#if (${component.rendererType})
   <b>Renderer type:</b> ${component.rendererType}
   <br/>
#set ($rendererClasses = $tagdocUtils.getRendererClasses($component,$model).values() )
#foreach ($rendererClass in $rendererClasses)
#set ($javadocPath = "../apidocs/" + $rendererClass.replace('.', '/') )
   <b>Renderer class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${rendererClass}</a>
   <br/>
#end
#end
   <br/>      
${component.longDescription}   
  </p>
  </section>
#if ($baseContent)
$baseContent
#end
#set($facetList = ${tagdocUtils.getSortedFacetList($component)})
#if ($facetList.size() != 0)
  <section name="Supported Facets">
   <p>
   <table>
    <tr>
     <th>Name</th>
     <th>Required</th>
     <th>Description</th>
    </tr>
#foreach( $facet in $facetList )
    <tr>
     <td>$facet.name</td>
     <td>$facet.isRequired()</td>
#if ($facet.longDescription)
     <td>$facet.longDescription</td>
#else
     <td></td>
#end     
    </tr>
#end
   </table>
   </p>
  </section>
#end
#set($listenerList = ${tagdocUtils.getSortedListenerList($component)})
#if ($listenerList.size() != 0)
  <section name="Supported Listeners">
   <p>
   <table>
    <tr>
     <th>Name</th>
     <th>Listener</th>
     <th>Event</th>
     <th>Phases</th>
     <th>Required</th>
     <th>Description</th>
    </tr>
#foreach( $listener in $listenerList )
    <tr>
#if ($listener.name)
     <td>$listener.name</td>
#else
     <td></td>
#end
#if ($listener.className)
    <td>$listener.className</td>
#else
    <td></td>
#end
#if ($listener.eventClassName)
    <td>$listener.eventClassName</td>
#else
    <td></td>
#end
#if ($listener.phases)
     <td>$listener.phases</td>
#else
     <td></td>
#end
     <td>$listener.isRequired()</td>
#if ($listener.longDescription)
     <td>$listener.longDescription</td>
#else
     <td></td>
#end     
    </tr>
#end
   </table>
   </p>
  </section>
#end  
#set ($propertyList = ${tagdocUtils.getSortedPropertyList($component)})
#if ($propertyList.size() != 0)  
  <section name="Attributes">
<table>
 <tr>
  <th>Name</th>
  <th>Type</th>
  <th>Supports EL?</th>
  <th>Description</th>
 </tr>
#foreach( $property in $propertyList )
#if (!$property.isTagExcluded())
 <tr>
  <td>$property.jspName</td>
#set ($type = ${tagdocUtils.getDisplayType($component.className,$property.jspName,$property.className)})
  <td>$type</td>
#if ($property.jspName == "action")
  <td>Yes</td>
#elseif ($property.isMethodBinding() || $property.isMethodExpression())
  <td>Only EL</td>
#elseif ($property.jspName == "binding")
  <td>Only EL</td>
#elseif ($property.isLiteralOnly())
  <td>No</td>
#else
  <td>Yes</td>
#end
#if ($property.longDescription)
  <td>$property.longDescription</td>
#else
  <td></td>
#end
 </tr>
#end
#end
</table>
  </section>
#end
#if ($faceletTag)
#set ($attributeList = ${tagdocUtils.getSortedAttributeList($faceletTag)})
#if ($attributeList.size() != 0)  
  <section name="Facelets Attributes">
<table>
 <tr>
  <th>Name</th>
  <th>Type</th>
  <th>Required</th>
  <th>Description</th>
 </tr>
#foreach( $attribute in $attributeList )
#if (!$attribute.isTagExcluded() && $attribute.isFaceletsOnly())
 <tr>
  <td>$attribute.name</td>
#set ($type = ${tagdocUtils.getDisplayType($faceletTag.className,$attribute.name,$attribute.className)})
  <td>$type</td>
  <td>$attribute.isRequired()</td>
#if ($attribute.longDescription)
  <td>$attribute.longDescription</td>
#else
  <td></td>
#end
 </tr>
#end
#end
</table>
  </section>
#end
#end
 </body> 
</document>