<!--
  ~ 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.
  -->

<ui:composition template="/sections/sectionTemplate.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:common="http://java.sun.com/jsf/composite/components/common">

    <ui:define name="title">
        Index
    </ui:define>

    <ui:define name="viewChangeLinks">
        <common:viewChange singlePageName="multiPage" slideId="slidesIndex"/>
    </ui:define>

    <ui:define name="sectionContent">
        <div style="padding-left:15%;">
            <ul style="line-height:120%; list-style: upper-roman; font-size: 140%;" class="fontedHeader">
                <li>
                    <a href="#" onclick="slideView.goBySlideId('slideView');return false;">Slide View</a>
                    <sup class="newFeature">New</sup>
                </li>
                <li>
                    <a href="#" onclick="slideView.goBySlideId('inputTypes');return false;">Input Types</a>
                </li>
                <li>
                    <a href="#"
                       onclick="slideView.goBySlideId('clientSideValidation01');return false;">Client Side Validation and Driving Properties with JSF Validators/Converters</a>
                </li>
                <li>
                    <a href="#" onclick="slideView.goBySlideId('effects01');return false;">Effects</a>
                    <sup class="newFeature">New</sup>
                </li>
                <li>
                    <a href="#" onclick="slideView.goBySlideId('animations');return false;">Animations</a>
                    <sup class="newFeature">New</sup>
                </li>
                <li>
                    <a href="#" onclick="slideView.goBySlideId('media01');return false;">Video and Audio</a>
                </li>
                <li>
                    <a href="#" onclick="slideView.goBySlideId('meterAndProgress');return false;">Meter and Progress</a>
                    <sup class="newFeature">New</sup>
                </li>
                <li>
                    <a href="#" onclick="slideView.goBySlideId('datetime');return false;">Date-Time</a>
                </li>
                <li>
                    <a href="#" onclick="slideView.goBySlideId('suggestions');return false;">Suggestions</a>
                </li>
                <li>
                    <a href="#" onclick="slideView.goBySlideId('dnd01');return false;">Drag and Drop</a>
                </li>
            </ul>
        </div>
    </ui:define>
</ui:composition>