<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://www.aptana.com" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
 <title>Aptana Front Page News Blog</title>
 <link>http://www.aptana.com/view/blog_front_page</link>
 <description>Aptana Front Page News Blog</description>
 <language>en</language>
<item>
 <title>&#039;DOM Scraping&#039; with Aptana Jaxer</title>
 <link>http://www.aptana.com/node/339</link>
 <description>One of the things I was working on recently is &#039;screen scraping&#039; some data from several sites and presenting them in a single page. Of course Jaxer seems like the perfect tool for this as I can go fetch the data server-side, pull it all together, then present the final page to the browser. It was so exciting to see this work that I thought I&#039;d make this post to share my experience with you!
&lt;p&gt;&lt;/p&gt;

We’re working now on adding support in Jaxer for being able to programmatically create &#039;window&#039; objects, filling them with content from a remote URL, having that content actually execute, then being able to go into that window object and pull DOM elements out.
&lt;p&gt;&lt;/p&gt;

Unfortunately for me, that work isn&#039;t ready yet, so I wanted to see if there was some workaround I could use until it was ready. Well, after some research and trial and error, a workaround was found. The only catch with this code is that if there is any JavaScript on the page(s) you are fetching, that code will not execute, that’s coming soon.
&lt;p&gt;&lt;/p&gt;

Note that all of the code below can be contained within a single script tag:
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;html&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
&amp;lt;script runat=&#039;server&#039;&gt;...all code here...&amp;lt;/script&gt;
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

So, the first thing I wanted to do is make it really easy to fetch a remote document and grab out some content. I didn&#039;t want to use string matching or regular expressions of any kind, I wanted to use my trusted &#039;getElementById&#039; to fetch named elements directly. (Of course I ran into sites that don&#039;t name their elements, but fortunately many use named classes, so I had to fetch them that way, but I get ahead of myself.)
&lt;p&gt;&lt;/p&gt;

