/*
 * 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.
 */
 
<%
     function testRequestAttribute(/* String */ name) {
        var tag = (request.getAttribute(name) != null) ? "" : "no";
        out.println("<p>-" + tag + "-" + name + "-</p>");
    }
%>
 
<%-- used by IncludeTest --%>
<html>
	<body>
		<h1>ESP template</h1>
		<p class="main"><%= currentNode.text %></p>

        <%
          // Servlet API request include attributes
          testRequestAttribute( "javax.servlet.include.request_uri" );
          testRequestAttribute( "javax.servlet.include.context_path" );
          testRequestAttribute( "javax.servlet.include.servlet_path" );
          testRequestAttribute( "javax.servlet.include.path_info" );
          testRequestAttribute( "javax.servlet.include.query_string" );
          testRequestAttribute( "javax.servlet.include.request_uri" );
          testRequestAttribute( "javax.servlet.include.request_uri" );
          
          // Sling API request include attributes
          testRequestAttribute( "org.apache.sling.api.include.servlet" );
          testRequestAttribute( "org.apache.sling.api.include.resource" );
          testRequestAttribute( "org.apache.sling.api.include.request_path_info" );
        %>
		
		<h2>Test 1</h2>
		<%
			if(currentNode.pathToInclude) {
			  %>
			  <p>pathToInclude = <%= currentNode.pathToInclude %></p>
  		  	  <p>Including <%= currentNode.pathToInclude %></p>
			  <%
			  sling.include(currentNode.pathToInclude);
			}
		%>
		
		<h2>Test 2</h2>
		<%
			if(currentNode.testInfiniteLoop) {
			  %>
			  <p>testInfiniteLoop = <%= currentNode.testInfiniteLoop %></p>
			  <%
			  // try to include the item itself, to cause an infinite loop
			  sling.include(resource.getPath());
			}
		%>
		
		<h2>Test 3</h2>
		<%
			if(currentNode.pathToInclude && currentNode.forceResourceType) {
			  %>
			  <p>pathToInclude = <%= currentNode.pathToInclude %></p>
  		  	  <p>Including <%= currentNode.pathToInclude %></p>
			  <%
			  sling.include(currentNode.pathToInclude, currentNode.forceResourceType);
			}
		%>
	</body>
</html>
