<?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="IntegralParts" role="new">
		<?dbhtml filename="IntegralParts.html"?>
		<title>RichFaces Integral Parts</title>
		<para> The <property>RichFaces</property> comes with a number of integral parts (framework,
			libraries): </para>
		<itemizedlist>
			<listitem>
				<para>
					<ulink url="http://prototypejs.org">Prototype 1.6.0.3</ulink>
				</para>
			</listitem>
			<listitem>
				<para>
					<ulink url="http://jquery.com">jQuery 1.2.6</ulink>
				</para>
			</listitem>
			<listitem>
				<para>
					<ulink url="http://script.aculo.us">Script.aculo.us 1.8.1</ulink>
				</para>
			</listitem>
		</itemizedlist>
		<para> For more information about framework and libraries loading see the following section
			in the <ulink
				url="http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/faq/faq.html#d0e581"
				>FAQ</ulink>. </para>
		<note>
			<title>Note:</title>
			<para> In order to prevent JavaScript versions conflict you should use only one version
				of the framework or library. You could find more information about libraries
				exclusion in the <ulink
					url="http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/faq/faq.html#d0e1546"
					>FAQ</ulink>. </para>
		</note>
	</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="QueuePrinciples">
			<title>Queue Principles</title>
			<para>Starting from 3.3.0 version RichFaces has an improved queue.</para>
		
			<para>There are some serious reasons why the queue has been improved. The improved queue allows to</para>
			
			<itemizedlist>
		
			
					<listitem>
						<para>
							Eliminate the possibility of collisions when several JSF requests pass the JSF lifecycle at the same time. The queue prevents sending such requests. Only one request is processed. The rest ones are waiting. 
						</para>
					</listitem>
			
					<listitem>
						<para> 
							Reduce the traffic between browser and the server. The "similar" requests came within requestDelay are absorbed. Only the last one is actually sent. Reducing the number of request reduces the server load. 
						</para>
					</listitem>
				
				<listitem><para>
					
					Significantly increase the amount of &quot;unrelated&quot; asynchronous requests to processed
					
				</para></listitem>
			
			</itemizedlist>
				
			<para>There are 4 types of the queue:</para>
			<itemizedlist>
				<listitem><para>
					Global default queue, defined in the web.xml file
				</para>
				</listitem>
				<listitem>
					<para>View scoped default queue</para>
				</listitem>
				<listitem>
					<para>View scoped named queue</para>
				</listitem>
				<listitem>
					<para>Form-based default queue</para>
				</listitem>
			</itemizedlist>
			<para>In this section we will take a closer look at the listed above types of the queue 
				and see in more detail how they differ. Usage details are alos covered in the <link linkend="queue">&lt;a4j:queue&gt;</link>chapter.</para>
			<section>
				<title>Global default queue, defined in the web.xml file</title>
				
				<para>Design details</para>
				<itemizedlist>
					<listitem><para>Only one global queue will ever exist on a view</para>
						
						<para>If you define more that one with this name while attempting to set its attributes a warning will appear in server console
							during rendering. All the same named queues after the first instance are ignored.</para></listitem>
					<listitem><para>The queue class name is &quot;org.richfaces.queue.global&quot;</para>
				
					</listitem>
					
				</itemizedlist>
				
				
				<para>Global default queue has application scope and is defined in the
					web.xml</para>
				<para>It can be done as follows:</para>
				<programlisting role="XML"><![CDATA[...
<context-param>
   <param-name>org.richfaces.queue.global.enabled</param-name>
   <param-value>true</param-value>
</context-param>
...
]]></programlisting>
				<para>The global default queue is disabled by default, because artificial
					serializing of all Ajax requests on a page can significantly affect expected
					behavior. </para>
				
			</section>
				<section>
					<title>View scoped default queue</title>
					
					<para>Design details</para>
					<itemizedlist>
	<listitem><para>Only one default queue is ever active at one time for a given view or form.</para></listitem>
						<listitem><para>If ever more are detected a warning will appears in server console during rendering. 
						All the same named queues after the first instance are ignored.</para></listitem>	
						<listitem><para>View scoped default queue is also created
						for components which have the following ajax attributes: (in this case queue has a component scope)</para>
						<itemizedlist>
							<listitem><para><emphasis><property>&quot;requestDelay&quot; </property></emphasis></para></listitem>
							<listitem><para><emphasis><property>&quot;ignoreDupResponce&quot; </property></emphasis></para></listitem>
						</itemizedlist>
												
						</listitem>
						<listitem><para>View scoped default queue is created automatically if the  <emphasis><property>&quot;eventsQueue&quot; </property></emphasis> attribute is defined with some name in a component but not found in the view. It has a scope the same as defined in corresponding context param.</para></listitem>
					</itemizedlist>
					
					<para>The view scoped default, named and formed-based types of queue utilize the
							<emphasis role="bold">
							<property>&lt;a4j:queue&gt;</property></emphasis> tag to override the
						settings of the global queue defined in the web.xml file. </para>
					<para> You can also programmatically enable/disable the global queue on a single
						view using the following:</para>
					<programlisting role="XML"><![CDATA[...
<a4j:queue name="org.richfaces.global_queue" disabled="true"... />
...
]]></programlisting>
					<para>Hence, to enable the queue for a single view page you need to define the
							<property>&quot;disable&quot;</property> attribute with
						&quot;false&quot;. </para>
					<para> Now, you can override the default settings using the attributes of the
							<emphasis role="bold">
							<property>&lt;a4j:queue&gt;</property></emphasis> component. The full
						<ulink
			url="file:///C:/Projects/RichFaces/docs/userguide/en/target/docbook/publish/en-US/html_single/index.html#d0e10019"
							>list of attributes</ulink> is given in the <emphasis>&quot;6.20.  &lt;a4j:queue&gt;&quot;</emphasis> chapter of the guide.</para>
					<para>
						<emphasis role="bold">Example:</emphasis>
					</para>
					<programlisting role="XML"><![CDATA[...
<a4j:queue name="org.richfaces.global_queue" requestDelay="1000" />
...]]></programlisting>
					<para> View scoped queue can be also added by just definition of the queue
						without name specified. In this case it should be placed anywhere outside
						the forms in order not to be recognized as a form-based queue. </para>
					<programlisting role="XML"><![CDATA[...
<a4j:queue ... />
...
]]></programlisting>
				</section>
					<section>
						<title>View scoped named queue</title>
						
						<para>Design details</para>
						<itemizedlist>
							<listitem><para>Named queues must have a unique name, 
								if a second queue with the same name is defined  all the same named queues after the first instance are ignored.</para></listitem>
							<listitem><para>Form elements are used as naming container for the queue i.e. custom queue defined within the form cannot be used by the components outside this concrete form. </para></listitem>
						
						</itemizedlist>
						
						
						<para>You can reference a named queue from any Ajax4JSF or RichFaces
							component that supports the &quot;eventsQueue&quot; attribute. Below
							there is an example of how the components can reference a named
							queue.</para>
						<para>
							<emphasis role="bold">Example:</emphasis>
						</para>
						<programlisting role="XML"><![CDATA[...
<a4j:queue name="sampleQueue"/>							

<h:inputText value="#{bean.inputValue}" >
<a4j:support id="inputSupport" event="onkeyup" eventsQueue="sample"/>
</h:inputText>
<rich:comboBox value="#{bean.state}" suggestionValues="#{bean.suggestions}" eventsQueue="sample" />    

...]]></programlisting>
						<para>In this example, two components(&lt;a4j:queue&gt;,
							&lt;rich:comboBox&gt;,) reference the named queue via the
							&quot;eventsQueue&quot; attribute. </para>
					</section>
			<section>
				<title>Form based default queue</title>
				<para>Design details</para>
				<itemizedlist>
					<listitem><para>Only one enabled form based default queue can be active at a time.</para>
					<itemizedlist>
						<listitem><para>A warning appears in server console during rendering if more than one enabled form based queue exists. 
							All queues with the same name after the first instance should be ignored.
						</para></listitem>
						<listitem><para>Users can define more than one form queue, however all but one must be disabled. 
						</para></listitem>

					</itemizedlist>
						
						
					</listitem>
				
				</itemizedlist>
				
				<para>Queues are often used within forms, but defining the <emphasis><property>&quot;eventsQueue&quot;</property></emphasis> attribute on every component within a form can be tedious work.  
				To avoid that you can create a default queue for a form (overriding the global default queue ).</para>
				
				<para>You can use either a JSF &lt;h:form&gt; or an Ajax4JSF &lt;a4j:form&gt;. </para>
				<para>
					<emphasis role="bold">Example:</emphasis>
				</para>
				<programlisting role="XML"><![CDATA[...
<h:form ... >
<a4j:queue ... /><!-- note no name specified -->
   ...
</h:form>
...]]></programlisting>		
			
				<para>Though, using an Ajax4JSF &lt;a4j:form&gt; you can refrence a named queue via the <emphasis><property>&quot;eventsQueue&quot;</property></emphasis>.  </para>
			
				<para>
					<emphasis role="bold">Example:</emphasis>
				</para>
				<programlisting role="XML"><![CDATA[...
<a4j:form eventsQueue="fooQueue" ...>
   ...
</a4j:form>
...]]></programlisting>		
			<para>However the implementation of the queue allows you to reference a named queue from the form with a form-based queue.</para>
			
			
				<para>
					<emphasis role="bold">Example:</emphasis>
				</para>
				<programlisting role="XML"><![CDATA[...
<a4j:queue name="sampleQueue" ... /> <!-- named queue -->
...
<h:form ... >
 <a4j:queue ... /><!-- form-based queue-->
  <a4j:commandButton ... > <!-- uses the form-based queue -->
 <a4j:commandButton eventsQueue="sampleQueue" > <!-- uses named queue -->
</h:form>
...]]></programlisting>	
	
	

			
			</section>

