<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Ajaxlines Feed</title>
    <link>http://www.ajaxlines.com</link>
    <description>Ajaxlines provides Asynchronous JavaScript and XML Resources, Tutorials, Websites and Toolkits.</description>
    <language>en-us</language>
    <item>
      <title>Conditional Preloading Better Ajax</title>
      <description>Conditional preloading is a smart way of providing information to the user. Searching for information could be hastened when conditional preloading is activated since information is gradually made available for the user as the users key-in the data they are looking for.&#60;br /&#62;
&#60;br /&#62;
In order to pull this off, developers has to work with different web languages. Building an Ajax based application is a little bit challenging and conditional preloading is definitely one of those functions that could really confuse developers in no time. When properly coded, conditional preloading will ensure that the users experienced will be enhanced. On the other hand, poorly coded conditional preloading will only diminish the functions of the application.&#60;br /&#62;
&#60;br /&#62;
Conditional preloading works with JavaScript, CSS, PHP, Images and other web languages. Everything will be on play during the conditional preloading and their functions will be fully realized when the application has been successfully rendered. As we have already indicated, combining these web languages is definitely a challenge for developers but the trick actually is to compress the functions. This will enable the languages to work hand in hand without compromising the function. Some will say that compressing web languages will diminish the function of the application. But this is not the case in conditional preloading. Although preloading requires a good number of web languages, it does nOt require a lot of coding to ensure for that this function to work properly.&#60;br /&#62;
&#60;br /&#62;
Aside from the web languages in conditional preloading, the location of the function should also be considered. Developers have to ensure that the application has the power to support conditional preloading. Ideally, this function has to be placed at the start of the application since it is usually used for search engines of the online application. But there are other online applications that requires conditional preloading to be at the middle of the application. To ensure that the conditional preloading will work even though the rest of the functions are already loaded, developers have to use &#38;ldquo;search caching&#38;rdquo;. Think of it as an interactive CSS &#38;ndash; with the help of JavaScript the information is loaded as the user encodes the information needed. CSS on the other hand will stream the information. This function will eventually be wrapped with the web language used by the developer such as HTML or PHP.&#60;br /&#62;
&#60;br /&#62;
The challenge for developers is to ensure that conditional preloading works successfully even though bandwidth is already exhausted in other functions. To solve this problem, developers have to separate the online application to the conditional preloading in terms of caching. For the online application, developers could point the cached data to the user while the conditional preloading will be loaded from the server. When the data is cached in the server, there is more space and the data could be asynchronously streamed from the server. More often than not, server caching will ensure that the online application will work as planned. &#60;br /&#62;
&#60;br /&#62;
source: &#60;a href=&#34;http://www.ajaxwith.com&#34;&#62;ajaxwith&#60;/a&#62;</description>
      <link>http://www.ajaxlines.com/ajax/stuff/article/conditional_preloading_better_ajax.php</link>
      <pubDate>Mon, 07 Jul 2008 8:07:37 EDT</pubDate>
      <guid isPermaLink="true">http://www.ajaxlines.com/ajax/stuff/article/conditional_preloading_better_ajax.php</guid>
    </item>
    <item>
      <title>A lightweight AJAX.NET-enabled grid control</title>
      <description>Managing lists of items from databases is the bread and butter of most web applications, but creating an user-friendly grid can be problematic. The obvious solution of creating Microsoft grid controls in an Ajax.Net Update panel can create very large HTML pages with long response times when a substantial amount of data is being worked with. Also, every grid has to be created individually on each page, and that makes it hard to create and maintain a common &#38;quot;look and feel&#38;quot;.&#60;br /&#62;
