<?xml version="1.0" encoding="UTF-8" ?>
<document>
 <properties>
  <title>&lt;${validator.name}&gt;</title>
 </properties>
 <body>
  <section name="Summary">
  <p>
   <b>Tag name:</b> &lt;${validator.name}&gt;
   <br/>
#set ($javadocPath = "../apidocs/" + $validator.getClassName().replace('.', '/') )
   <b>Validator class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${validator.className}</a>
   <br/>
#if ($validator.tagClass)
#set ($javadocPath = "../apidocs/" + $validator.getTagClass().replace('.', '/') )
   <b>Tag class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${validator.tagClass}</a>
   <br/>
#end
#if ($faceletTag)
   <b>Facelet Tag Handler:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${faceletTag.className}</a>
   <br/>  
#end
   <b>validator id:</b> ${validator.validatorId}
   <br/>
${validator.longDescription}   
  </p>
  </section>
#if ($baseContent)
$baseContent
#end
#set ($propertyList = ${tagdocUtils.getSortedPropertyList($validator)})
#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($validator.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
#elseif ($jsf20)
      <section name="Facelets Attributes">
<table>
 <tr>
  <th>Name</th>
  <th>Type</th>
  <th>Required</th>
  <th>Description</th>
 </tr>
 <tr>
  <td>for</td>
  <td>String</td>
  <td>false</td>
  <td></td>
 </tr>
</table>
  </section>
#end
 </body> 
</document>