## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##   http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing,
## software distributed under the License is distributed on an
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
## KIND, either express or implied.  See the License for the
## specific language governing permissions and limitations
## under the License.

<p>
#set( $demo = $text.demo )
$demo.thisPage.insert("#doclink( 'FooTool' true )").
</p>

#demoTableStart()

#set( $quote = '' )
#set( $desc = "" )
#demo( 'foo' '' $desc )

#set( $desc = '' )
#demo1( 'foo' '' 3 $desc)

#set( $desc = "" )
#demo2( 'foo' '' 5 $desc )

#demoCustom( 'foo' )
</table>

<div align="center">
  <a name="fullDemo"><h3>$demo.mainExampleHeader</h3></a>
<form method="post" action="$link.self.anchor('fullDemo')">
<textarea name="demo" rows="8" cols="65">##
#if( $params.demo )##
$params.demo##
#else##
${esc.h}${esc.h} Examples of using this tool:
 ${esc.d}foo
 ${esc.d}foo.whatever##
#end##
</textarea>
  <br>
  <input type="submit" value="$demo.try">
  #if( $params.layout )
  <input type="hidden" name="layout" value="$params.layout">
  #end
</form>

#if( $params.demo )
$demo.mainResultsIntro:
<pre>
  $render.eval($params.demo)
</pre>
#end
</div>