&#60;br /&#62;
This lightweight grid outputs very compact HTML and uses javascript to dynamically generate input or select boxes when updating. It includes built-in Ajaxed sorting and filtering which is very user-friendly, and throws in csv export for free. It has a fixed table header and scrolling contents, to facilitate use with large amounts of data.&#60;br /&#62;
&#60;br /&#62;
Many different grids can be very quickly generated in a standard way using an XML control file and a single common style sheet. Multiple AjaxGrids can be defined and used, even on the same page.&#60;br /&#62;
&#60;br /&#62;
You can customise grid column data to include links, images, etc and to support your own custom validations. &#60;br /&#62;
&#60;img width=&#34;1025&#34; height=&#34;386&#34; alt=&#34;&#34; src=&#34;/ajax/images/uploaded/1215348398.png &#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
Background&#60;br /&#62;
&#60;br /&#62;
Most developers will dip their toes into the seductive water of Ajax.Net by using the Update panel, but calling Ajax methods directly can be much more flexible and efficient.&#60;br /&#62;
&#60;br /&#62;
Any HTML element that is updated server-side by ASP.NET code must contain a long and &#38;quot;decorated&#38;quot; id, and these are used extensively in a typical grid and update panel. But if you generate your HTML directly then you can rely on Javascript to walk through the DOM to assign events to the element, to pop up HTML elements dynamically for the user to edit into on request and to identify any element that has changed. AJAX allows you to do most of the heavy lifting server-side, so that you don	 find yourself attempting to write an entire application in Javascript (a real performance &#38;quot;gotcha&#38;quot;).&#60;br /&#62;
&#60;br /&#62;
Because the HTML is so much more compact, there is much less data to transfer. Large numbers of rows can be returned efficiently to users. This implementation includes a way of side-stepping paging in most cases and under user control, even for large amounts of data. With the fixed grid header and scrolling data section, the user is scrolling experience can really take advantage of the smooth scrolling and background updating which browsers are optimised for. This approach is especially kind to your dial-up browsers.&#60;br /&#62;
&#60;br /&#62;
This control remembers the user is preferences for each grid during the session, and can be set up to remember them between sessions too. Thanks to AJAX.NET the user is data in the browser can also be always available server-side; you could extend the control to remember all the data that the user enters (even on a keystroke-by-keystroke basis), and even allow switching off the browser mid-session and resume working later at the same point - just as if it was a local application. Naive users especially will appreciate the security of not losing entered data by mistake.&#60;br /&#62;
Using the Code&#60;br /&#62;
&#60;br /&#62;
The source files are set up as a complete ASP.NET 2.0 website.&#60;br /&#62;
&#60;br /&#62;
This code uses two tables of a database set up by the open source &#38;quot;Tackle&#38;quot; application for management of the SCRUM process, which itself uses AJAX.NET using an Update panel. It is an interesting comparison. You can download it from here. (I have also included a minimal database .mdf file for a sample database, if you don	 want to bother with this).&#60;br /&#62;
&#60;br /&#62;
You will need to edit the connection string in AjaxGrid.db.cs. It assumes SQLExpress implementation of the database.&#60;br /&#62;
&#60;br /&#62;
Your own implementation of this control will almost certainly include an edited stylesheet to match your own application branding (you might like to improve the graphics too!).&#60;br /&#62;
&#60;br /&#62;
Lastly, you will want to edit ajaxgrid.xml to define and format each grid in your web application.&#60;br /&#62;
The source files&#60;br /&#62;
&#60;br /&#62;
This control doesn	 work well as a completely stand-alone assembly, because you need to include its .css and .js files and ajaxgrid.xml in the containing website. You will probably also want to adapt the core source files to the needs of your web application.&#60;br /&#62;
&#60;br /&#62;
Default.aspx and app.css are dummies for your own target web application. Default.aspx.cs shows how to serialise and deserialise &#38;quot;profile&#38;quot; data and how to register custom validation and postback methods for each page.&#60;br /&#62;
&#60;br /&#62;
ajaxgrid.xml specifies the language-specific texts and the format and contents of each grid. Each grid is named, and the SQL table, primary key and basic query string are defined. Each column of the grid is then defined, to include the data type, the displayable header and SQL column name. Where a column is restricted in the available options, a static or database-generated list can be specified. You can define as many grids as you like and they will all look and act the same. This file is loaded into static arrays when the web application loads to ensure efficient access at runtime.&#60;br /&#62;
&#60;br /&#62;
web.config shows how to set up the Ajax.Net subsystem to use web services in JSON format for Ajax.&#60;br /&#62;
&#60;br /&#62;
AjaxGrid.Webservices.cs contain the actual Ajax methods called by Javascript.&#60;br /&#62;
&#60;br /&#62;
AjaxGrid.db.cs implements database access for the grids. Any production web application should implement MultipleActiveResultSets, defend against SQL injection and implement asynchronous I/O, so this control does all this. However asynchronous I/O is a problem for AJAX.NET because there is currently no async handler for JSON available and Ajax callbacks are still restricted to synchronous I/O only. Don	 confuse asynchronous Ajax calls from the client (no problem) with asynchronous handling of the server requests (required for efficient use of server threads). There is a discussion of this here.&#60;br /&#62;
&#60;br /&#62;
AjaxGrid.main.cs is the core code for this control. It contains methods to paint or repaint the control, or just the data part of the control, by generating HTML as a string. The HTML can be used to populate the control server-side (inital rendering of page or postback) or client-side (in response to an Ajax call). Each row can contain many cells of different types (as defined by the XML control file), and there is scope for creating new methods for handling other data types - such as data, currency or images.&#60;br /&#62;
&#60;br /&#62;
AjaxGrid.js is the supporting javascript for the control. It shows how to use javascript to walk through the table cells and their contents, and how to position pop up edit controls to overlay the grid cells.&#60;br /&#62;
&#60;br /&#62;
AjaxGrid.css is the supporting stylesheet for the control. By including this stylesheet as a separate file, the control dramatically reduces the style information that needs to be included in each page.&#60;br /&#62;
&#60;br /&#62;
AjaxGrid.ascx/AjaxGrid.ascx.cs is the actual control. It is of interest for showing how an asynchronous IO operation is launched from an ASP.NET page.&#60;br /&#62;
What the code does&#60;br /&#62;
&#60;br /&#62;
The server &#38;quot;manually&#38;quot; generates a string containing HTML using a StringBuilder object. The HTML can then be used to populate the control server-side in C#:&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; divGrid.InnerHtml = AjaxGrid.Paint(Session[&#38;quot;GridProfile&#38;quot;], gridId);&#60;br /&#62;
&#60;br /&#62;
or to populate the control client-side from an AJAX callback in javascript:&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; divGrid.innerHTML =&#38;nbsp; response.html;&#60;br /&#62;
&#60;br /&#62;
&#60;img width=&#34;764&#34; height=&#34;573&#34; alt=&#34;&#34; src=&#34;/ajax/images/uploaded/1215348427.png&#34; /&#62;&#60;br /&#62;
When the &#38;quot;add new row&#38;quot; image is clicked, an extra row is added to the header table. This allows the user to see and edit the new row wherever the data table is scrolled to; once the columns have been filled in and the new row is accepted, the tables will automatically be repainted and the new row will then appear in the dat table in its proper sort order.&#60;br /&#62;
Points of Interest&#60;br /&#62;
&#60;br /&#62;
This control illustrates an interesting technique for making texts set up by javascript language-independent, by calling back to the server via AJAX. In many cases, the same thing can be accomplished by customising the javascript file to each individual user, but calling back to the server on demand reduces the amount of unnecessary data sent to the browser and can be easier to maintain.&#60;br /&#62;
&#60;br /&#62;
An AJAX application will present differently on your local machine (where there is little latency) and on the internet. Although the application correctly handles multiple outstanding AJAX calls, it can be helpful to the user to show an animated GIF file while an AJAX response is outstanding. There are no definite rules about whether to initiate an Ajax call on every keypress or when the &#38;quot;onchange&#38;quot; event handler fires (except beware if some other javascript event click handler is called by (say) clicking a button, you may lose notification of the onchange operation). Where a new row is to be created, all columns must be default or filled in before creating a new row in the database and it is necessary to have a button to indicate that the row is now ready to be created. Nevertheless it is convenient to AJAX each column up to the server as it is completed.&#60;br /&#62;
&#60;br /&#62;
One possible implementation of updates from the grid is to save them up in the user is Session data and only actually action the updates when the user explicitly requests with a &#38;quot;Save&#38;quot; command. This mimics many desktop applications in allowing the user to see how the updates look before committing them to the database. There are implications to this if multiple users can see the same data, especially if the saved updates are stored between Sessions. But even without these refinements, there is always going to be a window between the user reading and writing row data.&#60;br /&#62;
&#60;br /&#62;
Using database locks (possibly supplemented by Sql Server notifications when row data changes) are complex to implement and may significantly impact performance. A lightweight solution is to record when and who the data was last changed by and notify the user if that differs from when the row data was read. In many cases users can be quite tolerant of being told that they must repeat the edit and update because in the real world it is often an error if two people mistakenly work on the same task at the same time. In the following SQL snippet from a stored procedure to update a row, contention is detected before the update is actioned and the update is abandoned if someone else has editted the row since the original data was read.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; -- @editdate DATETIME parameter is the date that the record was last edited (remembered from read)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; -- @userid INT parameter is the caller is id&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; -- @newdate DATETIME OUT parameter is the new date that the record was last edited (or null if not updated)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; -- @editid INT OUT parameter is the person who made that last edit&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; -- each table so protected needs two new columns:&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; -- editdate DATETIME is the date last edited&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; -- updaterId INT is the person who last updated the record&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; IF @editdate IS NOT NULL&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; BEGIN&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; SELECT @editid = updaterId FROM [table] &#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; WHERE rowid=@rowid AND editdate &#38;lt;= @editdate&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; IF @editid IS NOT NULL AND @editid &#38;lt;&#38;gt; @userid&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; BEGIN&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; SELECT @newdate =NULL&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; RETURN&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; END&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; END&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; SELECT @newdate = GETDATE()&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; SELECT @editid = @userid&#60;br /&#62;
&#60;br /&#62;
By the way, if the last editer was the caller, then that is considered ok. It is possible that the user has created problems for themselves by working from two different machines or two different browsers, but most likely they will be quite annoyed if the website prevents them updating their own edits.&#60;br /&#62;
&#60;br /&#62;
You could also change the AJAX callback when each cell is updated to include both the new and original values (the original value is still present despite being overlayed by the edit popup). This allows a more fine-grained approach where the update is refused only if a particular column of the row has been changed by someone else, rather than the entire record.&#60;br /&#62;
&#60;br /&#62;
One major source of difficulty in a web application is management of postbacks and random use of the back button. This is much less of a problem for Ajax-enabled applications, because the user cannot initiate the same operation twice by refreshing while waiting a response and the back button will take the user right out of the current page. If you have a button which mustn	 be pushed twice, add some custom javascript to disable it when pressed.&#60;br /&#62;
&#60;br /&#62;
source: &#60;a href=&#34;http://www.codeproject.com&#34;&#62;codeproject&#60;/a&#62;</description>
      <link>http://www.ajaxlines.com/ajax/stuff/article/a_lightweight_ajaxnetenabled_grid_control.php</link>
      <pubDate>Sun, 06 Jul 2008 8:51:48 EDT</pubDate>
      <guid isPermaLink="true">http://www.ajaxlines.com/ajax/stuff/article/a_lightweight_ajaxnetenabled_grid_control.php</guid>
    </item>
    <item>
      <title>25 Excellent Ajax Techniques and Examples</title>
      <description>Ajax allows for rich-internet applications that mimic the responsiveness and complex user interfaces typically associated with desktop applications. Moving applications to the web browser opens many possibilities, including the ability to save user data, connecting with other users for collaboration and sharing, and making deployment and using the application easier since web browsers are standard-issue with most computers regardless of operating system.&#60;br /&#62;
