<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>!DOCTYPE &#187; Uncategorized</title>
	<atom:link href="http://www.createsoft.co.uk/blog/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.createsoft.co.uk/blog</link>
	<description>Software Development and Web Design</description>
	<lastBuildDate>Mon, 31 May 2010 09:36:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>iPhone Bookmarklets</title>
		<link>http://www.createsoft.co.uk/blog/2009/09/iphone-bookmarklets/</link>
		<comments>http://www.createsoft.co.uk/blog/2009/09/iphone-bookmarklets/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 22:00:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.createsoft.co.uk/blog/?p=20</guid>
		<description><![CDATA[This post is a bit of an experiment.  I want an iPhone bookmarklet that will allow me to subscribe to RSS feeds!  I use Google Reader currently, and found a couple of bookmarklets on their blog which do the trick.
I also came across a handy &#8216;find in page&#8217; link which is something I often miss [...]]]></description>
			<content:encoded><![CDATA[<p>This post is a bit of an experiment.  I want an iPhone bookmarklet that will allow me to subscribe to RSS feeds!  I use Google Reader currently, and found a couple of bookmarklets on their blog which do the trick.</p>
<p>I also came across a handy &#8216;find in page&#8217; link which is something I often miss with mobile Safari!</p>
<p><span id="more-20"></span></p>
<p>I found a <a href="http://googlereader.blogspot.com/2005/11/subscribing-to-feeds-via-little-google.html">post on the Google reader blog</a> about how to create bookmarklets for use with Google Reader. Although very old (2005!) the bookmarklets still work.</p>
<p>One way to get these bookmarklets into your iPhone is to bookmark them in your web browser, then synch the bookmarks with your iPhone.</p>
<p>Alternatively you can do so from your iPhone using the links on this page.  If you have saved bookmarklets before using your iPhone its a familiar process: bookmark a page, then edit the bookmark.</p>
<p>So here is my attempt.  Click through to each of the links below, then bookmark the page.  Enter an appropriate title for the bookmark, and save.</p>
<p>Once saved, go back and edit the bookmark &#8211; remove everything before the &#8220;javascript:&#8221; phrase.</p>
<p>(Note that <a href="http://twitterfon.net/___?javascript:window.location='twitterfon:///post?'+window.location">Twitterfon has a good summary of how to do this</a> if you need a graphical illustration)</p>
<p><a href="/blog/?p=20&amp;___javascript:var%20f=false;var%20ls=document.getElementsByTagName('link');for(var%20i=0,l;l=ls[i];i++){var%20t=l.getAttribute('type');var%20r=l.getAttribute('rel');if(t&amp;&amp;(t=='application/rss+xml'||t=='application/atom+xml')&amp;&amp;r&amp;&amp;r=='alternate'){var%20h=%20l.getAttribute('href');if(h.indexOf('http')!=0){var%20p=(h.indexOf('/')!=0)?'/':location.pathname;h='http://'+location.hostname+p+h;}location='%20http://google.com/reader/preview/*/feed/'+h;f=true;break;}}if(!f)alert('Oops.%20Can\'t%20find%20a%20feed.');">Subscribe</a></p>
<p><a href="/blog/?p=20&amp;___javascript:var%20el=document.createElement('div');el.style.zIndex=10000;el.style.position='absolute';el.style.padding='2em';el.style.top=0;el.style.backgroundColor='#ffffcc';el.style.border='1px%20solid%20%23008000';el.style.color='%23000%20!important';el.style.fontFamily='Arial,%20sans-serif';el.style.textAlign='left';el.innerHTML='View%20the%20following%20feeds%20in%20Google%20Reader:';var%20found%20=%20false;var%20links%20=%20document.getElementsByTagName('link');for%20(var%20i%20=%200,%20link;%20link%20=%20links[i];%20i++)%20{%20var%20type%20=%20link.getAttribute('type');%20var%20rel%20=%20link.getAttribute('rel');%20var%20title%20=%20link.getAttribute('title');%20if%20(type%20&amp;&amp;%20(type%20==%20'application/rss+xml'%20||%20type%20==%20'application/atom+xml')%20&amp;&amp;%20rel%20&amp;&amp;%20rel%20==%20'alternate')%20{%20var%20href%20=%20link.getAttribute('href');%20if%20(!href.match(/^http/))%20{%20var%20path%20=%20(href.match(/^\//))%20?%20'/'%20:%20location.pathname;%20href='http://'%20+%20location.hostname%20+%20path%20+%20href;%20}%20var%20previewLink%20=%20document.createElement('a');%20previewLink.href%20=%20'%20http://google.com/reader/preview/*/feed/'%20+%20href;%20previewLink.innerHTML%20=%20((title)%20?%20title%20:%20'')%20+%20'%20-%20'%20+%20href;%20previewLink.style.display='block';%20previewLink.style.color='%2300c';previewLink.style.textDecoration='underline';%20el.appendChild(previewLink);%20found%20=%20true;}}%20var%20close=document.createElement('a');%20close.innerHTML='Hide%20this%20box';%20close.href='%23';%20close.style.display='block';%20close.style.marginTop='2em';%20close.style.color='%2300c';%20close.style.textDecoration='underline';%20close.onclick=function()%20{el.style.display='none';%20return%20false;};%20el.appendChild(close);%20function%20Google_AddFeedBox()%20{document.body.appendChild(el);y=window.scroll(0,%200);}%20if%20(!found)%20alert('Oops.%20Can\'t%20find%20any%20feeds%20for%20this%20page.');%20else%20void(z=Google_AddFeedBox());">Show all feeds</a></p>
<p>Lastly &#8211; here is the &#8220;find in page&#8221; bookmarklet which i found <a href="http://www.lucidgreen.net/webbybooth/?p=39">here</a>:</p>
<p><a href="/blog/?p=20&amp;___javascript:void%28s%3Dprompt%28%27Find%20text%3A%27%2C%27%27%29%29%3Bs%3D%27%28%27+s+%27%29%27%3Bx%3Dnew%20RegExp%28s%2C%27gi%27%29%3Brn%3DMath.floor%28Math.random%28%29*100%29%3Brid%3D%27z%27%20+%20rn%3Bb%20%3D%20document.body.innerHTML%3Bb%3Db.replace%28x%2C%27%3Cspan%20name%3D%27%20+%20rid%20+%20%27%20id%3D%27%20+%20rid%20+%20%27%20style%3D%5C%27color%3A%23000%3Bbackground-color%3Ayellow%3B%20font-weight%3Abold%3B%5C%27%3E%241%3C/span%3E%27%29%3Bvoid%28document.body.innerHTML%3Db%29%3Balert%28%27Found%20%27%20+%20document.getElementsByName%28rid%29.length%20+%20%27%20matches.%27%29%3Bwindow.scrollTo%280%2Cdocument.getElementsByName%28rid%29%5B0%5D.offsetTop%29%3B">Find on this page</a></p>
<p>I hope these links work&#8230; bit of an experiment&#8230;!</p>
<p><strong>Edit: Yep, they do work, so now i can subscribe to feeds using my iPhone&#8230; hope someone else finds this useful!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.createsoft.co.uk/blog/2009/09/iphone-bookmarklets/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Another Jaguar Configurator for the XJ</title>
		<link>http://www.createsoft.co.uk/blog/2009/08/another-jaguar-configurator-for-the-xj/</link>
		<comments>http://www.createsoft.co.uk/blog/2009/08/another-jaguar-configurator-for-the-xj/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 12:14:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[configurator]]></category>

		<guid isPermaLink="false">http://www.createsoft.co.uk/blog/?p=19</guid>
		<description><![CDATA[The new Jaguar XJ Configurator joins the full range of configurators for Jaguar in the UK and the USA]]></description>
			<content:encoded><![CDATA[<p>Two years after the first Jaguar Configurator I was involved with went live, I am happy to say I was involved in the new <a title="Jaguar XJ Configurator" href="http://rules.config.jaguar.com/rc/jag/gb/cj?t=shtml">configurator for the All New XJ</a>.</p>
<p><span id="more-19"></span></p>
<p>This configurator is currently HTML based with a nice &#8220;Flash&#8221; 3d Model that lets you spin the car around to see it from all angles.</p>
<p>The backend is based on a product configurator/rules engine web service which can be used to drive all kinds of product configurator, automotive or otherwise.</p>
<p>I hope to build some controls and components for Umbraco to allow integration with the product configurator and a Content Management System, although it may be some time before I have the time!</p>
<p>The new configurator also contains the first Flash app I ever built: the 3D spin.  I&#8217;m still amazed at how quickly we were able to build that!</p>
<p>I absolutely love the Jaguar XJ; it really does help when building a new application when the product itself is so inspiring.</p>
<p>Since launching the XJ configurator we&#8217;ve also replaced the old XF configurator with a <a title="New XF Configurator" href="http://rules.config.jaguar.com/rc/jag/gb/cv?t=shtml">new XF configurator</a>, and added in new <a title="X-Type Configurator" href="http://rules.config.jaguar.com/rc/jag/gb/cx?t=shtml">X-Type</a> and <a title="X-Type Configurator" href="http://rules.config.jaguar.com/rc/jag/gb/cs?t=shtml">XK configurators</a> as well!</p>
<p>US versions are also available if you are interested in <a href="http://rules.config.jaguar.com/rc/jag/us/cj?t=shtml">building your own XJ</a>, <a title="USA XF Configurator" href="http://rules.config.jaguar.com/rc/jag/us/cv?t=shtml">building an XF</a> or <a title="USA XK Configurator" href="http://rules.config.jaguar.com/rc/jag/us/cs?t=shtml">building an XK</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.createsoft.co.uk/blog/2009/08/another-jaguar-configurator-for-the-xj/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Umbraco DocType Inheritance</title>
		<link>http://www.createsoft.co.uk/blog/2008/09/umbraco-doctype-inheritance/</link>
		<comments>http://www.createsoft.co.uk/blog/2008/09/umbraco-doctype-inheritance/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 08:12:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[umbraco]]></category>

		<guid isPermaLink="false">http://www.createsoft.co.uk/blog/?p=17</guid>
		<description><![CDATA[This is a post in response to the ongoing discussion about DocType Inheritance in Umbraco.
I am working on a large site with a lot of different doc types. They do all share some common properties &#8211; Breadcrumb name, and menu name for example. I also need to add Metadata fields to each of these document [...]]]></description>
			<content:encoded><![CDATA[<p>This is a post in response to the ongoing <a href="http://forum.umbraco.org/yaf_postsm30396_Partial-document-types-for-reusing-on-other-document-types.aspx">discussion about DocType Inheritance in Umbraco</a>.</p>
<p>I am working on a large site with a lot of different doc types. They do all share some common properties &#8211; Breadcrumb name, and menu name for example. I also need to add Metadata fields to each of these document types at some point.</p>
<p>Niels is probably correct &#8211; &#8220;inheritance&#8221; would save me half an hour here, half an hour there. But I do still think it would make my life easier and take some of the tedium out of website development!</p>
<p>I have been giving this some thought over the last few days and wondered if some of my thoughts would be of use to anybody.<br />
<span id="more-17"></span><br />
<strong>Aims of DocType Inheritance</strong><br />
1. Ability to inherit the properties defined in a base Document Type<br />
2. When the base document type properties change, these changes should propogate to child types.</p>
<p><strong>Examples of DocType Inheritance</strong><br />
1. Car website &#8211; base &#8220;Auto&#8221; doctype with child &#8220;CopCar&#8221; doctype<br />
2. Metadata &#8211; all/most documents require Keywords, Description, Title, breadcrumb name</p>
<p><strong>Simple Implementation</strong><br />
If the purpose of DocType inheritance is to re-use common fields, this can be achieved without making any changes to Umbraco and without even adding any packages to Umbraco (although, some Action Handlers could make the experience a little nicer).</p>
<p>I&#8217;m not saying this is a solution that everyone will want to use, but it is a possibility, and it works without any changes to Umbraco.</p>
<p><strong>Meta Data</strong><br />
Here is a scenario:<br />
1. a DocType called &#8220;BaseDocType&#8221; which has the properties &#8220;MetaKeywords&#8221;, &#8220;MetaDescription&#8221;.<br />
The &#8220;BaseDocType&#8221; does not have a template assigned (@template=0)</p>
<p>2. a DocType called &#8220;Blog&#8221; which has the properties &#8220;blogImage&#8221; and &#8220;blogText&#8221; and &#8220;author&#8221;</p>
<p>3. a DocType called &#8220;Homepage&#8221; which has the properties &#8220;bodyText&#8221; and &#8220;featuredBlogPosts&#8221;</p>
<p>If we want all of our documents to use the properties in &#8220;BaseDocType&#8221; then the simplest way is to allow &#8220;BaseDocType&#8221; to be a child node of the other two &#8211; on the &#8220;Structure&#8221; tab of the Document Type, make sure that &#8220;BaseDocType&#8221; is an allowed child node.</p>
<p><img src="http://img.skitch.com/20080909-knmht6pn1q4hy5qn5chjqeedqp.jpg" alt="" /></p>
<pre>WEBSITE
   |
   |-----------Homepage
   |                    |---------- BaseDocType
   |
   |-----------Blog Post 1
   |                    |---------- BaseDocType
   |
   |-----------Blog Post 2
   |                    |---------- BaseDocType</pre>
<p>You can write some XSLT, Python, or in Umbraco v4 you can write some C# straight into the page, to retrieve the properties of the child basedoctype.</p>
<div class="code"><strong>Code:</strong></p>
<div class="innercode">
<pre>&lt;xsl:variable name="baseDoc" select="$currentPage/node[@nodeTypeAlias='BaseDocType']" /&gt;
&lt;meta name="keywords" content="{$baseDoc/data[@alias='MetaKeywords']}" /&gt;
&lt;meta name="description" content="{$baseDoc/data[@alias='MetaDescription']}" /&gt;</pre>
<p><strong>Multiple Inheritance (BaseAuto)</strong></p>
</div>
</div>
<p>Now we could add some more document types:<br />
4. BaseAuto (With engine, transmission, topSpeed properties)<br />
Again, no template should be selected for the base type (@template=0)</p>
<p>5. CopCar (With SirenColour and optional Doughnut holder)</p>
<p>Now you can re-use both the BaseAuto and the BaseDocType as follows:</p>
<pre>WEBSITE
   |
   |-----------Homepage
   |                    |---------- BaseDocType
   |
   |-----------Blog Post
   |                    |---------- BaseDocType
   |
   |-----------Cop Car
   |                    |---------- BaseDocType
   |                    |---------- BaseAuto</pre>
<p><strong>@template=0</strong><br />
When writing menus, sitemaps, breadcrumbs etc you may already have come across &#8216;umbracoNaviHide&#8217;. This is a flag which can be used to tell XSLT not to render links to some pages.<br />
I also use the @template attribute for the same purpose.</p>
<p>So, if @template=0 &#8211; do not render that page in any navigation or sitemaps.</p>
<p><strong>Some Action Handlers</strong><br />
This could be made more user friendly by writing some action handlers. For example, if the user attempts to create a CopCar, then an action handler could automatically create the BaseDocType and BaseAuto child nodes.</p>
<p>This will require a more formal way of specifying the &#8220;inheritance&#8221; &#8211; so that the action handler knows which child documents to create. I think this could be done with a simple data type / label which identifies the child document types or by using the Document type &#8220;name&#8221;</p>
<div class="code"><strong>Code:</strong></p>
<div class="innercode">DocType Name: Blog Post extends BaseDocType<br />
DocType Alias: blogPost</p>
<p>DocTypeName: Cop Car extends BaseDocType,BaseAuto<br />
DocType Alias: copCar</p>
</div>
</div>
<p><strong>Some tweaks</strong><br />
You could arrange your content in reverse &#8211; which would give a view which looks more like an inheritance tree.</p>
<pre>WEBSITE
   |
   |-----------BaseDocType
   |                    |---------- Homepage</pre>
<p>This would allow you to use Umbraco&#8217;s &lt;GET_ITEM recursive=true&gt; tag, and a little less XSLT.<br />
However, you would need to redirect from the BaseDocType to its child node (using an Umbraco Redirect package?) which I think would make this structure unuseable.</p>
<p><strong>The &#8220;real&#8221; thing</strong><br />
For those of you who still want &#8220;proper&#8221; doctype inheritance, this is how I think it could be done as an Umbraco Package using Action Handlers.</p>
<p>Naming convention: Use the DocType naming convention mentioned above (A extends B).<br />
An ActionHandler or .NET event will fire when the DocType is saved. The action handler will check the name of the DocType &#8211; parse the &#8220;extends B&#8221; and add any properties from DocType B to DocType A.</p>
<p>If DocType B is modified, an ActionHandler or .NET event will modify all doctypes which extend DocType B.</p>
<p>I think you would also need to have a sensible naming convention for properties. For example, all properties of DocType B would be named &#8220;B.poperty&#8221; &#8211; to simulate namespaces and avoid duplicate variable names.</p>
<p>Special care would need to be taken to handle deep inheritance (A extends B, B extends C &#8211; so when C is modified, B would be modified, which would cause A to be modified).</p>
<p><strong>Conclusion</strong><br />
So &#8211; thats how I think it could be done.  What do you think?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.createsoft.co.uk/blog/2008/09/umbraco-doctype-inheritance/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using AJAX With Struts and Tiles</title>
		<link>http://www.createsoft.co.uk/blog/2008/05/using-ajax-with-struts-and-tiles/</link>
		<comments>http://www.createsoft.co.uk/blog/2008/05/using-ajax-with-struts-and-tiles/#comments</comments>
		<pubDate>Fri, 09 May 2008 21:29:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[j2ee struts ajax]]></category>

		<guid isPermaLink="false">http://www.createsoft.co.uk/blog/?p=11</guid>
		<description><![CDATA[ 
This post explains a technique for building websites using Struts and Tiles templates, in such a way that AJAX can be integrated into the application. When the user does not support AJAX or JavaScript, the website will still function because it will fall back on the standard HTTP protocols and the standard Struts framework.

Graceful degradation [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p id="f1ud40" class="western" lang="en-GB">This post explains a technique for building websites using Struts and Tiles templates, in such a way that AJAX can be integrated into the application. When the user does not support AJAX or JavaScript, the website will still function because it will fall back on the standard HTTP protocols and the standard Struts framework.</p>
<p class="western" lang="en-GB"><span id="more-11"></span></p>
<p id="f1ud41" class="western" lang="en-GB">Graceful degradation in this way is often referred to as &#8220;Hijax&#8221;.</p>
<p id="f1ud42" class="western" lang="en-GB">This post assumes that the reader is familiar with the Struts and Tiles frameworks.</p>
<p> </p>
<p class="western" lang="en-GB"> </p>
<h3 id="f1ud43" class="western" lang="en-GB">What is AJAX?</h3>
<p id="f1ud44" class="western" lang="en-GB"><span id="f1ud45" lang="en-US">AJAX is an acronym for Asynchronous JavaScript and XML. AJAX is a scripting technique for silently loading new data from the server. Although AJAX scripts commonly use the soon to be standardised XMLHttpRequest object, they could also use a hidden &lt;iframe&gt; or &lt;frame&gt;, or even dynamically </span>embedded<span id="f1ud46" lang="en-US"> &lt;script&gt; tags.</span></p>
<p id="f1ud47" class="western">Although the term AJAX is in common usage, and implies the use of XML, XML is not always used. The XML component is a method of transmitting data between the server and the client. There are alternative methods for doing this, such as JSON (JavaScript Object Notation), plain text, or even HTML.</p>
<h4 id="f1ud48" class="western" lang="en-GB"><span id="f1ud49" lang="en-US">What is </span>Hijax<span id="f1ud50" lang="en-US">?</span></h4>
<p id="f1ud51" class="western">The idea behind Hijax is to build a website with AJAX in mind, but not to implement AJAX functionality until the final stages of the project. When implemented properly, this should ensure that the site degrades gracefully when AJAX or JavaScript are not available.</p>
<p id="f1ud52" class="western" lang="en-GB"><span id="f1ud53" lang="en-US">Ideally this should be done using Unobtrusive JavaScript techniques. Unobtrusive JavaScript works by running function(s) when an (X)HTML page has finished loading. These functions look for classes and id&#8217;s assigned to (X)HTML tags and add JavaScript behaviour to those tags.</span></p>
<p id="f1ud54" class="western">For example, when the document loads the script could look for all (X)HTML &#8220;&lt;A&gt;&#8221; elements with a class named &#8220;ajax&#8221; and apply &#8220;onclick&#8221; events to those links.</p>
<h3 id="f1ud55" class="western" lang="en-GB">What is Struts?</h3>
<p id="f1ud56" class="western" lang="en-GB">Struts is an open source framework for building Servlet/JSP based web applications based on the Model-View-Controller (MVC) design paradigm. Struts is packaged for use in Java and J2EE applications.</p>
<p id="f1ud57" class="western" lang="en-GB">Struts is used to define the various actions which may be undertaken within the system.</p>
<h4 id="f1ud58" class="western" lang="en-GB">What is Tiles?</h4>
<p id="f1ud59" class="western" lang="en-GB">&#8220;Tiles&#8221; is a component of the Struts framework which allows for templating of websites. Templates easily allow us to create consistent websites and improve re-use.</p>
<p id="f1ud60" class="western" lang="en-GB"><br id="f1ud61" /></p>
<p id="f1ud62" class="western" lang="en-GB">Tiles is used to define the layout of the system.</p>
<h2 id="f1ud63" class="western" lang="en-GB">Designing the Tiles Templates</h2>
<p id="f1ud64" class="western" lang="en-GB">Tiles can be used to define the layout of the website. It is a templating system, which means that individual Tiles are created to represent different areas of the website. These are then brought together in a Layout file, which defines where each tile is placed.</p>
<h3 id="f1ud65" class="western" lang="en-GB">A sample Tiles layout design</h3>
<p><a href="http://www.createsoft.co.uk/blog/wp-content/uploads/2008/06/file.gif"><img class="alignnone size-medium wp-image-12" title="file" src="http://www.createsoft.co.uk/blog/wp-content/uploads/2008/06/file-300x200.gif" alt="" width="300" height="200" /></a></p>
<p> </p>
<p id="f1ud68" class="western" lang="en-GB">The Tiles shown above would be represented in a tiles-defs.xml file as follows:</p>
<p id="f1ud69" class="western" lang="en-GB"><br id="f1ud70" /></p>
<p id="f1ud71" class="western" lang="en-GB"><br id="f1ud72" /></p>
<p id="f1ud73"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><strong id="f1ud76">&lt;!&#8211; Filename: tiles-defs.xml &#8211;&gt;</strong></span></span></p>
<p id="f1ud77" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud80" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">definition </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;.default&#8221; </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;/jsp/layout/layout.jsp&#8221;</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud88" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud91" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;menu&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/menu.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud99" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud102" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;graphic&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/graphic.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud110" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud113" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;content&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/content.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud121" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud124" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;footer&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/footer.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud132" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud135" lang="en-US"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">definition</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud139" class="western" lang="en-GB"><br id="f1ud140" /></p>
<p id="f1ud141" class="western" lang="en-GB">Below are some sample JSP files which could be used to represent each Tile.</p>
<p id="f1ud142" class="western" lang="en-GB"><br id="f1ud143" /></p>
<p id="f1ud144" class="western" lang="en-GB"><br id="f1ud145" /></p>
<p id="f1ud146" class="western" lang="en-GB">For example, the Menu Tile would be a simple JSP file which renders an Ordered List of links, for example:</p>
<p id="f1ud147" class="western" lang="en-GB"><br id="f1ud148" /></p>
<p id="f1ud149" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><strong id="f1ud152">&lt;%&#8211; Filename: menu.jsp &#8211;%&gt;</strong></span></span></p>
<p id="f1ud153" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;ol id=&#8221;menu&#8221;&gt;</span></span></p>
<p id="f1ud156" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;li&gt;&lt;a href=&#8221;showPage.do?link=1&#8243;&gt;Menu Item 1&lt;/a&gt;&lt;/li&gt;</span></span></p>
<p id="f1ud159" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;li&gt;&lt;a href=&#8221;showPage.do?link=2&#8243;&gt;Menu Item 2&lt;/a&gt;&lt;/li&gt;</span></span></p>
<p id="f1ud162" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;li&gt;&lt;a href=&#8221;showPage.do?link=3&#8243;&gt;Menu Item 3&lt;/a&gt;&lt;/li&gt;</span></span></p>
<p id="f1ud165" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;/ol&gt;</span></span></p>
<p id="f1ud168" class="western" lang="en-GB"><br id="f1ud169" /></p>
<p id="f1ud170" class="western" lang="en-GB">(Obviously in a real scenario the links would be driven by some form of data, such as a JavaBean)</p>
<p id="f1ud171" class="western" lang="en-GB"><br id="f1ud172" /></p>
<p id="f1ud173" class="western" lang="en-GB">The Graphic Tile would be a simple JSP which outputs an image, for example:</p>
<p id="f1ud174" class="western" lang="en-GB"><br id="f1ud175" /></p>
<p id="f1ud176" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><strong id="f1ud179">&lt;%&#8211; Filename: graphic.jsp &#8211;%&gt;</strong></span></span></p>
<p id="f1ud180" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;img id=&#8221;maingraphic&#8221; src=&#8221;welcome.gif&#8221; alt=&#8221;Alt Text&#8221; /&gt;</span></span></p>
<p id="f1ud183" class="western" lang="en-GB"><br id="f1ud184" /></p>
<p id="f1ud185" class="western" lang="en-GB">The Footer Tile would also be a simple menu-like JSP, for example:</p>
<p id="f1ud186" class="western" lang="en-GB"><br id="f1ud187" /></p>
<p id="f1ud188" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><strong id="f1ud191">&lt;%&#8211; Filename: footer.jsp &#8211;%&gt;</strong></span></span></p>
<p id="f1ud192" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;ol&gt;</span></span></p>
<p id="f1ud195" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;li&gt;&lt;a href=&#8221;sitemap.do&#8221;&gt;Site Map&lt;/a&gt;&lt;/li&gt;</span></span></p>
<p id="f1ud198" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;li&gt;&lt;a href=&#8221;help.do&#8221;&gt;Help&lt;/a&gt;&lt;/li&gt;</span></span></p>
<p id="f1ud201" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;li&gt;&lt;a href=&#8221;terms.do&#8221;&gt;Terms and Conditions&lt;/a&gt;&lt;/li&gt;</span></span></p>
<p id="f1ud204" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;/ol&gt;</span></span></p>
<p id="f1ud207" class="western" lang="en-GB"><br id="f1ud208" /></p>
<p id="f1ud209" class="western" lang="en-GB">The content tile would contain the main information being displayed on the site, for instance, features and specifications information for a vehicle.</p>
<p id="f1ud210" class="western" lang="en-GB"><br id="f1ud211" /></p>
<p id="f1ud212" class="western" lang="en-GB">These separate tiles are then brought together inside a Tiles Layout. A Tiles Layout is simply a JSP file which defines the (X)HTML structure in which the Tiles are placed.</p>
<p id="f1ud213" class="western" lang="en-GB"><br id="f1ud214" /></p>
<p id="f1ud215" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud218" lang="en-US"><span style="color: #008080;">&lt;!</span>DOCTYPE <span style="color: #000080;">html </span><span style="color: #808080;">PUBLIC </span><span style="color: #000080;">&#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221;</span></span></span></span></p>
<p id="f1ud223" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud226" lang="en-US"><span style="color: #3f7f5f;">&#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud229"><br id="f1ud230" /></p>
<p id="f1ud231" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud234" lang="en-US"><span style="color: #bf5f3f;">&lt;%@ </span>taglib <span style="color: #7f007f;">uri</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;http://struts.apache.org/tags-tiles&#8221; </span><span style="color: #7f007f;">prefix</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;tiles&#8221; </span><span style="color: #bf5f3f;">%&gt;</span></span></span></span></p>
<p id="f1ud243" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud246" lang="en-US"><span style="color: #bf5f3f;">&lt;%@ </span>page <span style="color: #7f007f;">language</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;java&#8221; </span><span style="color: #7f007f;">contentType</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;text/html; charset=UTF-8&#8243; </span><span style="color: #bf5f3f;">%&gt;</span></span></span></span></p>
<p id="f1ud255" lang="en-GB"><br id="f1ud256" /></p>
<p id="f1ud257" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud260" lang="en-US"><span style="color: #008080;">&lt;</span>html:html <span style="color: #7f007f;">xhtml</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;true&#8221;</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud266" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud269" lang="en-US"><span style="color: #008080;">&lt;</span>head<span style="color: #008080;">&gt; &#8230; &lt;/head&gt;</span></span></span></span></p>
<p id="f1ud272"><span style="color: #008080;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;body&gt;</span></span></span></p>
<p id="f1ud276"><span style="color: #008080;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;div id=&#8221;menu&#8221;&gt;</span></span></span></p>
<p id="f1ud280" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud283" lang="en-US"><span style="color: #008080;">&lt;</span>tiles:insert <span style="color: #7f007f;">attribute</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;menu&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud289"><span style="color: #008080;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;/div&gt;</span></span></span></p>
<p id="f1ud293" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud296" lang="en-US"><span style="color: #008080;">&lt;div id=&#8221;graphic&#8221;&gt;</span></span></span></span></p>
<p id="f1ud298" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud301" lang="en-US"><span style="color: #008080;">&lt;</span>tiles:insert <span style="color: #7f007f;">attribute</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;graphic&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud307"><span style="color: #008080;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;/div&gt;</span></span></span></p>
<p id="f1ud311"><span style="color: #008080;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;div id=&#8221;content&#8221;&gt;</span></span></span></p>
<p id="f1ud315" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud318" lang="en-US"><span style="color: #008080;">&lt;</span>tiles:insert <span style="color: #7f007f;">attribute</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;content&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud324"><span style="color: #008080;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;/div&gt;</span></span></span></p>
<p id="f1ud328"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;div id=&#8221;footer&#8221;&gt;</span></span></p>
<p id="f1ud331" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud334" lang="en-US"><span style="color: #008080;">&lt;</span>tiles:insert <span style="color: #7f007f;">attribute</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;footer&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud340"><span style="color: #008080;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;/div&gt;</span></span></span></p>
<p id="f1ud344"><span style="color: #008080;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;/body&gt;</span></span></span></p>
<p id="f1ud348"><span style="color: #008080;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;/html&gt;</span></span></span></p>
<p id="f1ud352" class="western"><br id="f1ud353" /></p>
<p id="f1ud354" class="western" lang="en-GB">The last step is to define instantiations of this template. Using the example of a &#8220;Features and Specifications&#8221; website, the site could consist of the following pages:</p>
<p id="f1ud355" class="western" lang="en-GB"><br id="f1ud356" /></p>
<ul id="f1ud357">
<li id="f1ud358">
<p id="f1ud359" class="western" lang="en-GB">Exterior Dimensions</p>
</li>
<li id="f1ud360">
<p id="f1ud361" class="western" lang="en-GB">Interior Dimensions</p>
</li>
<li id="f1ud362">
<p id="f1ud363" class="western" lang="en-GB">Engine Data</p>
</li>
<li id="f1ud364">
<p id="f1ud365" class="western" lang="en-GB">Safety and Security</p>
</li>
<li id="f1ud366">
<p id="f1ud367" class="western" lang="en-GB">Audio Systems</p>
</li>
</ul>
<p id="f1ud368" class="western" lang="en-GB"><br id="f1ud369" /></p>
<p id="f1ud370" class="western" lang="en-GB">These need to be added to the tiles-defs.xml file.</p>
<p id="f1ud371" class="western" lang="en-GB"><br id="f1ud372" /></p>
<p id="f1ud373"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><strong id="f1ud376">&lt;!&#8211; Filename: tiles-defs.xml &#8211;&gt;</strong></span></span></p>
<p id="f1ud377" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud380" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">definition </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;.exterior&#8221; </span><span style="color: #7f007f;">extends</span>=<span style="color: #2a00ff;">&#8220;.default&#8221;</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud388" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud391" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;graphic&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/ext_graphic.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud399" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud402" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;content&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/ext_content.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud410" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud413" lang="en-US"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">definition</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud417"><br id="f1ud418" /></p>
<p id="f1ud419" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud422" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">definition </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;.interior&#8221; </span><span style="color: #7f007f;">extends</span>=<span style="color: #2a00ff;">&#8220;.default&#8221;</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud430" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud433" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;graphic&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/int_graphic.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud441" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud444" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;content&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/int_content.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud452" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud455" lang="en-US"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">definition</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud459" lang="en-GB"><br id="f1ud460" /></p>
<p id="f1ud461" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud464" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">definition </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;.engine&#8221; </span><span style="color: #7f007f;">extends</span>=<span style="color: #2a00ff;">&#8220;.default&#8221;</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud472" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud475" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;graphic&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/engine_graphic.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud483" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud486" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;content&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/engine_content.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud494" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud497" lang="en-US"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">definition</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud501" class="western" lang="en-GB"><br id="f1ud502" /></p>
<p id="f1ud503" class="western" lang="en-GB"><br id="f1ud504" /></p>
<p id="f1ud505" class="western" lang="en-GB">These definitions extend the default so that when the exterior view is requested, exterior graphics and content are displayed.</p>
<p class="western" lang="en-GB"> </p>
<p class="western" lang="en-GB"> </p>
<h3 id="f1ud506" class="western" lang="en-GB">Struts Configuration</h3>
<p id="f1ud507" class="western" lang="en-GB">One or more actions now need to be defined which will display the various pages of the site.</p>
<p id="f1ud508" class="western" lang="en-GB">In this simple example, we will look at just one action, &#8220;ShowPageAction&#8221;. This action will display a requested page, in the standard, non-AJAX way.</p>
<p id="f1ud509" class="western" lang="en-GB"><br id="f1ud510" /></p>
<p id="f1ud511" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud514" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">action </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;/showPage&#8221;</span></span></span></span></p>
<p id="f1ud519" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud522" lang="en-US"><span style="color: #7f007f;">type</span>=<span style="color: #2a00ff;">&#8220;com.ford.it.ajaxdemo.ShowPageAction&#8221;</span></span></span></span></p>
<p id="f1ud525" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud528" lang="en-US"><span style="color: #7f007f;">scope</span>=<span style="color: #2a00ff;">&#8220;request&#8221;</span></span></span></span></p>
<p id="f1ud531" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud534" lang="en-US"><span style="color: #7f007f;">unknown</span>=<span style="color: #2a00ff;">&#8220;false&#8221;</span></span></span></span></p>
<p id="f1ud537" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud540" lang="en-US"><span style="color: #7f007f;">validate</span>=<span style="color: #2a00ff;">&#8220;true&#8221;</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud544"><br id="f1ud545" /></p>
<p id="f1ud546" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud549" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">forward </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;exterior&#8221; </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;.exterior&#8221; </span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud557" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud560" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">forward </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;interior&#8221; </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;.interior&#8221; </span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud568" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud571" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">forward </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;engine&#8221; </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;.engine&#8221; </span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud579" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud582" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">forward </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;safety&#8221; </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;.safety&#8221; </span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud590" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud593" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">forward </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;audio&#8221; </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;.audio&#8221; </span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud601" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud604" lang="en-US"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">action</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud608" class="western" lang="en-GB"><br id="f1ud609" /></p>
<p id="f1ud610" class="western" lang="en-GB">A Struts Action class must now be created which will forward to the relevant page, based on a parameter; the URL to view the Exterior Dimensions would then be:</p>
<p id="f1ud611" class="western" lang="en-GB"><br id="f1ud612" /></p>
<p id="f1ud613" class="western" lang="en-GB"><span style="color: #0000ff;"><span id="f1ud615" style="text-decoration: underline;"><a id="f1ud616" href="http://www.url.com/myapp/showPage.do?page=exterior">http://www.url.com/myapp/showPage.do?page=exterior</a></span></span></p>
<p id="f1ud617" class="western" lang="en-GB"><br id="f1ud618" /></p>
<p id="f1ud619" class="western" lang="en-GB">The Action would then forward to &#8220;exterior&#8221; and display the exterior page as defined by the .exterior Tiles Definition (using &#8220;ext_graphic.jsp&#8221; and &#8220;ext_content.jsp&#8221;).</p>
<p id="f1ud620" class="western" lang="en-GB"><br id="f1ud621" /></p>
<h2 id="f1ud622" class="western" lang="en-GB">Implementing AJAX</h2>
<p id="f1ud623" class="western" lang="en-GB">Once a working website has been constructed, it is time to implement the AJAX layer. Unobtrusive JavaScript will be used to progressively enhance the website by adding AJAX calls to the hyperlinks within the page.</p>
<p id="f1ud624" class="western" lang="en-GB"><br id="f1ud625" /></p>
<h3 id="f1ud626" class="western" lang="en-GB">The AJAX XML Document</h3>
<p id="f1ud627" class="western" lang="en-GB">The AJAX messages are defined as Tiles Layout JSP files. These JSP files contain XML – not (X)HTML. The file must therefore begin with the standard XML header,</p>
<p id="f1ud628" class="western"><br id="f1ud629" /></p>
<p id="f1ud630" class="western"><br id="f1ud631" /></p>
<p id="f1ud632" class="western" lang="en-GB"><span id="f1ud633" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">&lt;?</span><span style="color: #3f7f7f;">xml </span><span style="color: #7f007f;">version</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;1.0&#8243; </span><span style="color: #7f007f;">encoding</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;UTF-8&#8243; </span><span style="color: #008080;">?&gt;</span></span></span></p>
<p id="f1ud644" class="western"><br id="f1ud645" /></p>
<p id="f1ud646" class="western" lang="en-GB"><span id="f1ud647" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">escape</span><span style="color: #008080;">&gt;</span></span></span></p>
<p id="f1ud652" class="western"><br id="f1ud653" /></p>
<p id="f1ud654" class="western" lang="en-GB"><span id="f1ud655" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">graphic </span><span style="color: #7f007f;">alt</span><span style="color: #000000;">=</span>&#8220;<span style="color: #008080;">text</span>&#8220; <span style="color: #7f007f;">id</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;tagid&#8221;</span><span style="color: #008080;">&gt;http://myurl.com/img.jpg&lt;/</span><span style="color: #3f7f7f;">graphic</span><span style="color: #008080;">&gt;</span></span></span></p>
<p id="f1ud668" class="western"><br id="f1ud669" /></p>
<p id="f1ud670" class="western" lang="en-GB"><span id="f1ud671" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">html </span><span style="color: #7f007f;">id</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;livearea&#8221;</span><span style="color: #008080;">&gt;&lt;![CDATA[</span></span></span></p>
<p id="f1ud679" class="western" lang="en-GB"><span id="f1ud680" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">&lt;tiles:insert attribute="content"/&gt;</span></span></span></p>
<p id="f1ud683" class="western" lang="en-GB"><span id="f1ud684" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">]]&gt;&lt;/</span><span style="color: #3f7f7f;">html</span><span style="color: #008080;">&gt;</span></span></span></p>
<p id="f1ud689" class="western"><br id="f1ud690" /></p>
<p id="f1ud691" class="western" lang="en-GB"><span id="f1ud692" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">javascript </span><span style="color: #7f007f;">description</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;start page&#8221; </span><span style="color: #7f007f;">when</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;start&#8221;</span><span style="color: #008080;">&gt;&lt;![CDATA[</span></span></span></p>
<p id="f1ud703" class="western"><span style="font-family: 'Courier New', monospace;">alert("hello");</span></p>
<p id="f1ud705" class="western" lang="en-GB"><span id="f1ud706" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">]]&gt;&lt;/</span><span style="color: #3f7f7f;">javascript</span><span style="color: #008080;">&gt;</span></span></span></p>
<p id="f1ud711" class="western"><br id="f1ud712" /></p>
<p id="f1ud713" class="western" lang="en-GB"><span id="f1ud714" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">escape</span><span style="color: #008080;">&gt;</span></span></span></p>
<p id="f1ud719" class="western"><br id="f1ud720" /></p>
<p id="f1ud721" class="western" lang="en-GB"><br id="f1ud722" /></p>
<p id="f1ud723" class="western" lang="en-GB">The document root is called &#8220;escape&#8221;. There are then 3 types of element – html, javascript, and graphic.</p>
<p id="f1ud724" class="western" lang="en-GB"><br id="f1ud725" /></p>
<p id="f1ud726" class="western" lang="en-GB"><strong id="f1ud727">&lt;graphic&gt;</strong></p>
<p id="f1ud728" class="western" lang="en-GB">The &lt;graphic&gt; tag is used to represent an image on the page. The &#8220;id&#8221; attribute should correspond to the ID of an (X)HTML &lt;img/&gt; tag somewhere in the web page. The content of the &lt;graphic&gt; element is used to replace the image source (src attribute).</p>
<p id="f1ud729" class="western" lang="en-GB"><br id="f1ud730" /></p>
<p id="f1ud731" class="western" lang="en-GB"><strong id="f1ud732">&lt;html&gt;</strong></p>
<p id="f1ud733" class="western" lang="en-GB">The HTML tag works in a similar way. The id attribute is used to locate an (X)HTML element somewhere on the page. The content of that element is then replaced with the content in the AJAX document.</p>
<p id="f1ud734" class="western" lang="en-GB"><br id="f1ud735" /></p>
<p id="f1ud736" class="western" lang="en-GB">The &lt;![CDATA[ tags are used to ensure that it is safe to place HTML fragments inside the XML document. Note that this means any included documents may <strong id="f1ud737">not</strong>themselves include &lt;![CDATA or ]]&gt; tags.</p>
<p id="f1ud738" class="western" lang="en-GB"><br id="f1ud739" /></p>
<p id="f1ud740" class="western" lang="en-GB"><strong id="f1ud741">&lt;javascript&gt;</strong></p>
<p id="f1ud742" class="western" lang="en-GB">The &lt;javascript&gt; tag does not have an id attribute. Instead it has a &#8220;when&#8221; attribute which can take the values &#8220;start&#8221; and &#8220;end&#8221;. These indicate whether the javascript should be run before or after the AJAX document has updated the (X)HTML document in the web browser.</p>
<p id="f1ud743" class="western" lang="en-GB"><br id="f1ud744" /></p>
<p id="f1ud745" class="western" lang="en-GB">Again, &lt;![CDATA[ … ]]&gt; elements are used to ensure the content of the &lt;javascript&gt; tag does not interfere with the AJAX XML document.</p>
<p id="f1ud746" class="western" lang="en-GB"><br id="f1ud747" /></p>
<p id="f1ud748" class="western" lang="en-GB"><strong id="f1ud749">JSP Tags</strong></p>
<p id="f1ud750" class="western" lang="en-GB">Note that it is perfectly acceptable to use JSP Tags in the XML document. An example if a &lt;tiles:insert /&gt; tag is included in the html example. Equally, a &lt;bean:write/&gt; or &lt;bean:message/&gt; tag could have been used for the alt text on the &lt;graphic&gt; image.</p>
<p id="f1ud751" class="western" lang="en-GB"><br id="f1ud752" /></p>
<h3 id="f1ud753" class="western" lang="en-GB">The AJAX Processor</h3>
<p id="f1ud754" class="western" lang="en-GB">JavaScript functions are required in order to send AJAX messages and to process the response from the server.</p>
<p id="f1ud755" class="western" lang="en-GB"><br id="f1ud756" /></p>
<p id="f1ud757" class="western" lang="en-GB">These methods are implemented in an &#8220;ajax.js&#8221; file. The AJAX JavaScript may be customised for each application, but the core of the code is reproduced here.</p>
<p id="f1ud758" class="western" lang="en-GB"><br id="f1ud759" /></p>
<p id="f1ud760" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">/*</span></span></span></p>
<p id="f1ud764" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">(c)Copyright 2007 Ford Motor Company. All rights reserved.</span></span></span></p>
<p id="f1ud768" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">*/</span></span></span></p>
<p id="f1ud772" class="western"><br id="f1ud773" /></p>
<p id="f1ud774" class="western" lang="en-GB"><span id="f1ud775" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">req;</span></span></span></span></p>
<p id="f1ud780" class="western" lang="en-GB"><br id="f1ud781" /></p>
<p id="f1ud782" class="western" lang="en-GB">The &#8220;req&#8221; variable is used to hold the XML Request object.</p>
<p id="f1ud783" class="western" lang="en-GB"><br id="f1ud784" /></p>
<p id="f1ud785" class="western" lang="en-GB"><span id="f1ud786" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">function </span><span style="color: #000000;">startRequest(url) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud792" class="western"> </p>
<p id="f1ud793" class="western"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">req = getXMLRequestObject();</span></span></p>
<p id="f1ud796" class="western"><br id="f1ud797" /></p>
<p id="f1ud798" class="western" lang="en-GB"><span id="f1ud799" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">if </span><span style="color: #000000;">(req) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud805" class="western" lang="en-GB"><span id="f1ud806" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">req.onreadystatechange = processStateChange;</span></span></span></span></p>
<p id="f1ud810" class="western" lang="en-GB"><span style="color: #000000;"><span id="f1ud812" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;">req.open(</span><span style="color: #8e00ff;">&#8220;GET&#8221;</span><span style="color: #000000;">, url, </span><span style="color: #7f0055;">true</span><span style="color: #000000;">);</span></span></span></span></p>
<p><span style="color: #000000;"></p>
<p id="f1ud820" class="western"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">sendXMLRequest(req);</span></span></p>
<p id="f1ud823" class="western" lang="en-GB"><span id="f1ud824" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">return false</span><span style="color: #000000;">;</span></span></span></span></p>
<p id="f1ud829" class="western" lang="en-GB"><span id="f1ud830" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">} else {</span></span></span></span></p>
<p id="f1ud834" class="western" lang="en-GB"><span style="color: #7f0055;"><span id="f1ud836" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;">return true</span><span style="color: #000000;">;</span></span></span></span></p>
<p><span style="color: #7f0055;"></p>
<p id="f1ud841" class="western" lang="en-GB"><span id="f1ud842" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud846" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">}</span></span></span></p>
<p id="f1ud850" class="western"><br id="f1ud851" /></p>
<p id="f1ud852" class="western" lang="en-GB"><span id="f1ud853" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">function </span><span style="color: #000000;">sendXMLRequest(obj) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud859" class="western" lang="en-GB"><span id="f1ud860" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">if </span><span style="color: #000000;">(window.XMLHttpRequest) </span><span style="color: #7f0055;">{ </span><span style="color: #3f5fbf;">// Non-IE browsers</span></span></span></span></p>
<p id="f1ud867" class="western" lang="en-GB"><span id="f1ud868" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">obj.send(</span><span style="color: #7f0055;">null</span><span style="color: #000000;">);</span></span></span></span></p>
<p id="f1ud874" class="western" lang="en-GB"><span id="f1ud875" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud879" class="western" lang="en-GB"><span id="f1ud880" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">else if </span><span style="color: #000000;">(window.ActiveXObject) </span><span style="color: #7f0055;">{ </span><span style="color: #3f5fbf;">// IE</span></span></span></span></p>
<p id="f1ud887" class="western" lang="en-GB"><span id="f1ud888" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">obj.send();</span></span></span></span></p>
<p id="f1ud892" class="western" lang="en-GB"><span id="f1ud893" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud897" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">}</span></span></span></p>
<p id="f1ud901" class="western"><br id="f1ud902" /></p>
<p id="f1ud903" class="western" lang="en-GB"><span id="f1ud904" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">function </span><span style="color: #000000;">getXMLRequestObject() </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud910" class="western" lang="en-GB"><span id="f1ud911" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">obj;</span></span></span></span></p>
<p id="f1ud916" class="western"><br id="f1ud917" /></p>
<p id="f1ud918" class="western" lang="en-GB"><span id="f1ud919" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">if </span><span style="color: #000000;">(window.XMLHttpRequest) </span><span style="color: #7f0055;">{ </span><span style="color: #3f5fbf;">// Non-IE browsers</span></span></span></span></p>
<p id="f1ud926" class="western" lang="en-GB"><span id="f1ud927" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">obj = </span><span style="color: #7f0055;">new </span><span style="color: #000000;">XMLHttpRequest();</span></span></span></span></p>
<p id="f1ud933" class="western" lang="en-GB"><span id="f1ud934" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">//req.overrideMimeType(&#8216;text/xml&#8217;)</span></span></span></span></p>
<p id="f1ud938" class="western" lang="en-GB"><span id="f1ud939" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud943" class="western" lang="en-GB"><span id="f1ud944" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">else if </span><span style="color: #000000;">(window.ActiveXObject) </span><span style="color: #7f0055;">{ </span><span style="color: #3f5fbf;">// IE</span></span></span></span></p>
<p id="f1ud951" class="western" lang="en-GB"><span id="f1ud952" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">obj = </span><span style="color: #7f0055;">new </span><span style="color: #000000;">ActiveXObject(</span><span style="color: #8e00ff;">&#8220;Microsoft.XMLHTTP&#8221;</span><span style="color: #000000;">);</span></span></span></span></p>
<p id="f1ud960" class="western" lang="en-GB"><span id="f1ud961" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud965" class="western" lang="en-GB"><span id="f1ud966" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">return </span><span style="color: #000000;">obj;</span></span></span></span></p>
<p id="f1ud971" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">}</span></span></span></p>
<p id="f1ud975" class="western" lang="en-GB"><br id="f1ud976" /></p>
<p id="f1ud977" class="western" lang="en-GB">The 3 functions above are used to generate the AJAX request.</p>
<p id="f1ud978" class="western" lang="en-GB"><br id="f1ud979" /></p>
<p id="f1ud980" class="western" lang="en-GB">The following function is called when an AJAX response is received, it processes the AJAX XML document.</p>
<p id="f1ud981" class="western" lang="en-GB"><br id="f1ud982" /></p>
<p id="f1ud983" class="western" lang="en-GB"><span id="f1ud984" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">function </span><span style="color: #000000;">processStateChange() </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud990" class="western" lang="en-GB"><span style="color: #7f0055;"><span id="f1ud992" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;">if </span><span style="color: #000000;">(req.readyState == 4) </span><span style="color: #7f0055;">{ </span><span style="color: #3f5fbf;">// Complete</span></span></span></span></p>
<p><span style="color: #7f0055;"></p>
<p id="f1ud999" class="western" lang="en-GB"><span style="color: #3f5fbf;"><span id="f1ud1001" lang="en-US"><span style="font-size: x-small;"><span style="color: #7f0055;">if </span><span style="color: #000000;">(req.status == 200) </span><span style="color: #7f0055;">{ </span><span style="color: #3f5fbf;">// OK response</span></span></span></span></p>
<p><span style="color: #3f5fbf;"></p>
<p id="f1ud1008" class="western"><br id="f1ud1009" /></p>
<p id="f1ud1010" class="western" lang="en-GB"><span id="f1ud1011" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">dom = req.responseXML;</span></span></span></span></p>
<p id="f1ud1016" class="western"> </p>
<p id="f1ud1017" class="western" lang="en-GB"><span id="f1ud1018" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// If response is non-XML, simply overwrite the current</span></span></span></span></p>
<p id="f1ud1022" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// document contents with what was received (html expected).</span></span></span></p>
<p id="f1ud1026" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// This caters for displaying fatal error pages, for example.</span></span></span></p>
<p id="f1ud1030" class="western" lang="en-GB"><span id="f1ud1031" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">if</span><span style="color: #000000;">(dom==</span><span style="color: #7f0055;">null </span><span style="color: #000000;">|| !dom.hasChildNodes()) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud1039" class="western" lang="en-GB"><span id="f1ud1040" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">document.write(req.responseText);</span></span></span></span></p>
<p id="f1ud1044" class="western" lang="en-GB"><span id="f1ud1045" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">} else {</span></span></span></span></p>
<p id="f1ud1049" class="western" lang="en-GB"><span id="f1ud1050" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></span></span></span></p>
<p id="f1ud1054" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// Process start JavaScript</span></span></span></p>
<p id="f1ud1058" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></span></span></p>
<p id="f1ud1062" class="western" lang="en-GB"><span id="f1ud1063" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">processJavaScript(</span><span style="color: #8e00ff;">&#8220;start&#8221;</span><span style="color: #000000;">, dom);</span></span></span></span></p>
<p id="f1ud1069" class="western"> </p>
<p id="f1ud1070" class="western"> </p>
<p id="f1ud1071" class="western" lang="en-GB"><span id="f1ud1072" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</span></span></span></span></p>
<p id="f1ud1076" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// Update graphic</span></span></span></p>
<p id="f1ud1080" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</span></span></span></p>
<p id="f1ud1084" class="western" lang="en-GB"><span id="f1ud1085" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">try {</span></span></span></span></p>
<p id="f1ud1089" class="western" lang="en-GB"><span id="f1ud1090" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">graphicElems = dom.getElementsByTagName(</span><span style="color: #8e00ff;">&#8220;graphic&#8221;</span><span style="color: #000000;">);</span></span></span></span></p>
<p id="f1ud1097" class="western" lang="en-GB"><span id="f1ud1098" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">for</span><span style="color: #000000;">(</span><span style="color: #7f0055;">var </span><span style="color: #000000;">i=0; i&lt;graphicElems.length; i++) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud1106" class="western" lang="en-GB"><span id="f1ud1107" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">alt = graphicElems[i].getAttribute(</span><span style="color: #8e00ff;">&#8220;alt&#8221;</span><span style="color: #000000;">);</span></span></span></span></p>
<p id="f1ud1114" class="western" lang="en-GB"><span id="f1ud1115" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">imagePath =</span></span></span></span></p>
<p id="f1ud1120" class="western" align="RIGHT"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">graphicElems[i].firstChild.nodeValue;</span></span></p>
<p id="f1ud1123" class="western" lang="en-GB"><span id="f1ud1124" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">id=graphicElems[i].getAttribute(</span><span style="color: #8e00ff;">&#8220;id&#8221;</span><span style="color: #000000;">);</span></span></span></span></p>
<p id="f1ud1131" class="western"> </p>
<p id="f1ud1132" class="western" lang="en-GB"><span id="f1ud1133" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">image = document.getElementById(id);</span></span></span></span></p>
<p id="f1ud1138" class="western" lang="en-GB"><span id="f1ud1139" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">if</span><span style="color: #000000;">(!isUndefined(image) &#038;&#038; image!=</span><span style="color: #7f0055;">null</span><span style="color: #000000;">) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud1147" class="western" lang="en-GB"><span id="f1ud1148" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">image.src = imagePath;</span></span></span></span></p>
<p id="f1ud1152" class="western"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">image.alt = alt;</span></span></p>
<p id="f1ud1155" class="western"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">image.title = alt;</span></span></p>
<p id="f1ud1158" class="western" lang="en-GB"><span id="f1ud1159" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud1163" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">}</span></span></span></p>
<p id="f1ud1167" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">}</span></span></span></p>
<p id="f1ud1171" class="western" lang="en-GB"><span id="f1ud1172" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">catch</span><span style="color: #000000;">(ex) </span><span style="color: #7f0055;">{</span><span style="color: #3f5fbf;">// If there is an exception, continue anyway since</span></span></span></span></p>
<p id="f1ud1179" class="western" lang="en-GB"><span id="f1ud1180" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// there may not be a graphic element in the returned <br id="f1ud1184" /></span><span style="color: #3f5fbf;">// XML. This caters for the AJAX Error page which simply</span></span></span></span></p>
<p id="f1ud1186" class="western" lang="en-GB"><span id="f1ud1187" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// displays an error notable.</span></span></span></span></p>
<p id="f1ud1191" class="western" lang="en-GB"><span id="f1ud1192" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud1196" class="western"> </p>
<p id="f1ud1197" class="western" lang="en-GB"><span id="f1ud1198" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></span></span></span></p>
<p id="f1ud1202" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// Update HTML</span></span></span></p>
<p id="f1ud1206" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></span></span></p>
<p id="f1ud1210" class="western" lang="en-GB"><span id="f1ud1211" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">i;</span></span></span></span></p>
<p id="f1ud1216" class="western" lang="en-GB"><span id="f1ud1217" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">for</span><span style="color: #000000;">(i=0; i&lt;dom.getElementsByTagName(</span><span style="color: #8e00ff;">&#8220;html&#8221;</span><span style="color: #000000;">).length; i++) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud1225" class="western" lang="en-GB"><span id="f1ud1226" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">htmlElem = dom.getElementsByTagName(</span><span style="color: #8e00ff;">&#8220;html&#8221;</span><span style="color: #000000;">)[i];</span></span></span></span></p>
<p id="f1ud1233" class="western"> </p>
<p id="f1ud1234" class="western" lang="en-GB"><span id="f1ud1235" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// Handle empty tags e.g. &lt;html id=&#8221;x&#8221;&gt;&lt;/html&gt;</span></span></span></span></p>
<p id="f1ud1239" class="western" lang="en-GB"><span id="f1ud1240" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">html = </span><span style="color: #8e00ff;">&#8220;&#8221;</span><span style="color: #000000;">;</span></span></span></span></p>
<p id="f1ud1247" class="western" lang="en-GB"><span id="f1ud1248" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">if</span><span style="color: #000000;">(htmlElem.firstChild) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud1254" class="western" lang="en-GB"><span id="f1ud1255" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">html = htmlElem.firstChild.nodeValue;</span></span></span></span></p>
<p id="f1ud1259" class="western" lang="en-GB"><span id="f1ud1260" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud1264" class="western"> </p>
<p id="f1ud1265" class="western" lang="en-GB"><span id="f1ud1266" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">id = htmlElem.getAttribute(</span><span style="color: #8e00ff;">&#8220;id&#8221;</span><span style="color: #000000;">);</span></span></span></span></p>
<p id="f1ud1273" class="western" lang="en-GB"><span id="f1ud1274" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">tag = document.getElementById(id);</span></span></span></span></p>
<p id="f1ud1279" class="western" lang="en-GB"><span id="f1ud1280" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">if</span><span style="color: #000000;">(!isUndefined(tag)) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud1286" class="western" lang="en-GB"><span id="f1ud1287" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">tag.innerHTML = html;</span></span></span></span></p>
<p id="f1ud1291" class="western" lang="en-GB"><span id="f1ud1292" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud1296" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">}</span></span></span></p>
<p id="f1ud1300" class="western"> </p>
<p id="f1ud1301" class="western" lang="en-GB"><span id="f1ud1302" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></span></span></span></p>
<p id="f1ud1306" class="western" lang="en-GB"><span id="f1ud1307" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// Process end JavaScript</span></span></span></span></p>
<p id="f1ud1311" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></span></span></p>
<p id="f1ud1315" class="western" lang="en-GB"><span id="f1ud1316" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">processJavaScript(</span><span style="color: #8e00ff;">&#8220;end&#8221;</span><span style="color: #000000;">, dom);</span></span></span></span></p>
<p id="f1ud1322" class="western" lang="en-GB"><span id="f1ud1323" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud1327" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">} else {</span></span></span></p>
<p id="f1ud1331" class="western" lang="en-GB"><span id="f1ud1332" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// If the request status returned was not 200 (OK), display the</span></span></span></span></p>
<p id="f1ud1336" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// standard locale-specific error page, since the request</span></span></span></p>
<p id="f1ud1340" class="western" lang="en-GB"><span id="f1ud1341" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// cannot be processed.</span></span></span></span></p>
<p id="f1ud1345" class="western" lang="en-GB"><span id="f1ud1346" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">document.location = </span><span style="color: #8e00ff;">&#8220;error.do&#8221;</span><span style="color: #000000;">;</span></span></span></span></p>
<p id="f1ud1352" class="western" lang="en-GB"><span id="f1ud1353" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud1357" class="western" lang="en-GB"><span id="f1ud1358" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud1362" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">}</span></span></span></p>
<p id="f1ud1366" class="western"><br id="f1ud1367" /></p>
<p id="f1ud1368" class="western" lang="en-GB"><br id="f1ud1369" /></p>
<p id="f1ud1370" class="western" lang="en-GB">The next function handles and &lt;javascript&gt; tags in the AJAX XML response.</p>
<p id="f1ud1371" class="western" lang="en-GB"><br id="f1ud1372" /></p>
<p id="f1ud1373" class="western" lang="en-GB"><span id="f1ud1374" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">function </span><span style="color: #000000;">processJavaScript(when, dom) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud1380" class="western" lang="en-GB"><span id="f1ud1381" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">i;</span></span></span></span></p>
<p id="f1ud1386" class="western" lang="en-GB"><span id="f1ud1387" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">for</span><span style="color: #000000;">(i=0; i&lt;dom.getElementsByTagName(</span><span style="color: #8e00ff;">&#8220;javascript&#8221;</span><span style="color: #000000;">).length; i++) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud1395" class="western" lang="en-GB"><span id="f1ud1396" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">jsElem = dom.getElementsByTagName(</span><span style="color: #8e00ff;">&#8220;javascript&#8221;</span><span style="color: #000000;">)[i];</span></span></span></span></p>
<p id="f1ud1403" class="western"><br id="f1ud1404" /></p>
<p id="f1ud1405" class="western" lang="en-GB"><span id="f1ud1406" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// description used for information purposes only (e.g. debugging)</span></span></span></span></p>
<p id="f1ud1410" class="western" lang="en-GB"><span id="f1ud1411" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">jsWhen = jsElem.getAttribute(</span><span style="color: #8e00ff;">&#8220;when&#8221;</span><span style="color: #000000;">);</span></span></span></span></p>
<p id="f1ud1418" class="western"> </p>
<p id="f1ud1419" class="western" lang="en-GB"><span id="f1ud1420" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">if</span><span style="color: #000000;">(jsWhen==when) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud1426" class="western" lang="en-GB"><span id="f1ud1427" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">jsDescription = jsElem.getAttribute(</span><span style="color: #8e00ff;">&#8220;description&#8221;</span><span style="color: #000000;">);</span></span></span></span></p>
<p id="f1ud1434" class="western" lang="en-GB"><span id="f1ud1435" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">js = jsElem.firstChild.nodeValue;</span></span></span></span></p>
<p id="f1ud1440" class="western"><br id="f1ud1441" /></p>
<p id="f1ud1442" class="western" lang="en-GB"><span id="f1ud1443" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">try {</span></span></span></span></p>
<p id="f1ud1447" class="western" lang="en-GB"><span id="f1ud1448" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">eval(js);</span></span></span></span></p>
<p id="f1ud1452" class="western" lang="en-GB"><span id="f1ud1453" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">} catch</span><span style="color: #000000;">(e) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud1459" class="western" lang="en-GB"><span id="f1ud1460" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// If the JavaScript fails to evaluate, ignore since this</span></span></span></span></p>
<p id="f1ud1464" class="western" lang="en-GB"><span id="f1ud1465" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// is not a critical error. Line below can be used for</span></span></span></span></p>
<p id="f1ud1469" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// debugging, if necessary, by uncommenting.</span></span></span></p>
<p id="f1ud1473" class="western"> </p>
<p id="f1ud1474" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// alert(&#8220;AJAX Error (&#8221; + jsDescription + &#8220;) &#8221; + e.message);</span></span></span></p>
<p id="f1ud1478" class="western" lang="en-GB"><span id="f1ud1479" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></span></p>
<p id="f1ud1483" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">}</span></span></span></p>
<p id="f1ud1487" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">}</span></span></span></p>
<p id="f1ud1491" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">}</span></span></span></p>
<p id="f1ud1495" class="western" lang="en-GB"><br id="f1ud1496" /></p>
<p id="f1ud1497" class="western" lang="en-GB">It is possible to write JavaScript in a JSP page and include that in the &lt;javascript&gt; tag. For example,</p>
<p id="f1ud1498" class="western" lang="en-GB"><br id="f1ud1499" /></p>
<p id="f1ud1500" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;javascript when=&#8221;start&#8221; description=&#8221;some description&#8221;&gt;&lt;![CDATA[</span></span></p>
<p id="f1ud1503" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;jsp:include page="javascript.jsp" flush="true" /&gt;</span></span></p>
<p id="f1ud1506" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">]]&gt;&lt;/javascript&gt;</span></span></p>
<p id="f1ud1509" class="western" lang="en-GB"><br id="f1ud1510" /></p>
<p id="f1ud1511" class="western" lang="en-GB">JavaScript which is run at AJAX runtime cannot include other JS files. To get around this restriction, the &#8220;include&#8221; function (below) may be called.</p>
<p id="f1ud1512" class="western" lang="en-GB"><br id="f1ud1513" /></p>
<p id="f1ud1514" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// This function can be used to include .js files</span></span></span></p>
<p id="f1ud1518" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">// It should be used by JSPs in place of the &lt;script src=&#8221;"/&gt; tag.</span></span></span></p>
<p id="f1ud1522" class="western" lang="en-GB"><span id="f1ud1523" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">function </span><span style="color: #000000;">include(scriptpath) </span><span style="color: #7f0055;">{</span></span></span></span></p>
<p id="f1ud1529" class="western" lang="en-GB"><span id="f1ud1530" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">jsReq = getXMLRequestObject();</span></span></span></span></p>
<p id="f1ud1535" class="western" lang="en-GB"><span id="f1ud1536" lang="en-US"><span style="font-size: x-small;"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">jsReq.open(</span><span style="color: #8e00ff;">&#8216;GET&#8217;</span><span style="color: #000000;">, scriptpath, </span><span style="color: #7f0055;">false</span><span style="color: #000000;">);</span></span></span></span></p>
<p id="f1ud1544" class="western"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">sendXMLRequest(jsReq);</span></span></p>
<p id="f1ud1547" class="western"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">eval(jsReq.responseText);</span></span></p>
<p id="f1ud1550" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">}</span></span></span></p>
<h3 id="f1ud1554" class="western" lang="en-GB">AJAX Struts Configuration</h3>
<p id="f1ud1555" class="western" lang="en-GB">An AJAX Action class should be created. This may extend or re-use functionality from a Struts Action class already defined, such as ShowPageAction in our example. The suggested naming convention used for AJAX Struts Action replaces the word &#8220;Action&#8221; with the word &#8220;AJAX&#8221;. So in this example we would name our AJAX Action &#8220;ShowPageAJAX.java&#8221;.</p>
<p id="f1ud1556" class="western" lang="en-GB"><br id="f1ud1557" /></p>
<p id="f1ud1558" class="western" lang="en-GB">The AJAX action should forward to an AJAX forward, as defined in the struts-config.xml file.</p>
<p id="f1ud1559" class="western" lang="en-GB"><br id="f1ud1560" /></p>
<p id="f1ud1561" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1564" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">action </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;/ajaxShowPage&#8221;</span></span></span></span></p>
<p id="f1ud1569" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1572" lang="en-US"><span style="color: #7f007f;">type</span>=<span style="color: #2a00ff;">&#8220;com.ford.it.ajaxdemo.ShowPageAJAX&#8221;</span></span></span></span></p>
<p id="f1ud1575" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1578" lang="en-US"><span style="color: #7f007f;">scope</span>=<span style="color: #2a00ff;">&#8220;request&#8221;</span></span></span></span></p>
<p id="f1ud1581" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1584" lang="en-US"><span style="color: #7f007f;">unknown</span>=<span style="color: #2a00ff;">&#8220;false&#8221;</span></span></span></span></p>
<p id="f1ud1587" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1590" lang="en-US"><span style="color: #7f007f;">validate</span>=<span style="color: #2a00ff;">&#8220;true&#8221;</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud1594"><br id="f1ud1595" /></p>
<p id="f1ud1596" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1599" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">forward </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;AJAXexterior&#8221; </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;AJAX.exterior&#8221; </span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud1607" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1610" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">forward </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;AJAXinterior&#8221; </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;AJAX.interior&#8221; </span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud1618" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1621" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">forward </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;AJAXengine&#8221; </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;AJAX.engine&#8221; </span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud1629" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1632" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">forward </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;AJAXsafety&#8221; </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;AJAX.safety&#8221; </span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud1640" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1643" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">forward </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;AJAXaudio&#8221; </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;AJAX.audio&#8221; </span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud1651" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1654" lang="en-US"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">action</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud1658" class="western" lang="en-GB"><br id="f1ud1659" /></p>
<p id="f1ud1660" class="western" lang="en-GB"><br id="f1ud1661" /></p>
<p id="f1ud1662" class="western" lang="en-GB">The tiles-defs.xml file also needs to be updated with AJAX tiles definitions. In this simple example, we are only updating the &#8220;content&#8221; area of the website using AJAX.</p>
<p id="f1ud1663" class="western" lang="en-GB"><br id="f1ud1664" /></p>
<p id="f1ud1665"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><strong id="f1ud1668">&lt;!&#8211; Filename: tiles-defs.xml &#8211;&gt;</strong></span></span></p>
<p id="f1ud1669" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1672" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">definition </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;AJAX.default&#8221; </span><span style="color: #7f007f;">path</span>=<span style="color: #2a00ff;">&#8220;/jsp/layout/AJAXlayout.jsp&#8221;</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud1680" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1683" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;view&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud1691" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1694" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;startJavaScript&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/startJavaScript.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud1702" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1705" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;endJavaScript&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/endJavaScript.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud1713" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1716" lang="en-US"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">definition</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud1720"><br id="f1ud1721" /></p>
<p id="f1ud1722" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1725" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">definition </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;AJAX.exterior&#8221; </span><span style="color: #7f007f;">extends</span>=<span style="color: #2a00ff;">&#8220;AJAX.default&#8221;</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud1733" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1736" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;view&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/ext_content.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud1744" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1747" lang="en-US"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">definition</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud1751"><br id="f1ud1752" /></p>
<p id="f1ud1753" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1756" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">definition </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;AJAX.interior&#8221; </span><span style="color: #7f007f;">extends</span>=<span style="color: #2a00ff;">&#8220;AJAX.default&#8221;</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud1764" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1767" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;view&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/int_content.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud1775" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1778" lang="en-US"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">definition</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud1782" lang="en-GB"><br id="f1ud1783" /></p>
<p id="f1ud1784" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1787" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">definition </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;AJAX.engine&#8221; </span><span style="color: #7f007f;">extends</span>=<span style="color: #2a00ff;">&#8220;AJAX.default&#8221;</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud1795" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1798" lang="en-US"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">put </span><span style="color: #7f007f;">name</span>=<span style="color: #2a00ff;">&#8220;view&#8221; </span><span style="color: #7f007f;">value</span>=<span style="color: #2a00ff;">&#8220;/jsp/engine_content.jsp&#8221;</span><span style="color: #008080;">/&gt;</span></span></span></span></p>
<p id="f1ud1806" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span id="f1ud1809" lang="en-US"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">definition</span><span style="color: #008080;">&gt;</span></span></span></span></p>
<p id="f1ud1813" lang="en-GB"><br id="f1ud1814" /></p>
<p id="f1ud1815" class="western" lang="en-GB"><br id="f1ud1816" /></p>
<p id="f1ud1817" class="western" lang="en-GB">Next we need to define a Tiles layout file which will output the XML. Create a new JSP File named &#8220;/jsp/layout/AJAXlayout.jsp&#8221;. This file should be set to have a content type of &#8220;text/xml&#8221; – this is important as some Web Browsers will not properly process the XML if it does not have this content-type.</p>
<p id="f1ud1818" class="western" lang="en-GB"><br id="f1ud1819" /></p>
<p id="f1ud1820" class="western" lang="en-GB">This can be done using the &lt;%@ page contentType=&#8221;text/xml; charset=UTF-8&#8243; %&gt; at the top of the JSP file.</p>
<p id="f1ud1821" class="western" lang="en-GB"><br id="f1ud1822" /></p>
<p id="f1ud1823" class="western" lang="en-GB">The layout file could look something like this:</p>
<p id="f1ud1824" class="western" lang="en-GB"><br id="f1ud1825" /></p>
<p id="f1ud1826" class="western" lang="en-GB"><span id="f1ud1827" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">&lt;?</span><span style="color: #3f7f7f;">xml </span><span style="color: #7f007f;">version</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;1.0&#8243; </span><span style="color: #7f007f;">encoding</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;UTF-8&#8243; </span><span style="color: #008080;">?&gt;</span></span></span></p>
<p id="f1ud1838" class="western"><br id="f1ud1839" /></p>
<p id="f1ud1840" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;">&lt;%&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;- &#8211;</span></span></p>
<p id="f1ud1843" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;">AJAX LAYOUT FILE</span></span></p>
<p id="f1ud1846" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;">&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;- &#8211;%&gt;</span></span></p>
<p id="f1ud1849" class="western"><br id="f1ud1850" /></p>
<p id="f1ud1851" class="western" lang="en-GB"><span id="f1ud1852" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #bf5f3f;">&lt;%@ </span><span style="color: #3f7f7f;">page </span><span style="color: #7f007f;">language</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;java&#8221; </span><span style="color: #7f007f;">contentType</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;text/xml; charset=UTF-8&#8243; </span><span style="color: #bf5f3f;">%&gt;</span></span></span></p>
<p id="f1ud1863" class="western"><br id="f1ud1864" /></p>
<p id="f1ud1865" class="western" lang="en-GB"><span id="f1ud1866" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #bf5f3f;">&lt;%@ </span><span style="color: #3f7f7f;">taglib </span><span style="color: #7f007f;">uri</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;http://struts.apache.org/tags-bean&#8221; </span><span style="color: #7f007f;">prefix</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;bean&#8221; </span><span style="color: #bf5f3f;">%&gt;</span></span></span></p>
<p id="f1ud1877" class="western" lang="en-GB"><span id="f1ud1878" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #bf5f3f;">&lt;%@ </span><span style="color: #3f7f7f;">taglib </span><span style="color: #7f007f;">uri</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;http://struts.apache.org/tags-tiles&#8221; </span><span style="color: #7f007f;">prefix</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;tiles&#8221; </span><span style="color: #bf5f3f;">%&gt;</span></span></span></p>
<p id="f1ud1889" class="western" lang="en-GB"><span id="f1ud1890" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #bf5f3f;">&lt;%@ </span><span style="color: #3f7f7f;">taglib </span><span style="color: #7f007f;">uri</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;http://struts.apache.org/tags-logic&#8221; </span><span style="color: #7f007f;">prefix</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;logic&#8221; </span><span style="color: #bf5f3f;">%&gt;</span></span></span></p>
<p id="f1ud1901" class="western"><br id="f1ud1902" /></p>
<p id="f1ud1903" class="western" lang="en-GB"><span id="f1ud1904" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">escape</span><span style="color: #008080;">&gt;</span></span></span></p>
<p id="f1ud1909" class="western"> </p>
<p id="f1ud1910" class="western" lang="en-GB"><span id="f1ud1911" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">html </span><span style="color: #7f007f;">id</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;content&#8221;</span><span style="color: #008080;">&gt;&lt;![CDATA[</span></span></span></p>
<p id="f1ud1919" class="western" lang="en-GB"><span id="f1ud1920" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">&lt;tiles:insert attribute="view" /&gt;</span></span></span></p>
<p id="f1ud1923" class="western" lang="en-GB"><span id="f1ud1924" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">]]&gt;&lt;/</span><span style="color: #3f7f7f;">html</span><span style="color: #008080;">&gt;</span></span></span></p>
<p id="f1ud1929" class="western"> </p>
<p id="f1ud1930" class="western" lang="en-GB"><span id="f1ud1931" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">javascript </span><span style="color: #7f007f;">description</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;start page&#8221; </span><span style="color: #7f007f;">when</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;start&#8221;</span><span style="color: #008080;">&gt;&lt;![CDATA[</span></span></span></p>
<p id="f1ud1942" class="western"><span style="font-family: 'Courier New', monospace;">&lt;tiles:insert attribute="startJavascript"/&gt;</span></p>
<p id="f1ud1944" class="western" lang="en-GB"><span id="f1ud1945" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">]]&gt;&lt;/</span><span style="color: #3f7f7f;">javascript</span><span style="color: #008080;">&gt;</span></span></span></p>
<p id="f1ud1950" class="western"> </p>
<p id="f1ud1951" class="western" lang="en-GB"><span id="f1ud1952" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">&lt;</span><span style="color: #3f7f7f;">javascript </span><span style="color: #7f007f;">description</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;Page refresh&#8221; </span><span style="color: #7f007f;">when</span><span style="color: #000000;">=</span><span style="color: #2a00ff;">&#8220;end&#8221;</span><span style="color: #008080;">&gt;&lt;![CDATA[</span></span></span></p>
<p id="f1ud1963" class="western"><span style="font-family: 'Courier New', monospace;">&lt;tiles:insert attribute="endJavascript"/&gt;</span></p>
<p id="f1ud1965" class="western" lang="en-GB"><span id="f1ud1966" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">]]&gt;&lt;/</span><span style="color: #3f7f7f;">javascript</span><span style="color: #008080;">&gt;</span></span></span></p>
<p id="f1ud1971" class="western" lang="en-GB"><span id="f1ud1972" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #008080;">&lt;/</span><span style="color: #3f7f7f;">escape</span><span style="color: #008080;">&gt;</span></span></span></p>
<p id="f1ud1977" class="western"><br id="f1ud1978" /></p>
<p id="f1ud1979" class="western" lang="en-GB"><br id="f1ud1980" /></p>
<p id="f1ud1981" class="western" lang="en-GB"><br id="f1ud1982" /></p>
<h3 id="f1ud1983" class="western" lang="en-GB">Adding the AJAX calls</h3>
<p id="f1ud1984" class="western" lang="en-GB">The final step is to call the AJAX &#8220;startRequest&#8221; function instead of doing a normal HREF call.</p>
<p id="f1ud1985" class="western" lang="en-GB"><br id="f1ud1986" /></p>
<p id="f1ud1987" class="western" lang="en-GB">Take another look at the Menu XHTML:</p>
<p id="f1ud1988" class="western" lang="en-GB"><br id="f1ud1989" /></p>
<p id="f1ud1990" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><strong id="f1ud1993">&lt;%&#8211; Filename: menu.jsp &#8211;%&gt;</strong></span></span></p>
<p id="f1ud1994" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;ol id=&#8221;menu&#8221;&gt;</span></span></p>
<p id="f1ud1997" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;li&gt;&lt;a href=&#8221;showPage.do?link=1&#8243;&gt;Menu Item 1&lt;/a&gt;&lt;/li&gt;</span></span></p>
<p id="f1ud2000" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;li&gt;&lt;a href=&#8221;showPage.do?link=2&#8243;&gt;Menu Item 2&lt;/a&gt;&lt;/li&gt;</span></span></p>
<p id="f1ud2003" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;li&gt;&lt;a href=&#8221;showPage.do?link=3&#8243;&gt;Menu Item 3&lt;/a&gt;&lt;/li&gt;</span></span></p>
<p id="f1ud2006" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;/ol&gt;</span></span></p>
<p id="f1ud2009" class="western" lang="en-GB"><br id="f1ud2010" /></p>
<p id="f1ud2011" class="western" lang="en-GB"><br id="f1ud2012" /></p>
<p id="f1ud2013" class="western" lang="en-GB">The simplest way to add AJAX is to use the &#8220;onclick&#8221; attribute, for example,</p>
<p id="f1ud2014" class="western" lang="en-GB"><br id="f1ud2015" /></p>
<p id="f1ud2016" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;li&gt;&lt;a href=&#8221;showPage.do?link=1&#8243;</span></span></p>
<p id="f1ud2019" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">onclick=&#8221;return startRequest(&#8216;ajaxShowPage.do&#8217;+this.search)&#8221;&gt;</span></span></p>
<p id="f1ud2022" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">Menu Item 1</span></span></p>
<p id="f1ud2025" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;/a&gt;&lt;/li&gt;</span></span></p>
<p id="f1ud2028" class="western" lang="en-GB"><br id="f1ud2029" /></p>
<p id="f1ud2030" class="western" lang="en-GB">This could be further improved by writing a simple function to start the AJAX request, and add it to &#8220;ajax.js&#8221;, for example:</p>
<p id="f1ud2031" class="western" lang="en-GB"><br id="f1ud2032" /></p>
<p id="f1ud2033" class="western"><br id="f1ud2034" /></p>
<p id="f1ud2035" class="western" lang="en-GB"><span id="f1ud2036" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">function </span><span style="color: #000000;">ajaxShowPage(link) </span><span style="color: #7f0055;">{</span></span></span></p>
<p id="f1ud2041" class="western" lang="en-GB"><span id="f1ud2042" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">url = </span><span style="color: #8e00ff;">&#8220;ajaxShowPage.do&#8221;</span><span style="color: #000000;">+link.search;</span></span></span></p>
<p id="f1ud2048" class="western" lang="en-GB"><span id="f1ud2049" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">return </span><span style="color: #000000;">startRequest(url);</span></span></span></p>
<p id="f1ud2053" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;">}</span></span></p>
<p id="f1ud2056" class="western" lang="en-GB"><br id="f1ud2057" /></p>
<p id="f1ud2058" class="western" lang="en-GB"><br id="f1ud2059" /></p>
<p id="f1ud2060" class="western" lang="en-GB">Then the onclick JavaScript event would become:</p>
<p id="f1ud2061" class="western" lang="en-GB"><br id="f1ud2062" /></p>
<p id="f1ud2063" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;li&gt;&lt;a href=&#8221;showPage.do?link=1&#8243;</span></span></p>
<p id="f1ud2066" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">onclick=&#8221;return ajaxShowPage(this)&#8221;&gt;</span></span></p>
<p id="f1ud2069" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">Menu Item 1</span></span></p>
<p id="f1ud2072" lang="en-GB"><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;">&lt;/a&gt;&lt;/li&gt;</span></span></p>
<p id="f1ud2075" class="western" lang="en-GB"><br id="f1ud2076" /></p>
<h3 id="f1ud2077" class="western" lang="en-GB">Unobtrusive AJAX Calls</h3>
<p id="f1ud2078" class="western" lang="en-GB">Ideally the &#8220;onclick&#8221; event would not be present in the (X)HTML; instead it should be added using unobtrusive JavaScript. Please see the references section for a tutorial on Unobtrusive JavaScript; however, a summary of the steps required is included here for completeness.</p>
<p id="f1ud2079" class="western" lang="en-GB">First you will need an &#8220;onload&#8221; hook to ensure that JavaScript is run once the XHTML document has loaded. In our example this hook is named &#8220;addLoadEvent&#8221;. This could be added to the &#8220;ajax.js&#8221; file in our example. Ideally it would be included in a general library file.</p>
<p id="f1ud2080" class="western" lang="en-GB"><br id="f1ud2081" /></p>
<p id="f1ud2082" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;">// Add a window.onLoad event. This is an unobrusive function:</span></span></p>
<p id="f1ud2085" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;">// it will maintain any other onload events required by other JS code.</span></span></p>
<p id="f1ud2088" class="western" lang="en-GB"><span id="f1ud2089" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">function </span><span style="color: #000000;">addLoadEvent(fn) </span><span style="color: #7f0055;">{</span></span></span></p>
<p id="f1ud2094" class="western" lang="en-GB"><span id="f1ud2095" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">return </span><span style="color: #000000;">addEvent(window, </span><span style="color: #8e00ff;">&#8220;load&#8221;</span><span style="color: #000000;">, fn);</span></span></span></p>
<p id="f1ud2101" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;">}</span></span></p>
<p id="f1ud2104" class="western"><br id="f1ud2105" /></p>
<p id="f1ud2106" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;">// Cross browser function for maintaining a list of events to be fired</span></span></p>
<p id="f1ud2109" class="western" lang="en-GB"><span id="f1ud2110" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #3f5fbf;">// (e..g onload, on resize</span></span></span></p>
<p id="f1ud2113" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;">// obj	- DOM which the event will fire upon</span></span></p>
<p id="f1ud2116" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;">// evType	- e.g. &#8220;load&#8221;, &#8220;resize&#8221; (without a leading &#8220;on&#8221;)</span></span></p>
<p id="f1ud2119" class="western"><span style="color: #3f5fbf;"><span style="font-family: 'Courier New', monospace;">// fn &#8211; Function to execute when the event fires</span></span></p>
<p id="f1ud2122" class="western" lang="en-GB"><span id="f1ud2123" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">function </span><span style="color: #000000;">addEvent(obj, evType, fn)</span><span style="color: #7f0055;">{</span></span></span></p>
<p id="f1ud2128" class="western" lang="en-GB"><span id="f1ud2129" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">if </span><span style="color: #000000;">(obj.addEventListener)</span><span style="color: #7f0055;">{</span></span></span></p>
<p id="f1ud2134" class="western" lang="en-GB"><span id="f1ud2135" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">obj.addEventListener(evType, fn, </span><span style="color: #7f0055;">false</span><span style="color: #000000;">);</span></span></span></p>
<p id="f1ud2140" class="western" lang="en-GB"><span id="f1ud2141" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">return true</span><span style="color: #000000;">;</span></span></span></p>
<p id="f1ud2145" class="western" lang="en-GB"><span id="f1ud2146" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">} else if </span><span style="color: #000000;">(obj.attachEvent)</span><span style="color: #7f0055;">{</span></span></span></p>
<p id="f1ud2151" class="western" lang="en-GB"><span id="f1ud2152" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">var </span><span style="color: #000000;">r = obj.attachEvent(</span><span style="color: #8e00ff;">&#8220;on&#8221;</span><span style="color: #000000;">+evType, fn);</span></span></span></p>
<p id="f1ud2158" class="western" lang="en-GB"><span id="f1ud2159" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">return </span><span style="color: #000000;">r;</span></span></span></p>
<p id="f1ud2163" class="western" lang="en-GB"><span id="f1ud2164" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">} else {</span></span></span></p>
<p id="f1ud2167" class="western" lang="en-GB"><span id="f1ud2168" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">return false</span><span style="color: #000000;">;</span></span></span></p>
<p id="f1ud2172" class="western" lang="en-GB"><span id="f1ud2173" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #7f0055;">}</span></span></span></p>
<p id="f1ud2176" class="western"><span style="color: #7f0055;"><span style="font-family: 'Courier New', monospace;">}</span></span></p>
<p id="f1ud2179" class="western" lang="en-GB"><br id="f1ud2180" /></p>
<p id="f1ud2181" class="western" lang="en-GB">Next we need to create our hook by adding it to the beginning of the &#8220;ajax.js&#8221; file.</p>
<p id="f1ud2182" class="western" lang="en-GB"><br id="f1ud2183" /></p>
<p id="f1ud2184" class="western"><br id="f1ud2185" /></p>
<p id="f1ud2186" class="western" lang="en-GB"><span id="f1ud2187" lang="en-US"><span style="font-family: 'Courier New', monospace;"><span style="color: #000000;">addLoadEvent(</span><span style="color: #7f0055;">function</span><span style="color: #000000;">()</span><span style="color: #7f0055;">{ </span><span style="color: #000000;">ajaxMenu(); </span><span style="color: #7f0055;">}</span><span style="color: #000000;">);</span></span></span></p>
<p id="f1ud2196" class="western"><br id="f1ud2197" /></p>
<p id="f1ud2198" class="western" lang="en-GB"><br id="f1ud2199" /></p>
<p id="f1ud2200" class="western" lang="en-GB">Finally, the ajaxMenu() function needs to be included in &#8220;ajax.js&#8221;. This function will simply look for an element with the id of &#8220;menu&#8221;, then grab all of the &lt;a&gt; tags within it and add &#8220;onclick&#8221; events.</p>
<p id="f1ud2201" class="western" lang="en-GB"><br id="f1ud2202" /></p>
<p id="f1ud2203" class="western"><br id="f1ud2204" /></p>
<p id="f1ud2205" class="western"><span style="font-family: 'Courier New', monospace;">function ajaxMenu() {</span></p>
<p id="f1ud2207" class="western"><br id="f1ud2208" /></p>
<p id="f1ud2209" class="western"><span style="font-family: 'Courier New', monospace;">var undef; // undefined variable</span></p>
<p id="f1ud2211" class="western"><span style="font-family: 'Courier New', monospace;">var menu = document.getElementById(&#8220;menu&#8221;);</span></p>
<p id="f1ud2213" class="western"><span style="font-family: 'Courier New', monospace;">if(menu!=undef) {</span></p>
<p id="f1ud2215" class="western"><span style="font-family: 'Courier New', monospace;">var tags = menu.getElementsByTagName(&#8220;a&#8221;);</span></p>
<p id="f1ud2217" class="western"><span style="font-family: 'Courier New', monospace;">var len = tags.length;</span></p>
<p id="f1ud2219" class="western"><br id="f1ud2220" /></p>
<p id="f1ud2221" class="western"><span style="font-family: 'Courier New', monospace;">for(var i=0; i&lt;len; i++) {</span></p>
<p id="f1ud2223" class="western"><span style="font-family: 'Courier New', monospace;">tags[i].onclick=function() {return ajaxShowPage(this);};</span></p>
<p id="f1ud2225" class="western"><span style="font-family: 'Courier New', monospace;">}</span></p>
<p id="f1ud2227" class="western"><span style="font-family: 'Courier New', monospace;">}</span></p>
<p id="f1ud2229" class="western"><span style="font-family: 'Courier New', monospace;">}</span></p>
<p id="f1ud2231" class="western"><br id="f1ud2232" /></p>
<p id="f1ud2233" class="western" lang="en-GB"><br id="f1ud2234" /></p>
<p id="f1ud2235" class="western" lang="en-GB">This ensures that the onclick events are attached to the XHTML.</p>
<p id="f1ud2236" class="western" lang="en-GB"><br id="f1ud2237" /></p>
<p id="f1ud2238" class="western" lang="en-GB">For more information, see the Unobtrusive JavaScript tutorial.</p>
<p id="f1ud2239" class="western" lang="en-GB"><br id="f1ud2240" /></p>
<p id="f1ud2241" class="western" lang="en-GB"><br id="f1ud2242" /></p>
<h1 id="f1ud2243" class="western" lang="en-GB">References</h1>
<ul id="f1ud2244">
<li id="f1ud2245">
<p id="f1ud2246" class="western" lang="en-GB">Hijax: Progressive enhancement with AJAX<br id="f1ud2247" /><span style="color: #0000ff;"><span id="f1ud2249" style="text-decoration: underline;"><a id="f1ud2250" href="http://domscripting.com/presentations/xtech2006/">http://domscripting.com/presentations/xtech2006/</a></span></span></p>
</li>
<li id="f1ud2251">
<p id="f1ud2252" class="western" lang="en-GB">Unobtrusive JavaScript<br id="f1ud2253" /><span style="color: #0000ff;"><span id="f1ud2255" style="text-decoration: underline;"><a id="f1ud2256" href="http://onlinetools.org/articles/unobtrusivejavascript/">http://onlinetools.org/articles/unobtrusivejavascript/</a></span></span></p>
</li>
</ul>
<p></span></span></span></span></p>
<p> </p>
<p> </p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.createsoft.co.uk/blog/2008/05/using-ajax-with-struts-and-tiles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jaguar Configurator goes live</title>
		<link>http://www.createsoft.co.uk/blog/2007/09/jaguar-configurator-goes-live/</link>
		<comments>http://www.createsoft.co.uk/blog/2007/09/jaguar-configurator-goes-live/#comments</comments>
		<pubDate>Mon, 10 Sep 2007 20:15:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[configurator]]></category>

		<guid isPermaLink="false">http://www.createsoft.co.uk/blog/?p=6</guid>
		<description><![CDATA[Well, the Jaguar configurator finally went live &#8211; a couple of days ahead of schedule!  Written on a Websphere platform, it uses Struts and lots of css/javascript/ajax effects while trying hard to remain accessible.
It&#8217;s based on the same platform as the Ford Configurator, and the soon to be released Land Rover Configurator.  I think the [...]]]></description>
			<content:encoded><![CDATA[<p>Well, the <a href="http://www.buildyourown.jaguar.co.uk/jlroc/en_GB/jag/configPopup.do">Jaguar configurator</a> finally went live &#8211; a couple of days ahead of schedule!  Written on a Websphere platform, it uses Struts and lots of css/javascript/ajax effects while trying hard to remain accessible.</p>
<p>It&#8217;s based on the same platform as the <a href="http://www.config.ford.co.uk/fordconnection/en_GB/pv/configPopup.do">Ford Configurator</a>, and the soon to be released <a href="http://www.buildyourown.landrover.co.uk/jlroc/en_GB/lr/configPopup.do">Land Rover Configurator</a>.  I think the Land Rover site is definitely the best looking&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.createsoft.co.uk/blog/2007/09/jaguar-configurator-goes-live/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No news yet</title>
		<link>http://www.createsoft.co.uk/blog/2006/11/no-news-yet/</link>
		<comments>http://www.createsoft.co.uk/blog/2006/11/no-news-yet/#comments</comments>
		<pubDate>Fri, 03 Nov 2006 20:20:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.createsoft.co.uk/blog/?p=5</guid>
		<description><![CDATA[Well, I still haven&#8217;t got involved with Song Bird as I have been far too busy at work.We are prototyping a new &#8220;Configurator&#8221; for Jaguar and Land Rover.  It uses a lot of AJAX and DHTML on the client, and Java/Websphere on the server.
I am determined to make the site as accessible as possible [...]]]></description>
			<content:encoded><![CDATA[<p>Well, I still haven&#8217;t got involved with Song Bird as I have been far too busy at work.<br />We are prototyping a new &#8220;Configurator&#8221; for Jaguar and Land Rover.  It uses a lot of AJAX and DHTML on the client, and Java/Websphere on the server.</p>
<p>I am determined to make the site as accessible as possible however.  Keyboard controls, mouse control, CSS/XHTML; unobtrusive JavaScript; AJAX can be switched off and the site works just fine.</p>
<p>I&#8217;ve also been experimenting with AJAX and Screen Readers, to find a way to ensure that page updates are reported correctly.  I&#8217;ve been experimenting with using an IFRAME in lieu of XMLHttpRequest objects, to varying degrees of success.</p>
<p>Windows Eyes, JAWS, and FireVox all work well with this technique, but IBM Home Page Reader just will not respond to focus change events; and cannot be forced to switch frames programatically: the user must press a combination of keys to force the reader to switch out of the IFRAME.</p>
<p>I will add more detailed results of these tests here soon &#8211; they may prove useful to someone else!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.createsoft.co.uk/blog/2006/11/no-news-yet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

