<!--
 * 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.
-->

<chapter id="introduction">
  <title>Introduction</title>
  <para>
    This is the
    <application>Tobago</application>
    reference documentation.
  </para>
  <para>
    The goal of Tobago is to create and maintain a well-designed set of user
    interface components based on the JavaServer Faces (
    <abbrev>JSF</abbrev>
    ) specification.
  </para>
  <para>
    Tobago is more than just a tag library. The following statements
    characterize Tobago and makes it different from other frameworks:
    <itemizedlist>
      <listitem>
        The focus of Tobago is to create business applications without the
        need for
        <abbrev>HTML</abbrev>
        design. The development of Tobago pages follows more the development
        of conventional user interfaces than the creation of web pages.
      </listitem>
      <listitem>
        The UI components are abstracted from
        <abbrev>HTML</abbrev>
        and any layout information that does not belong to the general page
        structure.
        The final output format is determined by the client/user-agent.
      </listitem>
      <listitem>
        A theming mechanism makes it easy to change the look and feel and to
        provide special implementations for certain browsers. A fallback
        solution ensures that as much code is reused for new themes as
        possible.
      </listitem>
      <listitem>
        A layout manager is used to arrange the components automatically. This
        means, no manual layouting with
        <abbrev>HTML</abbrev>
        tables or other constructs is needed.
      </listitem>
    </itemizedlist>
    The
    <link linkend='architecture'>next</link>
    chapter will give a short description of the architecture.
  </para>
</chapter>
