## 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.
#title( 'LinkTool' )
<p>
#set( $demo = $text.demo )
$demo.thisPage.insert("#doclink( 'LinkTool' false )"). This tool
is somewhat unusual in that every method that takes parameters will return a new
instance of the tool that is a copy of the one the method was called upon, with
the additional change specified by the method call.
</p>

#demoTableStart()

#set( $desc = "Returns a new ${esc.d}link with the addition of the specified anchor value." )
#demo1( 'link' 'anchor' 6 $desc )

#set( $desc = "Returns the anchor set for the ${esc.d}link" )
#if( $params.anchor )
  #set( $result = $link.anchor($params.anchor) )
#else
  #set( $result = $!link.anchor )
#end
#demoAlt( 'link' 'anchor' $result $desc )

#set( $desc = "Returns a new ${esc.d}link with the addition of the specified path value." )
#demo1( 'link' 'path' 6 $desc )

#set( $desc = "Returns a new ${esc.d}link with the addition of the specified relative value." )
#demo1( 'link' 'relative' 6 $desc )

#set( $desc = "Returns a new ${esc.d}link with the addition of the specified absolute value." )
#demo1( 'link' 'absolute' 6 $desc )

#set( $desc = "Returns the path currently set for this ${esc.d}link." )
#demoAlt( 'link' 'path' $link.path $desc )

#set( $desc = "Returns a new ${esc.d}link with the addition of the specified parameter." )
#demo2( 'link' 'param' 6 $desc )


#set( $desc = "Returns the query data set for this ${esc.d}link" )
#if( $params.param )
  #set( $result = $link.param($params.param).params )
#else
  #set( $result = $link.params )
#end
#demoAlt( 'link' 'params' $desc )


#set( $desc = "Returns the URI that addresses this web application. E.g. <code>http://myserver.net/myapp</code>. This string may not end with a ${esc.q}/${esc.q}." )
#demo( 'link' 'contextURL' $desc )

#set( $desc = "Returns the context path that addresses this web application, e.g. <code>/myapp</code>. This string starts with a ${esc.q}/${esc.q} but does not end with a ${esc.q}/${esc.q}." )
#demo( 'link' 'contextPath' $desc )

#set( $desc = "Retrieves the path for the current request regardless of whether this is a direct request or an include by the RequestDispatcher." )
#demo( 'link' 'requestPath' $desc )

#set( $desc = "Returns the full URI of this template without any query data. e.g. <code>http://myserver.net/myapp/stuff/View.vm</code>" )
#demo( 'link' 'baseRef' $desc )

#set( $desc = "This method returns a new self-referencing ${esc.d}link for the current request (e.g. <code>/myapp/stuff/View.vm</code>).  However, the behavior can be changed via toolbox configuration to use absolute URIs and/or add the current request parameters." )
#demo( 'link' 'self' $desc )

#set( $desc = "Performs URL encoding on the specified text." )
#demo1( 'link' 'encode' 6 $desc )

#demoCustom( 'link' )
</table>

#set( $base = $link.self.anchor('fullDemo') )

<div align="center">
  <a name="fullDemo"><h3>$demo.mainExampleHeader</h3></a>
<form method="post" action="$link.self.anchor('fullDemo')">
<textarea name="fullDemo" rows="5" cols="65">##
#if( $params.fullDemo )##
$params.fullDemo##
#else##
${esc.h}${esc.h} NOTE: this first line is done in the actual page,
${esc.h}${esc.h}       because ${esc.h}set() doesn't work in these demos
${esc.h}set( ${esc.d}base = ${esc.d}link.self.anchor('fullDemo') )
<a href="${esc.d}base.param('select','this')">this</a>
<a href="${esc.d}base.param('select','that')">that</a>##
#end##
</textarea>
  <br>
  <input type="submit" value="$demo.try">
  #if( $params.layout )
  <input type="hidden" name="layout" value="$params.layout">
  #end
</form>

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