&#60;br /&#62;
If you&#38;rsquo;re interested in expanding your understanding of Ajax techniques and practices, check out these 25 hand-picked Ajax articles and tutorials that outline various methods and concepts involved in the development of Ajax-based applications. Though most are geared for budding and intermediate developers, veterans might find a trick or two they haven&#38;rsquo;t encountered before.&#60;br /&#62;
&#60;br /&#62;
&#60;strong&#62; 1. Ajax RSS reader&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
Ajax RSS reader - Screenshot&#60;br /&#62;
&#60;br /&#62;
Build a simple RSS reader that takes remote XML data from RSS feeds using Ajax, PHP, and MySQL. This example allows users to view feed content from multiple sources in one page. At the bottom of the article, you&#38;rsquo;ll find an animated demonstration of the RSS reader.&#60;br /&#62;
&#60;strong&#62;&#60;br /&#62;
2. Ajax Desktop Tutorial&#60;br /&#62;
&#60;/strong&#62; &#60;br /&#62;
Ajax Desktop Tutorial - Screenshot&#60;br /&#62;
&#60;br /&#62;
This tutorial is a step-by-step guide on how to create a desktop/homepage similar to Pageflake and Netvibes. The goal of this tutorial is to showcase some common techiques involved in developing web-based applications like manipulating the Document Object Model (DOM), listening to events (i.e. certain mouse movements), and working with remote data.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Ajax Desktop demo&#60;br /&#62;
&#60;br /&#62;
&#60;strong&#62; 3. Ajax for Chat&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
Learn to build a simple web-based chat client using asynchronous JavaScript, XML, and PHP. The tutorial&#38;rsquo;s example utilizes the Prototype JS framework, MySQL, and PHP.&#60;br /&#62;
&#60;strong&#62; 4. Create your own information space with Ajax and del.icio.us&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
This article outlines the basic foundations of using Ajax alongside an API service. It uses the del.icio.us API, but the methods and concepts can be adapted to other popular services such as Digg&#38;rsquo;s or Flickr&#38;rsquo;s. It&#38;rsquo;s an essential resource for those contemplating on creating web applications that use remote XML data - a couple of live examples are popurls and SocialBlade, which obtains information from social media sites using available API services. This tutorial requires you to register (for free).&#60;br /&#62;
&#60;strong&#62; 5. Ultra-lightweight Charts For AJAX&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346388.gif &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
See how to create a super-lightweight (1.78 KB) charting component using Flash with Ajax. The example allows you to generate visual graphs using dynamically-loaded data. The solution involves ActionScript-JavaScript communication, and covers the use of the setData and setStyle ActionScript methods for generating and styling the charts.&#60;br /&#62;
&#60;strong&#62;&#60;br /&#62;
6. Quick Calendar Using AJAX and PHP&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346436.gif&#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
Learn how to create a calendar component using Ajax and PHP. Ajax is used for navigating through the calendar months without refreshing the page.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Quick Calendar demo&#60;br /&#62;
&#60;br /&#62;
&#60;strong&#62;7. How to integrate Google Calendar in your website using AJAX&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346497.gif &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
This tutorial shows you how to create a web page component that calls a publicly available Google calendar. Google Calendar allows you to easily create, share, and manage events and is an excellent feature for community websites.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * AJAX calendar demo&#60;br /&#62;
&#60;br /&#62;
&#60;strong&#62;8. Edit In Place with AJAX Using jQuery&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346519.gif&#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
In this example, users are given the ability to edit the XHTML of the web page they&#38;rsquo;re currently viewing. The example is a proof-of-concept &#38;ndash; presenting how this functionality can be achieved using jQuery. Normally, you&#38;rsquo;d want to send the user&#38;rsquo;s edits to server-side code to perform processes such as validation or saving the changes in a database.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Edit In Place demo 1&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Edit In Place demo 2&#60;br /&#62;
&#60;strong&#62;&#60;br /&#62;
9. Creating an AJAX Rating Widget&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346546.gif&#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
Learn the concepts of creating a rating system without prompting the user to click a submit button or refreshing the page. The tutorial showcases how you can do this in a variety of ways by including examples for the following four JavaScript frameworks/libraries: Dojo, jQuery, mootools, and Prototype JS.&#60;br /&#62;
&#60;br /&#62;
&#60;strong&#62;10. AJAX file upload tutorial&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346571.gif &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
In this tutorial, you&#38;rsquo;re shown how to create a file uploader. The tutorial uses JavaScript and PHP.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * AJAX File Uploader demo&#60;br /&#62;
&#60;strong&#62;&#60;br /&#62;
11. Use AJAX and PHP to Build your Mailing List&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
This tutorial from SitePoint walks you through the development of a mailing list form that accepts submissions asynchronously. It uses MySQL for storing the data inputted by the user and Prototype JS for simplifying Ajax requests and binding event handlers.&#60;br /&#62;
&#60;br /&#62;
&#60;strong&#62;12. Safer Contact Forms Without CAPTCHAs&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346609.jpg&#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
One way to reduce spam from public web forms is to implement a system to verify if the submitter is human by using image CAPTCHAs. Problems arise with accessibility when individuals using visual assistive technologies are presented with the test (and thus cannot continue on). This simple technique uses an Ajax call to a server-side script to drop a cookie on the user&#38;rsquo;s computer.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Safer Form demo&#60;br /&#62;
&#60;br /&#62;
&#60;strong&#62;13. Using AJAX with CAPTCHA&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346647.jpg&#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
Avoiding the use of image-based CAPTCHAs is a good idea. With that said, many sites still prefer using this technique to distinguish between humans and computers. If forgoing web accessibility is appropriate for your situation, this article outlines a unique method for administering CAPTCHA tests. The user is presented with a sequence of descriptions (i.e. Animal, Costume, Boy), and asked to click on a set of images in sequential order. The clicks are recorded and validated, returning the appropriate status message. Though probably not an ideal solution to CAPTCHAs, it does outline a fundamental technique for developing responsive user interfaces - use it for inspiration.&#60;br /&#62;
&#60;br /&#62;
&#60;strong&#62;14. Ajax-based login form&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346676.gif &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
Create a basic login form that asynchronously validates the inputted data. The example uses the jQuery form plugin and PHP to process the request.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Ajax-based login form demo&#60;br /&#62;
&#60;strong&#62;&#60;br /&#62;
15. Nice Ajax effect for message box using Mootools&#60;/strong&#62;&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346706.gif &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
In this example, a message box that fades after a specified duration is displayed when the user clicks on the &#38;ldquo;save&#38;rdquo; button. This is a model for supplying users with the status of their request, and an real Ajax request should typically happen when the user clicks on the &#38;ldquo;save&#38;rdquo; button.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Nice Ajax Effects for messages box demo&#60;br /&#62;
&#60;br /&#62;
&#60;strong&#62;16. AutoCompleter Tutorial&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346732.gif &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
The AutoCompleter tutorial teaches you how auto completion of input fields can be accomplished. The example uses jQuery, PHP, and MySQL.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * AutoCompleter tutorial demo&#60;br /&#62;
&#60;br /&#62;
&#60;strong&#62;17. Auto-populating Select Boxes using jQuery &#38;amp; AJAX&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346763.gif &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
A key technique in Ajax applications is to populate content without a page refresh. In this tutorial, you&#38;rsquo;ll witness how this is done with a PHP and JavaScript (jQuery to make it easier).&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Auto-populating Select Boxes demo&#60;br /&#62;
&#60;strong&#62;&#60;br /&#62;
18. Build an Ajax Dropdown Menu&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
Here&#38;rsquo;s a basic example of working with external data to load content into a drop-down menu - from our beloved Webmonkey. Though the example uses a text file, you can use your own data source when applying the technique to your own purposes.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Ajax Dropdown Menu demo&#60;br /&#62;
&#60;strong&#62;&#60;br /&#62;
19. Ajax/PHP Shoutbox Tutorial&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346794.gif &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
Make an Ajax-powered shoutbox using PHP and JavaScript. This tutorial walks you through the server-side and client-side requirements of creating a shoutbox, which can be adapted to other functions such as a commenting system.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * AJAX Shoutbox demo&#60;br /&#62;
&#60;strong&#62;&#60;br /&#62;
20. Building Tabbed Content&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346816.gif &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
Learn how to build a tabbed content component with the data populated via Ajax. The tutorial uses PHP and Prototype JS.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Building Tabbed Content demo&#60;br /&#62;
&#60;strong&#62;&#60;br /&#62;
21. How to Load In and Animate Content with jQuery&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346840.jpg &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
This step-by-step tutorial shows you how to load data into a web page using jQuery to handle the Ajax request and manipulation of the DOM.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Load In and Animate Content demo&#60;br /&#62;
&#60;br /&#62;
Best practices and workaround techniques to common issues&#60;br /&#62;
&#60;br /&#62;
&#60;strong&#62;22. The Hows and Whys of Degradable Ajax&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346862.gif &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
This article discusses the concept of creating Ajax-based applications that degrades effectively when JavaScript is not detected, providing increased accessibility and bulletproof-ness. Completely successful degradation means that an application is still usable and information is still accessible without reliance to JavaScript or CSS.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Degradable Ajax demo&#60;br /&#62;
&#60;strong&#62;&#60;br /&#62;
23. Avoid unnecessary Ajax traffic with session state&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
This article presents a method for minimizing unneeded database/computational processes and avoiding large status updates if no changes have occurred. By using client cookies to keep track of the session&#38;rsquo;s state, you can cut down on processes that may be redundant. Though the article presents an example using Python for server code &#38;ndash; the model remains the same in virtually any language you use.&#60;br /&#62;
&#60;strong&#62;24. A Better Ajax Back Button Solution&#60;/strong&#62;&#60;br /&#62;
&#60;br /&#62;
Here&#38;rsquo;s a workaround to issues pertaining to Ajax-loaded content breaking web browser controls and bookmarking capabilities. The solution involves firing off a function at a set interval that checks the #value of the URL, and then presenting the correct content. It restores the ability to bookmark the content. In Part 2 of the article, you&#38;rsquo;ll see a working example and additional discussion of this method.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * A Better Ajax Back Button demo&#60;br /&#62;
&#60;strong&#62;&#60;br /&#62;
25. Making Ajax Work with Screen Readers&#60;/strong&#62;&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1215346892.gif &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
One of the biggest drawbacks of loading content via Ajax is that it fails to indicate an update of the content to users who are reliant on screen readers. For people who are not visually-impaired &#38;ndash; messages and status indicators can be visual queues that the content is changing; this isn&#38;rsquo;t effective for users with visual impairments. This article draws out the underlying issues and proposes techniques to make Ajax-based applications work with screen readers.&#60;br /&#62;
&#60;br /&#62;
There we have it&#38;hellip; some brilliant Ajax techniques and examples. I hope you&#38;rsquo;ve found some links of interest that will help you in a future project or in advancing your command of Ajax.&#60;br /&#62;
&#60;br /&#62;
source: &#60;a href=&#34;http://www.3car.blogspot.com&#34;&#62;3car.blogspot&#60;/a&#62;</description>
      <link>http://www.ajaxlines.com/ajax/stuff/article/_excellent_ajax_techniques_and_examples.php</link>
      <pubDate>Sun, 06 Jul 2008 8:09:14 EDT</pubDate>
      <guid isPermaLink="true">http://www.ajaxlines.com/ajax/stuff/article/_excellent_ajax_techniques_and_examples.php</guid>
    </item>
    <item>
      <title>ASP.NET MVC &#38; Threads</title>
      <description>I have a method that handles sending of emails.&#38;nbsp; I wrote it so that it would run asynchronously, so that it won&#38;rsquo;t slow down the web app.&#38;nbsp; It looks like this:&#60;br /&#62;
