<?xml version="1.0" encoding="UTF-8"?>
<chapter id="ArchitectureOverview" xreflabel="ArchitecturalOverview">
	<?dbhtml filename="ArchitectureOverview.html"?>

	<chapterinfo>
		<keywordset>
			<keyword>RichFaces</keyword>

			<keyword>CSS</keyword>

			<keyword>skin</keyword>
		</keywordset>
	</chapterinfo>
	<title>Basic concepts of the RichFaces Framework</title>
	<section id="introToBasics">
		<?dbhtml filename="introToBasics.html"?>
		<title>Introduction</title>
		<para>
			The framework is implemented as a component library which
			adds Ajax capability into existing pages, so you don&apos;t
			need to write any JavaScript code or to replace existing
			components with new Ajax widgets.
			<property>RichFaces</property>
			enables page-wide Ajax support instead of the traditional
			component-wide support. Hence, you can define the event on
			the page that invokes an Ajax request and the areas of the
			page that should be synchronized with the JSF Component Tree
			after the Ajax request changes the data on the server
			according to the events fired on the client.
		</para>
		<para>Next Figure shows how it works:</para>
		<figure>
			<title>Request Processing flow</title>

			<mediaobject>
				<imageobject>
					<imagedata fileref="images/newpic1.png"
						scalefit="1" />
				</imageobject>
			</mediaobject>
		</figure>
		<para>
			<property>RichFaces</property>
			allows to define (by means of JSF tags) different parts of a
			JSF page you wish to update with an Ajax request and provide
			a few options to send Ajax requests to the server. Also JSF
			page doesn&apos;t change from a &quot;regular&quot; JSF page
			and you don&apos;t need to write any JavaScript or
			XMLHTTPRequest objects by hands, everything is done
			automatically.
		</para>
	</section>
	<section id="RichFacesArchitectureOverview">
		<?dbhtml filename="RichFacesArchitectureOverview.html"?>
		<title>RichFaces Architecture Overview</title>
		<para>
			Next figure lists several important elements of the
			<property>RichFaces</property>
			framework
		</para>
		<figure>
			<title>Core Ajax component structure</title>

			<mediaobject>
				<imageobject>
					<imagedata fileref="images/newpic2.png" />
				</imageobject>
			</mediaobject>
		</figure>
		<formalpara>
			<title>Ajax Filter.</title>
			<para>
				To get all benefits of
				<property>RichFaces</property>
				, you should register a Filter in web.xml file of your
				application. The Filter recognizes multiple request
				types. Necessary information about Filter configuration
				can be found in the
				<link linkend="FilterConfiguration">
					&quot;Filter configuration&quot;
				</link>
				section. The sequence diagram on Figure 3 shows the
				difference in processing of a &quot;regular&quot; JSF
				request and an Ajax request.
			</para>
		</formalpara>
		<para>
			In the first case the whole JSF tree will be encoded, in the
			second one option it depends on the &quot;size&quot; of the
			Ajax region. As you can see, in the second case the filter
			parses the content of an Ajax response before sending it to
			the client side.
		</para>
		<para>
			Have a look at the next picture to understand these two
			ways:
		</para>
		<figure>
			<title>Request Processing sequence diagram</title>

			<mediaobject>
				<imageobject>
					<imagedata fileref="images/newpic3.png"
						scalefit="1" />
				</imageobject>
			</mediaobject>
		</figure>
		<para>
			In both cases, the information about required static or
			dynamic resources that your application requests is
			registered in the ResourseBuilder class.
		</para>
		<para>
			When a request for a resource comes (Figure 4), the
			RichFaces filter checks the Resource Cache for this resource
			and if it is there, the resource is sent to the client.
			Otherwise, the filter searches for the resource among those
			that are registered by the ResourceBuilder. If the resource
			is registered, the RichFaces filter will send a request to
			the ResourceBuilder to create (deliver) the resource.
		</para>
		<para>
			Next Figure shows the ways of resource request processing.
		</para>
		<figure>
			<title>Resource request sequence diagram</title>

			<mediaobject>
				<imageobject>
					<imagedata fileref="images/newpic4.png"
						scalefit="1" />
				</imageobject>
			</mediaobject>
		</figure>
		<formalpara>
			<title>AJAX Action Components</title>
			<para>
				There are Ajax Action Components: <emphasis role="bold"><property>&lt;a4j:commandButton&gt;</property></emphasis>,
				<emphasis role="bold"><property>&lt;a4j:commandLink&gt;</property></emphasis>, <emphasis role="bold"><property>&lt;a4j:poll&gt;</property></emphasis> and<emphasis role="bold"><property>&lt;a4j:support&gt;</property></emphasis> and etc. You
				can use them to send Ajax requests from the client side.
			</para>
		</formalpara>
		<formalpara>
			<title>AJAX Containers</title>
			<para>
				AjaxContainer is an interface that describes an area on
				your JSF page that should be decoded during an Ajax
				request. <code>AjaxViewRoot</code> and <code>AjaxRegion</code> are implementations
				of this interface.
			</para>
		</formalpara>
		<formalpara>
			<title>JavaScript Engine</title>
			<para>
				<property>RichFaces</property>
				JavaScript Engine runs on the client-side. It knows how
				to update different areas on your JSF page based on the
				information from the Ajax response. Do not use this
				JavaScript code directly, as it is available
				automatically.
			</para>
		</formalpara>
	</section>
	<section id="LimitationsAndRules">
		<?dbhtml filename="LimitationAndRules.html"?>
		<title>Limitations and Rules</title>
		<para>
			In order to create RichFaces applications properly, keep the
			following points in mind:
		</para>
		<itemizedlist>
			<listitem>
				<para>
					Any Ajax framework should not append or delete, but
					only replace elements on the page. For successful
					updates, an element with the same ID as in the
					response must exist on the page. If you&apos;d like
					to append any code to a page, put in a placeholder
					for it (any empty element). For the same reason,
					it&apos;s recommended to place messages in the
					<emphasis role="bold">
						<property>&quot;AjaxOutput&quot;</property>
					</emphasis>
					component (as no messages is also a message).
				</para>
			</listitem>
			<listitem>
				<para>
					Don&apos;t use
					<emphasis role="bold">
						<property>&lt;f:verbatim&gt;</property>
					</emphasis>
					for self-rendered containers, since this component
					is transient and not saved in the tree.
				</para>
			</listitem>
			<listitem>
				<para>
					Ajax requests are made by XMLHTTPRequest functions
					in XML format, but this XML bypasses most
					validations and the corrections that might be made
					in a browser. Thus, create only a strict
					standards-compliant code for HTML and XHTML, without
					skipping any required elements or attributes. Any
					necessary XML corrections are automatically made by
					the XML filter on the server, but lot&apos;s of
					unexpected effects can be produced by an incorrect
					HTML code.
				</para>
			</listitem>
			<listitem>
				<para>
					The <property>RichFaces</property> ViewHandler puts itself in front of the Facelets ViewHandlers chain.
				</para>
			</listitem>
			<listitem>
				<para>
					<property>RichFaces</property> components uses their own renderers. On the Render Response Phase <property>RichFaces</property>
					framework makes a traversal of the component tree, calls its own renderer and put the result into the Faces Response.
				</para>
			</listitem>
		</itemizedlist>
	</section>

	<section id="AjaxRequestOptimization">
		<?dbhtml filename="AjaxRequestOptimization.html"?>
		<title>Ajax Request Optimization</title>
		<section id="Re-Rendering">
			<?dbhtml filename="Re-Rendering.html"?>
			<title>Re-Rendering</title>
			<para>
				Ajax attributes are common for Ajax components such as
				<emphasis role="bold">
					<property>&lt;a4j:support&gt;</property>
				</emphasis>
				,
				<emphasis role="bold">
					<property>&lt;a4j:commandButton&gt;</property>
				</emphasis>
				,
				<emphasis role="bold">
					<property>&lt;a4j:jsFunction&gt;</property>
				</emphasis>
				,
				<emphasis role="bold">
					<property>&lt;a4j:poll&gt;</property>
				</emphasis>
				,
				<emphasis role="bold">
					<property>&lt;a4j:push&gt;</property>
				</emphasis>
				and so on. Also, most RichFaces components with built-in
				Ajax support have these attributes for a similar
				purpose. Ajax components attributes help RichFaces to
				expose its features. Most of the attributes have default
				values. Thus, you can start working with RichFaces
				without knowing the usage of these attribute. However,
				their usage allows to tune the required Ajax behavior
				very smoothly.
			</para>

			<para>
				<emphasis>
					<property>&quot;reRender&quot;</property>
				</emphasis>
				is a key attribute. The attribute allows to point to
				area(s) on a page that should be updated as a response
				on Ajax interaction. The value of the
				<emphasis>
					<property>&quot;reRender&quot;</property>
				</emphasis>
				attribute is an id of the JSF component or an id list.
			</para>
			<para>A simple example is placed below:</para>

			<programlisting role="XML"><![CDATA[...
        <a4j:commandButton value="update" reRender="infoBlock"/>
            ...
        <h:panelGrid id="infoBlock">
            ...
        </h:panelGrid>
...
]]></programlisting>

			<para>
				The value of
				<emphasis>
					<property>&quot;reRender&quot;</property>
				</emphasis>
				attribute of the
				<emphasis role="bold">
					<property>&lt;a4j:commandButton&gt;</property>
				</emphasis>
				tag defines which part(s) of your page is (are) to be
				updated. In this case, the only part of the page to
				update is the
				<emphasis role="bold">
					<property>&lt;h:panelGrid&gt;</property>
				</emphasis>
				tag because its ID value matches to the value of
				<emphasis>
					<property>&quot;reRender&quot;</property>
				</emphasis>
				attribute. As you see, it&apos;s not difficult to update
				multiple elements on the page, only list their IDs as
				the value of
				<emphasis>
					<property>&quot;reRender&quot;</property>
				</emphasis>
				.
			</para>

			<para>
				<emphasis>
					<property>&quot;reRender&quot;</property>
				</emphasis>
				uses
				<ulink
					url="http://java.sun.com/javaee/javaserverfaces/1.2_MR1/docs/api/javax/faces/component/UIComponent.html#findComponent(java.lang.String)">
					UIComponent.findComponent() algorithm
				</ulink>
				(with some additional exceptions) to find the component
				in the component tree. As can you see, the algorithm
				presumes several steps. Each other step is used if the
				previous step is not successful. Therefore, you can
				define how fast the component is found mentioning it
				more precisely. The following example shows the
				difference in approaches (both buttons will work
				successfully):
			</para>

			<programlisting role="XML"><![CDATA[...
    <h:form id="form1">
        ...
        <a4j: commandButton value="Usual Way" reRender="infoBlock, infoBlock2" />
        <a4j:commandButton value="Shortcut" reRender=":infoBlockl,:sv:infoBlock2" />
        ...
    </h:form>
    <h:panelGrid id="infoBlock">
        ...
    </h:panelGrid>
    ...
    <f:subview id="sv">
      <h:panelGrid id="infoBlock2">
        ...
      </h:panelGrid>
      ...
    </f:subview>
...
]]></programlisting>

			<para>
				It&apos;s also possible to use JSF EL expression as a
				value of the reRender attribute. It might be a property
				of types Set, Collection, Array or simple String. The EL
				for reRender is resolved right before the Render
				Response phase. Hence, you can calculate what should be
				re-rendered on any previous phase during the Ajax
				request processing.
			</para>

			<para>
				Most common problem with using reRender is pointing it
				to the component that has a
				<emphasis>
					<property>&quot;rendered&quot;</property>
				</emphasis>
				attribute. Note, that JSF does not mark the place in the
				browser DOM where the outcome of the component should be
				placed in case the
				<emphasis>
					<property>&quot;rendered&quot;</property>
				</emphasis>
				condition returns false. Therefore, after the component
				becomes rendered during the Ajax request, RichFaces
				delivers the rendered code to the client, but does not
				update a page, because the place for update is unknown.
				You need to point to one of the parent components that
				has no
				<emphasis>
					<property>&quot;rendered&quot;</property>
				</emphasis>
				attribute. As an alternative, you can wrap the component
				with
				<emphasis role="bold">
					<property>&lt;a4j:outputPanel&gt;</property>
				</emphasis>
				<code>layout=&quot;none&quot;</code>
				.
			</para>

			<para>
				<emphasis>
					<property>&quot;ajaxRendered&quot;</property>
				</emphasis>
				attribute of the
				<emphasis role="bold">
					<property>&lt;a4j:outputPanel&gt;</property>
				</emphasis>
				set to
				&quot;true&quot;
				allows to define the area of the page that will be
				re-rendered even if it is not pointed in the reRender
				attribute explicitly. It might be useful if you have an
				area on a page that should be updated as a response on
				any Ajax request. For example, the following code allows
				to output error messages regardless of what Ajax request
				causes the Validation phase failed.
			</para>
			<programlisting role="XML"><![CDATA[...
     <a4j:outputPanel ajaxRendered="true">
        <h:messages />
    </a4j:outputPanel>
...
]]></programlisting>

			<para>
				<emphasis>
					<property>&quot;limitToList&quot;</property>
				</emphasis>
				attribute allows to dismiss the behavior of the
				<emphasis role="bold">
					<property>&lt;a4j:outputPanel&gt;</property>
				</emphasis>
				<emphasis>
					<property>&quot;ajaxRendered&quot;</property>
				</emphasis>
				attribute.
				<code>limitToList = &quot;false&quot;</code>
				means to update only the area(s) that mentioned in the
				<emphasis>
					<property>&quot;reRender&quot;</property>
				</emphasis>
				attribute explicitly. All output panels with
				<code>ajaxRendered=&quot;true&quot;</code>
				is ignored. An example is placed below:
			</para>

			<programlisting role="XML"><![CDATA[...
    <h:form>
       <h:inputText value="#{person.name}">
            <a4j:support event="onkeyup" reRender="test" limitToList="true"/>
        </h:inputText>
        <h:outputText value="#{person.name}" id="test"/>
    </form>
...
]]></programlisting>

		</section>

		<section id="QueueandTrafficFloodProtection">
			<?dbhtml filename="QueueandTrafficFloodProtection.html"?>
			<title>Queue and Traffic Flood Protection</title>
			<para>
				<emphasis>
					<property>&quot;eventsQueue&quot;</property>
				</emphasis>
				attribute defines the name of the queue that will be
				used to order upcoming Ajax requests. By default,
				RichFaces does not queue Ajax requests. If events are
				produced simultaneously, they will come to the server
				simultaneously. JSF implementations (especially, the
				very first ones) does not guaranty that the request that
				comes first will be served or passed into the JSF
				lifecycle first. The order how the server side data will
				be modified in case of simultaneous request might be
				unpredictable. Usage of eventsQueue attribute allows to
				avoid possible mess. Define the queue name explicitly,
				if you expect intensive Ajax traffic in your
				application.
			</para>
			<para>
				The next request posted in the same queue will wait
				until the previos one is not processed and Ajax Response
				is returned back if the
				<emphasis>
					<property>&quot;eventsQueue&quot;</property>
				</emphasis>
				attribute is defined. In addition, RichFaces starts to
				remove from the queue &quot;similar&quot; requests.
				&quot;Similar'&quot;requests are the requests produced
				by the same event. For example, according to the
				following code, only the newest request will be sent to
				the server if you type very fast and has typed the
				several characters already before the previous Ajax
				Response is back.
			</para>

			<programlisting role="XML"><![CDATA[...
    <h:inputText value="#{userBean.name}">
        <a4j:support event="onkeyup" eventsQueue="foo" reRender="bar" />
    </h:inputText>
...
]]></programlisting>

			<para>
				<emphasis>
					<property>&quot;requestDelay&quot;</property>
				</emphasis>
				attribute defines the time (in ms) that the request will
				be wait in the queue before it is ready to send. When
				the delay time is over, the request will be sent to the
				server or removed if the newest &quot;similar&quot;
				request is in a queue already .
			</para>
			<para>
				<emphasis>
					<property>&quot;ignoreDupResponses&quot;</property>
				</emphasis>
				attribute orders to ignore the Ajax Response produced by
				the request if the newest &quot;similar&quot; request is
				in a queue already.
				<code>ignoreDupResponses&quot;=&quot;true&quot;</code>
				does not cancel the request while it is processed on the
				server, but just allows to avoid unnecessary updates on
				the client side if the response loses the actuality.
			</para>
			<para>
				Defining the
				<emphasis>
					<property>&quot;eventsQueue&quot;</property>
				</emphasis>
				along with
				<emphasis>
					<property>&quot;requestDelay&quot;</property>
				</emphasis>
				allows to protect against unnecessary traffic flood and
				synchronizes Ajax requests order. If you have several
				sources of Ajax requests, you can define the same queue
				name there. This might be very helpful if you have Ajax
				components that invoke request asynchronously from the
				ones produced by events from users. For example,
				<emphasis role="bold">
					<property>&lt;a4j:poll&gt;</property>
				</emphasis>
				or
				<emphasis role="bold">
					<property>&lt;a4j:push&gt;</property>
				</emphasis>
				. In case the requests from such components modify the
				same data, the synchronization might be very helpful.
			</para>

			<para>
				More information can be found on the
				<ulink
					url="http://jboss.com/index.html?module=bb&amp;op=viewtopic&amp;t=105766">
					RichFaces Users Forum
				</ulink>
				.
			</para>

			<para>
				<emphasis>
					<property>&quot;timeout&quot;</property>
				</emphasis>
				attribute is used for setting response waiting time on a
				particular request. If a response is not received during
				this time, the request is aborted.
			</para>
		</section>

		<section id="DataProcessingOptions">
			<?dbhtml filename="DataProcessingOptions.html"?>
			<title>Data Processing Options</title>
			<para>
				RichFaces uses form based approach for Ajax request
				sending. This means each time, when you click an Ajax
				button or
				<emphasis role="bold">
					<property>&lt;a4j:poll&gt;</property>
				</emphasis>
				produces an asynchronous request, the data from the
				closest JSF form is submitted with the XMLHTTPRequest
				object. The form data contains the values from the form
				input element and auxiliary information such as state
				saving data.
			</para>
			<para>
				When
				<emphasis>
					<property>&quot;ajaxSingle&quot;</property>
				</emphasis>
				attribute value is
				&quot;true&quot;
				, it orders to include only a value of the current
				component (along with
				<emphasis role="bold">
					<property>&lt;f:param&gt;</property>
				</emphasis>
				or
				<emphasis role="bold">
					<property>&lt;a4j:action&gt;</property>
				</emphasis>
				param values if any) to the request map. In case of
				<emphasis role="bold">
					<property>&lt;a4j:support&gt;</property>
				</emphasis>
				, it is a value of the parent component. An example is
				placed below:
			</para>

			<programlisting role="XML"><![CDATA[...
    <h:form>
        <h:inputText value="#{person.name}">
            <a4j:support event="onkeyup" reRender="test" ajaxSingle="true"/>
        </h:inputText>
      <h:inputText value="#{person.middleName}"/>
    </form>
...
]]></programlisting>
			<para>
				In this example the request contains only the input
				component causes the request generation, not all the
				components contained on a form, because of
				<code>ajaxSingle=&quot;true&quot;</code>
				usage.
			</para>
			<para>
				Note, that
				<code>ajaxSingle=&quot;true&quot;</code>
				reduces the upcoming traffic, but does not prevent
				decoding other input components on the server side. Some
				JSF components, such as
				<emphasis role="bold">
					<property>&lt;h:selectOneMenu&gt;</property>
				</emphasis>
				do recognize the missing data in the request map value
				as a null value and try to pass the validation process
				with a failed result. Thus, use
				<emphasis role="bold">
					<property>&lt;a4j:region&gt;</property>
				</emphasis>
				to limit a part of the component tree that will be
				processed on the server side when it is required.
			</para>
			<para>
				<emphasis>
					<property>&quot;immediate&quot;</property>
				</emphasis>
				attribute has the same purpose as any other non-JSF
				component. The default
				<emphasis>
					<property>&quot;ActionListener&quot;</property>
				</emphasis>
				should be executed immediately (i.e. during the Apply
				Request Values phase of a request processing lifecycle),
				rather than waiting until the Invoke Application phase.
				Using
				<code>immediate=&quot;true&quot;</code>
				is one of the ways to have some data model values
				updated when other cannot be updated because of a
				problem with passing the Validation phase successfully.
				This might be important inside the
				<emphasis role="bold">
					<property>&lt;h:dataTable&gt;</property>
				</emphasis>
				like components where using
				<emphasis role="bold">
					<property>&lt;a4j:region&gt;</property>
				</emphasis>
				is impossible due to the
				<emphasis role="bold">
					<property>&lt;h:dataTable&gt;</property>
				</emphasis>
				component architecture.
			</para>

			<para>
				<emphasis>
					<property>&quot;bypassUpdates&quot;</property>
				</emphasis>
				attribute allows to bypass the Update Model phase. It
				might be useful if you need to check your input against
				the available validator, but not to update the model
				with those data. Note, that an action will be invoked at
				the end of the Validation phase only if the Validation
				phase is passed successfully. The listeners of the
				Application phase will not be invoked in any case.
			</para>
		</section>

		<section id="ActionandNavigation">
			<?dbhtml filename="ActionandNavigation.html"?>
			<title>Action and Navigation</title>
			<para>
				Ajax component is similar to any other non-Ajax JSF
				component like
				<emphasis role="bold">
					<property>&lt;h:commandButton&gt;</property>
				</emphasis>
				. It allows to submit the form. You can use
				<emphasis>
					<property>&quot;action&quot;</property>
				</emphasis>
				and
				<emphasis>
					<property>&quot;actionListener&quot;</property>
				</emphasis>
				attributes to invoke the action method and define the
				action event.
			</para>
			<para>
				<emphasis>
					<property>&quot;action&quot;</property>
				</emphasis>
				method must return null if you want to have an Ajax
				Response with a partual page update. This is regular
				mode called <code>&quot;Ajax request generates Non-Ajax
				Response&quot;</code>. In
				case of action does not return null, but the action
				outcome that matches one of navigation rules, RichFaces
				starts to work in <code>&quot;Ajax request generates Non-Ajax
				Response&quot;</code> mode. This mode might be helpful in two major
				cases:
			</para>
			<itemizedlist>
				<listitem>
					<para>
						RichFaces allows to organize a page flow inside
						the
						<emphasis role="bold">
							<property>&lt;a4j:include&gt;</property>
						</emphasis>
						component. This is a typical scenario for Wizard
						like behavior. The new content is rendered
						inside the
						<emphasis role="bold">
							<property>&lt;a4j:include&gt;</property>
						</emphasis>
						area. The content is taken from the navigation
						rule of the faces configuration file (usually,
						the faces-config.xml). Note, that the content of
						the "wizard" is not isolated from the rest of
						the page. The included page should not have own
						<emphasis role="bold">
							<property>&lt;f:view&gt;</property>
						</emphasis>
						(it does not matter if you use facelets). You
						need to have an Ajax component inside the
						<emphasis role="bold">
							<property>&lt;a4j:include&gt;</property>
						</emphasis>
						to navigate between the wizard pages. Otherwize,
						the whole page update will be performed.
					</para>
				</listitem>
				<listitem>
					<para>
						If you want to involve the server side
						validators and navigate to the next page only if
						the Validation phase is passed successfully, you
						can replace
						<emphasis role="bold">
							<property>&lt;h:commandButton&gt;</property>
						</emphasis>
						with
						<emphasis role="bold">
							<property>
								&lt;a4j:commandButton&gt;
							</property>
						</emphasis>
						and point to the action method that navigates to
						the next page. If Validation process fails, the
						partial page update will occur and you will see
						an error message. Otherwize, the application
						proceeds to the next page. Make sure, you define
						<emphasis role="bold"><property>&lt;redirect/&gt;</property></emphasis> 
						option for the navigation rule to avoid memory leaks.
					</para>
				</listitem>
			</itemizedlist>
			<para></para>
		</section>

		<section id="JavascriptInteractions">
			<?dbhtml filename="JavascriptInteractions.html"?>
			<title>JavaScript Interactions</title>
			<para>
				RichFaces allows writing Ajax-enabled JSF application
				without writing any Javascript code. However, you can
				still invoke the JavaScript code if you need. There are
				several ajax attributes that helps to do it.
			</para>
			<para>
				<emphasis>
					<property>&quot;onsubmit&quot;</property>
				</emphasis>
				attribute allows to invoke JavaScript code before an
				Ajax request is sent. If
				<emphasis>
					<property>&quot;onsubmit&quot;</property>
				</emphasis>
				returns
				&quot;false&quot;
				, the Ajax request is canceled. The code of
				<emphasis>
					<property>&quot;onsubmit&quot;</property>
				</emphasis>
				is inserted before the RichFaces Ajax call. Hence, the
				<emphasis>
					<property>&quot;onsubmit&quot;</property>
				</emphasis>
				should not has a &quot;return&quot; statement if you
				want the Ajax request to be sent. If you are going to
				invoke a JavaScript function that returns
				&quot;true&quot;
				or
				&quot;false&quot;
				, use the conditional statement to return something only
				when you need to cancel the request. For example:
			</para>
			<programlisting role="XML"><![CDATA[...
    onsubmit="if (mynosendfunct()==false){return false}"
...
]]></programlisting>

			<para>
				<emphasis>
					<property>&quot;onclick&quot;</property>
				</emphasis>
				attribute is similar to the
				<emphasis>
					<property>&quot;onsubmit&quot;</property>
				</emphasis>
				, but for clickable components such as
				<emphasis role="bold">
					<property>&lt;a4j:commandLink&gt;</property>
				</emphasis>
				and
				<emphasis role="bold">
					<property>&lt;a4j:commandButton&gt;</property>
				</emphasis>
				. If it returns
				&quot;false&quot;
				, the Ajax request is canceled also.
			</para>
			<para>
				<emphasis>
					<property>&quot;oncomplete&quot;</property>
				</emphasis>
				attribute allows to invoke the JavaScript code right
				after the Ajax Response is returned back and the DOM
				tree of the browser is updated. RichFaces registers the
				code for further invocation of XMLHTTP request object
				before an Ajax request is sent. This means the code will
				not be changed during processing of the request on the
				server if you use JSF EL value binding. Also, you cannot
				use &quot;this'&quot; inside the code, because it will
				not point the component where Ajax request was
				initiated.
			</para>

			<para>
				<emphasis>
					<property>&quot;onbeforedomupdate&quot;</property>
				</emphasis>
				attribute defines JavaScript code for call after Ajax
				response receiving and before updating DOM on a client
				side.
			</para>

			<para>
				<emphasis>
					<property>&quot;data&quot;</property>
				</emphasis>
				attribute allows to get the additional data from the
				server during an Ajax call. You can use JSF EL to point
				the property of the managed bean and its value will be
				serialized in JSON format and be available on the client
				side. You can refer to it using the
				<emphasis>
					<property>&quot;data&quot;</property>
				</emphasis>
				variable. For example:
			</para>
			<programlisting role="XML"><![CDATA[...
    <a4j:commandButton value="Update" data="#{userBean.name}" oncomplete="showTheName(data.name)" />
...
]]></programlisting>

			<para>
				RichFaces allows to serialize not only primitive types
				into JSON format, but also complex types including
				arrays and collections. The beans should be serializable
				to be refered with
				<emphasis>
					<property>&quot;data&quot;</property>
				</emphasis>
				.
			</para>
			<para>
				There is a number of useful functions which can be used
				in JavaScript:
			</para>
			<itemizedlist>
				<listitem>
					<para>
						<code>rich:clientId('id')</code>
						- returns client id by short id or null if the
						component with the id specified hasn't been
						found
					</para>
				</listitem>
				<listitem>
					<para>
						<code>rich:element('id')</code>
						- is a shortcut for
						<code>
							document.getElementById(#{rich:clientId('id')})
						</code>
					</para>
				</listitem>
				<listitem>
					<para>
						<code>rich:component('id')</code>
						- is a shortcut for
						<code>#{rich:clientId('id')}.component</code>
					</para>
				</listitem>
				<listitem>
					<para>
						<code>rich:findComponent('id')</code>
						- returns an instance of UIComponent  taking the short ID of the component as a parameter. 
					</para>
					<programlisting role="XML"><![CDATA[...
<h:inputText id="myInput">
    <a4j:support event="onkeyup" reRender="outtext"/>
</h:inputText>
<h:outputText id="outtext" value="#{rich:findComponent('myInput').value}" /> 
...]]></programlisting>
				</listitem>
			</itemizedlist>
		</section>

		<section id="IterationcomponentsAjaxattributes">
			<?dbhtml filename="IterationcomponentsAjaxattributes.html"?>
			<title>Iteration components Ajax attributes</title>
			<para>
				<emphasis>
					<property>&quot;ajaxKeys&quot;</property>
				</emphasis>
				attribute defines strings that are updated after an Ajax
				request. It provides possibility to update several child
				components separately without updating the whole page.
			</para>

			<programlisting role="XML"><![CDATA[...
    <a4j:poll intervall="1000" action="#{repeater.action}" reRender="text">
        <table>
            <tbody>
                <a4j:repeat value="#{bean.props}" var="detail" ajaxKeys="#{repeater.ajaxedRowsSet}">
                    <tr>                
                        <td>
                            <h:outputText value="detail.someProperty" id="text"/>
                        </td>                            
                    </tr>
                </a4j:repeat>
            </tbody>
        </table>
    </a4j:poll>
...
]]></programlisting>

		</section>

		<section id="Otherusefulattributes">
			<?dbhtml filename="Otherusefulattributes.html"?>
			<title>Other useful attributes</title>
			<para>
				<emphasis>
					<property>&quot;status&quot;</property>
				</emphasis>
				attribute for Ajax components (such as
				<emphasis role="bold">
					<property>&lt;a4j:commandButton&gt;</property>
				</emphasis>
				,
				<emphasis role="bold">
					<property>&lt;a4j:poll&gt;</property>
				</emphasis>
				, etc.) points to an ID of
				<emphasis role="bold">
					<property>&lt;a4j:status&gt;</property>
				</emphasis>
				component. Use this attribute if you want to share
				<emphasis role="bold">
					<property>&lt;a4j:status&gt;</property>
				</emphasis>
				component between different Ajax components from
				different regions. The following example shows it.
			</para>

			<programlisting role="XML"><![CDATA[...
    <a4j:region id="extr">
        <h:form>
            <h:outputText value="Status:" />
            <a4j:status id="commonstatus" startText="In Progress...." stopText=""/>
            <h:panelGrid columns="2">
                <h:outputText value="Name"/>
                <h:inputText id="name" value="#{userBean.name}">
                    <a4j:support event="onkeyup" reRender="out" />
                </h:inputText>
                <h:outputText value="Job"/>
                <a4j:region  id="intr">
                    <h:inputText id="job" value="#{userBean.job}">
                        <a4j:support event="onkeyup"  reRender="out" status="commonstatus"/>
                   </h:inputText>
                </a4j:region>
            </h:panelGrid>

            <a4j:region>
                <h:outputText id="out" value="Name: #{userBean.name}, Job: #{userBean.job}" />
                <br />
                <a4j:commandButton ajaxSingle="true" value="Clean Up Form" reRender="name, job, out"  status="commonstatus">
                    <a4j:actionparam name="n" value=""  assignTo="#{userBean.name}" />
                    <a4j:actionparam name="j" value=""  assignTo="#{userBean.job}" />
                </a4j:commandButton>
            </a4j:region>
        </h:form>
    </a4j:region>
...
]]></programlisting>

			<para>
				In the example
				<emphasis role="bold">
					<property>&lt;a4j:support&gt;</property>
				</emphasis>
				and
				<emphasis role="bold">
					<property>&lt;a4j:commandButton&gt;</property>
				</emphasis>
				are defined in different regions. Values of
				<emphasis>
					<property>&quot;status&quot;</property>
				</emphasis>
				attribute for these components points to an ID of
				<emphasis role="bold">
					<property>&lt;a4j:support&gt;</property>
				</emphasis>
				.Thus, the
				<emphasis role="bold">
					<property>&lt;a4j:support&gt;</property>
				</emphasis>
				component is shared between two components from
				different regions.
			</para>

			<para>
				More information could be found
				<ulink
					url="http://livedemo.exadel.com/richfaces-demo/richfaces/status.jsf?c=status">
					here
				</ulink>
				.
			</para>

			<para>
				Other useful attribute is
				<emphasis>
					<property>&quot;focus&quot;</property>
				</emphasis>
				. It points to an ID of a component where focus will be
				set after an Ajax request.
			</para>

		</section>

	</section>

	<section id="HowTo...">
		<?dbhtml filename="HowTo.html"?>
		<title>How To...</title>
		<section id="SendAnAJAXRequest">
			<?dbhtml filename="SendAnAJAXRequest.html"?>
			<title>Send an Ajax request</title>
			<para>
				There are different ways to send Ajax requests from your
				JSF page. For example you can use
				<emphasis role="bold">
					<property>&lt;a4j:commandButton&gt;</property>
				</emphasis>
				,
				<emphasis role="bold">
					<property>&lt;a4j:commandLink&gt;</property>
					,
					<emphasis role="bold">
						<property>&lt;a4j:poll&gt;</property>
					</emphasis>
				</emphasis>
				or
				<emphasis role="bold">
					<property>&lt;a4j:support&gt;</property>
				</emphasis>
				tags or any other.
			</para>
			<para>
				All these tags hide the usual JavaScript activities that
				are required for an XMHTTPRequest object building and an
				Ajax request sending. Also, they allow you to decide
				which components of your JSF page are to be re-rendered
				as a result of the Ajax response (you can list the IDs
				of these components in the <emphasis><property>&quot;reRender&quot;</property></emphasis>
				attribute).
			</para>
			<para>
				<emphasis role="bold">
					<property>&lt;a4j:commandButton&gt;</property>
				</emphasis>
				and
				<emphasis role="bold">
					<property>&lt;a4j:commandLink&gt;</property>
				</emphasis>
				tags are used to send an Ajax request on
				<emphasis><property>&quot;onclick&quot;</property></emphasis> JavaScript event.
			</para>
			<para>
				<emphasis role="bold">
					<property>&lt;a4j:poll&gt;</property>
				</emphasis>
				tag is used to send an Ajax request periodically using a
				timer.
			</para>
			<para>
				The
				<emphasis role="bold">
					<property>&lt;a4j:support&gt;</property>
				</emphasis>
				tag allows you to add Ajax functionality to standard JSF
				components and send Ajax request onto a chosen
				JavaScript event: <emphasis><property>&quot;onkeyup&quot;</property></emphasis>,
				<emphasis><property>&quot;onmouseover&quot;</property></emphasis>, etc.
			</para>
			<!--para>Most important attributes of components that provide Ajax request calling features are:</para>
				<itemizedlist>
				<listitem>
				<emphasis>
				<property>&quot;reRender&quot;</property>
				</emphasis>attribute as it was mentioned <link linkend="SendAnAJAXRequest">before</link>
				specifies components to be reRendered after Ajax response. The attribute can be specified
				using EL expression and formed dynamicaly on the server side (see <ulink
				url="index.html#FAQ">FAQ chapter</ulink>). </listitem>
				<listitem>
				<emphasis>
				<property>&quot;RequestDelay&quot;</property>
				</emphasis> attribute is used for a requests frequency regulation. </listitem>
				</itemizedlist>
				<programlisting role="XML"><![CDATA[<h:inputText size="50" value="#{bean.text}">
				<a4j:support event="onkeyup" RequestDelay="3"/>
				</h:inputText>]]></programlisting>
				<para>So every next request from the frequent keyboard events will be delayed on 3 ms to
				reduce the number of requests. </para>
				<itemizedlist>
				<listitem>
				<emphasis>
				<property>&quot;EventsQueue&quot;</property>
				</emphasis> is a queue that stores the next request. </listitem>
				<listitem>
				<emphasis>
				<property>&quot;LimitToList&quot;</property>
				</emphasis> attribute is used to regulate updatable regions. Setting it to true limits the
				updatable areas only to ones specified in a reRender list, in other case all Output Panels
				of the region are updated. </listitem>
				<listitem>
				<emphasis>
				<property>&quot;ajaxSingle&quot;</property>
				</emphasis> attributes specify regions to be sent with a request, if
				&quot;false&quot; it is a full region, in other case it&apos;s is only a
				control caused event. </listitem>
				
				<listitem>
				<emphasis>
				<property>&quot;timeout&quot;</property>
				</emphasis>attribute is used for response waiting time on a particular request. If a
				response is not received during this time, the request is aborted. </listitem>
				
				<listitem>
				<emphasis>
				<property>&quot;ignoreDupResponses&quot;</property>
				</emphasis> is used to abort unfinished request on new event. </listitem>
				</itemizedlist-->


		</section>



		<section id="DecideWhatToSend">
			<?dbhtml filename="DecideWhatToSend.html"?>
			<title>Decide What to Send</title>
			<para>
				You may describe a region on the page you wish to send
				to the server, in this way you can control what part of
				the JSF View is decoded on the server side when you send
				an Ajax request.
			</para>
			<para>
				The easiest way to describe an Ajax region on your JSF
				page is to do nothing, because the content between the
				<emphasis role="bold">
					<property>&lt;f:view&gt;</property>
				</emphasis>
				and
				<emphasis role="bold">
					<property>&lt;/f:view&gt;</property>
				</emphasis>
				tags is considered the default Ajax region.
			</para>
			<para>
				You may define multiple Ajax regions on the JSF page
				(they can even be nested) by using the
				<emphasis role="bold">
					<property>&lt;a4j:region&gt;</property>
				</emphasis>
				tag.
			</para>
			<para>
				If you wish to render the content of an Ajax response
				outside of the active region then the value of the
				<emphasis><property>&quot;renderRegionOnly&quot;</property></emphasis> attribute should be set to
				&quot;false&quot; (&quot;false&quot; is default value).
				Otherwise, your Ajax updates are limited to elements of
				the active region.
			</para>
		</section>


		<section id="DecideWhatToChange">
			<?dbhtml filename="DecideWhatToChange.html"?>
			<title>Decide What to Change</title>
			<para>
				Using IDs in the <emphasis><property>&quot;reRender&quot;</property></emphasis> attribute to
				define <code>&quot;AJAX zones&quot;</code> for update works fine in
				many cases.
			</para>
			<para>
				But you can not use this approach if your page contains,
				e.g. a
				<emphasis role="bold">
					<property>&lt;f:verbatim&gt;</property>
				</emphasis>
				tag and you wish to update its content on an Ajax
				response.
			</para>
			<para>
				The problem with the
				<emphasis role="bold">
					<property>&lt;f:verbatim/&gt;</property>
				</emphasis>
				tag as described above is related to the value of the
				transientFlag of JSF components. If the value of this
				flag is true, the component must not participate in
				state saving or restoring of process.
			</para>
			<para>
				In order to provide a solution to this kind of problems,
				RichFaces uses the concept of an output panel that is
				defined by the
				<emphasis role="bold">
					<property>&lt;a4j:outputPanel&gt;</property>
				</emphasis>
				tag. If you put a
				<emphasis role="bold">
					<property>&lt;f:verbatim&gt;</property>
				</emphasis>
				tag inside of the output panel, then the content of the
				<emphasis role="bold">
					<property>&lt;f:verbatim/&gt;</property>
				</emphasis>
				tag and content of other panel&apos;s child tags could
				be updated on Ajax response. There are two ways to
				control this:
				<itemizedlist>
					<listitem>
						<para>
							By setting the <emphasis><property>&quot;ajaxRendered&quot;</property></emphasis>
							attribute value to &quot;true&quot;.
						</para>
					</listitem>
					<listitem>
						<para>
							By setting the <emphasis><property>&quot;reRender&quot;</property></emphasis>
							attribute value of an Action Component to
							the output panel ID.
						</para>
					</listitem>
				</itemizedlist>
			</para>
		</section>
		<section id="process" role="updated">
			<title>Decide what to process</title>
			<para>
				The <emphasis><property>&quot;process&quot;</property></emphasis> attribute allows to 
				define the ids of components to be processed together with the component which is marked as <property>ajaxSingle</property> or wrapped to region. 
			</para>
			<para>
				You could make use of the <emphasis><property>&quot;process&quot;</property></emphasis> attribute when you need to process only two
				components in the different parts of view.
			</para>
			<para>
				Imagine you need to process only two input fields but not all the view.
				If you wrap the first input to region or make <emphasis role="bold"><property>&lt;a4j:support&gt;</property></emphasis> component  
				with <code>ajaxSingle=&quot;true&quot;</code> nested the second input will not be processed.
			</para>
			<para>
				Here is a simple solution:
			</para>
			<programlisting role="XML"><![CDATA[...
<h:inputText value="#{bean.name}" id="name">
	<a4j:support ajaxSingle="true" process="email" event="onblur" reRender="someOut"/>
</h:inputText>
<h:inputTextarea value="#{bean.description}" id="desc" />
<h:inputText value="#{bean.email}" id="email">
	<a4j:support ajaxSingle="true" process="name" event="onblur" reRender="someOut"/>
</h:inputText>
...]]></programlisting>
			<para>
				In the example above when the input field with the <code>id=&quot;name&quot;</code> looses focus, an AJAX request is sent. 
				So only two input fields (with <code>id=&quot;name&quot;</code> and additionally with <code>id=&quot;email&quot;</code>) 
				are processed: decoding, conversion/validation, value applying phases are executed. 
				The input field with the <code>id=&quot;email&quot;</code> is handled the same way on blur event.
			</para>
			<!--para>
				The
				<emphasis>
					<property>&quot;process&quot;</property>
				</emphasis>
				attribute has two limitations:
			</para>
			<itemizedlist>
				<listitem>
					<para>
						it works only if
						<emphasis>
							<property>&quot;ajaxSingle&quot;</property>
						</emphasis>
						equals to "true" for given command component
					</para>
				</listitem>
				<listitem>
					<para>
						you do not have to point this attribute to one
						of the own parent components to avoid processing
						of command component twice
					</para>
				</listitem>
			</itemizedlist>
			<para>
				<emphasis role="bold">Example:</emphasis>
			</para>
			<programlisting role="XML"><![CDATA[...
<h:form>
    <h:inputText id="oneA" value="#{bean.width}"/>
        <br/>
    <h:inputText id="oneB" value="#{bean.text}"/>
        <br/>
    <a4j:commandButton value="Submit2" process="oneB" ajaxSingle="true" reRender=":three1, :three2"/>
</h:form>
<h:outputText id="three1" value="#{bean.width}"/>
    <br/>
<h:outputText id="three2" value="#{bean.text}"/>
...]]></programlisting>
			<para>
				In the example above after you click on the
				<emphasis role="bold">
					<property>&lt;a4j:commandButton&gt;</property>
				</emphasis>
				<property>only</property>
				<emphasis role="bold">
					<property>&lt;h:inputText&gt;</property>
				</emphasis>
				with
				<code>"oneB"</code>
				id is processed and entered data appears into the
				<emphasis role="bold">
					<property>&lt;h:outputText&gt;</property>
				</emphasis>
				with
				<code>"three2"</code>
				id. If you doesn't use this attribute
				<property>both</property>
				<emphasis role="bold">
					<property>&lt;h:inputText&gt;</property>
				</emphasis>
				is processed and entered data appears into the
				<property>both</property>
				<emphasis role="bold">
					<property>&lt;h:outputText&gt;</property>
				</emphasis>
				.
			</para-->
		</section>
	</section>


	<section id="FilterConfiguration">
		<?dbhtml filename="FilterConfiguration.html"?>
		<title>Filter Configuration</title>
		<para>
			RichFaces uses a filter for a correction of code received on
			an Ajax request. In case of a &quot;regular&quot; JSF
			request a browser makes correction independently. In case of
			Ajax request in order to prevent layout destruction
			it&apos;s needed to use a filter, because a received code
			could differ from a code validated by a browser and a
			browser doesn't make any corrections.
		</para>

		<para>
			An example of how to set a Filter in a web.xml file of your
			application is placed below.
		</para>

		<para>
			<emphasis role="bold">Example:</emphasis>
		</para>

		<programlisting role="XML"><![CDATA[...
    <filter>
        <display-name>RichFaces Filter</display-name>
        <filter-name>richfaces</filter-name>
        <filter-class>org.ajax4jsf.Filter</filter-class>
    </filter>
...
]]></programlisting>

		<note>
			<title>Note:</title>
			<para>
				Fast Filter is deprecated and available only for
				backward compatibility with previous RichFaces versions.
				Fast Filter usage isn&apos;t recomended, because there
				is another way to use its functionality by means of
				<link linkend="Neko">Neko filter type</link>
				.
			</para>
		</note>

		<para>
			In RichFaces 3.2 filter configuration becomes more flexible.
			It&apos;s possible to configure different filters for
			different sets of pages for the same application.
		</para>

		<para>The possible filter types are:</para>

		<itemizedlist>
			<listitem>
				<para>TIDY</para>
			</listitem>
		</itemizedlist>

		<para>
			&quot;TIDY&quot; filter type based on the Tidy parser. This
			filter is recommended for applications with complicated or
			non-standard markup when all necessary code corrections are
			made by the filter when a response comes from the server.
		</para>

		<itemizedlist>
			<listitem>
				<para id="Neko">NEKO</para>
			</listitem>
		</itemizedlist>

		<para>
			&quot;NEKO&quot; filter type corresponds to the former
			&quot;Fast Filter&quot; and it&apos;s based on the Neko
			parser. In case of using this filter code isn&apos;t
			strictly verified. Use this one if you are sure that your
			application markup is really strict for this filter.
			Otherwise it could cause lot&apos;s of errors and corrupt a
			layout as a result. This filter considerably accelerates all
			Ajax requests processing.
		</para>

		<itemizedlist>
			<listitem>
				<para>NONE</para>
			</listitem>
		</itemizedlist>

		<para>No correction.</para>

		<para>An example of configuration is placed below.</para>
		<para>
			<emphasis role="bold">Example:</emphasis>
		</para>

		<programlisting role="XML"><![CDATA[...
    <context-param>
        <param-name>org.ajax4jsf.xmlparser.ORDER</param-name>
        <param-value>NONE,NEKO,TIDY</param-value>
    </context-param>
 
    <context-param>
        <param-name>org.ajax4jsf.xmlparser.NONE</param-name>
        <param-value>/pages/performance\.xhtml,/pages/default.*\.xhtml</param-value>
    </context-param>

    <context-param>
        <param-name>org.ajax4jsf.xmlparser.NEKO</param-name>
        <param-value>/pages/repeat\.xhtml</param-value>
    </context-param>
    
    <filter> 
        <display-name>RichFaces Filter</display-name> 
        <filter-name>richfaces</filter-name> 
        <filter-class>org.ajax4jsf.Filter</filter-class> 
    </filter>
    
    <filter-mapping> 
        <filter-name>richfaces</filter-name> 
        <servlet-name>Faces Servlet</servlet-name>
        <dispatcher>FORWARD</dispatcher> 
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>INCLUDE</dispatcher> 
    </filter-mapping>
...
]]></programlisting>

		<para>
			The example shows that <code>ORDER</code> parameter defines the order in
			which particular filter types are used for pages code
			correction.
		</para>
		<para>
			First of all &quot;NONE&quot; type is specified for the
			filter. Then two different sets of pages are defined for
			which two filter types (NONE and NEKO) are used
			correspondingly. If a page relates to the first set that is
			defined in the following way:
		</para>

		<programlisting role="XML"><![CDATA[<param-value>/pages/performance\.xhtml,/pages/default.*\.xhtml</param-value>,
]]></programlisting>

		<para>
			it&apos;s not corrected, because filter type for this page
			is defined as &quot;NONE&quot;. If a page is not from the
			first set, then &quot;NEKO&quot; type is set.
		</para>
		<para>
			If a page relates to the second set that is defined in the
			following way:
		</para>

		<programlisting role="XML"><![CDATA[<param-value>/pages/repeat\.xhtml</param-value>,
]]></programlisting>

		<para>
			then &quot;NEKO&quot; filter type is used for correction. If
			it&apos;s not related to the second set, &quot;TIDY&quot;
			type is set for the filter (&quot;TIDY&quot; filter type is
			used for code correction).
		</para>

	</section>
	<section id="ScriptsandStylesLoadStrategy" role="updated">
		<?dbhtml filename="ScriptsandStylesLoadStrategy" ?>
		<title>Scripts and Styles Load Strategy</title>
		<para>
			Before the version 3.1.3, RichFaces loaded styles and script
			on demand. I.e. files are loaded only if they are required
			on a particular page. Since RichFaces 3.1.3, it&apos;s
			possible to manage how the RichFaces script and style files
			are loaded to application.
		</para>
		<para>
			<emphasis role="bold">org.richfaces.LoadScriptStrategy</emphasis>
		</para>
		<para>
			The following declaration in your web.xml allows loading the
			integrated script files.
		</para>
		<programlisting role="XML"><![CDATA[...
    <context-param>
          <param-name>org.richfaces.LoadScriptStrategy</param-name>
          <param-value>ALL</param-value>
    </context-param>	
...
]]></programlisting>
		<para>
			If you do not declare the
			<code>org.richfaces.LoadScriptStrategy</code>
			in the web.xml, it equals to:
		</para>
		<programlisting role="XML"><![CDATA[...
    <context-param>
        <param-name>org.richfaces.LoadScriptStrategy</param-name>
        <param-value>DEFAULT</param-value>
    </context-param>	
...
]]></programlisting>
		<para>
			The third possible value is &quot;NONE&quot;. You have no a
			special reason to use it unless you obtain the newest (or
			modified) version of the script and want to include it
			manually in a page header.
		</para>

		<note>
			<title>Note:</title>
			<para>
				If you use
				<property>ALL</property>
				value of Scripts Load Strategy, the JavaScript files
				compression turns off!
			</para>
			<!--programlisting role="XML"><![CDATA[...
				<context-param>
				<param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
				<param-value>false</param-value>
				</context-param>	
				...
				]]></programlisting-->
		</note>

		<para>
			<emphasis role="bold">org.richfaces.LoadStyleStrategy</emphasis>
		</para>

		<para>
			The following declaration allows to load only one integrated
			style sheet file.
		</para>
		<programlisting role="XML"><![CDATA[...
    <context-param>
          <param-name>org.richfaces.LoadStyleStrategy</param-name>
          <param-value>ALL</param-value>
    </context-param>
...
]]></programlisting>
		<para>
			The integrated style sheet contains style for all shipped
			components. The skinnability feature still works.
		</para>
		<para>
			The &quot;DEFAULT&quot; value is a classical on-demand
			variant.
		</para>
		<para>
			The &quot;NONE&quot; stops loading the styles at all. The
			earlier introduced plain skin resets all color and font
			parameters to null. The &quot;NONE&quot; value for
			<code>org.richfaces.LoadStyleStrategy</code>
			means that predefined styles for RichFaces are not used.
		</para>
		<para>
			For more information see
			<ulink
				url="http://www.jboss.com/index.html?module=bb&amp;op=viewtopic&amp;p=4114033">
				RichFaces User Forum
			</ulink>
			.
		</para>
	</section>

	<section id="RequestErrorsAndSessionExpirationHandling">
		<?dbhtml filename="RequestErrorsAndSessionExpirationHandling.html"?>
		<title>Request Errors and Session Expiration Handling</title>
		<para>
			RichFaces allows to redefine standard handlers responsible
			for processing of different exceptional situations. It helps
			to define own JavaScript, which is executed when these
			situations occur.
		</para>
		<section id="RequestErrorsHandling">
			<?dbhtml filename="RequestErrorsHandling.html"?>
			<title>Request Errors Handling</title>
			<para>
				To execute your own code on the client in case of an
				error during Ajax request, it&apos;s necessary to
				redefine the standard
				<code>&quot;A4J.AJAX.onError&quot;</code>
				method:
			</para>
			<programlisting role="JAVA"><![CDATA[A4J.AJAX.onError = function(req,status,message) { 
          // Custom Developer Code 
};]]></programlisting>
			<para>
				The function defined this way accepts as parameters:
			</para>
			<itemizedlist>
				<listitem>
					<para>
						<code>req</code>
						- a params string of a request that calls an
						error
					</para>
				</listitem>
				<listitem>
					<para>
						<code>status</code>
						- the number of an error returned by the server
					</para>
				</listitem>
				<listitem>
					<para>
						<code>message</code>
						- a default message for the given error
					</para>
				</listitem>
			</itemizedlist>
			<para>
				Thus, it&apos;s possible to create your own handler that
				is called on timeouts, inner server errors, and etc.
			</para>
		</section>
		<section id="SessionExpiredHandling">
			<?dbhtml filename="SessionExpiredHandling.html"?>
			<title>Session Expired Handling</title>
			<para>
				It&apos;s possible to redefine also the
				<emphasis>
					<property>&quot;onExpired&quot;</property>
				</emphasis> 
				framework method that is called on the 
				<emphasis>
					<property>&quot;Session Expiration&quot;</property>
				</emphasis>
				event.
			</para>

			<para>
				<emphasis role="bold">Example:</emphasis>
			</para>

			<programlisting role="JAVA"><![CDATA[A4J.AJAX.onExpired = function(loc,expiredMsg){ 
          // Custom Developer Code 
};
]]></programlisting>

			<para>Here the function receives in params:</para>
			<itemizedlist>
				<listitem>
					<para>
						<code>
							loc
						</code> - URL of the current page (on demand can be
						updated)
					</para>
				</listitem>
				<listitem>
					<para>
						<code>
							expiredMsg
						</code>- a default message on
						<emphasis>
							<property>
								&quot;Session Expiration&quot;
							</property>
						</emphasis>
						event.
					</para>
				</listitem>
			</itemizedlist>
			<!--note>
				<title>Note:</title>
				Until the version 1.0.5 the method can&apos;t be redefined on <emphasis >
				<property>&quot;Session Expiration&quot;</property>,
				</emphasis> a confirmation dialog with a request for view reloading was always called.
				</note-->
		</section>
	</section>



	<section id="Skinnability">
		<?dbhtml filename="Skinnability.html"?>
		<title>Skinnability</title>

		<section id="WhySkinnability">
			<?dbhtml filename="WhySkinnability.html"?>
			<title>Why Skinnability</title>

			<para>
				If you have a look at a CSS file in an enterprise
				application, for example, the one you&apos;re working on
				now, you&apos;ll see how often the same color is noted
				in it. Standard CSS has no way to define a particular
				color abstractly for defining as a panel header color, a
				background color of an active pop-up menu item, a
				separator color, etc. To define common interface styles,
				you have to copy the same values over and over again and
				the more interface elements you have the more
				copy-and-paste activity that needs to be performed.
			</para>

			<para>
				Hence, if you want to change the application palette,
				you have to change all interrelating values, otherwise
				your interface can appear a bit clumsy. The chances of
				such an interface coming about is very high, as CSS
				editing usually becomes the duty of a general developer
				who doesn&apos;t necessarily have much knowledge of user
				interface design.
			</para>

			<para>
				Moreover, if a customer wishes to have an interface
				look-and-feel that can be adjusted on-the-fly by an end
				user, your work is multiplied, as you have to deal with
				several CSS files variants, each of which contains the
				same values repeated numerous times.
			</para>

			<para>
				These problems can be solved with the
				<property>skinnability</property>
				system built into the RichFaces project and realized
				fully in RichFaces. Every named skin has some
				skin-parameters for the definition of a palette and the
				other parameters of the user interface. By changing just
				a few parameters, you can alter the appearance of dozens
				of components in an application in a synchronized
				fashion without messing up user interface consistency.
			</para>

			<para>
				The
				<property>skinnability</property>
				feature can&apos;t completely replace standard CSS and
				certainly doesn&apos;t eliminate its usage.
				<property>Skinnability</property>
				is a high-level extension of standard CSS, which can be
				used together with regular CSS declarations. You can
				also refer to skin parameters in CSS via JSF Expression
				Language. You have the complete ability to synchronize
				the appearance of all the elements in your pages.
			</para>
		</section>

		<section id="UsingSkinnability">
			<?dbhtml filename="UsingSkinnability.html"?>
			<title>Using Skinnability</title>

			<para>
				RichFaces
				<property>skinnability</property>
				is designed for mixed usage with:
			</para>

			<itemizedlist>
				<listitem>
					<para>
						Skin parameters defined in the RichFaces
						framework
					</para>
				</listitem>

				<listitem>
					<para>Predefined CSS classes for components</para>
				</listitem>

				<listitem>
					<para>User style classes</para>
				</listitem>
			</itemizedlist>

			<para>
				The color scheme of the component can be applied to its
				elements using any of three style classes:
			</para>

			<itemizedlist>
				<listitem>
					<para>
						A default style class inserted into the
						framework
					</para>

					<para>
						This contains style parameters linked to some
						constants from a skin. It is defined for every
						component and specifies a default representation
						level. Thus, an application interface could be
						modified by changing the values of skin
						parameters.
					</para>
				</listitem>

				<listitem>
					<para>A style class of skin extension</para>

					<para>
						This class name is defined for every component
						element and inserted into the framework to allow
						defining a class with the same name into its CSS
						files. Hence, the appearance of all components
						that use this class is extended.
					</para>
				</listitem>

				<listitem>
					<para>User style class</para>

					<para>
						It&apos;s possible to use one of the styleClass
						parameters for component elements and define
						your own class in it. As a result, the
						appearance of one particular component is
						changed according to a CSS style parameter
						specified in the class.
					</para>
				</listitem>
			</itemizedlist>
		</section>

		<section id="Example">
			<title>Example</title>

			<para>Here is a simple panel component:</para>


			<para>
				<emphasis role="bold">Example:</emphasis>
			</para>
			<programlisting role="XML">
				&lt;rich:panel&gt; ... &lt;/rich:panel&gt;
			</programlisting>

			<para>
				The code generates a panel component on a page, which
				consists of two elements: a wrapper
				<emphasis role="bold">
					<property>&lt;div&gt;</property>
				</emphasis>
				element and a
				<emphasis role="bold">
					<property>&lt;div&gt;</property>
				</emphasis>
				element for the panel body with the particular style
				properties. The wrapper
				<emphasis role="bold">
					<property>&lt;div&gt;</property>
				</emphasis>
				element looks like:
			</para>


			<para>
				<emphasis role="bold">Example:</emphasis>
			</para>
			<programlisting role="XML">
				&lt;div class="dr-pnl rich-panel"&gt; ... &lt;/div&gt;
			</programlisting>

			<para>
				dr-pnl is a CSS class specified in the framework via
				skin parameters:
			</para>

			<itemizedlist>
				<listitem>
					<para>
						<property>background-color</property>
						is defined with
						<property>generalBackgroundColor</property>
					</para>
				</listitem>

				<listitem>
					<para>
						<property>border-color</property>
						is defined with
						<property>panelBorderColor</property>
					</para>
				</listitem>
			</itemizedlist>

			<para>
				It&apos;s possible to change all colors for all panels
				on all pages by changing these skin parameters.
			</para>

			<para>
				However, if a
				<emphasis role="bold">
					<property>&lt;rich:panel&gt;</property>
				</emphasis>
				class is specified somewhere on the page, its parameters
				are also acquired by all panels on this page.
			</para>

			<para>
				A developer may also change the style properties for a
				particular panel. The following definition:
			</para>


			<para>
				<emphasis role="bold">Example:</emphasis>
			</para>
			<programlisting role="XML">
				&lt;rich:panel styleClass="customClass"&gt; ...
				&lt;/rich:panel&gt;
			</programlisting>

			<para>
				Could add some style properties from customClass to one
				particular panel, as a result we get three styles:
			</para>


			<para>
				<emphasis role="bold">Example:</emphasis>
			</para>
			<programlisting role="XML">
				&lt;div class="dr_pnl rich-panel customClass"&gt; ...
				&lt;/div&gt;
			</programlisting>
		</section>

		<section id="SkinParametersTablesInRichFaces">
			<?dbhtml filename="SkinParametersTablesInRichFaces.html"?>

			<title>Skin Parameters Tables in RichFaces</title>

			<para>
				RichFaces provides eight predefined skin parameters
				(skins) at the simplest level of common customization:
			</para>

			<itemizedlist>
				<listitem>
					<para>DEFAULT</para>
				</listitem>

				<listitem>
					<para>plain</para>
				</listitem>

				<listitem>
					<para>emeraldTown</para>
				</listitem>

				<listitem>
					<para>blueSky</para>
				</listitem>

				<listitem>
					<para>wine</para>
				</listitem>

				<listitem>
					<para>japanCherry</para>
				</listitem>

				<listitem>
					<para>ruby</para>
				</listitem>

				<listitem>
					<para>classic</para>
				</listitem>

				<listitem>
					<para>deepMarine</para>
				</listitem>
			</itemizedlist>

			<para>
				To plug one in, it&apos;s necessary to specify a skin
				name in the
				<code>org.richfaces.SKIN</code>
				context-param.
			</para>

			<para>
				Here is an example of a table with values for one of the
				main skins,
				<property>&quot;blueSky&quot;</property>
				.
			</para>

			<table>
				<title>Colors</title>

				<tgroup cols="2">
					<thead>
						<row>
							<entry>Parameter name</entry>

							<entry>Default value</entry>
						</row>
					</thead>

					<tbody>
						<row>
							<entry>headerBackgroundColor</entry>

							<entry>#BED6F8</entry>
						</row>

						<row>
							<entry>headerGradientColor</entry>

							<entry>#F2F7FF</entry>
						</row>

						<row>
							<entry>headTextColor</entry>

							<entry>#000000</entry>
						</row>

						<row>
							<entry>headerWeightFont</entry>

							<entry>bold</entry>
						</row>

						<row>
							<entry>generalBackgroundColor</entry>

							<entry>#FFFFFF</entry>
						</row>

						<row>
							<entry>generalTextColor</entry>

							<entry>#000000</entry>
						</row>

						<row>
							<entry>generalSizeFont</entry>

							<entry>11px</entry>
						</row>

						<row>
							<entry>generalFamilyFont</entry>

							<entry>Arial, Verdana, sans-serif</entry>
						</row>

						<row>
							<entry>controlTextColor</entry>

							<entry>#000000</entry>
						</row>

						<row>
							<entry>controlBackgroundColor</entry>

							<entry>#ffffff</entry>
						</row>

						<row>
							<entry>additionalBackgroundColor</entry>

							<entry>#ECF4FE</entry>
						</row>

						<row>
							<entry>shadowBackgroundColor</entry>

							<entry>#000000</entry>
						</row>

						<row>
							<entry>shadowOpacity</entry>

							<entry>1</entry>
						</row>

						<row>
							<entry>panelBorderColor</entry>

							<entry>#BED6F8</entry>
						</row>

						<row>
							<entry>subBorderColor</entry>

							<entry>#ffffff</entry>
						</row>

						<row>
							<entry>tabBackgroundColor</entry>

							<entry>#C6DEFF</entry>
						</row>

						<row>
							<entry>tabDisabledTextColor</entry>

							<entry>#8DB7F3</entry>
						</row>

						<row>
							<entry>trimColor</entry>

							<entry>#D6E6FB</entry>
						</row>

						<row>
							<entry>tipBackgroundColor</entry>

							<entry>#FAE6B0</entry>
						</row>

						<row>
							<entry>tipBorderColor</entry>

							<entry>#E5973E</entry>
						</row>

						<row>
							<entry>selectControlColor</entry>

							<entry>#E79A00</entry>
						</row>

						<row>
							<entry>generalLinkColor</entry>

							<entry>#0078D0</entry>
						</row>

						<row>
							<entry>hoverLinkColor</entry>

							<entry>#0090FF</entry>
						</row>

						<row>
							<entry>visitedLinkColor</entry>

							<entry>#0090FF</entry>
						</row>
					</tbody>
				</tgroup>
			</table>

			<table>
				<title>Fonts</title>

				<tgroup cols="2">
					<thead>
						<row>
							<entry>Parameter name</entry>

							<entry>Default value</entry>
						</row>
					</thead>

					<tbody>
						<row>
							<entry>headerSizeFont</entry>

							<entry>11px</entry>
						</row>

						<row>
							<entry>headerFamilyFont</entry>

							<entry>Arial, Verdana, sans-serif</entry>
						</row>

						<row>
							<entry>tabSizeFont</entry>

							<entry>11px</entry>
						</row>

						<row>
							<entry>tabFamilyFont</entry>

							<entry>Arial, Verdana, sans-serif</entry>
						</row>

						<row>
							<entry>buttonSizeFont</entry>

							<entry>11px</entry>
						</row>

						<row>
							<entry>buttonFamilyFont</entry>

							<entry>Arial, Verdana, sans-serif</entry>
						</row>

						<row>
							<entry>tableBackgroundColor</entry>

							<entry>#FFFFFF</entry>
						</row>

						<row>
							<entry>tableFooterBackgroundColor</entry>

							<entry>#cccccc</entry>
						</row>

						<row>
							<entry>tableSubfooterBackgroundColor</entry>

							<entry>#f1f1f1</entry>
						</row>

						<row>
							<entry>tableBorderColor</entry>

							<entry>#C0C0C0</entry>
						</row>
					</tbody>
				</tgroup>
			</table>

			<para>
				Skin "plain" was added from 3.0.2 version. It doesn't
				have any parameters. It&apos;s necessary for embedding
				RichFaces components into existing projecst which have
				its own styles.
			</para>

			<para>
				To get detailed information on particular parameter
				possibilities, see the
				<link linkend="RichFacesComponentsLibrary">
					chapter
				</link>
				where each component has skin parameters described
				corresponding to its elements.
			</para>
		</section>

		<section id="CreatingAndUsingYourOwnSkinFile">
			<?dbhtml filename="CreatingAndUsingYourOwnSkinFile.html"?>
			<title>Creating and Using Your Own Skin File</title>

			<para>
				In order to create your own skin file, do the following:
			</para>

			<itemizedlist>
				<listitem>
					<para>
						Create a file and define in it skin constants
						which are used by style classes (see section
						<link
							linkend="SkinParametersTablesInRichFaces">
							&quot;Skin Parameters Tables in
							RichFaces&quot;
						</link>
						). The name of skin file should correspond to
						the following format:
						<code>&lt;name&gt;.skin.properties</code>
						. As an example of such file you can see
						RichFaces predefined skin parameters (skins):
						blueSky, classic, deepMarine, etc. These files
						are located in the
						<code>richfaces-impl-xxxxx.jar</code>
						inside the /META-INF/skins folder.
					</para>
				</listitem>

				<listitem>
					<para>
						Add a skin definition <code>&lt;contex-param&gt;</code> to
						the web.xml of your application. An example is
						placed below:
					</para>
					<para>
						<emphasis role="bold">Example:</emphasis>
					</para>
					<programlisting role="XML"><![CDATA[...
    <context-param> 
        <param-name>org.richfaces.SKIN</param-name> 
        <param-value>name</param-value> 
    </context-param>
...
]]></programlisting>
				</listitem>

				<listitem>
					<para>
						Put your
						<code>&lt;name&gt;.skin.properties</code>
						file in one of the following classpath elements:
						META-INF/skins/ or classpath folder (e.g.
						WEB-INF/classes).
					</para>
				</listitem>
			</itemizedlist>
		</section>
		<section id="BiuldInSkinnability">
			<title>Built-in skinnability in RichFaces</title>
			<para>
				RichFaces gives an opportunity to incorporate
				<property>skinnability</property>
				into UI design. With this framework you can easily use
				named skin parameters in properties files to control the
				appearance of the skins that are applied consistently to
				a whole set of components. You can look at examples of
				predefined skins at:
			</para>
			<simplelist>
				<member>
					<ulink
						url="http://livedemo.exadel.com/richfaces-demo/">
						http://livedemo.exadel.com/richfaces-demo/
					</ulink>
				</member>
			</simplelist>
			<para>
				You may simply control the look-and-feel of your
				application by using the
				<property>skinnability</property>
				service of the RichFaces framework. With the means of
				this service you can define the same style for rendering
				standard JSF components and custom JSF components built
				with the help of RichFaces.
			</para>
			<para>
				To find out more on
				<property>skinnability</property>
				possibilities, follow these steps:
			</para>
			<itemizedlist>
				<listitem>
					<para>
						Create a custom render kit and register it in
						the faces-config.xml like this:
					</para>
					<programlisting role="XML"><![CDATA[<render-kit>
        <render-kit-id>NEW_SKIN</render-kit-id>
        <render-kit-class> 
            org.ajax4jsf.framework.renderer.ChameleonRenderKitImpl
        </render-kit-class>
</render-kit>]]></programlisting>
				</listitem>
				<listitem>
					<para>
						Then you need to create and register custom
						renderers for the component based on the
						look-and-feel predefined variables:
					</para>
					<programlisting role="XML"><![CDATA[<renderer>
        <component-family>javax.faces.Command</component-family> 
        <renderer-type>javax.faces.Link</renderer-type> 
        <renderer-class>
           newskin.HtmlCommandLinkRenderer
        </renderer-class> 
</renderer>]]></programlisting>
				</listitem>
				<listitem>
					<para>
						Finally, you need to place a properties file
						with skin parameters into the class path root.
						There are two requirements for the properties
						file:
					</para>
					<itemizedlist>
						<listitem>
							<para>
								The file must be named
								<code>&lt;skinName&gt;.skin.properties</code>
								, in this case, it would be called
								<code>newskin.skin.properties</code>
								.
							</para>
						</listitem>
						<listitem>
							<para>
								The first line in this file should be
								<code>
									render.kit=&lt;render-kit-id&gt;
								</code>
								in this case, it would be called
								<code>render.kit=NEW_SKIN</code>
								.
							</para>
						</listitem>
					</itemizedlist>
				</listitem>
			</itemizedlist>
			<para>
				Extra information on custom renderers creation can be
				found at:
			</para>
			<simplelist>
				<member>
					<ulink
						url="http://java.sun.com/javaee/javaserverfaces/reference/docs/index.html">
						http://java.sun.com/javaee/javaserverfaces/reference/docs/index.html
					</ulink>
				</member>
			</simplelist>
		</section>

		<section id="StControlsSkinning">
			<title>Standard controls skinning</title>
			<para>
				The feature is designed to unify the look and feel of
				standard HTML element and RichFaces components. Skinning
				can be applied to all controls on a page basing on
				elements&apos; name and attribute type (where
				applicable). Also this feature provides a set of CSS
				styles so that skinning can be applied assigning rich-*
				classes to particular elements or to container of
				elements that nests controls.
			</para>
			<para>
				Standard controls skinning feature provides 2 levels of
				skinning - standard and extended, while skinning is
				based on detecting browser user agent. If user agent is
				not detected, Advanced level is used.
			</para>
			<itemizedlist>
				<listitem>
					<para>
						<emphasis>
							<property>Standard</property>
						</emphasis>
						provides customization only basic style
						properties.
					</para>
					<para>
						To the following browsers Basic level of
						skinning is applied:
					</para>
					<itemizedlist>
						<listitem>
							<para>Internet Explorer 6</para>
						</listitem>
						<listitem>
							<para>
								Internet Explorer 7 in BackCompat mode
								(see
								<ulink
									url="http://msdn2.microsoft.com/en-us/library/ms533687(VS.85).aspx">
									document.compatMode property in MSDN
								</ulink>
								)
							</para>
						</listitem>
						<listitem>
							<para>Opera</para>
						</listitem>
						<listitem>
							<para>Safari</para>
						</listitem>
					</itemizedlist>
				</listitem>
				<listitem>
					<para>
						<emphasis>
							<property>Extended</property>
						</emphasis>
						extends basic level introducing broader number
						of style properties and is applied to browsers
						with rich visual styling capability of controls
					</para>
					<para>
						The following browsers support Advanced level of
						skinning:
					</para>
					<itemizedlist>
						<listitem>
							<para>Mozilla Firefox</para>
						</listitem>
						<listitem>
							<para>
								Internet Explorer 7 in
								Standards-compliant mode (CSS1Compat
								mode)
							</para>
						</listitem>
					</itemizedlist>

				</listitem>
			</itemizedlist>
			<para>
				These are the elements that affected by skinning:
			</para>
			<itemizedlist>
				<listitem>
					<para>
						<property>input</property>
					</para>
				</listitem>
				<listitem>
					<para>
						<property>select</property>
					</para>
				</listitem>
				<listitem>
					<para>
						<property>textarea</property>
					</para>
				</listitem>
				<listitem>
					<para>
						<property>keygen</property>
					</para>
				</listitem>
				<listitem>
					<para>
						<property>isindex</property>
					</para>
				</listitem>
				<listitem>
					<para>
						<property>legend</property>
					</para>
				</listitem>
				<listitem>
					<para>
						<property>fieldset</property>
					</para>
				</listitem>
				<listitem>
					<para>
						<property>hr</property>
					</para>
				</listitem>
				<listitem>
					<para>
						<property>
							a (together with a:hover, a:visited
							&quot;pseudo&quot;-elements)
						</property>
					</para>
				</listitem>
			</itemizedlist>
			<para>Skinning can be initialized in two ways:</para>
			<itemizedlist>
				<listitem>
					<para>
						adding
						<code>org.richfaces.CONTROL_SKINNING</code>
						parmeter to web.xml. Values: &quot;enable&quot;
						and &quot;disable&quot;. This way implies that
						skinning style classes are applied to elements
						by element name and type attribute (where
						applicable). No additional steps required from
						an application developer. Please find below the
						table that contains the list of element to which
						skinning a applicable.
					</para>
				</listitem>
				<listitem>
					<para>
						adding
						<code>
							org.richfaces.CONTROL_SKINNING_CLASSES
						</code>
						parameter to web.xml file. Possible values
						&quot;enable&quot; and &quot;disable&quot;.
						Implementation of this method implies the
						provision of several style classes for different
						types of elements. The style classes have
						predefined names. Application developer should
						manually assign classes to controls that needs
						skinning or assign class to an element that
						contains controls.
					</para>
				</listitem>
			</itemizedlist>
			<para>
				By setting
				<code>org.richfaces.CONTROL_SKINNING_CLASSES</code>
				to &quot;enable&quot; you are provided with style
				classes applicable to:
			</para>
			<itemizedlist>
				<listitem>
					<para>
						Basic elements nested inside element having
						rich-container class, e.g.:
					</para>
					<para>
						<emphasis role="bold">Example:</emphasis>
					</para>
					<programlisting role="CSS"><![CDATA[...
.rich-container select {
   //class content
}
...]]></programlisting>
				</listitem>
				<listitem>
					<para>
						Elements that have class name corresponding to
						one of the basic elements name/type mapped by
						the following scheme
						<code>
							rich-&lt;elementName&gt;[-&lt;elementType&gt;]
						</code>
						. See the example:
					</para>
					<para>
						<emphasis role="bold">Example:</emphasis>
					</para>
					<programlisting role="CSS"><![CDATA[...
.rich-select {
  //class content
}

.rich-input-text {
  //class content
}

...]]></programlisting>

					<note>
						<title>Note:</title>
						<para>
							a elements have classes based on
							&quot;link&quot; and pseudo class name,
							e.g.: rich-link, rich-link-hover,
							rich-link-visited
						</para>
					</note>
				</listitem>
			</itemizedlist>
			<para>
				Additionally, the predefined rich CSS classes that we
				provide can be used not only as classes for basic HTML
				elements but also as classes for creation of complex
				elements .
			</para>
			<para>
				There is a snippet with some of them for example:
			</para>
			<programlisting role="XML"><![CDATA[...
<u:selector name=".rich-box-bgcolor-header">
    <u:style name="background-color" skin="headerBackgroundColor" />
</u:selector>
<u:selector name=".rich-box-bgcolor-general">
   <u:style name="background-color" skin="generalBackgroundColor" />
</u:selector>
...

//gradient elements
...
<u:selector name=".rich-gradient-menu">
    <u:style name="background-image">
        <f:resource f:key="org.richfaces.renderkit.html.gradientimages.MenuGradientImage"/>
    </u:style>
    <u:style name="background-repeat" value="repeat-x" />
</u:selector>

<u:selector name=".rich-gradient-tab">
    <u:style name="background-image">
        <f:resource f:key="org.richfaces.renderkit.html.gradientimages.TabGradientImage"/>
    </u:style>
    <u:style name="background-repeat" value="repeat-x" />
</u:selector>
...]]></programlisting>
			<para>
				To get a better idea of standard component skinning we
				recommend to explore CSS files located in
				ui/core/src/main/resources/org/richfaces/ folder of
				RichFaces svn.
			</para>
			<section id="Standard" role="NotInToc">
				<title>Standard level</title>
				<table>
					<title>
						Html Elements Skin Bindings for input, select,
						textarea, button, keygen, isindex, legend
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>font-size</entry>
								<entry>generalSizeFont</entry>
							</row>
							<row>
								<entry>font-family</entry>
								<entry>generalFamilyFont</entry>
							</row>
							<row>
								<entry>color</entry>
								<entry>controlTextColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Html Elements Skin Bindings for fieldset
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>Html Elements Skin Bindings for hr</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>Html Elements Skin Bindings for a</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>color</entry>
								<entry>generalLinkColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Html Elements Skin Bindings for a:hover
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>color</entry>
								<entry>
									hoverLinkColorgeneralLinkColor
								</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Html Elements Skin Bindings for a:visited
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>color</entry>
								<entry>visitedLinkColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Rich Elements Skin Bindings for .rich-input,
						.rich-select, .rich-textarea, 
						.rich-keygen, .rich-isindex,
						.rich-link
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>font-size</entry>
								<entry>generalSizeFont</entry>
							</row>
							<row>
								<entry>font-family</entry>
								<entry>generalFamilyFont</entry>
							</row>
							<row>
								<entry>color</entry>
								<entry>controlTextColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Rich Elements Skin Bindings for .rich-fieldset
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Rich Elements Skin Bindings for .rich-hr
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters/Value</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
							<row>
								<entry>border-width</entry>
								<entry>1px</entry>
							</row>
							<row>
								<entry>border-style</entry>
								<entry>solid</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Rich Elements Skin Bindings for .rich-link
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>color</entry>
								<entry>generalLinkColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Rich Elements Skin Bindings for .rich-link:hover
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>color</entry>
								<entry>hoverLinkColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Rich Elements Skin Bindings for
						.rich-link:visited
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>color</entry>
								<entry>visitedLinkColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Rich Elements Skin Bindings for
						.rich-field
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters/Value</entry>
							</row>
						</thead>
						<tbody>
							
							
							<row>
								<entry>border-width</entry>
								<entry>1px</entry>
							</row>
							<row>
								<entry>border-style</entry>
								<entry>inset</entry>
							</row>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
							
							<row>
								<entry>background-color</entry>
								<entry>controlBackgroundColor</entry>
							</row>
							
							<row>
								<entry>background-repeat</entry>
								<entry>no-repeat</entry>
							</row>
							
							<row>
								<entry>background-position</entry>
								<entry>1px 1px</entry>
							</row>
							
							
							
							
						</tbody>
					</tgroup>
				</table>
				
				
				
				<table>
					<title>
						Rich Elements Skin Bindings for
						.rich-field-edit
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters/Value</entry>
							</row>
						</thead>
						<tbody>
							
							
							<row>
								<entry>border-width</entry>
								<entry>1px</entry>
							</row>
							<row>
								<entry>border-style</entry>
								<entry>inset</entry>
							</row>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
							
							
							<row>
								<entry>background-color</entry>
								<entry>editBackgroundColor</entry>
							</row>
							
							
							
						</tbody>
					</tgroup>
				</table>
				
				
				<table>
					<title>
						Rich Elements Skin Bindings for
						.rich-field-error
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameter/Value</entry>
							</row>
						</thead>
						<tbody>
							
							
							<row>
								<entry>border-width</entry>
								<entry>1px</entry>
							</row>
							<row>
								<entry>border-style</entry>
								<entry>inset</entry>
							</row>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
							
							
							<row>
								<entry>background-color</entry>
								<entry>warningBackgroundColor</entry>
							</row>
							
							<row>
								<entry>background-repeat</entry>
								<entry>no-repeat</entry>
							</row>
							
							
							<row>
								<entry>background-position</entry>
								<entry>center left</entry>
							</row>
							
							
							<row>
								<entry>padding-left</entry>
								<entry>7px</entry>
							</row>
							
						</tbody>
					</tgroup>
				</table>
				
				
				
				
				
				
				<table>
					<title>
						Rich Elements Skin Bindings for
						.rich-button, .rich-button-disabled, .rich-button-over
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameter/Value</entry>
							</row>
						</thead>
						<tbody>
							
							
							<row>
								<entry>border-width</entry>
								<entry>1px</entry>
							</row>
							<row>
								<entry>border-style</entry>
								<entry>solid</entry>
							</row>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
							
							
							<row>
								<entry>background-color</entry>
								<entry>trimColor</entry>
							</row>
							
							<row>
								<entry>padding</entry>
								<entry>2px 10px 2px 10px</entry>
							</row>
							
							
							<row>
								<entry>text-align</entry>
								<entry>center</entry>
							</row>
							
							
							<row>
								<entry>cursor</entry>
								<entry>pointer</entry>
							</row>
							<row>
								<entry>background-repeat</entry>
								<entry>repeat-x</entry>
							</row>	<row>
								<entry>background-position</entry>
								<entry>top left</entry>
							</row>	
							
					
						</tbody>
					</tgroup>
				</table>
				
				
				
				
				
				
				<table>
					<title>
						Rich Elements Skin Bindings for
						.rich-button-press
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameter/Value</entry>
							</row>
						</thead>
						<tbody>
												
							<row>
								<entry>background-position</entry>
								<entry>bottom left</entry>
							</row>
													
						</tbody>
					</tgroup>
				</table>
				
				
				
				
				
				
				<table>
					<title>
						Rich Elements Skin Bindings for
						.rich-container fieldset, .rich-fieldset
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters/Value</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
							
							
							<row>
								<entry>border-width</entry>
								<entry>1px</entry>
							</row>
							
							
							<row>
								<entry>border-style</entry>
								<entry>solid</entry>
							</row>
							
							
							<row>
								<entry>padding</entry>
								<entry>10px</entry>
							</row>
							
							
							<row>
								<entry>padding</entry>
								<entry>10px</entry>
							</row>
							
							
						</tbody>
					</tgroup>
				</table>
				
				
				
				<table>
					<title>
						Rich Elements Skin Bindings for
						.rich-legend
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameter/Value</entry>
							</row>
						</thead>
						<tbody>
							
							<row>
								<entry>font-size</entry>
								<entry>generalSizeFont</entry>
							</row>
							<row>
								<entry>font-family</entry>
								<entry>generalFamilyFont</entry>
							</row>
							<row>
								<entry>color</entry>
								<entry>controlTextColor</entry>
							</row>
							
							
							<row>
								<entry>font-weight</entry>
								<entry>bold</entry>
							</row>
							
							
							
						</tbody>
					</tgroup>
				</table>
				
				
				
				
				
				
				<table>
					<title>
						Rich Elements Skin Bindings for
						.rich-form
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS Properties</entry>
								<entry>Skin parameters/Value</entry>
							</row>
						</thead>
						<tbody>
							
							<row>
								<entry>padding</entry>
								<entry>0px</entry>
							</row>
							<row>
								<entry>margin</entry>
								<entry>0px</entry>
							</row>
					
							
							
							
						</tbody>
					</tgroup>
				</table>

			</section>


			<section id="AdvancedLevel" role="NotInToc">
				<?dbhtml filename="AdvancedLevel.html"?>
				<title>Extended level</title>
				<table>
					<title>
						Html Elements Skin Bindings for input, select,
						textarea, button, keygen, isindex
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS properties</entry>
								<entry>Skin parameters/Value</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>border-width</entry>
								<entry>1px</entry>
							</row>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
							<row>
								<entry>color</entry>
								<entry>controlTextColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Html Elements Skin Bindings for *|button
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
							<row>
								<entry>font-size</entry>
								<entry>generalSizeFont</entry>
							</row>
							<row>
								<entry>font-family</entry>
								<entry>generalFamilyFont</entry>
							</row>
							<row>
								<entry>color</entry>
								<entry>headerTextColor</entry>
							</row>
							<row>
								<entry>background-color</entry>
								<entry>headerBackgroundColor</entry>
							</row>
							<row>
								<entry>background-image</entry>
								<entry>
									org.richfaces.renderkit.html.images.ButtonBackgroundImage
								</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Html Elements Skin Bindings for
						button[type=button], button[type=reset],
						button[type=submit], input[type=reset],
						input[type=submit], input[type=button]
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
							<row>
								<entry>font-size</entry>
								<entry>generalSizeFont</entry>
							</row>
							<row>
								<entry>font-family</entry>
								<entry>generalFamilyFont</entry>
							</row>
							<row>
								<entry>color</entry>
								<entry>headerTextColor</entry>
							</row>
							<row>
								<entry>background-color</entry>
								<entry>headerBackgroundColor</entry>
							</row>
							<row>
								<entry>background-image</entry>
								<entry>
									org.richfaces.renderkit.html.images.ButtonBackgroundImage
								</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Html Elements Skin Bindings for
						*|button[disabled], .rich-container
						*|button[disabled], .rich-button-disabled
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>color</entry>
								<entry>tabDisabledTextColor</entry>
							</row>
							<row>
								<entry>border-color</entry>
								<entry>
									tableFooterBackgroundColor
								</entry>
							</row>
							<row>
								<entry>background-color</entry>
								<entry>
									tableFooterBackgroundColor
								</entry>
							</row>
							<row>
								<entry>background-image</entry>
								<entry>
									org.richfaces.renderkit.html.images.ButtonDisabledBackgroundImage
								</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Html Elements Skin Bindings for
						.rich-button-disabled, .rich-container
						button[type=&quot;button&quot;][disabled],
						.rich-button-button-disabled, .rich-container
						button[type=&quot;reset&quot;][disabled],
						.rich-button-reset-disabled, .rich-container
						button[type=&quot;submit&quot;][disabled],
						.rich-button-submit-disabled, .rich-container
						input[type=&quot;reset&quot;][disabled],
						.rich-input-reset-disabled, .rich-container
						input[type=&quot;submit&quot;][disabled],
						.rich-input-submit-disabled, .rich-container
						input[type=&quot;button&quot;][disabled],
						.rich-input-button-disabled
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>color</entry>
								<entry>tabDisabledTextColor</entry>
							</row>
							<row>
								<entry>background-color</entry>
								<entry>
									tableFooterBackgroundColor
								</entry>
							</row>
							<row>
								<entry>border-color</entry>
								<entry>
									tableFooterBackgroundColor
								</entry>
							</row>
							<row>
								<entry>background-image</entry>
								<entry>
									org.richfaces.renderkit.html.images.ButtonDisabledBackgroundImage
								</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Html Elements Skin Bindings for
						*button[type=&quot;button&quot;][disabled],
						button[type=&quot;reset&quot;][disabled],
						button[type=&quot;submit&quot;][disabled],
						input[type=&quot;reset&quot;][disabled],
						input[type=&quot;submit&quot;][disabled],
						input[type=&quot;button&quot;][disabled]
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>color</entry>
								<entry>tabDisabledTextColor</entry>
							</row>
							<row>
								<entry>border-color</entry>
								<entry>
									tableFooterBackgroundColor
								</entry>
							</row>
							<row>
								<entry>background-color</entry>
								<entry>
									tableFooterBackgroundColor
								</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Html Elements Skin Bindings for *|textarea
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
							<row>
								<entry>font-size</entry>
								<entry>generalSizeFont</entry>
							</row>
							<row>
								<entry>font-family</entry>
								<entry>generalFamilyFont</entry>
							</row>
							<row>
								<entry>color</entry>
								<entry>controlTextColor</entry>
							</row>
							<row>
								<entry>background-color</entry>
								<entry>controlBackgroundColor</entry>
							</row>
							<row>
								<entry>background-image</entry>
								<entry>
									org.richfaces.renderkit.html.images.InputBackgroundImage
								</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Html Elements Skin Bindings for
						textarea[type=textarea], input[type=text],
						input[type=password], select
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>border-color</entry>
								<entry>panelBorderColor</entry>
							</row>
							<row>
								<entry>font-size</entry>
								<entry>generalSizeFont</entry>
							</row>
							<row>
								<entry>font-family</entry>
								<entry>generalFamilyFont</entry>
							</row>
							<row>
								<entry>color</entry>
								<entry>controlTextColor</entry>
							</row>
							<row>
								<entry>background-color</entry>
								<entry>controlBackgroundColor</entry>
							</row>
							<row>
								<entry>background-image</entry>
								<entry>
									org.richfaces.renderkit.html.images.InputBackgroundImage
								</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						Html Elements Skin Bindings for
						*|textarea[disabled], .rich-container
						*|textarea[disabled]
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>color</entry>
								<entry>tableBorderColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						textarea[type=&quot;textarea&quot;][disabled],
						input[type=&quot;text&quot;][disabled],
						input[type=&quot;password&quot;][disabled]
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>color</entry>
								<entry>tableBorderColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
				<table>
					<title>
						textarea[type=&quot;textarea&quot;][disabled],
						input[type=&quot;text&quot;][disabled],
						input[type=&quot;password&quot;][disabled]
					</title>
					<tgroup cols="2">
						<thead>
							<row>
								<entry>CSS properties</entry>
								<entry>Skin parameters</entry>
							</row>
						</thead>
						<tbody>
							<row>
								<entry>color</entry>
								<entry>tableBorderColor</entry>
							</row>
						</tbody>
					</tgroup>
				</table>
			</section>


		</section>
		<section>
			<title>Client-side script for extended skinning support</title>
			
			<para>As it was mentioned earlier in the guide,
				extended skinning of standard HTML controls is applied automatically: 
				the browser type is detected and if a browser doesn&apos;t fully support 
				extended skinning feature, only basic skinning is applied. 
			</para>
			
			<para>
				However, if a develop doesn&apos;t want to
				the rich components and standard HTML 
				controls to be skinned automatically and
				perform the skinnability implementation himself, 
				he might encounter with a problem, i.e. standard 
				HTML controls in such browsers as Opera and Safari are
				affected by standard controls skinning featured. 
				( <link linkend="ScriptsandStylesLoadStrategy">Here</link> you can get more details on how to disable skinnability.)		
			</para>
			
			<para>
				In brief, to disable the skinnability mechanism of RichFaces you need to
				set the &quot;org.richfaces.LoadStyleStrategy&quot; parameter to &quot;NONE&quot; in web.xml. 
				
			</para>
			
			<programlisting role="XML"><![CDATA[...
<context-param>
	<param-name>org.richfaces.LoadStyleStrategy</param-name>
	<param-value>NONE</param-value>
</context-param>
...
]]></programlisting>
			
			<para>
				Additionally, you should include the style sheets that perform skinning 
				of the rich component and standard HTML controls.	
			</para>
			
			<para>
				In order to resolve the problem with extended skinning in Opera and Safari a client script (skinning.js) is added to the RichFaces library. 
				The script detects the browser type and enables extended skinning only for those browsers that fully support it. 	
				
			</para>
			
			<para>
				The script can be activated by inserting this JavaScript code to the page:			
			</para>
			
			<programlisting role="XML"><![CDATA[
<script type="text/javascript">
window.RICH_FACES_EXTENDED_SKINNING_ON = true;
</script>
]]></programlisting>
			
			
			<para>
				You also need to specify &quot;media&quot; attribute in the 
				&lt;link&gt; tag which includes the &quot;extended_both.xcss&quot; style sheet with &quot;rich-extended-skinning&quot;.
				
			</para>
			<para>
				This is how you can include the style sheets to the page,
				in case automatic skinnability implementation is disabled.
				
			</para>
			
			<programlisting role="XML"><![CDATA[
<link href='/YOUR_PROJECT_NAME/a4j_3_2_2-SNAPSHOTorg/richfaces/renderkit/html/css/basic_both.xcss/DATB/eAF7sqpgb-jyGdIAFrMEaw__.jsf' type='text/css' rel='stylesheet' class='component' />
<link media='rich-extended-skinning' href='/ YOUR_PROJECT_NAME /a4j_3_2_2-SNAPSHOTorg/richfaces/renderkit/html/css/extended_both.xcss/DATB/eAF7sqpgb-jyGdIAFrMEaw__.jsf' type='text/css' rel='stylesheet' class='component' />
<link href='/ YOUR_PROJECT_NAME /a4j_3_2_2-SNAPSHOT/org/richfaces/skin.xcss/DATB/eAF7sqpgb-jyGdIAFrMEaw__.jsf' type='text/css' rel='stylesheet' class='component' />
]]></programlisting>
			
			
			
		</section>
		<section id="XCSSfileformat">
			<title>XCSS file format</title>
			<para>
				XCSS files are the core of RichFaces components
				skinnability.
			</para>
			<para>
				XCSS is an XML formatted CSS that adds extra
				functionality to the skinning process
			</para>
			<para>
				XCSS extends skinning possibilities by parsing the XCSS
				file that contains all look-and-feel parameters of a
				particular component into a standard CSS file that a web
				browser can recognize.
			</para>
			<para>
				XCSS file contains CSS properties and skin parameters
				mappings. Mapping of a CSS selector to a skin parameter
				is performed using
				<emphasis role="bold"><property>&lt; u:selector &gt;</property></emphasis>
				and
				<emphasis role="bold"><property>&lt; u:style&gt;</property></emphasis>
				XML tags that form the mapping structure. Please study
				the example below.
			</para>
			<programlisting role="XML"><![CDATA[...
	<u:selector name=".rich-component-name">
		<u:style name="background-color" skin="additionalBackgroundColor" />
		<u:style name="border-color" skin="tableBorderColor" />
		<u:style name="border-width" skin="tableBorderWidth" />
		<u:style name="border-style" value="solid" />
	</u:selector>
...
]]></programlisting>
			<para>
				During processing the code in the shown example will be
				parsed into a standard CSS format.
			</para>
			<programlisting role="CSS"><![CDATA[...
.rich-component-name {
background-color: additionalBackgroundColor; /*the value of the constant defined by your skin*/
border-color: tableBorderColor; /*the value of the constant defined by your skin*/
border-width: tableBorderWidth /*the value of the constant defined by your skin*/
border-style: solid;
}
...
]]></programlisting>
			<para>
				The
				<emphasis><property>&quot;name&quot;</property></emphasis>
				attribute of <emphasis role="bold"><property>&lt;u:selector&gt;</property></emphasis> tag defines the CSS
				selector, while
				<emphasis><property>&quot;name&quot;</property></emphasis>
				attribute of the
				<emphasis role="bold"><property>&lt;u:style&gt;</property></emphasis>
				tag defines what skin constant is mapped to a CSS
				property. The
				<emphasis><property>&quot;value&quot;</property></emphasis>
				attribute of the
				<emphasis role="bold"><property>&lt;u:style&gt;</property></emphasis>
				tag can also be used to assign a value to a CSS
				property.
			</para>
			<para>
				CSS selectors with identical skinning properties can be
				set as a comma separated list.
			</para>
			<programlisting role="XML"><![CDATA[...
<u:selector name=".rich-ordering-control-disabled, .rich-ordering-control-top, .rich-ordering-control-bottom, .rich-ordering-control-up, .rich-ordering-control-down">
		<u:style name="border-color" skin="tableBorderColor" />
</u:selector>
...
]]></programlisting>
		</section>

		<section id="PlugnSkin" role="new">
		<?dbhtml filename="PlugnSkin.html"?>
			<title>Plug-n-Skin</title>

			<para>
				Plug-n-Skin is a feature that gives a developer an opportunity
				to easily create, customize and plug into a project a custom skin. 
				The skin can be created basing on parameters of some predefined RichFaces skin.

			</para>


			<para>
				The feature also provides an option to unify
				the appearance of rich controls with standard HTML elements.
			</para>
			
			<para>
				In order to create your own skin using Plug-n-Skin
				feature, you can follow these step by step instructions.
			</para>




			<para>
				First of all, you need to create a template for the new
				skin. Creation of the template can be performed using
				Maven build and deployment tool. More information on how
				to configure Maven for RichFaces
				<ulink
					url="http://wiki.jboss.org/wiki/HowToConfigureMavenForRichFaces">
					here
				</ulink>
				. You can copy and paste these Maven instructions to
				command line and execute them.
			</para>


			<programlisting role="XML"><![CDATA[...
mvn archetype:create 
-DarchetypeGroupId=org.richfaces.cdk 
-DarchetypeArtifactId=maven-archetype-plug-n-skin 
-DarchetypeVersion=RF-VERSION
-DartifactId=ARTIFACT-ID
-DgroupId=GROUP-ID 
-Dversion=VERSION
...
]]></programlisting>
			<para>Primary keys for the command:</para>
			<itemizedlist>
				<listitem>
					<para>
						<code>DarchetypeVersion</code>
						indicates the RichFaces version. For example,
						<code>&quot;3.2.2.BETA5&quot;</code>
					</para>
				</listitem>
				<listitem>
					<para>
						<code>DartifactId</code>
						artifact id of the project
					</para>
				</listitem>
				<listitem>
					<para>
						<code>DgroupId</code>
						group id of the project
					</para>
				</listitem>
				<listitem>
					<para>
						<code>Dversion</code>
						the version of the project you create, by
						default it is <code>&quot;1.0.-SNAPSHOT&quot;</code>
					</para>
				</listitem>
			</itemizedlist>
			<para>
				After this operation, a folder with the name of your
				<code>&quot;ARTIFACT-ID&quot;</code> appears. The folder contains a
				template of Maven project.
			</para>

			<para>
				Next steps will guide you though creating of the skin
				itself.
			</para>



			<para>
				In the root folder of Maven project (the one that
				contains &quot;pom.xml&quot; file) you should run the
				following command in the command line:
			</para>

			<programlisting role="XML"><![CDATA[...
mvn cdk:add-skin -Dname=SKIN-NAME -Dpackage=SKIN-PACKAGE
...
]]></programlisting>


			<para>Primary keys for the command:</para>
			<itemizedlist>

				<listitem>
					<para>
						<code>Dname</code>
						defines the name of the new skin
					</para>
				</listitem>

				<listitem>
					<para>
						<code>Dpackage</code>
						base package of the skin. By default
						&quot;groupId&quot; of the project is used.
					</para>
				</listitem>
			</itemizedlist>

			<para>Additional optional keys for the command:</para>

			<itemizedlist>

				<listitem>

					<para>
						<code>DbaseSkin</code>
						defines the name of the base skin.
					</para>
				</listitem>

				<listitem>
					<para>
						<code>DcreateExt</code>
						if set to &quot;true&quot;, extended CSS classes
						are added. For more information, please, see
						<link linkend="StControlsSkinning">
							&quot;Standard controls skinning&quot;
						</link>
					</para>
				</listitem>
			</itemizedlist>


			<para>
				As a result of the performed operations the following
				files and folders are created:
			</para>

			<itemizedlist>
				<listitem>
					<para>
						<property>BaseImage.java</property>
						- the base class to store images. Location:
						&quot;\src\main\java\SKIN-PACKAGE\SKIN-NAME\images\&quot;
					</para>
				</listitem>
				<listitem>
					<para>
						<property>BaseImageTest.java</property>
						- a test version of a class that stores images.
						Location:
						&quot;\src\test\java\SKIN-PACKAGE\SKIN-NAME\images\&quot;
					</para>
				</listitem>
				<listitem>
					<para>
						<property>XCSS files</property>
						- XCSS files define the new look of RichFaces
						components affected by the new skin. Location:
						&quot;\src\main\resources\SKIN-PACKAGE\SKIN-NAME\css\&quot;
					</para>
				</listitem>
				<listitem>
					<para>
						<property>SKIN-NAME.properties</property>
						- a XCSS file that contains properties of the
						new skin. Location:
						&quot;\src\main\resources\SKIN-PACKAGE\SKIN-NAME\css\&quot;
					</para>
					<para>
						The following properties are used to configure
						the SKIN-NAME.properties file:
					</para>


					<itemizedlist>
						<listitem>
							<para>
								<property>baseSkin</property>
								– the name of the base skin to be used
								as basis. The look of the skin you
								define will be affected by new style
								properties.
							</para>
						</listitem>
						<listitem>
							<para>
								<property>generalStyleSheet</property>
								- a path to the style sheet
								(SKIN-NAME.xcss) that imports style
								sheets of the components to be affected
								by the new skin.
							</para>
						</listitem>
						<listitem>
							<para>
								<property>extendedStyleSheet</property>
								- a path to a style sheet that is used
								to unify the appearance of RichFaces
								components and standard HTML controls.
								For additional information please read
								<link linkend="StControlsSkinning">
									&quot;Standard controls
									skinning&quot;
								</link>
								chapter.
							</para>
						</listitem>
						<listitem>
							<para>
								<property>gradientType</property>
								is a predefined property to set the type
								of gradient applied to the new skin.
								Possible values are glass, plastic,
								plain. More information on gradient
								implementation you can find further in
								this chapter.
							</para>
						</listitem>
					</itemizedlist>
				</listitem>
				<listitem>
					<para>
						<property>SKIN-NAME.xcss</property>
						- a XCSS file that imports XCSS files of the
						components to be affected by the new skin.
						Location:
						&quot;src\main\resources\META-INF\skins &quot;
					</para>
				</listitem>
				<listitem>
					<para>
						<property>XCSS files</property>
						If the command is executed with the
						&quot;DcreateExt&quot; key set to
						&quot;true&quot;,  the XCSS (extended_classes.xcss and extended.xcss) files that define style
						for standard controls will be created. Location:
						&quot;\src\main\resources\SKIN-PACKAGE\SKIN-NAME\css\&quot;.
					</para>
				</listitem>
				<listitem>
					<para>
						<property>SKIN-NAME-ext.xcss</property> /
						
						If the command is executed with the
						&quot;DcreateExt&quot; key set to
						&quot;true&quot;, the configuration
						SKIN-NAME-ext.xcss file that imports XCSS file
						defining styles for the standard controls will
						be created. Location:
						&quot;src\main\resources\META-INF\skins &quot;.
					</para>
				</listitem>
				<listitem>
					<para>
						<property>SKIN-NAME-resources.xml</property>
						- the file contains the description of all
						listed above files. Location:
						&quot;src\main\config\resources &quot;.
					</para>
				</listitem>
			</itemizedlist>

			<para>Now you can start editing the XCSS files 
				located in &quot;\src\main\resources\SKIN-PACKAGE\SKIN-NAME\css\&quot;.  
				New style properties can be assigned to the selectors (the selectors listed in the XCSS files) in two ways, which are both valid, and it&apos;up to the developer what way to choose.  </para>
<itemizedlist>
	<listitem><para>Applying a standard CSS coding approach, i.e. you can add css properties to the given selectors are you normally do while doing CSS coding. 
		The only thing, you have to keep in mind is that the selectors must be inside 
		<code>&lt;f:verbatim&gt; &lt;![CDATA[ ...]]&gt; &lt;/f:verbatim&gt;</code> tags.</para>
	
	
	<para>For example </para>
	
		<programlisting role="XML">
<![CDATA[...
.rich-calendar-cell {
background: #537df8;
}
...
]]></programlisting>
	
	
	
	</listitem>
	
	
	<listitem><para>
		
		Using XCSS coding approach, the same way as XCSS files are normally formed in RichFaces. 
		The XCSS tags have to be placed outside <code>&lt;f:verbatim&gt; &lt;![CDATA[ ...]]&gt; &lt;/f:verbatim&gt;</code> tags.
		
		</para>
	
		<programlisting role="XML">
			<![CDATA[...
<u:selector name=".rich-calendar-cell">
	<u:style name="border-bottom-color" skin="panelBorderColor"/>
	<u:style name="border-right-color" skin="panelBorderColor"/>
	<u:style name="background-color" skin="tableBackgroundColor"/>
	<u:style name="font-size" skin="generalSizeFont"/>
	<u:style name="font-family" skin="generalFamilyFont"/>
</u:selector>
...
]]></programlisting>
		
		
	</listitem>
</itemizedlist>


<para>
	
	
	
	
</para>

			<para>
				Having performed described above steps and edited the XCSS files 
				you can proceed to building the new skin and to plugging it into the project. 
				Building the new skin can be done by executing the
				given below command in the command line in the root
				folder of you skin project (the one that contains
				pom.xml file).
			</para>

<programlisting role="XML"><![CDATA[...
mvn clean install
...
]]></programlisting>


			<para>In addition Plug-n-Skin has a number of predefined 
				 gradients that you can also use to make your application look nicer. The given below code snippet shows how a gradient can be used
			</para>
				
<programlisting role="XML"><![CDATA[...
<u:selector name=".rich-combobox-item-selected">
	<u:style name="border-width" value="1px" />
	<u:style name="border-style" value="solid" />
	<u:style name="border-color" skin="newBorder" />
	<u:style name="background-position" value="0% 50%" />
	<u:style name="background-image">
		<f:resource f:key="org.richfaces.renderkit.html.CustomizeableGradient">
			<f:attribute name="valign" value="middle" />
			<f:attribute name="gradientHeight" value="17px" />
			<f:attribute name="baseColor" skin="headerBackgroundColor" />
		 </f:resource>
	</u:style>	
</u:selector>
...
]]></programlisting>
				
				<para>
					So, as you can see, the  <property>background-image</property> CSS property is defined with 
					<code>
						&lt;f:resource
						f:key=&quot;org.richfaces.renderkit.html.CustomizeableGradient&quot;&gt;
					</code>
					that sets the gradient. While the gradient type can be specified in the 
					<property>SKIN-NAME.properties</property> file with <property>gradientType</property> property. 
					
				
				The <property>gradientType</property> property can be set to one of the possible values glass, plastic, plain. 
					The  gradient in it&apos;s turn can be can be  adjusted using baseColor, gradientColor, gradientHeight, valign attributes.
					Their usage is shown in the snippet above. 
				
					
				</para>
				
				
				
			<para>	
				Now, you can use your newly-created and customized skin in your project
				by adding your new skin parameters to web.xml file and
				placing the jar file with your skin
				( the jar file  is located in &quot;target&quot; folder of your skin project) 
				to &quot;\WebContent\WEB-INF\lib\&quot;.
			</para>
			
			<programlisting role="XML"><![CDATA[...
<context-param>
    <param-name>org.ajax4jsf.SKIN</param-name>
    <param-value>SKIN-NAME</param-value>
</context-param>
...
]]></programlisting>


<section>
	<sectioninfo>
		<keywordset>
			<keyword>Plug-n-Skin</keyword>
		</keywordset>
	</sectioninfo>
	
	<title>Details of Usage</title>
	
	<para>This section will cover some practical aspects of Plug-n-Skin implementation.
	It&apos;s assumed that you have read the section of the guide that tells how the new skin using Plug-n-Skin prototype can be created. </para>
	<para>Above all, we need to create a new skin, in order to do that we just  have to  follow 
	the steps described in the previous section.</para>
	
	<para>This command will be used to create a template of the new skin project. </para>
	
	<programlisting role="XML"><![CDATA[
mvn archetype:create 
-DarchetypeGroupId=org.richfaces.cdk 
-DarchetypeArtifactId=maven-archetype-plug-n-skin 
-DarchetypeVersion=3.2.2.BETA5 
-DartifactId=P-n-S 
-DgroupId=GROUPID 
-Dversion=1.0.-SNAPSHOT
]]></programlisting>
	<para>
		Now you can browse the &quot;P-n-S&quot; folder to view what files and folders were created there.
	</para>
	
	<para>
		Next, we will use Maven to add all needed files to the skin project. This will  done by the following command:
	</para>
	
	<programlisting role="XML"><![CDATA[
mvn cdk:add-skin -DbaseSkin=blueSky  -DcreateExt=true -Dname=PlugnSkinDemo -Dpackage=SKINPACKAGE 
]]></programlisting>
	
	<para>
		As you remember from the previous section &quot;-DbaseSkin&quot; key defines what RichFaces built-in skin to be used as a base one, 
		&quot;-DcreateExt=true&quot; determines that the new skin will 
		come with XCSS files that unify the look of the rich components with standard HTML controls.
	</para>
	
	
	<para>
		So, now the files and folder with all needed resources are created 
		and  redefining/editing the new skin can be started.
	</para>
	
	<para>
		Now we can start editing XCSS files of the rich components. 
		In order to see how the Plug-n-Skin feature works we will change some style attributes of <emphasis role="bold">
			<property>&lt;rich:calendar&gt;</property></emphasis> and some basic HTML controls to see how they are affected by standard controls skinning.
	
	</para>
	<para>Thus, it will be demonstrated how to: </para>
		<itemizedlist>
			<listitem><para>Recolor the current day&apos;s cell background of the  <emphasis role="bold">
				<property>&lt;rich:calendar&gt;</property></emphasis> to see how the new skin created with the help of Plug-n-Skin feature affects the style of the component;</para></listitem>
			<listitem><para>Recolor a standard HTML submit button;</para></listitem>
			
		</itemizedlist>
		
		
	<para>In oder to edit the style properties of <emphasis role="bold">
		<property>&lt;rich:calendar&gt;</property></emphasis> you
		need to open the  &quot;calendar.xcss&quot; file located in &quot;P-n-S\src\main\resources\skinpackage\plugnskindemo\css\&quot;. Once, you have opened the file, please find ".rich-calendar-today"  selector and  amend it as follows: <code>background-color: #075ad1;</code>. The current day's background color can be considered recolored.</para>
	
	<para>Now we will see how font style of a standard HTML submit button can be changed. Please, open &quot;extended.xcss&quot; file located in &quot;P-n-S\src\main\resources\skinpackage\plugnskindemo\css\&quot; and put in <code>font-weight: bold;</code> inside the curly braces of these coma separated selectors
	<code>button[type=&quot;button&quot;], button[type=&quot;reset&quot;], button[type=&quot;submit&quot;], input[type=&quot;reset&quot;], input[type=&quot;submit&quot;], input[type=&quot;button&quot;]</code>. So, the CSS code should look like this. </para>


	<programlisting role="XML"><![CDATA[
button[type=&quot;button&quot;], button[type=&quot;reset&quot;], button[type=&quot;submit&quot;], input[type=&quot;reset&quot;], input[type=&quot;submit&quot;], input[type=&quot;button&quot;] {
font-weight: bold;
}
]]></programlisting>
	<para>All the changes that were planned to be preformed are done and now you can proceed to building the new PlugnSkinDemo skin and import it into the project. 
		As you read in the previous section, the skin should be built in the &quot;P-n-S&quot; folder of the skin project be executing <code>mvn clean install</code> command. This procedure results in creating a &quot;target&quot; folder that contains a .jar file with a compiled new skin, it our case the file is named &quot;P-n-S-1.0.-SNAPSHOT.jar&quot;. 
		The next step is to import the new PlugnSkinDemo skin into the project.</para>
	<para>What you need to do, in order to have the new skin imported to the project is to</para>
	<itemizedlist>
		
		<listitem><para>Copy the &quot;P-n-S-1.0.-SNAPSHOT.jar&quot; file to the &quot;\WebContent\WEB-INF\lib\&quot; folder.</para></listitem>
		<listitem><para>Add the new skin&apos;s name to the &quot;web.xml&quot; file. It is done like this</para>
		
<programlisting role="XML"><![CDATA[
 <context-param>
  <param-name>org.ajax4jsf.SKIN</param-name>
  <param-value>PlugnSkinDemo</param-value>
 </context-param>
]]></programlisting>
		
		
		
		</listitem>
	</itemizedlist>
	
	
<para>	
	
	Please, do not forget that standard controls skinning has to be enabled in the &quot;web.xml&quot; file, which can be done by adding the following code to the &quot;web.xml&quot; file:
	</para>
			
			
	<programlisting role="XML"><![CDATA[
 <context-param>
  <param-name>org.richfaces.CONTROL_SKINNING</param-name>
  <param-value>enable</param-value>
 </context-param>
]]></programlisting>
			<para>The result of both action is displayed on the figure below.</para>
			
			
			
			<figure>
				<title>Plug-n-Skin feature in action. </title>
				<mediaobject>
					<imageobject>
						<imagedata fileref="images/PlugnSkinDemo.png"/>
					</imageobject>
				</mediaobject>
			</figure>
</section>
		</section>

	</section>
	<section id="statemanagerapi">
		<title>State Manager API</title>
		<para>
			JSF has an advanced navigation mechanism that allows you to define navigation from view to view.
			Navigation happens in a Web Application when a user tries to switch from one page to another page
			either by clicking a button, a hyperlink, or another command component.
			But there is no switch mechanism between some logical states of the same view. 
			For example in <property>Login/Register dialog</property> an existing user signs in with his user name and password, 
			but if a new user registers an additional field &quot;Confirm&quot; is displayed, 
			buttons labels and methods are changed when the user clicks &quot;To register&quot; link:
		</para>
		<figure>
			<title>
				Login Dialog
			</title>
			<mediaobject>
				<imageobject>
					<imagedata fileref="images/stateapi1.png"/>
				</imageobject>
			</mediaobject>
		</figure>
		<figure>
			<title>
				Register Dialog
			</title>
			<mediaobject>
				<imageobject>
					<imagedata fileref="images/stateapi2.png"/>
				</imageobject>
			</mediaobject>
		</figure>
		<para>
			<property>RichFaces State API</property> allows easily to define some set of states for the pages and any properties for this states.
		</para>
		<para>
			Actually States is a <property>map</property> where the entry key is a name of the State and the value is a State map. 
			Particular State map has entries with some names as keys and any objects as values that are used after the state activation.
			Thus, in the State map you could define any values, method bindings, or just some simple state variables (constants) 
			which have different values for every State. 
		</para>
		<figure>
			<title>
				RichFaces State API
			</title>
			<mediaobject>
				<imageobject>
					<imagedata fileref="images/stateapi3.png"/>
				</imageobject>
			</mediaobject>
		</figure>
		<para>
			One of the most convenience features of the <property>RichFaces State API</property> is a navigation between states.
			The <property>RichFaces State API</property> implements states change as the standard JSF navigation. 
			Action component just returns outcome and the RichFaces State API
			<property>extension for the JSF navigation handler</property> 
			checks whether this outcome is registered as a <property>state change outcome</property> or not. 
			If the <property>state change outcome</property> is found the corresponding state is activated.
			Otherwise the standard navigation handling is called.
		</para>
		<para>
			In order to use <property>RichFaces State API</property> you should follow the next steps:  
		</para>
		<itemizedlist>
			<listitem>
				<para>
					Register State Manager EL resolver and navigation handler in the <property>faces-config.xml</property>: 
				</para>
				<programlisting role="XML"><![CDATA[...
<application>
	<navigation-handler>org.richfaces.ui.application.StateNavigationHandler</navigation-handler>
	<el-resolver>org.richfaces.el.StateELResolver</el-resolver>
</application>
...]]></programlisting>
			</listitem>
			<listitem>
				<para>
					Register an additional application factory in the <property>faces-config.xml</property>: 
				</para>
				<programlisting role="XML"><![CDATA[...
<factory>
	<application-factory>org.richfaces.ui.application.StateApplicationFactory</application-factory>
</factory>
...]]></programlisting>
			</listitem>
			<listitem>
				<para>
					Register two managed beans in the <property>faces-config.xml</property>:
				</para>
				<programlisting role="XML"><![CDATA[...
<managed-bean>
	<managed-bean-name>state</managed-bean-name>
	<managed-bean-class>org.richfaces.ui.model.States</managed-bean-class>
	<managed-bean-scope>request</managed-bean-scope>
	<managed-property>
		<property-name>states</property-name>
		<property-class>org.richfaces.ui.model.States</property-class>
		<value>#{config.states}</value>
	</managed-property>
</managed-bean>
<managed-bean>
	<managed-bean-name>config</managed-bean-name>
	<managed-bean-class>org.richfaces.demo.stateApi.Config</managed-bean-class>
	<managed-bean-scope>none</managed-bean-scope>
</managed-bean>
...]]></programlisting>
				<para>
					One bean (&quot;config&quot;) defines and stores states as it is shown in the following example:
				</para>
				<programlisting role="JAVA"><![CDATA[...
public class Config {

	/**
	 * @return States
	 */
	public States getStates() {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		States states = new States();

		// Registering new User State definition
		states.setCurrentState("register"); // Name of the new state

		// Text labels, properties and Labels for controls in "register" state
		states.put("showConfirm", Boolean.TRUE); // confirm field rendering
		states.put("link", "(To login)"); // Switch State link label
		states.put("okBtn", "Register"); // Login/Register button label
		states.put("stateTitle", "Register New User"); // Panel title

		ExpressionFactory expressionFactory = facesContext.getApplication()
				.getExpressionFactory();

		// Define "registerbean" available under "bean" EL binding on the page
		ValueExpression beanExpression = expressionFactory
				.createValueExpression(facesContext.getELContext(),
						"#{registerbean}", Bean.class);
		states.put("bean", beanExpression);

		// Define "registeraction" available under "action" EL binding on the
		// page
		beanExpression = expressionFactory.createValueExpression(facesContext
				.getELContext(), "#{registeraction}", RegisterAction.class);
		states.put("action", beanExpression);

		// Define method expression inside registeraction binding for this state
		MethodExpression methodExpression = expressionFactory.createMethodExpression(
				facesContext.getELContext(), "#{registeraction.ok}",
				String.class, new Class[] {});
		states.put("ok", methodExpression);

		// Outcome for switching to login state definition
		states.setNavigation("switch", "login");

		// Login Existent User State analogous definition
		states.setCurrentState("login");
		states.put("showConfirm", Boolean.FALSE);
		states.put("link", "(To register)");
		states.put("okBtn", "Login");
		states.put("stateTitle", "Login Existing User");

		beanExpression = expressionFactory.createValueExpression(facesContext
				.getELContext(), "#{loginbean}", Bean.class);
		states.put("bean", beanExpression);

		beanExpression = expressionFactory.createValueExpression(facesContext
				.getELContext(), "#{loginaction}", LoginAction.class);
		states.put("action", beanExpression);

		methodExpression = expressionFactory.createMethodExpression(
				facesContext.getELContext(), "#{loginaction.ok}",
				String.class, new Class[] {});
		states.put("ok", methodExpression);

		states.setNavigation("switch", "register");

		return states;
	}
}
...]]></programlisting>				
				<para>
					The other bean (&quot;state&quot;) with the type <code>org.richfaces.ui.model.States</code> has
					the &quot;states&quot; managed property that is bound to the &quot;config&quot; bean which defines states.
				</para>		
			</listitem>
			<listitem>
				<para>
					Use <property>state</property> bindings on the page. See the following example: 
				</para>
								<programlisting role="XML"><![CDATA[...
<h:panelGrid columns="3">
	<h:outputText value="username" />
	<h:inputText value="#{state.bean.name}" id="name" required="true" />
	<h:outputText value="password" />
	<h:inputSecret value="#{state.bean.password}" id="password" required="true" />
	<h:outputText value="confirm" rendered="#{state.showConfirm}" />
	<h:inputSecret value="#{state.bean.confirmPassword}" rendered="#{state.showConfirm}" id="confirm" required="true" />
</h:panelGrid>
<a4j:commandButton actionListener="#{state.action.listener}" action="#{state.ok}" value="#{state.okBtn}" id="action"/>
...]]></programlisting>
			</listitem>
		</itemizedlist>
		<para>
			To get full <property>Login/Register dialog</property> example, please, 
			click <ulink url="http://livedemo.exadel.com/richfaces-demo/richfaces/stateAPI.jsf?c=stateAPI">here</ulink>.
		</para>
	</section>
</chapter>