<section>
	<title>Queue functionality</title>
	<para>
		This section will cover some queue's functionality aspects.
		
	</para>
	
	<section>
		<title>Events Similarity</title>
		<para>By default all the events raised by the same component 
			are similar to the queue (according to client Id of event source). 
			This means that if new requests come from the same component they are combined with the previous ones. 
			For example: if we use a4j:support on an input field and the user types frequently
			all the request raised by key up during requestDelay will be combined into one.
		</para>
		<para>
			
			You can also manually specify multiple components which will produce similar requests. The <emphasis><property>&quot;similarityGroupingId&quot;</property></emphasis> attribute is added to all the Ajax action components with 3.3.0 release. 
			Hence, for example, you can add two &lt;a4j:support/&gt; components to the input 
			(one for key up and the second for blur) and define that request events are similar by specifying the same <emphasis><property>&quot;similarityGroupingId&quot;</property></emphasis>.
			
		</para>
	</section>
	<section>
		<title>Similar requests during request delay</title>
	<para>
			As written above requests are collected in the queue during requestDelay and similar ones are combined. 
			But similar requests can only be combined if they are raised sequentially. 
			This is done in order not to block the queue and not to change the requests order.
		</para>
		<para>
			<emphasis role="bold">Example:</emphasis>
		</para>
		<para>
			A request with some delay comes to the queue, let it be A<superscript>1</superscript> the delay counter for this request is started. 
			If similar request(e.g. from the same component -  A<superscript>2</superscript>) appears - these two requests are combined(A<superscript>1</superscript>A<superscript>2</superscript> to A<superscript>combined</superscript> ) and the counter is reset.	
		</para>
		<para>
			But if some not similar request comes to the queue B<superscript>1</superscript> - it is placed after the first one(A<superscript>combined</superscript>,B<superscript>1</superscript>). And if the A<superscript>combined</superscript> request doesn't exit the queue and another request similar to A (let is be A<superscript>3</superscript>) appears again - these requests are not combined with the first one. 
			The request  is placed after B<superscript>1</superscript>. (A<superscript>combined</superscript>, B<superscript>1</superscript>, A<superscript>3</superscript>).
		</para>	
			<para>Such behavior allows</para>
		<itemizedlist>
			<listitem><para>to maximize similar requests throughput</para></listitem>
			<listitem><para>to send only the latest fields state for similar requests</para></listitem>
			<listitem><para>not to block the queue if the different types of requests comes to queue and should wait one for another</para></listitem>
		</itemizedlist>
		
		<para>
			
			The <emphasis role="bold">
				<property>&lt;a4j:poll&gt;</property>
			</emphasis> component has delay time 0 by default staring from 3.3.0 version in order  not to use the queue delay(its own value for this parameter redefines queue's parameter) to avoid blocking periodical update in the queue. You can redefine this on the component level if need.
		</para>
			
		
	</section>
	
	<section>
		<title>JavaScript API</title>
		<table> 
			<title>JavaScript API</title>
			<tgroup cols="2">
				<thead>
					<row>
						<entry>Function</entry>
						<entry>Description</entry>
						
					</row>
				</thead>
				<tbody>
					<!--Sorting API -->
					<row>
						<entry>getSize()</entry>
						<entry>Returns the current size to the queue</entry>
						
					</row>
					<row>
						<entry>getMaximumSize()</entry>
						<entry>Returns the maximum size to the queue, specified in the &quot;size&quot; attribute</entry>
						
					</row>
					
					
					
					
				</tbody>
			</tgroup>
		</table>
	</section>
	
	
</section>
			
			
		</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/>
		</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> The <property>&quot;oncomplete&quot;</property>
				</emphasis> attribute is used for passing JavaScript that would be invoked right
				after the AJAX response returns back and DOM is updated. It is not recommended to
				use use keyword <code>this</code> inside the EL-expression, because it will not
				always point to 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>
		<para> Add the following code to web.xml: </para>
		<programlisting role="XML"><![CDATA[<context-param>
	<param-name>org.ajax4jsf.handleViewExpiredOnClient</param-name>
	<param-value>true</param-value>
</context-param>]]>
		</programlisting>
		<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){
    window.alert("Custom onError handler "+message);
}]]></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,
				internal 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){
    if(window.confirm("Custom onExpired handler "+expiredMsg+" for a location: "+loc)){
      return loc;
    } else {
     return false;
    }
}]]></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>
				<para> Note that custom <emphasis><property
						>&quot;onError&quot;</property></emphasis>, <emphasis><property
							>&quot;onExpire&quot;</property></emphasis> handlers do not work under
					MyFaces. MyFaces handles exception by its internals generating debug page. You
					could use the following code to prevent such behavior: </para>
				<programlisting role="XML"><![CDATA[...
<context-param>
	<param-name>org.apache.myfaces.ERROR_HANDLING</param-name>
	<param-value>false</param-value>
</context-param> 
...]]></programlisting>
			</note>
			<!--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 - <property
					>Standard</property> and <property>Extended</property> 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> level </emphasis> provides customization
						for only basic style properties. </para>
					<para> To the following browsers <property>Standard</property> 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> level </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 <property>Extended</property> 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 for standard HTML controls 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 properties are applied to elements by element name and
						attribute type (where applicable). No additional steps required. Please find
						below the table that contains the list of elements 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 that 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>
				<note>
					<title>Note:</title>
					<para> Standard skinning level can fail if configuration of
							<code>ajaxPortlet</code> is as following: </para>
					<programlisting role="XML"><![CDATA[...
<portlet>
   <portlet-name>ajaxPortlet</portlet-name>
   <header-content>
      <script src="/faces/rfRes/org/ajax4jsf/framework.pack.js" type="text/javascript" />
      <script src="/faces/rfRes/org/richfaces/ui.pack.js" type="text/javascript" />
      <link rel="stylesheet" type="text/css" href="/faces/rfRes/org/richfaces/skin.xcss" />
   </header-content>
</portlet>
...]]></programlisting>
				</note>
			</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 you don&apos;t want  the RichFaces components and standard HTML
				controls to be skinned automatically and perform the skinnability implementation
				yourself, you might encounter with a problem, namely standard HTML controls in such
				browsers as Opera and Safari will 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 the
				<code>web.xml</code> file. </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
				RichFaces component and standard HTML controls. </para>
			<para> In order to resolve the problem with extended skinning in Opera and Safari a
				client script (<code>skinning.js</code>) 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> When NO script loading strategy is used and extended skinning is turned on then
				corresponding warning message will appears in the console. </para>
			<para> You also need to specify <emphasis>
					<property>&quot;media&quot;</property>
				</emphasis> attribute in the <emphasis role="bold">
					<property>&lt;link&gt;</property>
				</emphasis> 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>
			<note>
				<para> Now it&apos;s necessary to use  <code>a4j/versionXXX</code> resources prefix  instead of
						<code>a4j_versionXXX</code>. Base64 encoder changed to use
						&apos;<code>!</code>&apos; instead of &apos;<code>.</code>&apos;. </para>
			</note>
		</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 you an opportunity to easily create,
				customize and plug into your 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.3.0.GA&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.3.0.GA
-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>