&#60;br /&#62;
protected static void SendMail(string to, string subject, string body)&#60;br /&#62;
{&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; try&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; using (var bgw = new BackgroundWorker())&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; bgw.DoWork += new DoWorkEventHandler(delegate&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; try&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; Thread.Sleep(15000);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; using (MailMessage message = new MailMessage())&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; message.From = new MailAddress(AdminEmail,&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; AdminName);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; message.To.Add(new MailAddress(to));&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; message.Subject = subject;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; message.Body = body;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; message.IsBodyHtml = false;&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; SmtpClient mailClient = new SmtpClient();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; mailClient.Send(message);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; catch (Exception ex)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; Utils.Log(ex);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; });&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; bgw.RunWorkerAsync();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; catch (Exception ex)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; Utils.Log(ex);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
}&#60;br /&#62;
&#60;br /&#62;
I added the Thread.Sleep(15000) to see if it works.&#38;nbsp; To my surprise, it didn&#38;rsquo;t.&#38;nbsp; For some reason, the web request doesn&#38;rsquo;t return until the email thread is done executing.&#38;nbsp; When I step through the code, it runs through the code right away without waiting and calls the return method on the controller as expected.&#38;nbsp; But the response is actually never sent to the server until the thread completes - which defies the whole point of it being asynchronous.&#60;br /&#62;
&#60;br /&#62;
What am I doing wrong?&#38;nbsp; Is this a bug in the MVC framework?&#38;nbsp; Or did I just overlook something?&#60;br /&#62;
&#60;br /&#62;
[UPDATE]&#60;br /&#62;
&#60;br /&#62;
I am not sure what&#38;rsquo;s wrong with the code above but I re-wrote it as show below and it works very well.&#60;br /&#62;
&#60;br /&#62;
protected static void SendMail(string to, string subject, string body)&#60;br /&#62;
{&#60;br /&#62;
&#38;nbsp;&#38;nbsp; try&#60;br /&#62;
&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; var t1 = new Thread(SendMailAsync);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; t1.Start(new string[] {to, subject, body});&#60;br /&#62;
&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp; catch (Exception ex)&#60;br /&#62;
&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; Utils.Log(ex);&#60;br /&#62;
&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
}&#60;br /&#62;
&#60;br /&#62;
private static void SendMailAsync(object emailInfo)&#60;br /&#62;
{&#60;br /&#62;
&#38;nbsp;&#38;nbsp; try&#60;br /&#62;
&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; var paramArray = emailInfo as string[];&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (paramArray != null)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; var to = paramArray[0];&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; var subject = paramArray[1];&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; var body = paramArray[2];&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; using (MailMessage message = new MailMessage())&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; message.From = new MailAddress(AdminEmail,&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; AdminName);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; message.To.Add(new MailAddress(to));&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; message.Subject = subject;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; message.Body = body;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; message.IsBodyHtml = false;&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; var mailClient = new SmtpClient();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; mailClient.Send(message);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp; catch (Exception ex)&#60;br /&#62;
&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; Utils.Log(ex);&#60;br /&#62;
&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
}&#60;br /&#62;
&#60;br /&#62;
source: &#60;a href=&#34;http://www.emadibrahim.com&#34;&#62;emadibrahim&#60;/a&#62;</description>
      <link>http://www.ajaxlines.com/ajax/stuff/article/aspnet_mvc__threads.php</link>
      <pubDate>Thu, 03 Jul 2008 5:51:45 EDT</pubDate>
      <guid isPermaLink="true">http://www.ajaxlines.com/ajax/stuff/article/aspnet_mvc__threads.php</guid>
    </item>
    <item>
      <title>How to add Google Maps to your website</title>
      <description>A picture is worth a thousand words is a proverb that refers to the idea that a picture can explain a complex situation in more meaningful way than 1000 or more words.&#60;br /&#62;