Let&#039;s get started. The following two lines is all that is required to fetch a remote URL synchronously on the server and then pull out a named element:
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
var doc = getDocumentFromURL(&quot;http://www.news.com/&quot;);
var item = doc.getElementById(&quot;mostPopStories&quot;);
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

Now that we have &#039;item&#039; as the element we were trying to fetch, we just have to add that element to our current blank page. I created a simple function called &#039;addElementToPage(title, element)&#039; that takes care of this for me. Here&#039;s the next line:
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
addElementToPage(&quot;News.com Popular Stories&quot;, item);
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

That&#039;s it. Now I do that 2 more times to fetch content from 2 other sites.
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
doc = getDocumentFromURL(&quot;http://ajaxian.com&quot;);
item = getElementsByClass(&#039;activitystream&#039;, doc)[0];
addElementToPage(&quot;Ajaxian Activity Stream&quot;, item);

doc = getDocumentFromURL(&quot;http://www.washingtonpost.com/&quot;);
item = getElementsByClass(&quot;top-box-in&quot;, doc)[0];
addElementToPage(&quot;Washington Post&quot;, item);
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

You&#039;ll notice that I didn&#039;t use getElementById() as those elements were not named, but fortunately they had class names associated with them. I found a convenient function called getElementsByClass() that I used in this case. Since it returns an array of elements, I use the [0] index to retrieve the first item in the list, which in my case, is probably the only item.
&lt;p&gt;&lt;/p&gt;

Believe it or not, that&#039;s basically it. At this point, your three &#039;DOM fragments&#039; have been fetched and inserted into your new document. Here&#039;s the result:
&lt;p&gt;&lt;/p&gt;

&lt;img src=&quot;http://aptana.com/system/files/DOMScraping.png&quot;&gt;
&lt;p&gt;&lt;/p&gt;

Following are the convenience functions that help make the magic happen. The first function is addElementToPage(). It very simply just creates an H2 tag and sets the title and a DIV tag which contains the contents of the fetched element:
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
function addElementToPage(title, element)
{
    var el = document.importNode(element, true);
				
    var h2 = document.createElement(&#039;h2&#039;);
    h2.innerHTML = title;
    document.body.appendChild(h2);
				
    var div = document.createElement(&#039;div&#039;);
    div.appendChild(el);
    document.body.appendChild(div);
}
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

This next function, getDocumentFromURL(), is the one that does most of the work. (I found some good info on the subject of HTML to DOM here: http://jszen.blogspot.com/2007/02/how-to-parse-html-strings-into-dom.html) It first goes and retrieves the remote page. Then it creates a &#039;document fragment&#039; from the contents of the fetched site. That fragment is then added to a dynamically created IFRAME. Finally, the Document object from the IFRAME is fetched and returned. In short, we can pass in a URL, get the string value, place it into an IFRAME, then pull out the resulting Document object so that we can work on it.
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
function getDocumentFromURL(url)
{
    // Get remote site
    var string = Jaxer.Web.get(url);
                
    // Parse the string into a doc fragment
    var range = document.createRange();
    range.selectNode(document.body);
    var parsedHTML = range.createContextualFragment(string);

    // Create the iframe that will contain the site we loaded
    var iframe = document.createElement(&quot;iframe&quot;);
    document.body.appendChild(iframe);
				
    // Import from doc fragment into the iframe
    var el = iframe.contentDocument.importNode(parsedHTML, true);
    iframe.contentDocument.body.appendChild(el);
                
    var newDoc = iframe.contentDocument;

    // delete the iframe as we don&#039;t need it any more
    document.body.removeChild(iframe);

    return newDoc;
}
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

This final function was found at http://www.dustindiaz.com/getelementsbyclass/ and walks a node looking for an element with a specific class name. It was used in the case where elements don&#039;t have ID&#039;s, so a class name is used instead.
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
            function getElementsByClass(searchClass, node, tag)
			{
                var classElements = new Array();
                if (node == null) 
                    node = document;
                if (tag == null) 
                    tag = &#039;*&#039;;
                var els = node.getElementsByTagName(tag);
                var elsLen = els.length;
                var pattern = new RegExp(&quot;(^|\\\\s)&quot; + searchClass + &quot;(\\\\s|$)&quot;);
                for (i = 0, j = 0; i &lt; elsLen; i++) {
                    if (pattern.test(els[i].className)) {
                        classElements[j] = els[i];
                        j++;
                    }
                }
                return classElements;
            }
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

What&#039;s exciting about this sample is that it is relatively simple, uses the full power of server-side JavaScript and more importantly, Jaxer&#039;s cool server-side DOM capability to enable real &#039;DOM scraping&#039;. Once window object creation is finished in Jaxer (real soon now), then you&#039;ll be able to fetch remote pages, execute their integrated code, then proceed to fetch out items from the resulting DOM.


</description>
 <content:encoded>One of the things I was working on recently is &#039;screen scraping&#039; some data from several sites and presenting them in a single page. Of course Jaxer seems like the perfect tool for this as I can go fetch the data server-side, pull it all together, then present the final page to the browser. It was so exciting to see this work that I thought I&#039;d make this post to share my experience with you!
&lt;p&gt;&lt;/p&gt;

We’re working now on adding support in Jaxer for being able to programmatically create &#039;window&#039; objects, filling them with content from a remote URL, having that content actually execute, then being able to go into that window object and pull DOM elements out.
&lt;p&gt;&lt;/p&gt;

Unfortunately for me, that work isn&#039;t ready yet, so I wanted to see if there was some workaround I could use until it was ready. Well, after some research and trial and error, a workaround was found. The only catch with this code is that if there is any JavaScript on the page(s) you are fetching, that code will not execute, that’s coming soon.
&lt;p&gt;&lt;/p&gt;

Note that all of the code below can be contained within a single script tag:
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;html&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
&amp;lt;script runat=&#039;server&#039;&gt;...all code here...&amp;lt;/script&gt;
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

So, the first thing I wanted to do is make it really easy to fetch a remote document and grab out some content. I didn&#039;t want to use string matching or regular expressions of any kind, I wanted to use my trusted &#039;getElementById&#039; to fetch named elements directly. (Of course I ran into sites that don&#039;t name their elements, but fortunately many use named classes, so I had to fetch them that way, but I get ahead of myself.)
&lt;p&gt;&lt;/p&gt;

Let&#039;s get started. The following two lines is all that is required to fetch a remote URL synchronously on the server and then pull out a named element:
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
var doc = getDocumentFromURL(&quot;http://www.news.com/&quot;);
var item = doc.getElementById(&quot;mostPopStories&quot;);
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

Now that we have &#039;item&#039; as the element we were trying to fetch, we just have to add that element to our current blank page. I created a simple function called &#039;addElementToPage(title, element)&#039; that takes care of this for me. Here&#039;s the next line:
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
addElementToPage(&quot;News.com Popular Stories&quot;, item);
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

That&#039;s it. Now I do that 2 more times to fetch content from 2 other sites.
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
doc = getDocumentFromURL(&quot;http://ajaxian.com&quot;);
item = getElementsByClass(&#039;activitystream&#039;, doc)[0];
addElementToPage(&quot;Ajaxian Activity Stream&quot;, item);

doc = getDocumentFromURL(&quot;http://www.washingtonpost.com/&quot;);
item = getElementsByClass(&quot;top-box-in&quot;, doc)[0];
addElementToPage(&quot;Washington Post&quot;, item);
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

You&#039;ll notice that I didn&#039;t use getElementById() as those elements were not named, but fortunately they had class names associated with them. I found a convenient function called getElementsByClass() that I used in this case. Since it returns an array of elements, I use the [0] index to retrieve the first item in the list, which in my case, is probably the only item.
&lt;p&gt;&lt;/p&gt;

Believe it or not, that&#039;s basically it. At this point, your three &#039;DOM fragments&#039; have been fetched and inserted into your new document. Here&#039;s the result:
&lt;p&gt;&lt;/p&gt;

&lt;img src=&quot;http://aptana.com/system/files/DOMScraping.png&quot;&gt;
&lt;p&gt;&lt;/p&gt;

Following are the convenience functions that help make the magic happen. The first function is addElementToPage(). It very simply just creates an H2 tag and sets the title and a DIV tag which contains the contents of the fetched element:
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
function addElementToPage(title, element)
{
    var el = document.importNode(element, true);
				
    var h2 = document.createElement(&#039;h2&#039;);
    h2.innerHTML = title;
    document.body.appendChild(h2);
				
    var div = document.createElement(&#039;div&#039;);
    div.appendChild(el);
    document.body.appendChild(div);
}
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

This next function, getDocumentFromURL(), is the one that does most of the work. (I found some good info on the subject of HTML to DOM here: http://jszen.blogspot.com/2007/02/how-to-parse-html-strings-into-dom.html) It first goes and retrieves the remote page. Then it creates a &#039;document fragment&#039; from the contents of the fetched site. That fragment is then added to a dynamically created IFRAME. Finally, the Document object from the IFRAME is fetched and returned. In short, we can pass in a URL, get the string value, place it into an IFRAME, then pull out the resulting Document object so that we can work on it.
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
function getDocumentFromURL(url)
{
    // Get remote site
    var string = Jaxer.Web.get(url);
                
    // Parse the string into a doc fragment
    var range = document.createRange();
    range.selectNode(document.body);
    var parsedHTML = range.createContextualFragment(string);

    // Create the iframe that will contain the site we loaded
    var iframe = document.createElement(&quot;iframe&quot;);
    document.body.appendChild(iframe);
				
    // Import from doc fragment into the iframe
    var el = iframe.contentDocument.importNode(parsedHTML, true);
    iframe.contentDocument.body.appendChild(el);
                
    var newDoc = iframe.contentDocument;

    // delete the iframe as we don&#039;t need it any more
    document.body.removeChild(iframe);

    return newDoc;
}
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

This final function was found at http://www.dustindiaz.com/getelementsbyclass/ and walks a node looking for an element with a specific class name. It was used in the case where elements don&#039;t have ID&#039;s, so a class name is used instead.
&lt;p&gt;&lt;/p&gt;

&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
            function getElementsByClass(searchClass, node, tag)
			{
                var classElements = new Array();
                if (node == null) 
                    node = document;
                if (tag == null) 
                    tag = &#039;*&#039;;
                var els = node.getElementsByTagName(tag);
                var elsLen = els.length;
                var pattern = new RegExp(&quot;(^|\\\\s)&quot; + searchClass + &quot;(\\\\s|$)&quot;);
                for (i = 0, j = 0; i &lt; elsLen; i++) {
                    if (pattern.test(els[i].className)) {
                        classElements[j] = els[i];
                        j++;
                    }
                }
                return classElements;
            }
&lt;/textarea&gt;
&lt;p&gt;&lt;/p&gt;

What&#039;s exciting about this sample is that it is relatively simple, uses the full power of server-side JavaScript and more importantly, Jaxer&#039;s cool server-side DOM capability to enable real &#039;DOM scraping&#039;. Once window object creation is finished in Jaxer (real soon now), then you&#039;ll be able to fetch remote pages, execute their integrated code, then proceed to fetch out items from the resulting DOM.


</content:encoded>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <category domain="http://www.aptana.com/taxonomy/term/14">jaxer</category>
 <category domain="http://www.aptana.com/taxonomy/term/13">studio</category>
 <pubDate>Tue, 15 Apr 2008 12:40:11 -0500</pubDate>
 <dc:creator>pcolton</dc:creator>
 <guid isPermaLink="false">339 at http://www.aptana.com</guid>
</item>
<item>
 <title>Server-side jQuery and more cool tricks with Aptana Jaxer</title>
 <link>http://www.aptana.com/node/336</link>
 <description>&lt;P&gt;In this example, (the first in a series) we&#039;re going to build a simple voting tool, using a single page of DHTML. The implementation is quite basic but covers a good few examples of how to use &lt;a href=&#039;/jaxer&#039;&gt;Aptana Jaxer&lt;/a&gt; in real world situations, such as :
&lt;UL&gt;
&lt;LI&gt;Using Ajax libraries on the server (jQuery in this example)&lt;/LI&gt;
&lt;LI&gt;Server-side DOM manipulation (using jQuery)&lt;/LI&gt;
&lt;LI&gt;Storing and retrieving Session data&lt;/LI&gt;
&lt;LI&gt;Creating and accessing a database&lt;/LI&gt;
&lt;LI&gt;E4X as a templating mechanism (E4X provides native XML support in JavaScript)&lt;/LI&gt;
&lt;LI&gt;Handling form data&lt;/LI&gt;
&lt;/UL&gt;
&lt;/P&gt;
&lt;h3&gt;Let&#039;s Vote...&lt;/h3&gt;
&lt;P&gt;This example was written as a single page webapp. You could remove the Javascript to another file and make it all unobtrusive if that is what gets you excited, but I&#039;m just using an inline script tag, as the code is only about 30 or so lines long. Also in Jaxer we could have easily implemented this using Jaxer&#039;s seamless ajax callback mechanism but for the purpose of this example we&#039;ll stick with a traditional form post.&lt;/P&gt;
&lt;P&gt;Let&#039;s get started. Most folks reading this should be familiar with the standard blog/portal poll, where you are presented with a set of choices.&lt;/P&gt;
&lt;img src=&#039;http://www.aptana.com/system/files/choices_0.png&#039;&gt;
&lt;P&gt;and once you have voted you get to see the current results of the voting.&lt;/P&gt;
&lt;img src=&#039;http://www.aptana.com/system/files/voted_0.png&#039;&gt;
&lt;P&gt;In our example we allow multiple votes per user but you can easily change that by just commenting out a single line of code.
&lt;/P&gt;
&lt;P&gt;One of the interesting features of this application is that, by using server-side DOM manipulation in Jaxer, you can remove any unwanted content before it is sent to the client browser. We use this to hide the vote results until the user has voted&lt;/P&gt;
&lt;P&gt;This is a useful technique for permission based forms where, for example, you may want remove the credit card details unless the user has established the correct permissions and been validated by the server.
&lt;/P&gt;
&lt;h3&gt;A very basic web page&lt;/h3&gt;
&lt;P&gt;So let&#039;s jump in and have a look at the code used to make this work.&lt;/P&gt;

&lt;textarea name=&quot;code&quot; class=&quot;HTML&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&gt;
&lt;title&gt;Jaxer Poll&lt;/title&gt;
&lt;script runat=&#039;server&#039; src=&#039;jquery-compressed.js&#039; autoload=&#039;true&#039;&gt;&lt;/script&gt;
&lt;style&gt;
        #pollContainer {
            width: 600px;
            background: #eee;
            border: 3px solid #555;
            padding: 5px;
            font-size: 1em;
            font-family: Tahoma, Verdana, Helvetica, Arial;
            font-weight: 900;
        }
        
        #display {
            background: #ccc;
            font-size: 0.75em;
            font-weight: 200;
            color: #2E3540;
            margin: 5px 0 5px 0;
        }
        
        TD {
            padding-left: 10px;
        }
        
        TD IMG {
            margin-left: -6px;
        }
&lt;/style&gt;
&lt;/textarea&gt;
&lt;P&gt;Above is the contents of the HEAD element. Just the usual suspects, setting the title and some simple CSS stuff. The only interesting part is at line #3, where we load the jQuery library on the &lt;B&gt;server&lt;/B&gt;, because we intend to do some &lt;B&gt;serverside DOM manipulation&lt;/B&gt; before the page is sent to the client. &lt;/P&gt;
&lt;P&gt;The runat=&#039;server&#039; attribute tells Jaxer to load this javascript library &lt;B&gt;on the server&lt;/B&gt;. &lt;/P&gt;
&lt;P&gt;The autoload attribute is a recent addition to Jaxer, and it instructs Jaxer to load that page and keep it cached as preparsed bytecode (for faster library loadtime) for any future calls to this page, including callbacks.&lt;P&gt;

&lt;P&gt;In the body of the document we have a simple form which we will dynamically populate on the server. The form will post the vote to itself on the server. &lt;/P&gt;
&lt;P&gt;We are marking up the DOM content with the classnames &#039;voter&#039; and &#039;nonvoter&#039; to identify content that is specific to a user&#039;s status, and make it easily accessible using jQuery on the server.&lt;/P&gt;

&lt;textarea name=&quot;code&quot; class=&quot;HTML&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;&lt;form id=&#039;pollContainer&#039; method=&quot;POST&quot; accept-charset=&quot;utf-8&quot;&gt;
    &lt;div id=&#039;question&#039;&gt;What do you think is the coolest feature of Jaxer?&lt;/div&gt;
    &lt;div id=&#039;display&#039;&gt;&lt;/div&gt;
    &lt;div class=&#039;nonvoter&#039;&gt;&lt;input type=&#039;submit&#039; value=&#039;vote&#039;&gt;&lt;/div&gt;&lt;div id=&#039;voteTotals&#039; class=&#039;voter&#039;&gt;&lt;/div&gt;
&lt;/form&gt;
&lt;/textarea&gt;
&lt;h3&gt;Server Side Javascript&lt;/h3&gt;
Now we get to the Javascript. The app has a single script tag in the body which is designated to run on the server.&lt;/P&gt;
&lt;P&gt;The first dozen or so lines are &lt;B&gt;simply creating a DB and preparing a schema&lt;/B&gt; for use.&lt;/P&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;var db = new Jaxer.DB.SQLite.createDB({PATH:Jaxer.Dir.resolvePath(&#039;poll.sqlite&#039;)});
db.execute(&quot;CREATE TABLE IF NOT EXISTS votes (id, ip, vote)&quot;); 

var questions = [ &quot;Server-Side DOM&quot;,&quot;Server-Side Javascript&quot;,&quot;Seamless Ajax&quot;,&quot;I already know it!&quot;];

var totalVotes = db.execute(&#039;SELECT count(*) FROM votes&#039;).singleResult - questions.length;
if (totalVotes &lt; 0)
{
    questions.map(function(item, index) // seed the table with 1 row per question to avoid nulls
	{
    	db.execute(&quot;INSERT INTO votes (id ,ip,vote) VALUES (?,?,?)&quot;, &quot;&quot;+index, &#039;127.0.0.1&#039;, &quot;&quot;+index);
    });
	totalVotes = 0;
}&lt;/textarea&gt;
&lt;P&gt;So we&#039;ve connected to the database (which was automatically created if needed, how convenient!) and set up the schema and initial content we expect. We also setup an Array (&lt;B&gt;&lt;I&gt;questions&lt;/I&gt;&lt;/B&gt;) containing the questions for the voting poll&lt;/P&gt;
&lt;P&gt;Next we need to check the &lt;B&gt;session value&lt;/B&gt; we are storing (&lt;B&gt;&lt;I&gt;status&lt;/I&gt;&lt;/B&gt;) to determine whether this user has already voted, and then check to see if the form data for the vote is being posted. Then, if we are actually voting, we write the vote to the database and set the user status to &#039;voter&#039;. &lt;/P&gt;
&lt;P&gt;When we write the vote to the database, we grab the sessionID and the remote IP address and write those out with the vote data, this will let us enforce single voting later if we need it.&lt;/P&gt;
&lt;P&gt;Finally query the database to get the current vote counts, remembering to subtract 1 from the total to account for the dummy rows we inserted to seed database and prevent any nulls from appearing in the results totals.&lt;/P&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;var status = Jaxer.session.get(&#039;status&#039;) || &#039;nonvoter&#039;;

// look for request data and save vote if present
if (Jaxer.request.data.hasOwnProperty(&#039;radioBtns&#039;) &amp;&amp; status == &#039;nonvoter&#039;) 
{
	db.execute(&quot;INSERT INTO votes (id,ip,vote) VALUES (?,?,?) &quot;
	,	Jaxer.SessionManager.keyFromRequest() 	// session ID
	,	Jaxer.request.remoteAddr 				// remote IP address
	,	Jaxer.request.data.radioBtns			// posted data
	);
    status = &#039;voter&#039;; 
	totalVotes ++ ;
}
rs = db.execute(&#039;SELECT count(*)-1 AS tot FROM votes GROUP BY vote&#039;);

&lt;/textarea&gt;
&lt;P&gt;Now we build the DOM, to do this we issue a query to the DB to get the current vote tally.&lt;/P&gt;
&lt;P&gt;Using &lt;A href=&#039;http://en.wikipedia.org/wiki/E4X&#039; title=&#039;Open the Wikipedia page on E4X in a new window/tab&#039; target=&#039;_blank&#039;&gt;E4X - ECMAScript For XML&lt;/A&gt; as a simple templating tool we create the DOM with the nodes populated according to our dataset.&lt;/P&gt;
&lt;P&gt;One of the nice features of server-side javascript with Jaxer &lt;B&gt;is that you have access to all neat things built into Mozilla without the worry of client side browser support&lt;/B&gt;, which enables reliable use of the advanced features of the Javascript language.&lt;/P&gt;
&lt;P&gt;If you look closely at the code below you&#039;ll notice we use a simple syntax for variable substitution using curly braces containing javascript code inside the E4X assigments. This allows us to use this for templating as long as we are creating valid XML nodes.&lt;/P&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;var output = &lt;table&gt;&lt;/table&gt;;
for (question in questions)
{
	var percent = parseInt((rs.rows[question].tot / totalVotes) * 100);
    output.appendChild(&lt;tr&gt;
    &lt;td class=&#039;nonvoter&#039;&gt;&lt;input type=&#039;radio&#039; name=&#039;radioBtns&#039; value={question}&gt;&lt;/td&gt;
    &lt;td&gt;{questions[question]}&lt;/td&gt;
    &lt;td class=&#039;voter&#039;&gt;
         &lt;img src=&quot;poll_l.png&quot; height=&#039;16&#039;&gt;
         &lt;img src=&quot;poll.png&quot;   height=&#039;16&#039; width={percent * 2}&gt;
         &lt;img src=&quot;poll_r.png&quot; height=&#039;16&#039;&gt;&lt;/td&gt;
    &lt;td class=&#039;voter&#039;&gt;{rs.rows[question].tot}&lt;/td&gt;
    &lt;td class=&#039;voter&#039;&gt;({percent}%)&lt;/td&gt;
    &lt;/tr&gt;); 
}
$(&#039;#display&#039;).html(output.toString());
$(&#039;#voteTotals&#039;).html(totalVotes + &quot; votes&quot;);&lt;/textarea&gt;
&lt;P&gt;So the document now has a DOM that has been populated with the content for &lt;B&gt;BOTH&lt;/B&gt; voters and non-voters. We use a little &lt;B&gt;jQuery&lt;/B&gt; magic to remove the elements we don&#039;t want presented to the user.&lt;/P&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;3&#039;&gt;// remove DOM elements based on whether user has already voted
$((status == &#039;voter&#039;) ? &#039;.nonvoter&#039; : &#039;.voter&#039;).remove(); &lt;/textarea&gt;
&lt;P&gt;In this way the user will EITHER see the form with the question and the submit button &lt;/P&gt;
&lt;img src=&#039;http://www.aptana.com/system/files/choices_0.png&#039;&gt;
&lt;P&gt;OR the current voting results data.&lt;/P&gt;
&lt;img src=&#039;http://www.aptana.com/system/files/voted_0.png&#039;&gt;
&lt;P&gt;Now we set the &lt;B&gt;session variable&lt;/B&gt; status to be the current status of the user as they have either voted or not.&lt;/P&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;3&#039;&gt;Jaxer.session.set(&#039;status&#039;, status);&lt;/textarea&gt;
&lt;P&gt;Finally as the page that is served has no further dependency on Jaxer once it leaves the server, we tell Jaxer to not bother injecting the client framework. Normally the client framework would be automatically inserted as a script tag in the outgoing HTML, but our simple example doesn&#039;t need to communicate back to the Jaxer server, as it contains no server callbacks.
&lt;/P&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;3&#039;&gt;// no need for the client Framework to be injected into the page
Jaxer.response.setClientFramework(); 
&lt;/textarea&gt;
&lt;P&gt;So there you have it, a simple poll on a single page, using many of Jaxer&#039;s cool features.&lt;/P&gt;
&lt;h3&gt;Supporting Files&lt;/h3&gt;
&lt;P&gt;The full code and supporting files for this article are available &lt;a href=&#039;http://www.aptana.com/system/files/votepoll.zip&#039;&gt;here&lt;/a&gt;&lt;/P&gt;
&lt;h3&gt;Full Source Listing&lt;/h3&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;25&#039;&gt;
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&gt;
        &lt;title&gt;Jaxer Poll&lt;/title&gt;
        &lt;script runat=&#039;server&#039; src=&#039;jquery-compressed.js&#039; autoload=&#039;true&#039;&gt;&lt;/script&gt;
		&lt;style&gt;
        #pollContainer {
            width: 600px;
            background: #eee;
            border: 3px solid #555;
            padding: 5px;
            font-size: 1em;
            font-family: Tahoma, Verdana, Helvetica, Arial;
            font-weight: 900;
        }
        
        #display {
            background: #ccc;
            font-size: 0.75em;
            font-weight: 200;
            color: #2E3540;
            margin: 5px 0 5px 0;
        }
        
        TD {
            padding-left: 10px;
        }
        
        TD IMG {
            margin-left: -6px;
        }
		&lt;/style&gt;
    &lt;/head&gt;
    &lt;body&gt;
		&lt;form id=&#039;pollContainer&#039; method=&quot;POST&quot; accept-charset=&quot;utf-8&quot;&gt;
		    &lt;div id=&#039;question&#039;&gt;What do you think is the coolest feature of Jaxer?&lt;/div&gt;
		    &lt;div id=&#039;display&#039;&gt;&lt;/div&gt;
		    &lt;div class=&#039;nonvoter&#039;&gt;&lt;input type=&#039;submit&#039; value=&#039;vote&#039;/&gt;&lt;/div&gt;&lt;div id=&#039;voteTotals&#039; class=&#039;voter&#039;&gt;&lt;/div&gt;
		&lt;/form&gt;
        &lt;script runat=&#039;server&#039;&gt;
        var db = Jaxer.DB.SQLite.createDB({PATH:Jaxer.Dir.resolvePath(&#039;poll.sqlite&#039;)});
        db.execute(&quot;CREATE TABLE IF NOT EXISTS votes (id, ip, vote)&quot;); 
		
        var questions = [ &quot;Server-Side DOM&quot;,&quot;Server-Side Javascript&quot;,&quot;Seamless Ajax&quot;,&quot;I already know it!&quot;];
		
        var totalVotes = db.execute(&#039;SELECT count(*) FROM votes&#039;).singleResult - questions.length;
        if (totalVotes &lt; 0)
        {
            questions.map(function(item, index) // seed the table with 1 row per question to avoid nulls
			{
            	db.execute(&quot;INSERT INTO votes (id ,ip,vote) VALUES (?,?,?)&quot;, &quot;&quot;+index, &#039;127.0.0.1&#039;, &quot;&quot;+index);
            });
			totalVotes = 0;
        }
        Jaxer.session.remove(&#039;status&#039;); // remove this line to limit to 1 vote per user session
		
        var status = Jaxer.session.get(&#039;status&#039;) || &#039;nonvoter&#039;;
		
		// look for request data and save vote if present
        if (Jaxer.request.data.hasOwnProperty(&#039;radioBtns&#039;) &amp;&amp; status == &#039;nonvoter&#039;) 
        {
        	db.execute(&quot;INSERT INTO votes (id,ip,vote) VALUES (?,?,?) &quot;
			,	Jaxer.SessionManager.keyFromRequest() 	// session ID
			,	Jaxer.request.remoteAddr 				// remote IP address
			,	Jaxer.request.data.radioBtns			// posted data
			);
            status = &#039;voter&#039;; 
			totalVotes ++ ;
        }
        rs = db.execute(&#039;SELECT count(*)-1 AS tot FROM votes GROUP BY vote&#039;);
		
        var output = &lt;table&gt;&lt;/table&gt;;
        for (question in questions)
        {
			var percent = parseInt((rs.rows[question].tot / totalVotes) * 100);
            output.appendChild(&lt;tr&gt;
            &lt;td class=&#039;nonvoter&#039;&gt;&lt;input type=&#039;radio&#039; name=&#039;radioBtns&#039; value={question}/&gt;&lt;/td&gt;
            &lt;td&gt;{questions[question]}&lt;/td&gt;
            &lt;td class=&#039;voter&#039;&gt;
				&lt;img src=&quot;poll_l.png&quot; height=&#039;16&#039;/&gt;
				&lt;img src=&quot;poll.png&quot;   height=&#039;16&#039; width={2+(percent * 2)}/&gt;
				&lt;img src=&quot;poll_r.png&quot; height=&#039;16&#039;/&gt;&lt;/td&gt;
            &lt;td class=&#039;voter&#039;&gt;{rs.rows[question].tot}&lt;/td&gt;
            &lt;td class=&#039;voter&#039;&gt;({percent}%)&lt;/td&gt;
            &lt;/tr&gt;); 
        }
        $(&#039;#display&#039;).html(output.toString());
        $(&#039;#voteTotals&#039;).html(totalVotes + &quot; votes&quot;);
		
		// remove DOM elements based on whether user has already voted
        $((status == &#039;voter&#039;) ? &#039;.nonvoter&#039; : &#039;.voter&#039;).remove(); 
		
        Jaxer.session.set(&#039;status&#039;, status);
		
		// no need for the client Framework to be injected into the page.
		Jaxer.response.setClientFramework(); 
        &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;

&lt;/textarea&gt;


</description>
 <content:encoded>&lt;P&gt;In this example, (the first in a series) we&#039;re going to build a simple voting tool, using a single page of DHTML. The implementation is quite basic but covers a good few examples of how to use &lt;a href=&#039;/jaxer&#039;&gt;Aptana Jaxer&lt;/a&gt; in real world situations, such as :
&lt;UL&gt;
&lt;LI&gt;Using Ajax libraries on the server (jQuery in this example)&lt;/LI&gt;
&lt;LI&gt;Server-side DOM manipulation (using jQuery)&lt;/LI&gt;
&lt;LI&gt;Storing and retrieving Session data&lt;/LI&gt;
&lt;LI&gt;Creating and accessing a database&lt;/LI&gt;
&lt;LI&gt;E4X as a templating mechanism (E4X provides native XML support in JavaScript)&lt;/LI&gt;
&lt;LI&gt;Handling form data&lt;/LI&gt;
&lt;/UL&gt;
&lt;/P&gt;
&lt;h3&gt;Let&#039;s Vote...&lt;/h3&gt;
&lt;P&gt;This example was written as a single page webapp. You could remove the Javascript to another file and make it all unobtrusive if that is what gets you excited, but I&#039;m just using an inline script tag, as the code is only about 30 or so lines long. Also in Jaxer we could have easily implemented this using Jaxer&#039;s seamless ajax callback mechanism but for the purpose of this example we&#039;ll stick with a traditional form post.&lt;/P&gt;
&lt;P&gt;Let&#039;s get started. Most folks reading this should be familiar with the standard blog/portal poll, where you are presented with a set of choices.&lt;/P&gt;
&lt;img src=&#039;http://www.aptana.com/system/files/choices_0.png&#039;&gt;
&lt;P&gt;and once you have voted you get to see the current results of the voting.&lt;/P&gt;
&lt;img src=&#039;http://www.aptana.com/system/files/voted_0.png&#039;&gt;
&lt;P&gt;In our example we allow multiple votes per user but you can easily change that by just commenting out a single line of code.
&lt;/P&gt;
&lt;P&gt;One of the interesting features of this application is that, by using server-side DOM manipulation in Jaxer, you can remove any unwanted content before it is sent to the client browser. We use this to hide the vote results until the user has voted&lt;/P&gt;
&lt;P&gt;This is a useful technique for permission based forms where, for example, you may want remove the credit card details unless the user has established the correct permissions and been validated by the server.
&lt;/P&gt;
&lt;h3&gt;A very basic web page&lt;/h3&gt;
&lt;P&gt;So let&#039;s jump in and have a look at the code used to make this work.&lt;/P&gt;

&lt;textarea name=&quot;code&quot; class=&quot;HTML&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&gt;
&lt;title&gt;Jaxer Poll&lt;/title&gt;
&lt;script runat=&#039;server&#039; src=&#039;jquery-compressed.js&#039; autoload=&#039;true&#039;&gt;&lt;/script&gt;
&lt;style&gt;
        #pollContainer {
            width: 600px;
            background: #eee;
            border: 3px solid #555;
            padding: 5px;
            font-size: 1em;
            font-family: Tahoma, Verdana, Helvetica, Arial;
            font-weight: 900;
        }
        
        #display {
            background: #ccc;
            font-size: 0.75em;
            font-weight: 200;
            color: #2E3540;
            margin: 5px 0 5px 0;
        }
        
        TD {
            padding-left: 10px;
        }
        
        TD IMG {
            margin-left: -6px;
        }
&lt;/style&gt;
&lt;/textarea&gt;
&lt;P&gt;Above is the contents of the HEAD element. Just the usual suspects, setting the title and some simple CSS stuff. The only interesting part is at line #3, where we load the jQuery library on the &lt;B&gt;server&lt;/B&gt;, because we intend to do some &lt;B&gt;serverside DOM manipulation&lt;/B&gt; before the page is sent to the client. &lt;/P&gt;
&lt;P&gt;The runat=&#039;server&#039; attribute tells Jaxer to load this javascript library &lt;B&gt;on the server&lt;/B&gt;. &lt;/P&gt;
&lt;P&gt;The autoload attribute is a recent addition to Jaxer, and it instructs Jaxer to load that page and keep it cached as preparsed bytecode (for faster library loadtime) for any future calls to this page, including callbacks.&lt;P&gt;

&lt;P&gt;In the body of the document we have a simple form which we will dynamically populate on the server. The form will post the vote to itself on the server. &lt;/P&gt;
&lt;P&gt;We are marking up the DOM content with the classnames &#039;voter&#039; and &#039;nonvoter&#039; to identify content that is specific to a user&#039;s status, and make it easily accessible using jQuery on the server.&lt;/P&gt;

&lt;textarea name=&quot;code&quot; class=&quot;HTML&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;&lt;form id=&#039;pollContainer&#039; method=&quot;POST&quot; accept-charset=&quot;utf-8&quot;&gt;
    &lt;div id=&#039;question&#039;&gt;What do you think is the coolest feature of Jaxer?&lt;/div&gt;
    &lt;div id=&#039;display&#039;&gt;&lt;/div&gt;
    &lt;div class=&#039;nonvoter&#039;&gt;&lt;input type=&#039;submit&#039; value=&#039;vote&#039;&gt;&lt;/div&gt;&lt;div id=&#039;voteTotals&#039; class=&#039;voter&#039;&gt;&lt;/div&gt;
&lt;/form&gt;
&lt;/textarea&gt;
&lt;h3&gt;Server Side Javascript&lt;/h3&gt;
Now we get to the Javascript. The app has a single script tag in the body which is designated to run on the server.&lt;/P&gt;
&lt;P&gt;The first dozen or so lines are &lt;B&gt;simply creating a DB and preparing a schema&lt;/B&gt; for use.&lt;/P&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;var db = new Jaxer.DB.SQLite.createDB({PATH:Jaxer.Dir.resolvePath(&#039;poll.sqlite&#039;)});
db.execute(&quot;CREATE TABLE IF NOT EXISTS votes (id, ip, vote)&quot;); 

var questions = [ &quot;Server-Side DOM&quot;,&quot;Server-Side Javascript&quot;,&quot;Seamless Ajax&quot;,&quot;I already know it!&quot;];

var totalVotes = db.execute(&#039;SELECT count(*) FROM votes&#039;).singleResult - questions.length;
if (totalVotes &lt; 0)
{
    questions.map(function(item, index) // seed the table with 1 row per question to avoid nulls
	{
    	db.execute(&quot;INSERT INTO votes (id ,ip,vote) VALUES (?,?,?)&quot;, &quot;&quot;+index, &#039;127.0.0.1&#039;, &quot;&quot;+index);
    });
	totalVotes = 0;
}&lt;/textarea&gt;
&lt;P&gt;So we&#039;ve connected to the database (which was automatically created if needed, how convenient!) and set up the schema and initial content we expect. We also setup an Array (&lt;B&gt;&lt;I&gt;questions&lt;/I&gt;&lt;/B&gt;) containing the questions for the voting poll&lt;/P&gt;
&lt;P&gt;Next we need to check the &lt;B&gt;session value&lt;/B&gt; we are storing (&lt;B&gt;&lt;I&gt;status&lt;/I&gt;&lt;/B&gt;) to determine whether this user has already voted, and then check to see if the form data for the vote is being posted. Then, if we are actually voting, we write the vote to the database and set the user status to &#039;voter&#039;. &lt;/P&gt;
&lt;P&gt;When we write the vote to the database, we grab the sessionID and the remote IP address and write those out with the vote data, this will let us enforce single voting later if we need it.&lt;/P&gt;
&lt;P&gt;Finally query the database to get the current vote counts, remembering to subtract 1 from the total to account for the dummy rows we inserted to seed database and prevent any nulls from appearing in the results totals.&lt;/P&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;var status = Jaxer.session.get(&#039;status&#039;) || &#039;nonvoter&#039;;

// look for request data and save vote if present
if (Jaxer.request.data.hasOwnProperty(&#039;radioBtns&#039;) &amp;&amp; status == &#039;nonvoter&#039;) 
{
	db.execute(&quot;INSERT INTO votes (id,ip,vote) VALUES (?,?,?) &quot;
	,	Jaxer.SessionManager.keyFromRequest() 	// session ID
	,	Jaxer.request.remoteAddr 				// remote IP address
	,	Jaxer.request.data.radioBtns			// posted data
	);
    status = &#039;voter&#039;; 
	totalVotes ++ ;
}
rs = db.execute(&#039;SELECT count(*)-1 AS tot FROM votes GROUP BY vote&#039;);

&lt;/textarea&gt;
&lt;P&gt;Now we build the DOM, to do this we issue a query to the DB to get the current vote tally.&lt;/P&gt;
&lt;P&gt;Using &lt;A href=&#039;http://en.wikipedia.org/wiki/E4X&#039; title=&#039;Open the Wikipedia page on E4X in a new window/tab&#039; target=&#039;_blank&#039;&gt;E4X - ECMAScript For XML&lt;/A&gt; as a simple templating tool we create the DOM with the nodes populated according to our dataset.&lt;/P&gt;
&lt;P&gt;One of the nice features of server-side javascript with Jaxer &lt;B&gt;is that you have access to all neat things built into Mozilla without the worry of client side browser support&lt;/B&gt;, which enables reliable use of the advanced features of the Javascript language.&lt;/P&gt;
&lt;P&gt;If you look closely at the code below you&#039;ll notice we use a simple syntax for variable substitution using curly braces containing javascript code inside the E4X assigments. This allows us to use this for templating as long as we are creating valid XML nodes.&lt;/P&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;var output = &lt;table&gt;&lt;/table&gt;;
for (question in questions)
{
	var percent = parseInt((rs.rows[question].tot / totalVotes) * 100);
    output.appendChild(&lt;tr&gt;
    &lt;td class=&#039;nonvoter&#039;&gt;&lt;input type=&#039;radio&#039; name=&#039;radioBtns&#039; value={question}&gt;&lt;/td&gt;
    &lt;td&gt;{questions[question]}&lt;/td&gt;
    &lt;td class=&#039;voter&#039;&gt;
         &lt;img src=&quot;poll_l.png&quot; height=&#039;16&#039;&gt;
         &lt;img src=&quot;poll.png&quot;   height=&#039;16&#039; width={percent * 2}&gt;
         &lt;img src=&quot;poll_r.png&quot; height=&#039;16&#039;&gt;&lt;/td&gt;
    &lt;td class=&#039;voter&#039;&gt;{rs.rows[question].tot}&lt;/td&gt;
    &lt;td class=&#039;voter&#039;&gt;({percent}%)&lt;/td&gt;
    &lt;/tr&gt;); 
}
$(&#039;#display&#039;).html(output.toString());
$(&#039;#voteTotals&#039;).html(totalVotes + &quot; votes&quot;);&lt;/textarea&gt;
&lt;P&gt;So the document now has a DOM that has been populated with the content for &lt;B&gt;BOTH&lt;/B&gt; voters and non-voters. We use a little &lt;B&gt;jQuery&lt;/B&gt; magic to remove the elements we don&#039;t want presented to the user.&lt;/P&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;3&#039;&gt;// remove DOM elements based on whether user has already voted
$((status == &#039;voter&#039;) ? &#039;.nonvoter&#039; : &#039;.voter&#039;).remove(); &lt;/textarea&gt;
&lt;P&gt;In this way the user will EITHER see the form with the question and the submit button &lt;/P&gt;
&lt;img src=&#039;http://www.aptana.com/system/files/choices_0.png&#039;&gt;
&lt;P&gt;OR the current voting results data.&lt;/P&gt;
&lt;img src=&#039;http://www.aptana.com/system/files/voted_0.png&#039;&gt;
&lt;P&gt;Now we set the &lt;B&gt;session variable&lt;/B&gt; status to be the current status of the user as they have either voted or not.&lt;/P&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;3&#039;&gt;Jaxer.session.set(&#039;status&#039;, status);&lt;/textarea&gt;
&lt;P&gt;Finally as the page that is served has no further dependency on Jaxer once it leaves the server, we tell Jaxer to not bother injecting the client framework. Normally the client framework would be automatically inserted as a script tag in the outgoing HTML, but our simple example doesn&#039;t need to communicate back to the Jaxer server, as it contains no server callbacks.
&lt;/P&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;3&#039;&gt;// no need for the client Framework to be injected into the page
Jaxer.response.setClientFramework(); 
&lt;/textarea&gt;
&lt;P&gt;So there you have it, a simple poll on a single page, using many of Jaxer&#039;s cool features.&lt;/P&gt;
&lt;h3&gt;Supporting Files&lt;/h3&gt;
&lt;P&gt;The full code and supporting files for this article are available &lt;a href=&#039;http://www.aptana.com/system/files/votepoll.zip&#039;&gt;here&lt;/a&gt;&lt;/P&gt;
&lt;h3&gt;Full Source Listing&lt;/h3&gt;
&lt;textarea name=&quot;code&quot; class=&quot;javascript&quot; cols=&#039;150&#039; rows=&#039;25&#039;&gt;
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&gt;
        &lt;title&gt;Jaxer Poll&lt;/title&gt;
        &lt;script runat=&#039;server&#039; src=&#039;jquery-compressed.js&#039; autoload=&#039;true&#039;&gt;&lt;/script&gt;
		&lt;style&gt;
        #pollContainer {
            width: 600px;
            background: #eee;
            border: 3px solid #555;
            padding: 5px;
            font-size: 1em;
            font-family: Tahoma, Verdana, Helvetica, Arial;
            font-weight: 900;
        }
        
        #display {
            background: #ccc;
            font-size: 0.75em;
            font-weight: 200;
            color: #2E3540;
            margin: 5px 0 5px 0;
        }
        
        TD {
            padding-left: 10px;
        }
        
        TD IMG {
            margin-left: -6px;
        }
		&lt;/style&gt;
    &lt;/head&gt;
    &lt;body&gt;
		&lt;form id=&#039;pollContainer&#039; method=&quot;POST&quot; accept-charset=&quot;utf-8&quot;&gt;
		    &lt;div id=&#039;question&#039;&gt;What do you think is the coolest feature of Jaxer?&lt;/div&gt;
		    &lt;div id=&#039;display&#039;&gt;&lt;/div&gt;
		    &lt;div class=&#039;nonvoter&#039;&gt;&lt;input type=&#039;submit&#039; value=&#039;vote&#039;/&gt;&lt;/div&gt;&lt;div id=&#039;voteTotals&#039; class=&#039;voter&#039;&gt;&lt;/div&gt;
		&lt;/form&gt;
        &lt;script runat=&#039;server&#039;&gt;
        var db = Jaxer.DB.SQLite.createDB({PATH:Jaxer.Dir.resolvePath(&#039;poll.sqlite&#039;)});
        db.execute(&quot;CREATE TABLE IF NOT EXISTS votes (id, ip, vote)&quot;); 
		
        var questions = [ &quot;Server-Side DOM&quot;,&quot;Server-Side Javascript&quot;,&quot;Seamless Ajax&quot;,&quot;I already know it!&quot;];
		
        var totalVotes = db.execute(&#039;SELECT count(*) FROM votes&#039;).singleResult - questions.length;
        if (totalVotes &lt; 0)
        {
            questions.map(function(item, index) // seed the table with 1 row per question to avoid nulls
			{
            	db.execute(&quot;INSERT INTO votes (id ,ip,vote) VALUES (?,?,?)&quot;, &quot;&quot;+index, &#039;127.0.0.1&#039;, &quot;&quot;+index);
            });
			totalVotes = 0;
        }
        Jaxer.session.remove(&#039;status&#039;); // remove this line to limit to 1 vote per user session
		
        var status = Jaxer.session.get(&#039;status&#039;) || &#039;nonvoter&#039;;
		
		// look for request data and save vote if present
        if (Jaxer.request.data.hasOwnProperty(&#039;radioBtns&#039;) &amp;&amp; status == &#039;nonvoter&#039;) 
        {
        	db.execute(&quot;INSERT INTO votes (id,ip,vote) VALUES (?,?,?) &quot;
			,	Jaxer.SessionManager.keyFromRequest() 	// session ID
			,	Jaxer.request.remoteAddr 				// remote IP address
			,	Jaxer.request.data.radioBtns			// posted data
			);
            status = &#039;voter&#039;; 
			totalVotes ++ ;
        }
        rs = db.execute(&#039;SELECT count(*)-1 AS tot FROM votes GROUP BY vote&#039;);
		
        var output = &lt;table&gt;&lt;/table&gt;;
        for (question in questions)
        {
			var percent = parseInt((rs.rows[question].tot / totalVotes) * 100);
            output.appendChild(&lt;tr&gt;
            &lt;td class=&#039;nonvoter&#039;&gt;&lt;input type=&#039;radio&#039; name=&#039;radioBtns&#039; value={question}/&gt;&lt;/td&gt;
            &lt;td&gt;{questions[question]}&lt;/td&gt;
            &lt;td class=&#039;voter&#039;&gt;
				&lt;img src=&quot;poll_l.png&quot; height=&#039;16&#039;/&gt;
				&lt;img src=&quot;poll.png&quot;   height=&#039;16&#039; width={2+(percent * 2)}/&gt;
				&lt;img src=&quot;poll_r.png&quot; height=&#039;16&#039;/&gt;&lt;/td&gt;
            &lt;td class=&#039;voter&#039;&gt;{rs.rows[question].tot}&lt;/td&gt;
            &lt;td class=&#039;voter&#039;&gt;({percent}%)&lt;/td&gt;
            &lt;/tr&gt;); 
        }
        $(&#039;#display&#039;).html(output.toString());
        $(&#039;#voteTotals&#039;).html(totalVotes + &quot; votes&quot;);
		
		// remove DOM elements based on whether user has already voted
        $((status == &#039;voter&#039;) ? &#039;.nonvoter&#039; : &#039;.voter&#039;).remove(); 
		
        Jaxer.session.set(&#039;status&#039;, status);
		
		// no need for the client Framework to be injected into the page.
		Jaxer.response.setClientFramework(); 
        &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;

&lt;/textarea&gt;


</content:encoded>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <category domain="http://www.aptana.com/taxonomy/term/13">studio</category>
 <enclosure url="http://www.aptana.com/system/files/choices_0.png" length="7259" type="image/x-png" />
 <pubDate>Thu, 03 Apr 2008 17:00:15 -0500</pubDate>
 <dc:creator>davey</dc:creator>
 <guid isPermaLink="false">336 at http://www.aptana.com</guid>
</item>
<item>
 <title>Aptana Jaxer 0.9.5 Now Available with Faster Performance, New Features</title>
 <link>http://www.aptana.com/node/326</link>
 <description>&lt;p&gt;Aptana Jaxer has been updated to 0.9.5 providing increased performance for server-side JavaScript and a host of other enhancements to make End-to-End Ajax development easier.  &lt;/p&gt;
&lt;p&gt;Aptana Studio users can get the latest via Help &amp;gt; Software Updates.  Otherwise, &lt;a href=&quot;/download&quot; target=&quot;_new&quot;&gt;download the latest now&lt;/a&gt;.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Increased Performance&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;	Aptana Jaxer&#039;s core is now based on &lt;b&gt;Mozilla FireFox Beta3&lt;/b&gt; and thus delivers improved JS performance and memory management.
&lt;li&gt;	Jaxer now &lt;b&gt;pre-parses scripts to bytecode&lt;/b&gt; for faster execution during callbacks.
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;More Natural JS Environment&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;	&lt;b&gt;Window and document objects on the server-side&lt;/b&gt; now parallel more closely how you work with them on the client-side. This means a more natural coding style with server-side JavaScript in Jaxer and a more browser compatible experience.
&lt;li&gt;	Jaxer &lt;b&gt;no longer inlines external scripts&lt;/b&gt; to the page, this allows for correct use of browser cache on client side content and makes &#039;view source&#039; a much more pleasant experience.  This also applies to &lt;b&gt;Jaxer&#039;s ClientFramework&lt;/b&gt; (the client-side JavaScript Jaxer puts in pages to facilitate callbacks and remote method invocation). Instead such external scripts are cachebusted with the buildnumber so that upgrading the server will automatically expire any old client side cache copies.
&lt;li&gt;	A new &lt;b&gt;Autoload&lt;/b&gt; feature has been added to allow for a script to be cached so that during callbacks the script does not have to be loaded on demand (thus faster) and the previous oncallback function used to setup the callback environment is no longer needed for library loading. A configuration option is provided to expire the script every time the containing page is accessed. This is allows for simpler development and is the configuration with which Jaxer show ships.
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Improved Platform Support&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;Significantly improved &lt;b&gt;Unix support&lt;/b&gt;.  Jaxer now builds and runs on &lt;b&gt;Solaris&lt;/b&gt; too!
&lt;li&gt;&lt;b&gt;mySQL&lt;/b&gt; support is now also provided for &lt;b&gt;Mac OSX&lt;/b&gt;
&lt;li&gt;A number of &lt;b&gt;Windows Vista&lt;/b&gt; security/UAC related problems have been addressed
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;API Enhancements&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;	Jaxer&#039;s &lt;b&gt;file system API&lt;/b&gt; has been updated -- mostly around the &#039;quick&#039; static method. For example: &lt;b&gt;Jaxer.File.chmod(&#039;myfile.tx&#039;,0400)&lt;/b&gt;
&lt;li&gt;	A simple &lt;b&gt;Stopwatch&lt;/b&gt; timer API now allows for timing measurements in code.
&lt;/ul&gt;
&lt;/ul&gt;
</description>
 <content:encoded>&lt;p&gt;Aptana Jaxer has been updated to 0.9.5 providing increased performance for server-side JavaScript and a host of other enhancements to make End-to-End Ajax development easier.  &lt;/p&gt;
&lt;p&gt;Aptana Studio users can get the latest via Help &amp;gt; Software Updates.  Otherwise, &lt;a href=&quot;/download&quot; target=&quot;_new&quot;&gt;download the latest now&lt;/a&gt;.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Increased Performance&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;	Aptana Jaxer&#039;s core is now based on &lt;b&gt;Mozilla FireFox Beta3&lt;/b&gt; and thus delivers improved JS performance and memory management.
&lt;li&gt;	Jaxer now &lt;b&gt;pre-parses scripts to bytecode&lt;/b&gt; for faster execution during callbacks.
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;More Natural JS Environment&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;	&lt;b&gt;Window and document objects on the server-side&lt;/b&gt; now parallel more closely how you work with them on the client-side. This means a more natural coding style with server-side JavaScript in Jaxer and a more browser compatible experience.
&lt;li&gt;	Jaxer &lt;b&gt;no longer inlines external scripts&lt;/b&gt; to the page, this allows for correct use of browser cache on client side content and makes &#039;view source&#039; a much more pleasant experience.  This also applies to &lt;b&gt;Jaxer&#039;s ClientFramework&lt;/b&gt; (the client-side JavaScript Jaxer puts in pages to facilitate callbacks and remote method invocation). Instead such external scripts are cachebusted with the buildnumber so that upgrading the server will automatically expire any old client side cache copies.
&lt;li&gt;	A new &lt;b&gt;Autoload&lt;/b&gt; feature has been added to allow for a script to be cached so that during callbacks the script does not have to be loaded on demand (thus faster) and the previous oncallback function used to setup the callback environment is no longer needed for library loading. A configuration option is provided to expire the script every time the containing page is accessed. This is allows for simpler development and is the configuration with which Jaxer show ships.
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Improved Platform Support&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;Significantly improved &lt;b&gt;Unix support&lt;/b&gt;.  Jaxer now builds and runs on &lt;b&gt;Solaris&lt;/b&gt; too!
&lt;li&gt;&lt;b&gt;mySQL&lt;/b&gt; support is now also provided for &lt;b&gt;Mac OSX&lt;/b&gt;
&lt;li&gt;A number of &lt;b&gt;Windows Vista&lt;/b&gt; security/UAC related problems have been addressed
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;API Enhancements&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;	Jaxer&#039;s &lt;b&gt;file system API&lt;/b&gt; has been updated -- mostly around the &#039;quick&#039; static method. For example: &lt;b&gt;Jaxer.File.chmod(&#039;myfile.tx&#039;,0400)&lt;/b&gt;
&lt;li&gt;	A simple &lt;b&gt;Stopwatch&lt;/b&gt; timer API now allows for timing measurements in code.
&lt;/ul&gt;
&lt;/ul&gt;
</content:encoded>
 <category domain="http://www.aptana.com/taxonomy/term/17">air</category>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <category domain="http://www.aptana.com/taxonomy/term/14">jaxer</category>
 <category domain="http://www.aptana.com/taxonomy/term/33">pro</category>
 <category domain="http://www.aptana.com/taxonomy/term/13">studio</category>
 <pubDate>Mon, 24 Mar 2008 12:33:09 -0500</pubDate>
 <dc:creator>khakman</dc:creator>
 <guid isPermaLink="false">326 at http://www.aptana.com</guid>
</item>
<item>
 <title>Easy File Uploading using Aptana Jaxer</title>
 <link>http://www.aptana.com/node/323</link>
 <description>&lt;style&gt;pre { margin:5px; padding:5px;border:#ddd 1px solid;background:#eee}&lt;/style&gt;    
&lt;P&gt;One of the common web tasks that always seems to involve a lot of arcane knowledge of backend systems, is how to upload files. Like most systems, Aptana Jaxer uses the post/receive model, where a web form is posted to the server, and the target of that form will receive and process the content. Where Jaxer makes this really easy is that it is all done with regular JavaScript and HTML. No special enviroment vars, excessive string processing, or finding handles to oddly named temp files is required.&lt;/P&gt;
&lt;P&gt;All you need is a form to present to the user, which contains an input element of type upload, and an HTML page to receive the submitted form containing a &quot;runat=server&quot; script block that retrieves the data from the request. You could have the form and the recipient be the same page, however in this example I&#039;ll use two files for clarity. As an aside in Jaxer you can actually send the form directly to a JavaScript function living on the server but we&#039;ll look at that configuration in a future blog entry.&lt;/P&gt;   
&lt;h4&gt;Example HTML Upload Form &lt;/h4&gt;   
&lt;P&gt;   
This example upload form simply allows you to select up to 2 files for upload from the local filesystem. Pressing &#039;upload&#039; posts the contents of that form to an HTML page containing the JavaScript shown later.   
&lt;/P&gt;   
&lt;textarea name=&quot;code&quot; class=&quot;HTML&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;   
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&gt;
	&lt;title&gt;Upload &lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form id=&#039;upload&#039; action=&quot;submissions.html&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
    &lt;input type=&quot;file&quot; name=&quot;myFile1&quot;&gt;&lt;br&gt;
    &lt;input type=&quot;file&quot; name=&quot;myFile2&quot;&gt;&lt;input type=&quot;submit&quot; value=&#039;upload&#039;&gt;
	&lt;p&gt;
		&#039;upload&#039; sends the selected file(s) to the server.
	&lt;/p&gt;
&lt;/form&gt;
&lt;/body&gt;	
&lt;/html&gt;
&lt;/textarea&gt;   
&lt;p&gt;The form will look like the following when viewed in a browser. Pressing the browse button will present you with a file selection dialog, or you can type the path into the input box directly. I&#039;ve used 2 file slots in this example to demostrate that the files passed in are available as part of an files array contained in the request object (a JavaScript representation of the HTTP request) and are accessed like any other JavaScript array.&lt;/p&gt;   
&lt;!--img src=&#039;http://www.aptana.com/system/files/upload_0.png&#039;/--&gt;

&lt;div style=&quot;background-color:white; border:1px solid #f5f5f5; padding:5px; width:80%&quot;&gt;
&lt;input type=&quot;file&quot; name=&quot;myFile1&quot;&gt;&lt;br&gt;
&lt;input type=&quot;file&quot; name=&quot;myFile2&quot;&gt;&lt;input type=&quot;submit&quot; value=&#039;upload&#039;&gt;
&lt;p&gt;
    &#039;upload&#039; sends the selected file(s) to the server.
&lt;/p&gt;
&lt;/div&gt;
&lt;br&gt;
  
&lt;h4&gt;Example Aptana Jaxer code to receive file uploads&lt;/h4&gt;   
&lt;p&gt;   
To receive the data from the form when submitted we put some Jaxer code into the page the form will be submitted to. The code below should be in script block with a runat = &#039;server&#039; attribute, which makes the code run serverside and doesn&#039;t present it to the client so you don&#039;t expose any serverside filenames or folder structures.&lt;/p&gt;   
&lt;textarea name=&quot;code&quot; class=&quot;HTML&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;&lt;script type=&#039;text/javascript&#039; runat=&#039;server&#039;&gt;
var message = &quot;&quot;;

for (fileCount=0; fileCount&lt;Jaxer.request.files.length; fileCount++)
{
    var fileInfo = Jaxer.request.files[fileCount];
	
    var destinationFilePath = Jaxer.Dir.resolvePath(fileInfo.originalFileName);
    fileInfo.save(destinationFilePath);

    message += &quot;&lt;br&gt;&quot; + [ 
		&quot;Saved to : &quot; 			+ destinationFilePath
	,	&quot;original filename : &quot; 		+ fileInfo.originalFileName
	,	&quot;temp filename : &quot;		+ fileInfo.tempFileName
	,	&quot;contentType : &quot; 		+ fileInfo.contentType
	,	&quot;size : &quot; 				+ fileInfo.fileSize
	].join(&quot;&lt;br&gt;&quot;);
	
}
document.write(message); 
&lt;/script&gt;&lt;/textarea&gt;

&lt;P&gt;   
The data posted by the form is available within the Jaxer.request object.
&lt;/P&gt;
&lt;P&gt;For the purposes of this example we are specifically interested in the Jaxer.request.files array which contains an array of Jaxer.Request.FileInfo objects, one for each file posted with the form.
&lt;P&gt;&lt;/P&gt;  
The Jaxer.Request.FileInfo object contains some useful properties describing the file, such as fileName, contentType, etc.   
&lt;/P&gt;   
&lt;P&gt;
Uploading two files from my filesystem from the form in this example would return a page of output like below. We have uploaded the file to same location as the submission.html file used as the form action in the originating HTML.
&lt;/P&gt;
&lt;PRE&gt;Saved to : C:\aptana\JaxerDev\public\work\bar.txt
original filename : bar.txt
temp filename : C:\aptana\JaxerDev\tmp\tmp
contentType : text/plain
size : 15754
Saved to : C:\aptana\JaxerDev\public\work\foo.txt
original filename : foo.txt
temp filename : C:\aptana\JaxerDev\tmp\tmp-1
contentType : text/plain
size : 816
&lt;/PRE&gt;
&lt;P&gt;Well that&#039;s really all there is to it. It&#039;s simple and easy and you never have to think about anything other than HTML and Javascript.&lt;/P&gt;
&lt;P&gt;
API docs for the &lt;a href=http://www.aptana.com/reference/jaxer/api/Jaxer.Request.FileInfo.html&gt;FileInfo object&lt;/A&gt; and the &lt;a href=http://www.aptana.com/reference/jaxer/api/Jaxer.Request.html&gt;Jaxer.Request object&lt;/a&gt; are available online.
&lt;/P&gt;
</description>
 <content:encoded>&lt;style&gt;pre { margin:5px; padding:5px;border:#ddd 1px solid;background:#eee}&lt;/style&gt;    
&lt;P&gt;One of the common web tasks that always seems to involve a lot of arcane knowledge of backend systems, is how to upload files. Like most systems, Aptana Jaxer uses the post/receive model, where a web form is posted to the server, and the target of that form will receive and process the content. Where Jaxer makes this really easy is that it is all done with regular JavaScript and HTML. No special enviroment vars, excessive string processing, or finding handles to oddly named temp files is required.&lt;/P&gt;
&lt;P&gt;All you need is a form to present to the user, which contains an input element of type upload, and an HTML page to receive the submitted form containing a &quot;runat=server&quot; script block that retrieves the data from the request. You could have the form and the recipient be the same page, however in this example I&#039;ll use two files for clarity. As an aside in Jaxer you can actually send the form directly to a JavaScript function living on the server but we&#039;ll look at that configuration in a future blog entry.&lt;/P&gt;   
&lt;h4&gt;Example HTML Upload Form &lt;/h4&gt;   
&lt;P&gt;   
This example upload form simply allows you to select up to 2 files for upload from the local filesystem. Pressing &#039;upload&#039; posts the contents of that form to an HTML page containing the JavaScript shown later.   
&lt;/P&gt;   
&lt;textarea name=&quot;code&quot; class=&quot;HTML&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;   
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&gt;
	&lt;title&gt;Upload &lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form id=&#039;upload&#039; action=&quot;submissions.html&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
    &lt;input type=&quot;file&quot; name=&quot;myFile1&quot;&gt;&lt;br&gt;
    &lt;input type=&quot;file&quot; name=&quot;myFile2&quot;&gt;&lt;input type=&quot;submit&quot; value=&#039;upload&#039;&gt;
	&lt;p&gt;
		&#039;upload&#039; sends the selected file(s) to the server.
	&lt;/p&gt;
&lt;/form&gt;
&lt;/body&gt;	
&lt;/html&gt;
&lt;/textarea&gt;   
&lt;p&gt;The form will look like the following when viewed in a browser. Pressing the browse button will present you with a file selection dialog, or you can type the path into the input box directly. I&#039;ve used 2 file slots in this example to demostrate that the files passed in are available as part of an files array contained in the request object (a JavaScript representation of the HTTP request) and are accessed like any other JavaScript array.&lt;/p&gt;   
&lt;!--img src=&#039;http://www.aptana.com/system/files/upload_0.png&#039;/--&gt;

&lt;div style=&quot;background-color:white; border:1px solid #f5f5f5; padding:5px; width:80%&quot;&gt;
&lt;input type=&quot;file&quot; name=&quot;myFile1&quot;&gt;&lt;br&gt;
&lt;input type=&quot;file&quot; name=&quot;myFile2&quot;&gt;&lt;input type=&quot;submit&quot; value=&#039;upload&#039;&gt;
&lt;p&gt;
    &#039;upload&#039; sends the selected file(s) to the server.
&lt;/p&gt;
&lt;/div&gt;
&lt;br&gt;
  
&lt;h4&gt;Example Aptana Jaxer code to receive file uploads&lt;/h4&gt;   
&lt;p&gt;   
To receive the data from the form when submitted we put some Jaxer code into the page the form will be submitted to. The code below should be in script block with a runat = &#039;server&#039; attribute, which makes the code run serverside and doesn&#039;t present it to the client so you don&#039;t expose any serverside filenames or folder structures.&lt;/p&gt;   
&lt;textarea name=&quot;code&quot; class=&quot;HTML&quot; cols=&#039;150&#039; rows=&#039;15&#039;&gt;&lt;script type=&#039;text/javascript&#039; runat=&#039;server&#039;&gt;
var message = &quot;&quot;;

for (fileCount=0; fileCount&lt;Jaxer.request.files.length; fileCount++)
{
    var fileInfo = Jaxer.request.files[fileCount];
	
    var destinationFilePath = Jaxer.Dir.resolvePath(fileInfo.originalFileName);
    fileInfo.save(destinationFilePath);

    message += &quot;&lt;br&gt;&quot; + [ 
		&quot;Saved to : &quot; 			+ destinationFilePath
	,	&quot;original filename : &quot; 		+ fileInfo.originalFileName
	,	&quot;temp filename : &quot;		+ fileInfo.tempFileName
	,	&quot;contentType : &quot; 		+ fileInfo.contentType
	,	&quot;size : &quot; 				+ fileInfo.fileSize
	].join(&quot;&lt;br&gt;&quot;);
	
}
document.write(message); 
&lt;/script&gt;&lt;/textarea&gt;

&lt;P&gt;   
The data posted by the form is available within the Jaxer.request object.
&lt;/P&gt;
&lt;P&gt;For the purposes of this example we are specifically interested in the Jaxer.request.files array which contains an array of Jaxer.Request.FileInfo objects, one for each file posted with the form.
&lt;P&gt;&lt;/P&gt;  
The Jaxer.Request.FileInfo object contains some useful properties describing the file, such as fileName, contentType, etc.   
&lt;/P&gt;   
&lt;P&gt;
Uploading two files from my filesystem from the form in this example would return a page of output like below. We have uploaded the file to same location as the submission.html file used as the form action in the originating HTML.
&lt;/P&gt;
&lt;PRE&gt;Saved to : C:\aptana\JaxerDev\public\work\bar.txt
original filename : bar.txt
temp filename : C:\aptana\JaxerDev\tmp\tmp
contentType : text/plain
size : 15754
Saved to : C:\aptana\JaxerDev\public\work\foo.txt
original filename : foo.txt
temp filename : C:\aptana\JaxerDev\tmp\tmp-1
contentType : text/plain
size : 816
&lt;/PRE&gt;
&lt;P&gt;Well that&#039;s really all there is to it. It&#039;s simple and easy and you never have to think about anything other than HTML and Javascript.&lt;/P&gt;
&lt;P&gt;
API docs for the &lt;a href=http://www.aptana.com/reference/jaxer/api/Jaxer.Request.FileInfo.html&gt;FileInfo object&lt;/A&gt; and the &lt;a href=http://www.aptana.com/reference/jaxer/api/Jaxer.Request.html&gt;Jaxer.Request object&lt;/a&gt; are available online.
&lt;/P&gt;
</content:encoded>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <category domain="http://www.aptana.com/taxonomy/term/14">jaxer</category>
 <category domain="http://www.aptana.com/taxonomy/term/13">studio</category>
 <pubDate>Tue, 18 Mar 2008 14:39:06 -0500</pubDate>
 <dc:creator>davey</dc:creator>
 <guid isPermaLink="false">323 at http://www.aptana.com</guid>
</item>
<item>
 <title>Aptana-At-Large in March 2008</title>
 <link>http://www.aptana.com/node/321</link>
 <description>		Next week Aptana will be at AjaxWorld (NYC), iPhone Developer Summit (NYC), and EclipseCon (Silicon Valley).  
		Join us. We want to meet you, answer your questions, and get your feedback and ideas to make Aptana Studio and Aptana Jaxer even better for you. 
		(Of course you can do that anytime via our &lt;a href=&quot;http://support.aptana.com&quot; taget=&quot;_new&quot;&gt;ASAP&lt;/a&gt; enhancement request system too).



&lt;p&gt;&lt;a href=&quot;http://www.ajaxworld.com/ &quot; target=&quot;_new&quot;&gt;&lt;b&gt;AjaxWorld&lt;/b&gt;&lt;/a&gt;, March 18-20, New York, NY &lt;br /&gt;
Kevin Hakman presents &lt;a href=&quot;http://www.ajaxworld.com/general/sessiondetail0308.htm?id=36&quot; target=&quot;_new&quot;&gt;Aptana Studio: Your Unfair Advantage for AJAX, iPhone, Adobe AIR, PHP and Rails 
Development &lt;/a&gt;  and 
&lt;a href=&quot;http://www.ajaxworld.com/general/sessiondetail0308.htm?id=126&quot; target=&quot;_new&quot;&gt;Rapid Development of 
Enterprise Ajax Apps&lt;/a&gt; both on Wednesday, March 19.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.iphonedevsummit.com/&quot; target=&quot;_new&quot;&gt;&lt;b&gt;iPhone Developer Summit&lt;/b&gt;&lt;/a&gt;, March 18-20, New York, NY &lt;br /&gt;
Also on Wednesday March 19, Kevin Hakman presents &lt;a href=&quot;http://www.ajaxworld.com/general/sessiondetail0308.htm?id=35&quot; target=&quot;_new&quot;&gt;Developing AJAX Applications for iPhone and iPod Touch&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.eclipsecon.org/2008/&quot; target=&quot;_new&quot;&gt;&lt;b&gt;EclipseCon&lt;/b&gt;&lt;/a&gt;, March 17-19, Santa Clara, CA &lt;br /&gt;
Eclipse Monkey committer and Aptana engineer Ingo Muschenetz shares 
&lt;a href=&quot;http://www.eclipsecon.org/2008/index.php?page=sub/&amp;id=433&quot; target=&quot;_new&quot;&gt;Building Eclipse-based Products: A View From the Trenches&lt;/a&gt; 
on March 18, and Aptana engineer Kevin Sawicki delivers 
&lt;a href=&quot;http://www.eclipsecon.org/2008/index.php?page=sub/&amp;id=450&quot; target=&quot;_new&quot;&gt;
Pimp My Editor&lt;/a&gt;  with insights for extending and customizing features in Eclipse.
&lt;/p&gt;
We&#039;ll also be at the EclipseCon Ajax focused Birds of a Feather meeting -- check &lt;a href=&quot;http://www.eclipsecon.org/2008/index.php?page=bofs/&quot; target=&quot;_new&quot;&gt;the schedule&lt;/a&gt; for details.
	</description>
 <content:encoded>		Next week Aptana will be at AjaxWorld (NYC), iPhone Developer Summit (NYC), and EclipseCon (Silicon Valley).  
		Join us. We want to meet you, answer your questions, and get your feedback and ideas to make Aptana Studio and Aptana Jaxer even better for you. 
		(Of course you can do that anytime via our &lt;a href=&quot;http://support.aptana.com&quot; taget=&quot;_new&quot;&gt;ASAP&lt;/a&gt; enhancement request system too).



&lt;p&gt;&lt;a href=&quot;http://www.ajaxworld.com/ &quot; target=&quot;_new&quot;&gt;&lt;b&gt;AjaxWorld&lt;/b&gt;&lt;/a&gt;, March 18-20, New York, NY &lt;br /&gt;
Kevin Hakman presents &lt;a href=&quot;http://www.ajaxworld.com/general/sessiondetail0308.htm?id=36&quot; target=&quot;_new&quot;&gt;Aptana Studio: Your Unfair Advantage for AJAX, iPhone, Adobe AIR, PHP and Rails 
Development &lt;/a&gt;  and 
&lt;a href=&quot;http://www.ajaxworld.com/general/sessiondetail0308.htm?id=126&quot; target=&quot;_new&quot;&gt;Rapid Development of 
Enterprise Ajax Apps&lt;/a&gt; both on Wednesday, March 19.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.iphonedevsummit.com/&quot; target=&quot;_new&quot;&gt;&lt;b&gt;iPhone Developer Summit&lt;/b&gt;&lt;/a&gt;, March 18-20, New York, NY &lt;br /&gt;
Also on Wednesday March 19, Kevin Hakman presents &lt;a href=&quot;http://www.ajaxworld.com/general/sessiondetail0308.htm?id=35&quot; target=&quot;_new&quot;&gt;Developing AJAX Applications for iPhone and iPod Touch&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.eclipsecon.org/2008/&quot; target=&quot;_new&quot;&gt;&lt;b&gt;EclipseCon&lt;/b&gt;&lt;/a&gt;, March 17-19, Santa Clara, CA &lt;br /&gt;
Eclipse Monkey committer and Aptana engineer Ingo Muschenetz shares 
&lt;a href=&quot;http://www.eclipsecon.org/2008/index.php?page=sub/&amp;id=433&quot; target=&quot;_new&quot;&gt;Building Eclipse-based Products: A View From the Trenches&lt;/a&gt; 
on March 18, and Aptana engineer Kevin Sawicki delivers 
&lt;a href=&quot;http://www.eclipsecon.org/2008/index.php?page=sub/&amp;id=450&quot; target=&quot;_new&quot;&gt;
Pimp My Editor&lt;/a&gt;  with insights for extending and customizing features in Eclipse.
&lt;/p&gt;
We&#039;ll also be at the EclipseCon Ajax focused Birds of a Feather meeting -- check &lt;a href=&quot;http://www.eclipsecon.org/2008/index.php?page=bofs/&quot; target=&quot;_new&quot;&gt;the schedule&lt;/a&gt; for details.
	</content:encoded>
 <category domain="http://www.aptana.com/taxonomy/term/17">air</category>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <category domain="http://www.aptana.com/taxonomy/term/18">iphone</category>
 <category domain="http://www.aptana.com/taxonomy/term/14">jaxer</category>
 <category domain="http://www.aptana.com/taxonomy/term/34">php</category>
 <category domain="http://www.aptana.com/taxonomy/term/33">pro</category>
 <category domain="http://www.aptana.com/taxonomy/term/15">rails</category>
 <category domain="http://www.aptana.com/taxonomy/term/13">studio</category>
 <pubDate>Thu, 13 Mar 2008 15:45:56 -0500</pubDate>
 <dc:creator>khakman</dc:creator>
 <guid isPermaLink="false">321 at http://www.aptana.com</guid>
</item>
<item>
 <title>RadRails 1.0 Release</title>
 <link>http://www.aptana.com/node/320</link>
 <description>&lt;p&gt;I&#039;m happy to announce that RadRails 1.0 has been released today. This release has been a long time coming and includes a lot of new features and polish. We&#039;re especially proud of the progress we&#039;ve made here at Aptana since we took over the project. RadRails 0.7.2 users will definitely want to check out this new release - it offers a more stable environment, full Rails 2.0 support, support for JRuby, and a boatload of new features. For those who want the comprehensive list of changes since the 0.9.3 release, you can find &lt;a href=&quot;http://support.aptana.com/asap/browse/ROR/fixforversion/10020&quot; target=&quot;_blank&quot;&gt;the changelist in ASAP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The highlights include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new Rails Shell console - A &lt;a href=&quot;http://www.aptana.tv/movies/aptana_radrails_rails_shell/aptana_radrails_rails_shell.html&quot;&gt;screencast dedicated to this feature&lt;/a&gt; is available at &lt;a href=&quot;http://www.aptana.tv&quot;&gt;aptana.tv&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Bundled auto-installing gems for rails development&lt;/li&gt;
&lt;li&gt;A Ruby profiler for Pro users&lt;/li&gt;
&lt;li&gt;An RDoc preview view&lt;/li&gt;
&lt;li&gt;Extended RHTML/ERb color preferences&lt;/li&gt;
&lt;li&gt;Code completion for ActiveRecord model fields and finders&lt;/li&gt;
&lt;li&gt;Code completion suggesting method call arguments&lt;/li&gt;
&lt;li&gt;Significant expansion of code warnings and analysis, including syntax changes from Ruby 1.8 to 1.9&lt;/li&gt;
&lt;li&gt;An improved look and feel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These new features join an already impressive set of functionality:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Fast Ruby debugger&lt;/li&gt;
&lt;li&gt;RHTML, YML, HTML, JS, and CSS editors with code assist.&lt;/li&gt;
&lt;li&gt;Unit testing integration and GUI&lt;/li&gt;
&lt;li&gt;Refactoring&lt;/li&gt;
&lt;li&gt;Code analysis and warnings&lt;/li&gt;
&lt;li&gt;IDE Scriptable via Ruby&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.aptana.com/rails/#features&quot;&gt;Much, much more!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please note that unless you&#039;ve been using 1.0.0 nightlies Aptana/Eclipse will &lt;b&gt;not&lt;/b&gt; automatically update you to 1.0. You&#039;ll need to force an install of RadRails 1.0 via the Start Page, Plugins Manager, or Software update mechanism that you used to initially install RadRails. For those who prefer to use the Software Update route, the update site URL for RadRails is: &lt;a href=&quot;http://update.aptana.com/update/rails/3.2/&quot; title=&quot;http://update.aptana.com/update/rails/3.2/&quot;&gt;http://update.aptana.com/update/rails/3.2/&lt;/a&gt;&lt;/p&gt;
</description>
 <content:encoded>&lt;p&gt;I&#039;m happy to announce that RadRails 1.0 has been released today. This release has been a long time coming and includes a lot of new features and polish. We&#039;re especially proud of the progress we&#039;ve made here at Aptana since we took over the project. RadRails 0.7.2 users will definitely want to check out this new release - it offers a more stable environment, full Rails 2.0 support, support for JRuby, and a boatload of new features. For those who want the comprehensive list of changes since the 0.9.3 release, you can find &lt;a href=&quot;http://support.aptana.com/asap/browse/ROR/fixforversion/10020&quot; target=&quot;_blank&quot;&gt;the changelist in ASAP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The highlights include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new Rails Shell console - A &lt;a href=&quot;http://www.aptana.tv/movies/aptana_radrails_rails_shell/aptana_radrails_rails_shell.html&quot;&gt;screencast dedicated to this feature&lt;/a&gt; is available at &lt;a href=&quot;http://www.aptana.tv&quot;&gt;aptana.tv&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Bundled auto-installing gems for rails development&lt;/li&gt;
&lt;li&gt;A Ruby profiler for Pro users&lt;/li&gt;
&lt;li&gt;An RDoc preview view&lt;/li&gt;
&lt;li&gt;Extended RHTML/ERb color preferences&lt;/li&gt;
&lt;li&gt;Code completion for ActiveRecord model fields and finders&lt;/li&gt;
&lt;li&gt;Code completion suggesting method call arguments&lt;/li&gt;
&lt;li&gt;Significant expansion of code warnings and analysis, including syntax changes from Ruby 1.8 to 1.9&lt;/li&gt;
&lt;li&gt;An improved look and feel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These new features join an already impressive set of functionality:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Fast Ruby debugger&lt;/li&gt;
&lt;li&gt;RHTML, YML, HTML, JS, and CSS editors with code assist.&lt;/li&gt;
&lt;li&gt;Unit testing integration and GUI&lt;/li&gt;
&lt;li&gt;Refactoring&lt;/li&gt;
&lt;li&gt;Code analysis and warnings&lt;/li&gt;
&lt;li&gt;IDE Scriptable via Ruby&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.aptana.com/rails/#features&quot;&gt;Much, much more!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please note that unless you&#039;ve been using 1.0.0 nightlies Aptana/Eclipse will &lt;b&gt;not&lt;/b&gt; automatically update you to 1.0. You&#039;ll need to force an install of RadRails 1.0 via the Start Page, Plugins Manager, or Software update mechanism that you used to initially install RadRails. For those who prefer to use the Software Update route, the update site URL for RadRails is: &lt;a href=&quot;http://update.aptana.com/update/rails/3.2/&quot; title=&quot;http://update.aptana.com/update/rails/3.2/&quot;&gt;http://update.aptana.com/update/rails/3.2/&lt;/a&gt;&lt;/p&gt;
</content:encoded>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <category domain="http://www.aptana.com/taxonomy/term/16">news</category>
 <category domain="http://www.aptana.com/taxonomy/term/33">pro</category>
 <category domain="http://www.aptana.com/taxonomy/term/15">rails</category>
 <category domain="http://www.aptana.com/taxonomy/term/13">studio</category>
 <pubDate>Tue, 11 Mar 2008 18:45:25 -0500</pubDate>
 <dc:creator>cwilliams</dc:creator>
 <guid isPermaLink="false">320 at http://www.aptana.com</guid>
</item>
<item>
 <title>Jaxer on AIR: Build Desktop &amp; Server Apps in Ajax</title>
 <link>http://www.aptana.com/node/297</link>
 <description>&lt;p&gt;Yesterday Adobe announced the availability of Adobe AIR 1.0. At the same time, Aptana released the Adobe AIR plugin for Aptana Studio which simplifies development of Ajax applications that run &quot;on AIR&quot;. (&lt;a href=&quot;http://www.aptana.com/air/&quot;&gt;Adobe AIR Plugin for Aptana Studio&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;If you are not familiar with Adobe AIR, it enables you to use the skills and Web technologies you already know, HTML, CSS, and JavaScript, to write applications that can be deployed to the Windows and Mac desktop, and shortly on Linux desktops too.&lt;/p&gt;
&lt;p&gt;And what is Aptana Jaxer, you ask? Jaxer is an Ajax server that enables you to leverage those same Web skills and technologies, HTML, CSS, and JavaScript, to write server-side code and do a whole new range of things with JavaScript like interact with databases, file systems, and remote data sources, do server-side DOM manipulations, cross-domain data calls, make socket connections, and call server-side JavaScript functions from the client-side, plus lots more. Yes, you write both client and server code using HTML and Ajax. You can even write entire web applications in a single HTML file if you wish.&lt;/p&gt;
&lt;p&gt;With that said, it becomes much clearer as to what ‘Jaxer on AIR’ is all about -- two systems that enable you to leverage your Ajax skills for building desktop and server apps, unified into a single, very interesting model.  With Jaxer you can implement your server-side to know if an app is running in AIR and thus take advantage of offline synchronization and local access to the client system as permitted, or if you’re running on the Web with a subset of the total potential features of your Ajax apps and Web pages.  &lt;/p&gt;
&lt;p&gt;I did a 10-minute screencast showing a simple example of this. I take one of Jack Slocum’s great Ext / Adobe AIR demos (&lt;a href=&quot;http://extjs.com/blog/2008/02/24/tasks2/&quot;&gt;EXT Tasks Demo&lt;/a&gt;) and Jaxer-enabled it. I added a single JavaScript function that can query my backend database, and I use the results to fill the user interface.&lt;/p&gt;
&lt;p&gt;This demo just scratches the surface of what is possible, but I hope it opens the doors to your thinking about how to utilize these great technologies – it’s my version of their chocolate and our peanut-butter happily together, enjoy!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://aptana.tv/movies/jaxer/PlayQTFlash.html?movie=JaxerOnAIR&amp;amp;width=975&amp;amp;height=750&quot;&gt;View &#039;Jaxer on AIR&#039; Screencast&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
</description>
 <content:encoded>&lt;p&gt;Yesterday Adobe announced the availability of Adobe AIR 1.0. At the same time, Aptana released the Adobe AIR plugin for Aptana Studio which simplifies development of Ajax applications that run &quot;on AIR&quot;. (&lt;a href=&quot;http://www.aptana.com/air/&quot;&gt;Adobe AIR Plugin for Aptana Studio&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;If you are not familiar with Adobe AIR, it enables you to use the skills and Web technologies you already know, HTML, CSS, and JavaScript, to write applications that can be deployed to the Windows and Mac desktop, and shortly on Linux desktops too.&lt;/p&gt;
&lt;p&gt;And what is Aptana Jaxer, you ask? Jaxer is an Ajax server that enables you to leverage those same Web skills and technologies, HTML, CSS, and JavaScript, to write server-side code and do a whole new range of things with JavaScript like interact with databases, file systems, and remote data sources, do server-side DOM manipulations, cross-domain data calls, make socket connections, and call server-side JavaScript functions from the client-side, plus lots more. Yes, you write both client and server code using HTML and Ajax. You can even write entire web applications in a single HTML file if you wish.&lt;/p&gt;
&lt;p&gt;With that said, it becomes much clearer as to what ‘Jaxer on AIR’ is all about -- two systems that enable you to leverage your Ajax skills for building desktop and server apps, unified into a single, very interesting model.  With Jaxer you can implement your server-side to know if an app is running in AIR and thus take advantage of offline synchronization and local access to the client system as permitted, or if you’re running on the Web with a subset of the total potential features of your Ajax apps and Web pages.  &lt;/p&gt;
&lt;p&gt;I did a 10-minute screencast showing a simple example of this. I take one of Jack Slocum’s great Ext / Adobe AIR demos (&lt;a href=&quot;http://extjs.com/blog/2008/02/24/tasks2/&quot;&gt;EXT Tasks Demo&lt;/a&gt;) and Jaxer-enabled it. I added a single JavaScript function that can query my backend database, and I use the results to fill the user interface.&lt;/p&gt;
&lt;p&gt;This demo just scratches the surface of what is possible, but I hope it opens the doors to your thinking about how to utilize these great technologies – it’s my version of their chocolate and our peanut-butter happily together, enjoy!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://aptana.tv/movies/jaxer/PlayQTFlash.html?movie=JaxerOnAIR&amp;amp;width=975&amp;amp;height=750&quot;&gt;View &#039;Jaxer on AIR&#039; Screencast&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
</content:encoded>
 <category domain="http://www.aptana.com/taxonomy/term/17">air</category>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <category domain="http://www.aptana.com/taxonomy/term/14">jaxer</category>
 <pubDate>Tue, 26 Feb 2008 19:33:56 -0600</pubDate>
 <dc:creator>pcolton</dc:creator>
 <guid isPermaLink="false">297 at http://www.aptana.com</guid>
</item>
<item>
 <title>Ajax Pioneer Kevin Hakman joins Aptana, Inc.</title>
 <link>http://www.aptana.com/node/292</link>
 <description>&lt;p&gt;We are excited to announce that Kevin Hakman has joined Aptana to head up marketing and developer community programs.  Kevin is a recognized leader in the Ajax community.  Long before the term &quot;Ajax&quot; was coined, Kevin was pioneering single page web application concepts via the company he co-founded, General Interface Corp., one of the first enterprise Ajax libraries and visual development tools companies.  General Interface Corp. went on to be acquired by TIBCO Software in 2004 as a compliment the company&#039;s service-oriented architecture (SOA) products.  Today TIBCO General Interface is used by many Fortune-scale companies for rapid Web application development and deployment atop their XML and SOAP data sources.  &lt;/p&gt;
&lt;p&gt;In addition to his historic role on the steering committee of the OpenAjax Alliance, Kevin currently chairs the organization&#039;s integrated development environment working group.  The OpenAjax Alliance IDE Working Group which includes Adobe, Aptana, the Eclipse Foundation, IBM, Microsoft, Sun, TIBCO and others is now close to delivering a draft specification for a uniform way to describe Ajax libraries and controls and thus streamline the ability to use Ajax libraries within your development tools of choice.  Kevin is a frequent speaker at Ajax industry events and is an author to many published articles on Ajax in the enterprise.&lt;/p&gt;
</description>
 <content:encoded>&lt;p&gt;We are excited to announce that Kevin Hakman has joined Aptana to head up marketing and developer community programs.  Kevin is a recognized leader in the Ajax community.  Long before the term &quot;Ajax&quot; was coined, Kevin was pioneering single page web application concepts via the company he co-founded, General Interface Corp., one of the first enterprise Ajax libraries and visual development tools companies.  General Interface Corp. went on to be acquired by TIBCO Software in 2004 as a compliment the company&#039;s service-oriented architecture (SOA) products.  Today TIBCO General Interface is used by many Fortune-scale companies for rapid Web application development and deployment atop their XML and SOAP data sources.  &lt;/p&gt;
&lt;p&gt;In addition to his historic role on the steering committee of the OpenAjax Alliance, Kevin currently chairs the organization&#039;s integrated development environment working group.  The OpenAjax Alliance IDE Working Group which includes Adobe, Aptana, the Eclipse Foundation, IBM, Microsoft, Sun, TIBCO and others is now close to delivering a draft specification for a uniform way to describe Ajax libraries and controls and thus streamline the ability to use Ajax libraries within your development tools of choice.  Kevin is a frequent speaker at Ajax industry events and is an author to many published articles on Ajax in the enterprise.&lt;/p&gt;
</content:encoded>
 <comments>http://www.aptana.com/node/292#comments</comments>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <pubDate>Mon, 25 Feb 2008 17:00:08 -0600</pubDate>
 <dc:creator>pcolton</dc:creator>
 <guid isPermaLink="false">292 at http://www.aptana.com</guid>
</item>
<item>
 <title>A Jaxer Roadmap</title>
 <link>http://www.aptana.com/node/285</link>
 <description>&lt;p&gt;This past week we released another point release of Jaxer, version 0.9.3, updating the standalone server as well as the one packaged within Aptana Studio. Of course there were bug fixes, performance improvements, and API enhancements. Perhaps most important, this was our first release to officially support Linux. Supporting Linux isn&#039;t trivial because of the multitude of variants, but it is very strategic as the deployment platform of choice for many people. Look for more distros being supported and more forms of distribution, from buildable source drops to tarballs and installable packages and even to complete EC2 and VMWare images. And thanks to the community for already helping us with supporting Linux distros.&lt;/p&gt;
&lt;p&gt;So where are these releases leading &amp;mdash; what are some things on the immediate roadmap for Jaxer? &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;An even more Ajax-y experience&lt;/b&gt;: the callback environment will be made more natural, server-side support for Ajax libraries will expand, mashups will be easier to implement, etc.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Scalability and performance&lt;/b&gt;: we&#039;ll release some interesting benchmarks on current Jaxer performance and stability, illustrate how it scales, and make some significant improvements.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;More APIs&lt;/b&gt;: we&#039;ll make database, file, network, and native interfaces more powerful while maintaining clean APIs that feel at home in JavaScript and HTML.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;More integration&lt;/b&gt;: we&#039;re creating a true bridge to Java by leveraging &lt;a href=&quot;http://getahead.org/dwr&quot; target=&quot;_blank&quot;&gt;DWR (Direct Web Remoting)&lt;/a&gt; server-side, in addition to our current support for Tomcat (and other servlet containers); we&#039;ll expand the list of supported web servers from the current Apache 2.x and Jetty to IIS, Apache 1.3, and perhaps others; and we&#039;ll work on other database drivers.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Deployment&lt;/b&gt;: we&#039;re working on making one-click deployment a reality, so you can develop your Ajax apps in Studio, leveraging Jaxer for the server side, and click to deploy your app to a hosted, managed, monitored, and scalable environment.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Tooling&lt;/b&gt;: How about seamless end-to-end debugging of your Ajax app &amp;mdash; step through your program starting on the server, move to the browser, go back to the server for a callback, then back to the browser for processing the result...&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Real-world apps&lt;/b&gt;: in the spirit of eating our own dog food, and supporting dog food consumption in the community, look for complete applications written on Jaxer and en expansion of our web site and of Studio so you can share your snippets, samples, projects and applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oh, and the time frame? We&#039;re not exactly the patient type, so for many of these think weeks rather than months. Want something specific to come out even faster? Join the discussions on the &lt;a href=&quot;http://forums.aptana.com&quot; target=&quot;_blank&quot;&gt;forums&lt;/a&gt;, join the effort (some folks are supporting Linux distros, others are building persistence frameworks, some are putting together samples), or &lt;a href=&quot;http://www.aptana.com/careers&quot; target=&quot;_blank&quot;&gt;join our team&lt;/a&gt;.&lt;/p&gt;
</description>
 <content:encoded>&lt;p&gt;This past week we released another point release of Jaxer, version 0.9.3, updating the standalone server as well as the one packaged within Aptana Studio. Of course there were bug fixes, performance improvements, and API enhancements. Perhaps most important, this was our first release to officially support Linux. Supporting Linux isn&#039;t trivial because of the multitude of variants, but it is very strategic as the deployment platform of choice for many people. Look for more distros being supported and more forms of distribution, from buildable source drops to tarballs and installable packages and even to complete EC2 and VMWare images. And thanks to the community for already helping us with supporting Linux distros.&lt;/p&gt;
&lt;p&gt;So where are these releases leading &amp;mdash; what are some things on the immediate roadmap for Jaxer? &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;An even more Ajax-y experience&lt;/b&gt;: the callback environment will be made more natural, server-side support for Ajax libraries will expand, mashups will be easier to implement, etc.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Scalability and performance&lt;/b&gt;: we&#039;ll release some interesting benchmarks on current Jaxer performance and stability, illustrate how it scales, and make some significant improvements.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;More APIs&lt;/b&gt;: we&#039;ll make database, file, network, and native interfaces more powerful while maintaining clean APIs that feel at home in JavaScript and HTML.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;More integration&lt;/b&gt;: we&#039;re creating a true bridge to Java by leveraging &lt;a href=&quot;http://getahead.org/dwr&quot; target=&quot;_blank&quot;&gt;DWR (Direct Web Remoting)&lt;/a&gt; server-side, in addition to our current support for Tomcat (and other servlet containers); we&#039;ll expand the list of supported web servers from the current Apache 2.x and Jetty to IIS, Apache 1.3, and perhaps others; and we&#039;ll work on other database drivers.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Deployment&lt;/b&gt;: we&#039;re working on making one-click deployment a reality, so you can develop your Ajax apps in Studio, leveraging Jaxer for the server side, and click to deploy your app to a hosted, managed, monitored, and scalable environment.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Tooling&lt;/b&gt;: How about seamless end-to-end debugging of your Ajax app &amp;mdash; step through your program starting on the server, move to the browser, go back to the server for a callback, then back to the browser for processing the result...&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Real-world apps&lt;/b&gt;: in the spirit of eating our own dog food, and supporting dog food consumption in the community, look for complete applications written on Jaxer and en expansion of our web site and of Studio so you can share your snippets, samples, projects and applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oh, and the time frame? We&#039;re not exactly the patient type, so for many of these think weeks rather than months. Want something specific to come out even faster? Join the discussions on the &lt;a href=&quot;http://forums.aptana.com&quot; target=&quot;_blank&quot;&gt;forums&lt;/a&gt;, join the effort (some folks are supporting Linux distros, others are building persistence frameworks, some are putting together samples), or &lt;a href=&quot;http://www.aptana.com/careers&quot; target=&quot;_blank&quot;&gt;join our team&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <category domain="http://www.aptana.com/taxonomy/term/14">jaxer</category>
 <category domain="http://www.aptana.com/taxonomy/term/16">news</category>
 <category domain="http://www.aptana.com/taxonomy/term/13">studio</category>
 <pubDate>Sun, 24 Feb 2008 05:52:36 -0600</pubDate>
 <dc:creator>uri</dc:creator>
 <guid isPermaLink="false">285 at http://www.aptana.com</guid>
</item>
<item>
 <title>Jaxer Server Now on Linux</title>
 <link>http://www.aptana.com/node/278</link>
 <description>&lt;p&gt;The Jaxer Team is proud to announce that we now support Jaxer for several Linux platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;li&gt;CentOS&lt;/li&gt;
&lt;li&gt;Fedora&lt;/li&gt;
&lt;/ul&gt; 

&lt;p&gt;To learn how to get up and running on Linux, see the &lt;a href=&quot;http://www.aptana.com/jaxer/linux&quot;&gt;Jaxer Standalone Installation guide for Linux&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We&#039;ve been working with volunteer beta testers within the Jaxer community to bring you these distros, and we plan to support additional distros in the future. However, this is our initial release for Linux support and because the various Linux platforms have so many nuances, some Linux platforms could likely still have some issues. Our Linux support is very community driven, so we invite you to participate in the platform vote on the forums to voice your opinion about your preferred platform:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://forums.aptana.com/viewtopic.php?t=4844&quot;&gt;http://forums.aptana.com/viewtopic.php?t=4844&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have Jaxer up and running on a platform that we have not listed, let us know so we can add it to the list of supported platforms. Additionally, if you need help troubleshooting issues with Jaxer on your Linux platform, post your questions on the &lt;a href=&quot;http://forums.aptana.com/index.php?c=12&quot;&gt;Jaxer forums&lt;/a&gt;.&lt;/p&gt;



</description>
 <content:encoded>&lt;p&gt;The Jaxer Team is proud to announce that we now support Jaxer for several Linux platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;li&gt;CentOS&lt;/li&gt;
&lt;li&gt;Fedora&lt;/li&gt;
&lt;/ul&gt; 

&lt;p&gt;To learn how to get up and running on Linux, see the &lt;a href=&quot;http://www.aptana.com/jaxer/linux&quot;&gt;Jaxer Standalone Installation guide for Linux&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We&#039;ve been working with volunteer beta testers within the Jaxer community to bring you these distros, and we plan to support additional distros in the future. However, this is our initial release for Linux support and because the various Linux platforms have so many nuances, some Linux platforms could likely still have some issues. Our Linux support is very community driven, so we invite you to participate in the platform vote on the forums to voice your opinion about your preferred platform:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://forums.aptana.com/viewtopic.php?t=4844&quot;&gt;http://forums.aptana.com/viewtopic.php?t=4844&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have Jaxer up and running on a platform that we have not listed, let us know so we can add it to the list of supported platforms. Additionally, if you need help troubleshooting issues with Jaxer on your Linux platform, post your questions on the &lt;a href=&quot;http://forums.aptana.com/index.php?c=12&quot;&gt;Jaxer forums&lt;/a&gt;.&lt;/p&gt;



</content:encoded>
 <comments>http://www.aptana.com/node/278#comments</comments>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <category domain="http://www.aptana.com/taxonomy/term/14">jaxer</category>
 <category domain="http://www.aptana.com/taxonomy/term/16">news</category>
 <pubDate>Wed, 20 Feb 2008 19:36:57 -0600</pubDate>
 <dc:creator>klindsey</dc:creator>
 <guid isPermaLink="false">278 at http://www.aptana.com</guid>
</item>
<item>
 <title>The Power of Mozilla - Now Playing at a Server Near You</title>
 <link>http://www.aptana.com/node/211</link>
 <description>&lt;p&gt;Jaxer lets you use your full stack of Ajax technologies &amp;mdash; HTML, JavaScript, DOM manipulation, XHR, etc. &amp;mdash; on the server, to make web application development a lot smoother and more natural.&lt;/p&gt;
&lt;p&gt;But Jaxer is also based on the Mozilla engine, in fact on the same core that will power Firefox 3, just without the rendering. And this simple fact unlocks a lot of power that&#039;s been built up over many years by Mozilla developers. Unless your apps and sites have targeted Firefox exclusively &amp;mdash; unlikely, given its market share &amp;mdash; they could not rely on JavaScript features beyond version 1.4. And how about the numerous extensions that have been developed for Firefox, some of which actually ship with the browser? Most developers don&#039;t even know about them, and they couldn&#039;t rely on them being available to most of their target audience.&lt;/p&gt;
&lt;p&gt;But now all that Firefox 3 goodness is under the hood of your Jaxer, on the server side, under your full control. So if &lt;a&gt;JavaScript 1.7 and 1.8&lt;/a&gt; generators, iterators, and array comprehensions float your boat, then happy sailing. Soon native JSON parsing and encoding will be available, along with other features on the march towards JavaScript 2. Perhaps more significantly, you have a rich &lt;a href=&quot;http://www.mozilla.org/projects/webservices/&quot;&gt;SOA stack&lt;/a&gt;: SOAP, WSDL, and other four-letter friends from the enterprise architect&#039;s bestiary. Microformats, anyone? Simply use the script loader to import the built-in &lt;a href=&quot;http://developer.mozilla.org/en/docs/Using_microformats&quot;&gt;Microformats.js&lt;/a&gt; and you have access to hCard, hCalendar, and other functionalities. XSLT transformations are at your fingertips by just &quot;new&quot;ing up an &lt;a href=&quot;http://developer.mozilla.org/en/docs/Using_the_Mozilla_JavaScript_interface_to_XSL_Transformations&quot;&gt;XSLTProcessor&lt;/a&gt; object. There are all sorts of hidden gems to discover: did you know there&#039;s a very nice &lt;a href=&quot;http://developer.mozilla.org/en/docs/RDF_in_Mozilla_FAQ&quot;&gt;RDF subsystem&lt;/a&gt; in there? How about &lt;a href=&quot;http://developer.mozilla.org/en/docs/DOM:window.btoa&quot;&gt;base64 encoding and decoding&lt;/a&gt;? Try typing &lt;code&gt;for (var p in Components.classes) { print(p); }&lt;/code&gt; in the Jaxer Shell to see that we&#039;ve just scratched the surface of what&#039;s available.&lt;/p&gt;
&lt;p&gt;Of course, if you don&#039;t see something you need, you can always just build it: think server-side GreaseMonkey scripts on steroids. I can&#039;t wait to see what people will come up with, now that all these capabilities are free from their browser dependence. There&#039;s already been a number of cool examples on various blogs, and we&#039;ll start to roll out more on a regular basis. More importantly, we&#039;ll make it easy to share your own samples and snippets with the community. Stay tuned...&lt;/p&gt;
</description>
 <content:encoded>&lt;p&gt;Jaxer lets you use your full stack of Ajax technologies &amp;mdash; HTML, JavaScript, DOM manipulation, XHR, etc. &amp;mdash; on the server, to make web application development a lot smoother and more natural.&lt;/p&gt;
&lt;p&gt;But Jaxer is also based on the Mozilla engine, in fact on the same core that will power Firefox 3, just without the rendering. And this simple fact unlocks a lot of power that&#039;s been built up over many years by Mozilla developers. Unless your apps and sites have targeted Firefox exclusively &amp;mdash; unlikely, given its market share &amp;mdash; they could not rely on JavaScript features beyond version 1.4. And how about the numerous extensions that have been developed for Firefox, some of which actually ship with the browser? Most developers don&#039;t even know about them, and they couldn&#039;t rely on them being available to most of their target audience.&lt;/p&gt;
&lt;p&gt;But now all that Firefox 3 goodness is under the hood of your Jaxer, on the server side, under your full control. So if &lt;a&gt;JavaScript 1.7 and 1.8&lt;/a&gt; generators, iterators, and array comprehensions float your boat, then happy sailing. Soon native JSON parsing and encoding will be available, along with other features on the march towards JavaScript 2. Perhaps more significantly, you have a rich &lt;a href=&quot;http://www.mozilla.org/projects/webservices/&quot;&gt;SOA stack&lt;/a&gt;: SOAP, WSDL, and other four-letter friends from the enterprise architect&#039;s bestiary. Microformats, anyone? Simply use the script loader to import the built-in &lt;a href=&quot;http://developer.mozilla.org/en/docs/Using_microformats&quot;&gt;Microformats.js&lt;/a&gt; and you have access to hCard, hCalendar, and other functionalities. XSLT transformations are at your fingertips by just &quot;new&quot;ing up an &lt;a href=&quot;http://developer.mozilla.org/en/docs/Using_the_Mozilla_JavaScript_interface_to_XSL_Transformations&quot;&gt;XSLTProcessor&lt;/a&gt; object. There are all sorts of hidden gems to discover: did you know there&#039;s a very nice &lt;a href=&quot;http://developer.mozilla.org/en/docs/RDF_in_Mozilla_FAQ&quot;&gt;RDF subsystem&lt;/a&gt; in there? How about &lt;a href=&quot;http://developer.mozilla.org/en/docs/DOM:window.btoa&quot;&gt;base64 encoding and decoding&lt;/a&gt;? Try typing &lt;code&gt;for (var p in Components.classes) { print(p); }&lt;/code&gt; in the Jaxer Shell to see that we&#039;ve just scratched the surface of what&#039;s available.&lt;/p&gt;
&lt;p&gt;Of course, if you don&#039;t see something you need, you can always just build it: think server-side GreaseMonkey scripts on steroids. I can&#039;t wait to see what people will come up with, now that all these capabilities are free from their browser dependence. There&#039;s already been a number of cool examples on various blogs, and we&#039;ll start to roll out more on a regular basis. More importantly, we&#039;ll make it easy to share your own samples and snippets with the community. Stay tuned...&lt;/p&gt;
</content:encoded>
 <comments>http://www.aptana.com/node/211#comments</comments>
 <category domain="http://www.aptana.com/taxonomy/term/51">ajax_news</category>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <category domain="http://www.aptana.com/taxonomy/term/14">jaxer</category>
 <category domain="http://www.aptana.com/taxonomy/term/16">news</category>
 <category domain="http://www.aptana.com/taxonomy/term/13">studio</category>
 <pubDate>Sun, 03 Feb 2008 00:49:08 -0600</pubDate>
 <dc:creator>uri</dc:creator>
 <guid isPermaLink="false">211 at http://www.aptana.com</guid>
</item>
<item>
 <title>Aptana recap: Aptana Studio 1.1.1 release coming soon</title>
 <link>http://www.aptana.com/node/210</link>
 <description>With the excitement of the 0.9 release of Jaxer and the Aptana Studio 1.1 release behind them, the Aptana development team spent the past week working on the first patch release for 0.9/1.1. The Aptana community should have access to these patches early next week.

&lt;p&gt;&lt;b&gt;New Release&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;The upcoming Aptana Studio 1.1 release will be a patch release that fixes several bugs in 1.1, including the following issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An encoding bug where workspace text encoding isn&#039;t saved after re-starting Aptana (&lt;a href=&quot;http://support.aptana.com/asap/browse/STU-1111&quot;&gt;STU-1111&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A bug involving CSS pseudo classes (&lt;a href=&quot;http://support.aptana.com/asap/browse/STU-1035&quot;&gt;STU-1035&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A bug in Prototype code assist involving the $() function(&lt;a href=&quot;http://support.aptana.com/asap/browse/STU-134&quot;&gt;STU-134&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;Tips and Tricks&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;We&#039;re aware that some users have been having difficulty installing the recent updates to Aptana Studio. The team is working on isolating the causes of this issue and hope to improve the situation soon. In the meantime, if you have been unable to download/install the updates, try performing a manual installation as directed on the update site:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://update.aptana.com/update/3.2/&quot;&gt;http://update.aptana.com/update/3.2/&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Community Buzz&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;We see a lot of bug reporting and feature requests on the forums; however, the best way to get support or to request a new feature is to fill out a ticket in ASAP&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://support.aptana.com/asap/secure/Dashboard.jspa&quot;&gt;http://support.aptana.com/issues/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By filing a ticket in ASAP, you enable us to track the status of a ticket more easily, and you can also easily search for related bugs and feature requests.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Next Week&lt;/b&gt;&lt;/p&gt;

Next week, we&#039;ll get started with work on the 1.2 release. Current plans for the 1.2 release include a number of updates to the Ajax libraries bundled with Aptana Studio (EXT, Yahoo UI, etc.) and a migration to the Eclipse 3.3 platform as the base platform for Aptana.

</description>
 <content:encoded>With the excitement of the 0.9 release of Jaxer and the Aptana Studio 1.1 release behind them, the Aptana development team spent the past week working on the first patch release for 0.9/1.1. The Aptana community should have access to these patches early next week.

&lt;p&gt;&lt;b&gt;New Release&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;The upcoming Aptana Studio 1.1 release will be a patch release that fixes several bugs in 1.1, including the following issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An encoding bug where workspace text encoding isn&#039;t saved after re-starting Aptana (&lt;a href=&quot;http://support.aptana.com/asap/browse/STU-1111&quot;&gt;STU-1111&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A bug involving CSS pseudo classes (&lt;a href=&quot;http://support.aptana.com/asap/browse/STU-1035&quot;&gt;STU-1035&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A bug in Prototype code assist involving the $() function(&lt;a href=&quot;http://support.aptana.com/asap/browse/STU-134&quot;&gt;STU-134&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;Tips and Tricks&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;We&#039;re aware that some users have been having difficulty installing the recent updates to Aptana Studio. The team is working on isolating the causes of this issue and hope to improve the situation soon. In the meantime, if you have been unable to download/install the updates, try performing a manual installation as directed on the update site:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://update.aptana.com/update/3.2/&quot;&gt;http://update.aptana.com/update/3.2/&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Community Buzz&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;We see a lot of bug reporting and feature requests on the forums; however, the best way to get support or to request a new feature is to fill out a ticket in ASAP&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://support.aptana.com/asap/secure/Dashboard.jspa&quot;&gt;http://support.aptana.com/issues/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By filing a ticket in ASAP, you enable us to track the status of a ticket more easily, and you can also easily search for related bugs and feature requests.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Next Week&lt;/b&gt;&lt;/p&gt;

Next week, we&#039;ll get started with work on the 1.2 release. Current plans for the 1.2 release include a number of updates to the Ajax libraries bundled with Aptana Studio (EXT, Yahoo UI, etc.) and a migration to the Eclipse 3.3 platform as the base platform for Aptana.

</content:encoded>
 <comments>http://www.aptana.com/node/210#comments</comments>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <category domain="http://www.aptana.com/taxonomy/term/16">news</category>
 <category domain="http://www.aptana.com/taxonomy/term/13">studio</category>
 <pubDate>Fri, 01 Feb 2008 18:07:01 -0600</pubDate>
 <dc:creator />
 <guid isPermaLink="false">210 at http://www.aptana.com</guid>
</item>
<item>
 <title>Aptana Jaxer -- An Entirely New Kind of Server</title>
 <link>http://www.aptana.com/node/184</link>
 <description>&lt;p&gt;Wow, it’s been a long road getting to this release date, but I am very excited and proud of our team, and I&#039;m happy to say that today we released our beta 1 of Jaxer -- what we believe to be the first true Ajax Server product.&lt;/p&gt;
&lt;p&gt;So what is an “Ajax Server”? Simply put, we unify the development model for Ajax developers. That is, write “Ajax” code client AND server. The same APIs, the same JavaScript, the same HTML and best of all, manipulate the DOM on the server.&lt;/p&gt;
&lt;p&gt;What does all that mean? It means that you can do a getElementById() and set its innerHTML on the server side just as easily as you can on the browser. You can write a single JavaScript function and share it between browser and server. You can write server functions which can be transparently called from the browser -- synchronous or asynchronously.&lt;/p&gt;
&lt;p&gt;If you’re a beginning Ajax developer and any of that sounds complicated, it’s not. It simply means you can now build an entire Web 2.0 application, client and server, using only the Ajax technologies you love.&lt;/p&gt;
&lt;p&gt;I asked several of the leaders in the Ajax space to join with us and with you, the Ajax community, in defining where we go from here. I’m very honored to say that we’ve got an all-star group assembled as our Aptana Advisory Board, just take a look at this &lt;a href=&quot;http://aptana.com/advisoryboard&quot;&gt;who’s who list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We’ve placed a &lt;a href=&quot;http://aptana.com/screencasts&quot;&gt;few screencasts&lt;/a&gt; online so you can take a quick look at what Jaxer is all about and how you can start playing with it right away.&lt;/p&gt;
&lt;p&gt;Send us your feedback, your suggestions, and &lt;a href=&quot;http://aptana.com/about&quot;&gt;tell us&lt;/a&gt; what you are building. After all, building a free, open-source product ultimately means we’re building this for you!&lt;/p&gt;
&lt;p&gt;Regards,&lt;br /&gt;
Paul Colton&lt;/p&gt;
</description>
 <content:encoded>&lt;p&gt;Wow, it’s been a long road getting to this release date, but I am very excited and proud of our team, and I&#039;m happy to say that today we released our beta 1 of Jaxer -- what we believe to be the first true Ajax Server product.&lt;/p&gt;
&lt;p&gt;So what is an “Ajax Server”? Simply put, we unify the development model for Ajax developers. That is, write “Ajax” code client AND server. The same APIs, the same JavaScript, the same HTML and best of all, manipulate the DOM on the server.&lt;/p&gt;
&lt;p&gt;What does all that mean? It means that you can do a getElementById() and set its innerHTML on the server side just as easily as you can on the browser. You can write a single JavaScript function and share it between browser and server. You can write server functions which can be transparently called from the browser -- synchronous or asynchronously.&lt;/p&gt;
&lt;p&gt;If you’re a beginning Ajax developer and any of that sounds complicated, it’s not. It simply means you can now build an entire Web 2.0 application, client and server, using only the Ajax technologies you love.&lt;/p&gt;
&lt;p&gt;I asked several of the leaders in the Ajax space to join with us and with you, the Ajax community, in defining where we go from here. I’m very honored to say that we’ve got an all-star group assembled as our Aptana Advisory Board, just take a look at this &lt;a href=&quot;http://aptana.com/advisoryboard&quot;&gt;who’s who list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We’ve placed a &lt;a href=&quot;http://aptana.com/screencasts&quot;&gt;few screencasts&lt;/a&gt; online so you can take a quick look at what Jaxer is all about and how you can start playing with it right away.&lt;/p&gt;
&lt;p&gt;Send us your feedback, your suggestions, and &lt;a href=&quot;http://aptana.com/about&quot;&gt;tell us&lt;/a&gt; what you are building. After all, building a free, open-source product ultimately means we’re building this for you!&lt;/p&gt;
&lt;p&gt;Regards,&lt;br /&gt;
Paul Colton&lt;/p&gt;
</content:encoded>
 <comments>http://www.aptana.com/node/184#comments</comments>
 <category domain="http://www.aptana.com/taxonomy/term/51">ajax_news</category>
 <category domain="http://www.aptana.com/taxonomy/term/37">blog</category>
 <category domain="http://www.aptana.com/taxonomy/term/36">front_page</category>
 <category domain="http://www.aptana.com/taxonomy/term/16">news</category>
 <category domain="http://www.aptana.com/taxonomy/term/13">studio</category>
 <pubDate>Tue, 22 Jan 2008 15:23:09 -0600</pubDate>
 <dc:creator>pcolton</dc:creator>
 <guid isPermaLink="false">184 at http://www.aptana.com</guid>
</item>
</channel>
</rss>