&#60;br /&#62;
You can see more details on this proverb by following the above link but we are here talking about slightly different topic. A map is worth telling 1000 ways to reach certain place. I guess 1000 doesn	 match with this proverb which i just created&#38;nbsp; but map really gives you clear picture and location of your destination.&#60;br /&#62;
&#60;br /&#62;
It is very good practice to provide map of the place on your website if you want to let people know about your contacts and want that they should visit your location or office.&#60;br /&#62;
&#60;br /&#62;
Earlier maps on websites used to be static and you could not interact with maps to zoom and explore different directions etc. But now in the Era of Ajax and Google Maps and other similar websites, it is very much possible to use map information for common use.&#60;br /&#62;
&#60;br /&#62;
Other than visiting these maps related websites you can also embed the related map of related place in your website. &#60;br /&#62;
&#60;img width=&#34;446&#34; height=&#34;274&#34; alt=&#34;&#34; src=&#34;/ajax/images/uploaded/1215069474.png&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
In starting, it was slightly tricky to embed Google maps in your website and you needed an application key for that which introduce another step towards including maps in your website but now it is probably easier than writing an email.&#60;br /&#62;
&#60;br /&#62;
1. Go to maps.google.com&#60;br /&#62;
2. Search for the location&#60;br /&#62;
3. Once you think that final location is in middle of map with appropriate zoom level, click on Link to this Page on right top of map.&#60;br /&#62;
4. It will open a small window there which will give you two things:&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * Link to this map for sending it over email or IM&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; * HTML to paste in your website.&#60;br /&#62;
&#60;br /&#62;
5. Copy and paste this HTML in your website and That is it.&#60;br /&#62;
&#60;br /&#62;
&#60;img width=&#34;515&#34; height=&#34;455&#34; src=&#34;/ajax/images/uploaded/1215070412.png &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
You can further customize by clicking Customize and Preview embedded Map and it will let you choose the size of map according to your need or space requirements on your website and then you can copy and paste HTML in Text area below the preview.&#60;br /&#62;
&#60;br /&#62;
See How it will look like:&#60;br /&#62;
&#60;br /&#62;
&#60;img width=&#34;508&#34; height=&#34;345&#34; src=&#34;/ajax/images/uploaded/1215070447.jpg&#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
&#60;br /&#62;
source: &#60;a href=&#34;http://www.techiegyan.com&#34;&#62;techiegyan&#60;/a&#62;</description>
      <link>http://www.ajaxlines.com/ajax/stuff/article/how_to_add_google_maps_to_your_website.php</link>
      <pubDate>Thu, 03 Jul 2008 3:17:11 EDT</pubDate>
      <guid isPermaLink="true">http://www.ajaxlines.com/ajax/stuff/article/how_to_add_google_maps_to_your_website.php</guid>
    </item>
    <item>
      <title>Speeding Up Post Load Script</title>
      <description>Post-load script maybe one of the most challenging tasks for developers especially those that use a framework for building an Ajax application. In a framework setting, developers will always work in a setting wherein JavaScript is involved.&#60;br /&#62;
&#60;br /&#62;
When post load happens, developers will be limited in their functions since the functions may need to run without the help of JavaScript. Without the proper coding, developers might slow down the process instead of speeding them up since asynchronous streaming of information is not there because JavaScript is not used.&#60;br /&#62;
&#60;br /&#62;
Some usually see this as a disadvantage but if you know where to post load script, you may be able to use its delay to your advantage. An Ajax application, although asynchronous, does not have to relay all information at once. They still have to function like a website wherein some things have to be delayed a little bit so that it could make way for more important functions. Because it does not use JavaScript, it might not be asynchronous but it will be used in a better way such as loading additional functions that does not have to be loaded from the server.&#60;br /&#62;
&#60;br /&#62;
Before doing that, developers have to ensure the actual use of the function so that they do not have to rearrange the function again. Post load script should be used when all things have been loaded. If this is the first function that should be used, then it should never be the post load script in the first place. Post load script should bring the information needed when everything else are in place.&#60;br /&#62;
&#60;br /&#62;
Post load script does not even need time related function to ensure it is loaded when everything else are in place. All the developers have to do is to place the script right after the function so that the browser will naturally execute the function located on top of the post load script.&#60;br /&#62;
&#60;br /&#62;
Any post load script could be used in the application which means it is not even a requirement that the post load script and the actual function are related. The post load script could be used as a tool for transitioning from one function to another or the post load script could be used as a complement for the function. Aside from the location of the coding, the source of the script should be reliable enough for developers to efficiently build the application.&#60;br /&#62;
&#60;br /&#62;
The only challenge in post load scripting is to ensure that the script will be loaded on time. Post load script could come from the server or it could come from an outside source.&#60;br /&#62;
&#60;br /&#62;
When it the post load script comes from the server, there is no problem but when it is loaded from the outside source, developers have to make sure that the outside source is reliable when the function is needed.&#38;nbsp; If it does not load on time then the post load script could be the cause of the Ajax application to slow down but when the post load script has a reliable source, the application will be faster than regularly coded Ajax application. &#60;br /&#62;
&#60;br /&#62;
source: &#60;a href=&#34;http://www.ajaxwith.com&#34;&#62;ajaxwith&#60;/a&#62;&#60;br /&#62;
&#60;br /&#62;</description>
      <link>http://www.ajaxlines.com/ajax/stuff/article/speeding_up_post_load_script.php</link>
      <pubDate>Wed, 02 Jul 2008 7:45:10 EDT</pubDate>
      <guid isPermaLink="true">http://www.ajaxlines.com/ajax/stuff/article/speeding_up_post_load_script.php</guid>
    </item>
    <item>
      <title>Simple AJAX Methodology</title>
      <description>What is AJAX? Well you can see what is it stand for behind the word to the left image shown. But - for those who just heard AJAX acronym - what does it like? What does it purposed to? Many of AJAX online documentation you can pointed to and learned, but anyway, this official wiki page is a good start. As personally for me, AJAX give many useful things in a web programming. Generally, it can eliminated some limitations you will face in a pure HTML page. And somehow, it can make website more attractive &#38;amp; increasing interactivity.&#60;br /&#62;
&#60;br /&#62;
Moreover, this blog article would like describe out about a simple AJAX implementation, especially just for beginner programmer like me ;-). AJAX technology is not a latest one in World Wide Web but it&#38;rsquo;s almost new to me. I&#38;rsquo;m not an expert but this is my first experience to AJAX and I&#38;rsquo;d like to share about it to you. Think about a job but you have to force finished it only with one tool. And this was happened to me when I had to create a web chat module written in PHP.&#60;br /&#62;
&#60;br /&#62;
Basically, a common rule acceptable chat application is that it has capability to refresh the display automatically when everyone leave a message, for example: Yahoo Messenger or IRC. In a regular HTML page (web based application), you can use a META tag but it will refresh the whole page in a specified time. Look at an example below:&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;meta equiv=&#38;quot;refresh&#38;quot; content=&#38;quot;5;URL=chat.php&#38;quot;&#38;gt;&#60;br /&#62;
&#60;br /&#62;
&#60;br /&#62;
&#60;br /&#62;
The lack is, the message you type in a input box will lost when the time achieved (5 second to get the page refreshed automatically &#38;ndash; chat.php). Give it 60 second and you will get an unreliable chat application since there are long duration time to rendering a new screen.&#60;br /&#62;
&#60;br /&#62;
The point is, you will never have a good chat application with above technique. But the mighty AJAX can. How? First of all, take a subject to the database side. This will hold the whole messages from users. Create a table contains 2 row in MySQL just like below script. (database name: chat)&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; # MySQL-Front Dump 2.5&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; #&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; # Host: xxx Database: chat&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; # --------------------------------------------------------&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; # Server version 4.1.11&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; USE chat;&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; #&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; # Table structure for table chat&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; #&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; DROP TABLE IF EXISTS chat;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; CREATE TABLE chat (&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; pesan text,&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; time time NOT NULL default  0:00:00&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; ) ENGINE=MyISAM DEFAULT CHARSET=latin1;&#60;br /&#62;
&#60;br /&#62;
&#60;br /&#62;
&#60;br /&#62;
This is a simple table, you can rearrange it to your needs later. Anyway, look at the picture below and this what&#38;rsquo;s looks like with MySQLFront&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1214997169.jpg &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
Finally, I remade &#38;amp; simplify the chat AJAX script until it contain only 2 files; the chat library (chat.lib.php) &#38;amp; the form page (index.php).&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1214997200.jpg &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
Take a look at complete chat.lib.php class below:&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;?php&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; class chat&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; var $host=&#38;quot;your_db_host_server&#38;quot;;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; var $user=&#38;quot;your_db_user&#38;quot;;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; var $db=&#38;quot;chat&#38;quot;;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; var $pass=&#38;quot;your_db_password&#38;quot;;&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; function connect_easy($query)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; $b = array();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; if(!$connect = mysql_connect($this-&#38;gt;host,$this-&#38;gt;user,$this-&#38;gt;pass));&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; if(!$dbr = mysql_select_db($this-&#38;gt;db));&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; if(!($result = mysql_query($query)));&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; @$num = mysql_num_rows($result);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; @$num2 = mysql_num_fields($result);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; for($x=0;$x&#38;lt;$num;$x++)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; $a = mysql_fetch_array($result);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; for($i=0;$i&#38;lt;$num2;$i++)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; $b[$x][$i] = html_entity_decode($a[$i]);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; return $b;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; function show($a)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; if(count($a)&#38;gt;0)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; $a=array_reverse($a);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; if(count($a)&#38;lt;9)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; $end=count($a);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; else&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; $end=9;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; for($i=0;$i&#38;lt;$end;$i++)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; echo &#38;quot;&#38;lt;font size=2 color=red&#38;gt;&#38;quot;.$a[$i][1].&#38;quot;&#38;lt;/font&#38;gt;: &#38;quot;.$a[$i][0].&#38;quot;&#38;lt;br /&#38;gt;&#38;quot;;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#60;br /&#62;
&#60;br /&#62;
&#60;br /&#62;
All you need to do is change the variable of $host, $user and $pass and make an appropriate with your existing database server. Globally, this class has 2 function; the connection query &#38;amp; retrieval argument. Next, copy below script as form page and rename it as index.php.&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;?&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; session_start();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; require_once(&#38;quot;chat.lib.php&#38;quot;);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; $action=$_GET[&#38;quot;action&#38;quot;];&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; switch ($action)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; case  arefresh : $refresh = new chat();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; $query=&#38;quot;select * from chat&#38;quot;;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; $a=$refresh-&#38;gt;connect_easy($query);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; $refresh-&#38;gt;show($a);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; exit;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; break;&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; case  isubmit: $submit = new chat();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; $query=&#38;quot;insert into chat values (&#38;quot;.$_GET[&#38;quot;chat&#38;quot;].&#38;quot;,NOW())&#38;quot;; $submit-&#38;gt;connect_easy($query);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; exit;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; break;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; ?&#38;gt;&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;html&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;head&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;title&#38;gt;AJAX Chat&#38;lt;/title&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;meta http-equiv=&#38;quot;Content-Type&#38;quot; content=&#38;quot;text/html; charset=iso-8859-1&#38;quot;&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;script language=&#38;quot;JavaScript&#38;quot;&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; function ajaxConstructor()&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; var request_;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; var browser = navigator.appName;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; if(browser == &#38;quot;Microsoft Internet Explorer&#38;quot;)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; request_ = new ActiveXObject(&#38;quot;Microsoft.XMLHTTP&#38;quot;);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; else&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; request_ = new XMLHttpRequest();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; return request_;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; var http = new Array();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; var http2 = new Array();&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; function getRefresh()&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; var curDateTime = new Date();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; http[curDateTime] = ajaxConstructor();&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; http[curDateTime].open(get, index.php?action=refresh);&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; http[curDateTime].onreadystatechange = function()&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; if (http[curDateTime].readyState == 4)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; if (http[curDateTime].status == 200 || http[curDateTime].status == 304)&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; var response = http[curDateTime].responseText;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; document.getElementById(ajax_chat).innerHTML = response;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; http[curDateTime].send(null);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; function getSubmit()&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; var curDateTime = new Date();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; http2[curDateTime] = ajaxConstructor();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; http2[curDateTime].open(get, index.php?action=submit&#38;amp;chat= + document.ajax.chat.value);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; http2[curDateTime].send(null);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; function kirim()&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; getSubmit();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; document.ajax.chat.value=&#38;quot; &#38;quot;;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; function refreshLayar()&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; {&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; getRefresh();&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; window.setTimeout(&#38;quot;refreshLayar()&#38;quot;, 2000);&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;/script&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;/head&#38;gt;&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;body onLoad=&#38;quot;refreshLayar()&#38;quot;&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;div id=&#38;quot;ajax_chat&#38;quot; style=&#38;quot;overflow=auto; width: 375px; height: 200px; border: 1px;&#38;quot; align=&#38;quot;left&#38;quot;&#38;gt;&#38;lt;/div&#38;gt;&#38;lt;br&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;form action=&#38;quot;JavaScript: kirim()&#38;quot; method=&#38;quot;get&#38;quot; name=&#38;quot;ajax&#38;quot;&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;font size=&#38;quot;2&#38;quot; face=&#38;quot;Trebuchet MS, Verdana, MS Sans Serif&#38;quot;&#38;gt;Tulis Pesan: &#38;lt;/font&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;input name=&#38;quot;chat&#38;quot; type=&#38;quot;text&#38;quot;&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;input type=&#38;quot;button&#38;quot; value=&#38;quot;Kirim&#38;quot; onClick=&#38;quot;kirim()&#38;quot;&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;/form&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;/body&#38;gt;&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;lt;/html&#38;gt;&#60;br /&#62;
&#60;br /&#62;
All the both files must stay in the same path of a web server and make sure that you have a valid parameter database connection described earlier in chat.lib.php. Take a test and call the index page from any browser available from client.&#60;br /&#62;
&#60;br /&#62;
&#60;img src=&#34;/ajax/images/uploaded/1214997243.jpg &#34; alt=&#34;&#34; /&#62;&#60;br /&#62;
&#60;br /&#62;
That&#38;rsquo;s it &#38;amp; you&#38;rsquo;re done. The explanation of index page is very much simple. It contains some of core chat functions in JavaScript; the AJAX constructor, refreshing display, submit message &#38;amp; auto render screen in 2 second!. Got it? Well, class dismissed &#38;amp; hope this lesson benefit to us.&#60;br /&#62;
&#60;br /&#62;
source: &#60;a href=&#34;http://www.paparadit.blogspot.com&#34;&#62;paparadit.blogspot&#60;/a&#62;&#60;br /&#62;</description>
      <link>http://www.ajaxlines.com/ajax/stuff/article/simple_ajax_methodology.php</link>
      <pubDate>Wed, 02 Jul 2008 7:22:55 EDT</pubDate>
      <guid isPermaLink="true">http://www.ajaxlines.com/ajax/stuff/article/simple_ajax_methodology.php</guid>
    </item>
    <item>
      <title>Javascript Ajax Class</title>
      <description>A JavaScript Ajax class for client / server communication. The Ajax request objects are stored in an array so that its possible for multiple requests to be running simultaneously.&#60;br /&#62;
view plaincopy to clipboardprint?&#60;br /&#62;
&#60;br /&#62;
&#38;nbsp;&#38;nbsp; 1.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; /*&#60;br /&#62;
&#38;nbsp;&#38;nbsp; 2.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; _________&#60;br /&#62;
&#38;nbsp;&#38;nbsp; 3.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#38;nbsp; INFO&#38;nbsp;&#38;nbsp; |__________________________________________________________________&#60;br /&#62;
&#38;nbsp;&#38;nbsp; 4.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp;&#38;nbsp; 5.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | ajax.js&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp;&#38;nbsp; 6.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | Version 1.0.1 - 03/09/2007&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp;&#38;nbsp; 7.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | Copyright 2007 Karl Payne&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp;&#38;nbsp; 8.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |____________________________________________________________________________|&#60;br /&#62;
&#38;nbsp;&#38;nbsp; 9.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; _________________&#60;br /&#62;
&#38;nbsp; 10.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | RELEASE HISTORY |__________________________________________________________&#60;br /&#62;
&#38;nbsp; 11.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 12.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | * v1.01 20-07-07 Chaged repsone type for plain text from responseXML to&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 13.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#38;nbsp;&#38;nbsp; responseText&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 14.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | * v1.00 17-07-07 Initial public development release&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 15.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |____________________________________________________________________________|&#60;br /&#62;
&#38;nbsp; 16.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; _________&#60;br /&#62;
&#38;nbsp; 17.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | LICENSE |__________________________________________________________________&#60;br /&#62;
&#38;nbsp; 18.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 19.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | This program is free software; you can redistribute it and/or modify&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 20.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | it under the terms of the GNU General Public License as published by&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 21.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | the Free Software Foundation; either version 3 of the License, or&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 22.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | (at your option) any later version.&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 23.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 24.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | This program is distributed in the hope that it will be useful,&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 25.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | but WITHOUT ANY WARRANTY; without even the implied warranty of&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 26.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&#38;nbsp; See the&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 27.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | GNU General Public License for more details.&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 28.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 29.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | You should have received a copy of the GNU General Public License&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 30.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | along with this program.&#38;nbsp; If not, see &#38;lt;http://www.gnu.org/licenses/&#38;gt;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 31.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |____________________________________________________________________________|&#60;br /&#62;
&#38;nbsp; 32.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; _________&#60;br /&#62;
&#38;nbsp; 33.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | CREDIT&#38;nbsp; |__________________________________________________________________&#60;br /&#62;
&#38;nbsp; 34.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 35.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | This program wouldn	 have been possible without the following resources&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 36.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | http://www.drakware.com/?d=2006-08&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 37.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | http://javascript.about.com/library/blajax08.htm&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 38.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; | http://www.wrox.com - for most of the other stuff&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |&#60;br /&#62;
&#38;nbsp; 39.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; |____________________________________________________________________________|&#60;br /&#62;
&#38;nbsp; 40.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; */ &#60;br /&#62;
&#38;nbsp; 41.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; &#60;br /&#62;
&#38;nbsp; 42.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; ///////////////////////////////////////////////////////////////////////////////////////////////////////////// &#60;br /&#62;
&#38;nbsp; 43.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; &#60;br /&#62;
&#38;nbsp; 44.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // determine whether its possible to use the XML HTTP request object (Mozilla et all first then IE) &#60;br /&#62;
&#38;nbsp; 45.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // typeof XMLHttpRequest returns function, instead of &#38;quot;object&#38;quot; as suggested by wrox.com &#60;br /&#62;
&#38;nbsp; 46.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; var bXmlHttpSupport = (typeof XMLHttpRequest != &#38;quot;undefined&#38;quot; || window.ActiveXObject); &#60;br /&#62;
&#38;nbsp; 47.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; &#60;br /&#62;
&#38;nbsp; 48.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // builds a paramater string for use in a post request &#60;br /&#62;
&#38;nbsp; 49.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; function addPostParam(sParams, sParamName, sParamValue) { &#60;br /&#62;
&#38;nbsp; 50.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // check if the current paramater string is longer than 0 chars (2 would be the min surely? a=) &#60;br /&#62;
&#38;nbsp; 51.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (sParams.length &#38;gt; 0) { &#60;br /&#62;
&#38;nbsp; 52.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; sParams += &#38;quot;&#38;amp;&#38;quot;; &#60;br /&#62;
&#38;nbsp; 53.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp; 54.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // url encode both the paramater and the variable &#60;br /&#62;
&#38;nbsp; 55.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; return sParams + encodeURIComponent(sParamName) + &#38;quot;=&#38;quot;&#38;nbsp; + encodeURIComponent(sParamValue); &#60;br /&#62;
&#38;nbsp; 56.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp; 57.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; &#60;br /&#62;
&#38;nbsp; 58.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // adds a variable to a url string and returns it &#60;br /&#62;
&#38;nbsp; 59.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; function addURLParam(sURL, sParamName, sParamValue) { &#60;br /&#62;
&#38;nbsp; 60.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // if there is already variables in the url add an &#38;amp; otherwise start the query string off with a ? &#60;br /&#62;
&#38;nbsp; 61.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; sURL += (sURL.indexOf(&#38;quot;?&#38;quot;) == -1 ? &#38;quot;?&#38;quot; : &#38;quot;&#38;amp;&#38;quot;); &#60;br /&#62;
&#38;nbsp; 62.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // url encode both the paramater and the variable &#60;br /&#62;
&#38;nbsp; 63.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; sURL += encodeURIComponent(sParamName) + &#38;quot;=&#38;quot; + encodeURIComponent(sParamValue); &#60;br /&#62;
&#38;nbsp; 64.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; return sURL; &#60;br /&#62;
&#38;nbsp; 65.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp; 66.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; &#60;br /&#62;
&#38;nbsp; 67.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // allows us to use the same object name (as IE) in all supporting browsers XMLHttpRequest &#60;br /&#62;
&#38;nbsp; 68.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (typeof XMLHttpRequest == &#38;quot;undefined&#38;quot; &#38;amp;&#38;amp; window.ActiveXObject) { &#60;br /&#62;
&#38;nbsp; 69.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; function XMLHttpRequest() { &#60;br /&#62;
&#38;nbsp; 70.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // an array of different versions in reverse order, so we try the latest version first &#60;br /&#62;
&#38;nbsp; 71.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; var arrSignatures = [&#38;quot;MSXML2.XMLHTTP.5.0&#38;quot;, &#38;quot;MSXML2.XMLHTTP.4.0&#38;quot;, &#60;br /&#62;
&#38;nbsp; 72.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;quot;MSXML2.XMLHTTP.3.0&#38;quot;, &#38;quot;MSXML2.XMLHTTP&#38;quot;, &#60;br /&#62;
&#38;nbsp; 73.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; &#38;quot;Microsoft.XMLHTTP&#38;quot;]; &#60;br /&#62;
&#38;nbsp; 74.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // loop through the array of versions &#60;br /&#62;
&#38;nbsp; 75.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; for (var i=0; i &#38;lt; arrSignatures.length; i++) { &#60;br /&#62;
&#38;nbsp; 76.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; try { &#60;br /&#62;
&#38;nbsp; 77.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // try and create an object using the current name &#60;br /&#62;
&#38;nbsp; 78.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; var oRequest = new ActiveXObject(arrSignatures[i]); &#60;br /&#62;
&#38;nbsp; 79.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; return oRequest; &#60;br /&#62;
&#38;nbsp; 80.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } catch (oError) { &#60;br /&#62;
&#38;nbsp; 81.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; //ignore &#60;br /&#62;
&#38;nbsp; 82.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp; 83.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp; 84.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; throw new Error(&#38;quot;MSXML is not installed on your system.&#38;quot;); &#60;br /&#62;
&#38;nbsp; 85.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp; 86.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp; 87.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; &#60;br /&#62;
&#38;nbsp; 88.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // stores a global array of request objects &#60;br /&#62;
&#38;nbsp; 89.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; var aRequests = new Array();&#38;nbsp; &#60;br /&#62;
&#38;nbsp; 90.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; &#60;br /&#62;
&#38;nbsp; 91.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // creates an array of objects so multiple ajax calls can be made simultaneously, each using their own object &#60;br /&#62;
&#38;nbsp; 92.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; function AJAX_Broker(lockStatus) { &#60;br /&#62;
&#38;nbsp; 93.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // if = 1 locks the object so only the correct object is requests can access it &#60;br /&#62;
&#38;nbsp; 94.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; this.locked = lockStatus; &#60;br /&#62;
&#38;nbsp; 95.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // no need to check the browser capabilities here &#60;br /&#62;
&#38;nbsp; 96.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // this function is only called if it works &#60;br /&#62;
&#38;nbsp; 97.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; this.oRequest = new XMLHttpRequest(); &#60;br /&#62;
&#38;nbsp; 98.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#38;nbsp; &#60;br /&#62;
&#38;nbsp; 99.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; &#60;br /&#62;
&#38;nbsp;100.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; function AJAX_get(sURL, fnCallback) { &#60;br /&#62;
&#38;nbsp;101.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // check if the broweser supports XMLHttp &#60;br /&#62;
&#38;nbsp;102.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (bXmlHttpSupport) { &#60;br /&#62;
&#38;nbsp;103.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; var pos = -1; &#60;br /&#62;
&#38;nbsp;104.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // search the array for an unlocked object &#60;br /&#62;
&#38;nbsp;105.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; for (var i=0; i&#38;lt;aRequests.length; i++) { &#60;br /&#62;
&#38;nbsp;106.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (aRequests[i].locked == 1) { &#60;br /&#62;
&#38;nbsp;107.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; pos = i; &#60;br /&#62;
&#38;nbsp;108.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; break; &#60;br /&#62;
&#38;nbsp;109.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;110.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;111.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // if we couldnt find a spare one &#60;br /&#62;
&#38;nbsp;112.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (pos == -1) { &#60;br /&#62;
&#38;nbsp;113.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // create a new one, passing in the unlock code = 1 &#60;br /&#62;
&#38;nbsp;114.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; pos = aRequests.length; &#60;br /&#62;
&#38;nbsp;115.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos] = new AJAX_Broker(1); &#60;br /&#62;
&#38;nbsp;116.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;117.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (aRequests[pos].oRequest) { &#60;br /&#62;
&#38;nbsp;118.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // set the freed property of our new object to 0 to prevent anything else using it &#60;br /&#62;
&#38;nbsp;119.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos].locked = 0; &#60;br /&#62;
&#38;nbsp;120.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // type, url, asynchronous &#60;br /&#62;
&#38;nbsp;121.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos].oRequest.open(&#38;quot;GET&#38;quot;, sURL, true); &#60;br /&#62;
&#38;nbsp;122.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // assign an event handler to watch for state changes &#60;br /&#62;
&#38;nbsp;123.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos].oRequest.onreadystatechange = function() { &#60;br /&#62;
&#38;nbsp;124.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // check if the response is ready to be dealt with &#60;br /&#62;
&#38;nbsp;125.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (AJAX_change(pos)) { &#60;br /&#62;
&#38;nbsp;126.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // get the content type (search for xml because it could be: &#38;quot;text/xml; charset=ISO-8859-1&#38;quot;) &#60;br /&#62;
&#38;nbsp;127.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; sContentType = aRequests[pos].oRequest.getResponseHeader(&#38;quot;Content-Type&#38;quot;); &#60;br /&#62;
&#38;nbsp;128.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (sContentType.indexOf(&#38;quot;xml&#38;quot;) == -1) { &#60;br /&#62;
&#38;nbsp;129.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // pass the response as plain text to our callback function &#60;br /&#62;
&#38;nbsp;130.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; fnCallback(aRequests[pos].oRequest.responseText); &#60;br /&#62;
&#38;nbsp;131.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } else { &#60;br /&#62;
&#38;nbsp;132.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // pass the XML response to our callback function &#60;br /&#62;
&#38;nbsp;133.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; fnCallback(aRequests[pos].oRequest.responseXML); &#60;br /&#62;
&#38;nbsp;134.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;135.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;136.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;137.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // send it all off and let the event handler do its work &#60;br /&#62;
&#38;nbsp;138.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos].oRequest.send(null); &#60;br /&#62;
&#38;nbsp;139.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;140.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } else { &#60;br /&#62;
&#38;nbsp;141.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; alert(&#38;quot;Your browser doesn	 support HTTP get requests.&#38;quot;); &#60;br /&#62;
&#38;nbsp;142.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;143.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;144.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; &#60;br /&#62;
&#38;nbsp;145.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; function AJAX_post(sURL, sParams, fnCallback) { &#60;br /&#62;
&#38;nbsp;146.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // check if the broweser supports XMLHttp &#60;br /&#62;
&#38;nbsp;147.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (bXmlHttpSupport) { &#60;br /&#62;
&#38;nbsp;148.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; var pos = -1; &#60;br /&#62;
&#38;nbsp;149.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // search the array for an unlocked object &#60;br /&#62;
&#38;nbsp;150.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; for (var i=0; i&#38;lt;aRequests.length; i++) { &#60;br /&#62;
&#38;nbsp;151.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (aRequests[i].locked == 1) { &#60;br /&#62;
&#38;nbsp;152.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; pos = i; &#60;br /&#62;
&#38;nbsp;153.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; break; &#60;br /&#62;
&#38;nbsp;154.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;155.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;156.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // if we couldnt find a spare one &#60;br /&#62;
&#38;nbsp;157.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (pos == -1) { &#60;br /&#62;
&#38;nbsp;158.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // create a new one, passing in the unlock code = 1 &#60;br /&#62;
&#38;nbsp;159.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; pos = aRequests.length; &#60;br /&#62;
&#38;nbsp;160.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos] = new AJAX_Broker(1); &#60;br /&#62;
&#38;nbsp;161.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;162.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (aRequests[pos].oRequest) { &#60;br /&#62;
&#38;nbsp;163.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // set the freed property of our new object to 0 to prevent anything else using it &#60;br /&#62;
&#38;nbsp;164.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos].locked = 0; &#60;br /&#62;
&#38;nbsp;165.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // type, url, asynchronous &#60;br /&#62;
&#38;nbsp;166.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos].oRequest.open(&#38;quot;POST&#38;quot;, sURL, true); &#60;br /&#62;
&#38;nbsp;167.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // assign an event handler to watch for state changes &#60;br /&#62;
&#38;nbsp;168.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos].oRequest.onreadystatechange = function() { &#60;br /&#62;
&#38;nbsp;169.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // check if the response is ready to be dealt with &#60;br /&#62;
&#38;nbsp;170.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (AJAX_change(pos)) { &#60;br /&#62;
&#38;nbsp;171.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // get the content type (search for xml because it could be: &#38;quot;text/xml; charset=ISO-8859-1&#38;quot;) &#60;br /&#62;
&#38;nbsp;172.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; sContentType = aRequests[pos].oRequest.getResponseHeader(&#38;quot;Content-Type&#38;quot;); &#60;br /&#62;
&#38;nbsp;173.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (sContentType.indexOf(&#38;quot;xml&#38;quot;) == -1) { &#60;br /&#62;
&#38;nbsp;174.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // pass the response as plain text to our callback function &#60;br /&#62;
&#38;nbsp;175.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; fnCallback(aRequests[pos].oRequest.responseText); &#60;br /&#62;
&#38;nbsp;176.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } else { &#60;br /&#62;
&#38;nbsp;177.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // pass the XML response to our callback function &#60;br /&#62;
&#38;nbsp;178.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; fnCallback(aRequests[pos].oRequest.responseXML); &#60;br /&#62;
&#38;nbsp;179.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;180.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;181.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;182.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // setRequestHeader must be called after open to prevent an uncaught exception &#60;br /&#62;
&#38;nbsp;183.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos].oRequest.setRequestHeader(&#38;quot;Content-Type&#38;quot;, &#38;quot;application/x-www-form-urlencoded&#38;quot;); &#60;br /&#62;
&#38;nbsp;184.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // send it all off and let the event handler do its work &#60;br /&#62;
&#38;nbsp;185.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos].oRequest.send(sParams); &#60;br /&#62;
&#38;nbsp;186.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;187.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } else { &#60;br /&#62;
&#38;nbsp;188.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; alert(&#38;quot;Your browser doesn	 support HTTP post requests.&#38;quot;); &#60;br /&#62;
&#38;nbsp;189.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; } &#60;br /&#62;
&#38;nbsp;190.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; }&#38;nbsp; &#60;br /&#62;
&#38;nbsp;191.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; &#60;br /&#62;
&#38;nbsp;192.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // event handler &#60;br /&#62;
&#38;nbsp;193.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; function AJAX_change(pos) { &#60;br /&#62;
&#38;nbsp;194.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // a few checks .. &#60;br /&#62;
&#38;nbsp;195.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // - that a position was passed in - should pretty much always be the case &#60;br /&#62;
&#38;nbsp;196.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // - that its freed - again pretty useless as we should have just created it in the get or post functions &#60;br /&#62;
&#38;nbsp;197.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // that the ready state is 4 (completely loaded) &#60;br /&#62;
&#38;nbsp;198.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; if (typeof(aRequests[pos]) != undefined &#38;amp;&#38;amp; &#60;br /&#62;
&#38;nbsp;199.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos].locked == 0 &#38;amp;&#38;amp; &#60;br /&#62;
&#38;nbsp;200.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; aRequests[pos].oRequest.readyState == 4 ) { &#60;br /&#62;
&#38;nbsp;201.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // check the headers status : 200 =&#38;nbsp; OK || 304 = Not Modified &#60;br /&#62;
&#38;nbsp;202.&#60;br /&#62;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp; // some advan