<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?>

<feed xmlns="http://purl.org/atom/ns#" version="0.3" xml:lang="en-US">
<link href="https://www.blogger.com/atom/19002723" rel="service.post" title="Tagneto" type="application/atom+xml"/>
<link href="https://www.blogger.com/atom/19002723" rel="service.feed" title="Tagneto" type="application/atom+xml"/>
<title mode="escaped" type="text/html">Tagneto</title>
<tagline mode="escaped" type="text/html">Notes on the development of the &lt;a href="http://tagneto.org"&gt;Tagneto&lt;/a&gt; framework.</tagline>
<link href="http://tagneto.blogspot.com" rel="alternate" title="Tagneto" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723</id>
<modified>2005-12-16T07:17:52Z</modified>
<generator url="http://www.blogger.com/" version="5.15">Blogger</generator>
<info mode="xml" type="text/html">
<div xmlns="http://www.w3.org/1999/xhtml">This is an Atom formatted XML site feed. It is intended to be viewed in a Newsreader or syndicated to another site. Please visit the <a href="http://help.blogger.com/bin/answer.py?answer=697">Blogger Help</a> for more info.</div>
</info>
<convertLineBreaks xmlns="http://www.blogger.com/atom/ns#">true</convertLineBreaks>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113471506636324632" rel="service.edit" title="Referrer test page / Authenticated script src APIs" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-12-15T22:33:00-08:00</issued>
<modified>2005-12-16T07:17:52Z</modified>
<created>2005-12-16T06:37:46Z</created>
<link href="http://tagneto.blogspot.com/2005/12/referrer-test-page-authenticated.html" rel="alternate" title="Referrer test page / Authenticated script src APIs" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113471506636324632</id>
<title mode="escaped" type="text/html">Referrer test page / Authenticated script src APIs</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">
<span style="font-weight: bold;">Referrer test page<br/>
<br/>
</span>I have a test page up now to test the HTTP referrer header values:<br/>
<br/>
<a href="http://tagneto.org/test/reftest">http://tagneto.org/test/reftest</a>
<br/>
<br/>If you press the test button, it should show the date from the server and the referrer header value.<br/>
<br/>There is also another URL to try in the text box: <span style="font-style: italic;">/cgi-bin/redirect.rb</span>. That URL will redirect to the /cgi-bin/refer.rb. I wanted to be sure a redirect did not change the referrer value.<br/>
<br/>Now I'm going to use the test page to test posting from different pages and in different scenarios to see if I can get the referrer to change to some value than the one from the actual page making the SCRIPT SRC request. If you want to try posting to http://tagneto.org/cgi-bin/refer.rb from other domains, save the <span style="font-style: italic;">index.html</span> page from the reftest URL mentioned above, as well as the <span style="font-style: italic;">SvrScript.js</span> file that is in that same directory.<br/>
<br/>
<span style="font-weight: bold;">Authenticated script src APIs</span>
<br/>If the referrer thing holds up, then I think it will be possible to proceed with some of the ideas mentioned in <a href="http://tagneto.blogspot.com/2005/12/security-and-dynamic-script-request.html">this post</a>. However, that post assumed the authorization issue concerned a developer user name using the API on his/her own page.<br/>
<br/>For the larger issue of allowing a third party web site that deals with data that needs user authentication (without exposing the auth credentials to the third party web site), what about this:<br/>
<ul>
<li>3rd party web site gets an API key. That API key is only bound for certain domains and/or URLs.</li>
<li>When a user uses the 3rd party web page that uses a protected data API, the data API server looks for authentication credentials in cookies that are only set to the data API server domain.</li>
<li>If the user is not authenticated, then respond to the web page with an error, message of "auth.needed". The 3rd party web page puts up a DIV dialog saying that authorization is needed. If the user says OK, the 3rd party calls an "<span style="font-style: italic;">authenticate</span>" JS method that is provided by the data service script library. An argument to <span style="font-style: italic;">authenticate</span> method would be a return URL (an URL on the 3rd party site). The <span style="font-style: italic;">authenticate </span>method would pop a window an prompt the user for auth credentials. A new window should be used so the user can check the domain/URL of the auth credential page. After successful login, the new window sets its location to the URL passed to <span style="font-style: italic;">authenticate</span>. That URL on the 3rd party site should just close the window and force a refresh/update of the web page that uses the data API.</li>
<li>If the user is authenticated, then the data service checks its own database to see if the user has explicitly granted data access to the 3rd party web page URL. If the user has not granted access yet (the data API would look at the referrer HTTP header), then data API responds to the web page with an error, "auth.needPermission". The 3rd party web page calls a "<span style="font-style: italic;">askPermission</span>" JS method that is provided by the data service script library. <span style="font-style: italic;">askPermission </span>would take a JS method callback as an argument. This method creates an IFRAME dialog in the page that asks if the user wants to give permission to this website to access the data. There could be a "Remember this answer" checkbox too, if the data API wanted to allow that. If the user says OK, then <span style="font-style: italic;">askPermission </span>notifies the callback of the answer. The callback could then update the page accordingly (probably by re-calling the data API).</li>
</ul>More experiments to do, but it seems promising.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113445476464433826" rel="service.edit" title="Ctrl.js event listening updated" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-12-12T22:12:00-08:00</issued>
<modified>2005-12-13T06:19:24Z</modified>
<created>2005-12-13T06:19:24Z</created>
<link href="http://tagneto.blogspot.com/2005/12/ctrljs-event-listening-updated.html" rel="alternate" title="Ctrl.js event listening updated" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113445476464433826</id>
<title mode="escaped" type="text/html">Ctrl.js event listening updated</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">I was reading more on the web about registering event listeners in JavaScript. Mainly:<br/>
<ul>
<li>http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html<br/>(including comments)</li>
<li>http://dean.edwards.name/weblog/2005/10/add-event2/</li>
<li>http://www.quirksmode.org/js/introevents.html<br/>
</li>
<li>http://www.dustindiaz.com/rock-solid-addevent/</li>
</ul>I reworked the event listening methods in Ctrl.js to do the following:<br/>
<ul>
<li>modify the events that are used in MSIE to look more like the standard events.</li>
<li>have "this" point to the element that has the event listener.</li>
<li>allow the ability for any JavaScript object to have listeners.</li>
<li>allow for cleaning up to avoid memory leaks for individual DOM elements (and optionally their children). Ctrl does register a global cleanup function on document unload, but it also surfaces a removeListeners() method for cases when there are multiple nodes attached/detached within the web page's lifetime, and memory leaks want to be contained as nodes are detached before the page is unloaded. (Even does cleanup for Mozilla because of bug: https://bugzilla.mozilla.org/show_bug.cgi?id=241518</li>
</ul>I also renamed the methods, and now there is only one "register event listener" method, Ctrl.listen().<br/>
<br/>The changes are in CVS but not visible on the web site yet. Still need to round out a little more testing.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113359209629574497" rel="service.edit" title="Security and the Dynamic Script Request API" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-12-02T22:32:00-08:00</issued>
<modified>2005-12-03T07:11:34Z</modified>
<created>2005-12-03T06:41:36Z</created>
<link href="http://tagneto.blogspot.com/2005/12/security-and-dynamic-script-request.html" rel="alternate" title="Security and the Dynamic Script Request API" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113359209629574497</id>
<title mode="escaped" type="text/html">Security and the Dynamic Script Request API</title>
<content mode="escaped" type="text/html" xml:base="http://tagneto.blogspot.com" xml:space="preserve">&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Possible Security Issue&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Dynamically adding SCRIPT SRC tags to pull in data as JavaScript is nice since it gets around cross-domain issues, but it could also be problematic if you are providing user data, data that required the user to authenticate in some way.&lt;br /&gt;&lt;br /&gt;If the User A authenticates for using some JavaScript data APIs via SCRIPT SRC tags, it is possible that Hacker B could guide User A to Hacker B's page that includes a data source that uses User A's credentials.&lt;br /&gt;&lt;br /&gt;User A authentication could have been through setting cookies that will travel to the data API domain. The API could also require that User A have an "API key" to use the API (User A registers with the data service provider, and receives a API key text string that must be passed to any data calls.  Google Maps is an example).&lt;br /&gt;&lt;br /&gt;Hacker B could find out User A's data API key, and if the API required authentication cookies to be set, Hacker B just needs to be sure User A authenticates before coming to Hacker B's page.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Protection Measures&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Data Service Registration&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The user must register for an API key. To obtain the API key, the user must authenticate with the data service provider to prove their identity.&lt;/li&gt;&lt;li&gt;As part of this registration, the user must specify which domains are allows to use the API key, and possibly which user names are authorized to use the API Key.&lt;/li&gt;&lt;li&gt;Since the user is authenticated, that user name can use the API. Any other user names that are added to the API key must receive an email notification. The other user names must authenticate and grant permission to be on the allowed users for the API key.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Script SRC requests&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In addition to sending the API key, there must be a timestamp as part of the request. These parameters should be querystring parameters (like dataapi.com?key=xyz&amp;stamp=55959833920)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Data Service Server&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The server for the data service should not allow caching of the data request. They should set the appropriate HTTP headers to expire the results of the request immediately, to avoid Hacker B taking advantage of the browser cache (that is why query string params are used on the URL too).&lt;/li&gt;&lt;li&gt;The server will reject any request that does not have a registered domain in the Referrer HTTP header.&lt;/li&gt;&lt;li&gt;The data service domain should only have data services. It should not allow any user-generated web pages under that domain. Ideally it should be unrelated to any domains that host user web page content -- no subdomains should match to prevent document.domain tricks from working.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Test scenarios&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Even with these measures in place, are there other holes? I want to make some tests to verify the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Does authenticating with the data service pass the cookies along properly for SCRIPT SRC requests?&lt;/li&gt;&lt;li&gt;Does the Referrer field get set correctly for SCRIPT SRC requests? In all browsers?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;How can the Referrer field be spoofed? Use XMLHTTPRequest. But hopefully since only data services are allowed on the data service domain that can't be used. Hopefully the document.domain protection above will help too. Is there some way a server proxy running on Hacker B's site be used? Hopefully the User's authentication cookies can't travel to that domain.&lt;/li&gt;&lt;li&gt;Even if the server sets expiration headers, will the browser still cache? Hopefully since a timestamp is sent and the URL uses query string params, Hacker B's URL won't be the same anyway, and therefore a different browser cache entry?&lt;/li&gt;&lt;/ul&gt;These are just first thoughts. I haven't checked yet to see if someone else has already worked this out. And it would be good to do some testing too, think of other scenarios that might break.</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113307198636738550" rel="service.edit" title="Tagneto 0.3.1 Released" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-26T22:06:00-08:00</issued>
<modified>2005-11-27T06:13:06Z</modified>
<created>2005-11-27T06:13:06Z</created>
<link href="http://tagneto.blogspot.com/2005/11/tagneto-031-released.html" rel="alternate" title="Tagneto 0.3.1 Released" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113307198636738550</id>
<title mode="escaped" type="text/html">Tagneto 0.3.1 Released</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Tagneto 0.3.1 was released yesterday. It is <a href="http://sourceforge.net/project/showfiles.php?group_id=152695">available for download</a> from the SourceForge site.<br/>
<br/>Release Notes:<br/>
<ul>
<li>Added source examples to website/documentation for ease of reference.</li>
<li>
<a href="http://tagneto.sourceforge.net/how/reference/js/DynamicScriptRequest.html">Dynamic Script Request API document</a> and SvrScript implementation of the API.</li>
<li>Broke up Srvr.js into 3 files: SvrScript.js, SvrReq.js and SvrFrame.js.</li>
<li>No more warnings when building in Eclipse. Most warnings were from autogenerated JAXB files.</li>
<li>Fixed tagneto/src/test/RunTest.bat and RunTest.sh. </li>
<li>Added ant lib to make it easy to build tagneto directly from cvs source checkout in Eclipse.</li>
<li>Added notes on how to build Tagneto on the <a href="http://tagneto.sourceforge.net/where/index.html">Where</a> page.</li>
</ul>
</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113261533043040937" rel="service.edit" title="Dynamic Script Request API" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-21T15:14:00-08:00</issued>
<modified>2005-11-21T23:22:10Z</modified>
<created>2005-11-21T23:22:10Z</created>
<link href="http://tagneto.blogspot.com/2005/11/dynamic-script-request-api.html" rel="alternate" title="Dynamic Script Request API" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113261533043040937</id>
<title mode="escaped" type="text/html">Dynamic Script Request API</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">I updated the Tagneto website with a document describing the <a href="http://tagneto.sourceforge.net/how/reference/js/DynamicScriptRequest.html">Dynamic Script Request API</a>, and Tagneto's support of it through the Srvr.js library. The goal of the API is to make it possible to reliably use dynamically added SCRIPT SRC elements to load data and UI. It also makes it possible to send up more data to the server via multipart requests. This should make it easier to access web APIs across server domains (something XMLHTTPRequest normally cannot do). The limitation being the cross server web API must return JavaScript.<br/>
<br/>This document is another revision of the API first described in <a href="http://tagneto.blogspot.com/2005/11/using-on-demand-javascript-for.html">this post</a>.<br/>
<br/>The changes to Srvr.js to support this API are not in the 0.3.0 release of Tagneto. Either grab from CVS or a later version of Tagneto (if available).</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113218037803577233" rel="service.edit" title="Using On-Demand JavaScript for Everything" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T14:30:00-08:00</issued>
<modified>2005-11-21T23:25:28Z</modified>
<created>2005-11-16T22:32:58Z</created>
<link href="http://tagneto.blogspot.com/2005/11/using-on-demand-javascript-for.html" rel="alternate" title="Using On-Demand JavaScript for Everything" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113218037803577233</id>
<title mode="escaped" type="text/html">Using On-Demand JavaScript for Everything</title>
<content mode="escaped" type="text/html" xml:base="http://tagneto.blogspot.com" xml:space="preserve">I really like using &lt;a href="http://www.ajaxpatterns.org/On-Demand_Javascript"&gt;On-Demand JavaScript&lt;/a&gt; (dynamically creating a SCRIPT tag and attaching to the HEAD) for loading new data or UI, particularly since it gets around the domain restrictions of XMLHTTPRequest. There is also no need to deal with messy XML to JavaScript transformations.&lt;br /&gt;&lt;br /&gt;The challenges:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;GET URL length restrictions.&lt;/li&gt;  &lt;li&gt;Data has to be JavaScript.&lt;/li&gt;  &lt;li&gt;Knowing when script load is complete.&lt;/li&gt;&lt;/ol&gt;Tagneto can help deal with these issues. The approach and issues are slightly different for retrieving UI (View) vs. Data (Model):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;On Demand UI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;1. GET URL length restrictions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This normally shouldn't be an issue for retrieving UI, particularly if the UI does not depend on particular request or user data (see &lt;a href="http://tagneto.org/why"&gt;Why&lt;/a&gt; document). If it is an issue, please see the approach mapped out below in &lt;span style="font-weight: bold;"&gt;On Demand Data&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;2. Data has to be JavaScript&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is particularly tricky to encode HTML as JavaScript. Tagneto's &lt;a href="http://tagneto.org/how/reference/tags/CtrlTags.html"&gt;ctrl:&lt;/a&gt; tags make this easier. An example, to create a JavaScript function that returns an HTML string based on some input parameters.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Sample.js:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="codemarkup"&gt;&amp;lt;ctrl:function name="getHelloWorld" parameters="name, planet"&amp;gt;&lt;br /&gt;&amp;lt;b&amp;gt;Hello &amp;amp;ctrl:out-value:planet;, this is &amp;lt;ctrl:out value="name/&amp;gt;.&amp;lt;/b&amp;gt;&lt;br /&gt;&amp;lt;/ctrl:function&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;span class="codemarkup"&gt;After running this file through Tagneto's view assembly tool, &lt;span style="font-style: italic;"&gt;Sample.js&lt;/span&gt; will look something like this (the actual result is a little more complex and efficient than string concatenations::&lt;br /&gt;&lt;pre&gt;&lt;span class="codemarkup"&gt;function getHelloWorld(name, planet)&lt;br /&gt;{&lt;br /&gt;return '&amp;lt;b&amp;gt;Hello ' + planet + ', this is ' + name + .&amp;lt;/b&amp;gt;';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span class="codemarkup"&gt;Now &lt;span style="font-style: italic;"&gt;Sample.js&lt;/span&gt; is ready to be dynamically included in the page.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;3. Knowing when script load is complete&lt;/span&gt;&lt;span class="codemarkup"&gt;&lt;br /&gt;&lt;br /&gt;The script can be dynamically added to the page using a method in &lt;a href="http://tagneto.org/how/reference/js"&gt;Srvr.js&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;Srvr.Script.add('Sample.js', '&lt;span class="codemarkup"&gt;getHelloWorld', sampleLoadedListener);&lt;/span&gt;&lt;/pre&gt;where sampleLoadedListener is an object that could look like this:&lt;br /&gt;&lt;pre&gt;var &lt;span class="codemarkup"&gt;sampleLoadedListener&lt;/span&gt; = {&lt;br /&gt;            onLoad: function()&lt;br /&gt;                  {&lt;br /&gt;                  document.getElementById('outDiv').innerHTML = &lt;span class="codemarkup"&gt;getHelloWorld()&lt;/span&gt;;&lt;br /&gt;                  },&lt;br /&gt;            onError = function(error) { alert('error: ' + error); },&lt;br /&gt;            onTimeout = function() { alert('timeout'); },&lt;br /&gt;            timeout = 30&lt;br /&gt;            };&lt;/pre&gt;&lt;span style="font-style: italic;"&gt;sampleLoadedListener.onLoad&lt;/span&gt; will be called once &lt;span style="font-style: italic;"&gt;getHelloWorld&lt;/span&gt; is detected as being defined.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;On Demand Data&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This section is bit more experimental. It is just a first thought, probably needs more work. I think I'll need to make changes to Srvr.Script to have it play nice with this model, perhaps even provide convenience method to handle multi part URLs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;1. GET URL length restrictions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;UPDATE&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;: The API described below has been updated. See the &lt;/span&gt;&lt;a style="color: rgb(255, 0, 0);" href="http://tagneto.blogspot.com/2005/11/dynamic-script-request-api.html"&gt;Dynamic Script Request API post&lt;/a&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="codemarkup"&gt;&lt;span class="codemarkup"&gt;It seems like URLs can only be at maximum around 1KB, so this can be problematic if you need to send a large amount back to the server. What about using multiple requests (parts) to post the data back? The server would collect the parts, and on the final part, do the action. Some spec is needed for GET parameters on the part URLs:&lt;br /&gt;&lt;pre&gt;?part=currentPartNumber.totalParts&lt;br /&gt;&amp;succes=methodName&lt;br /&gt;&amp;amp;amp;amp;amp;error=methodName&lt;br /&gt;&amp;partComplete=methodName&lt;br /&gt;[&amp;amp;actual data to give to server]&lt;/pre&gt;An example URL (broken into multiple lines for readability):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;?part=1.4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;success=myDataLoaded&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;error=myError&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;partComplete=myPartComplete&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;name=foo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;quantity=3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;....&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;1.4&lt;/span&gt; means this is part 1 of a 4 part request.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;myDataLoaded&lt;/span&gt; is a JavaScript function already defined in the page, and it takes one parameter, the actual JavaScript response data from the server after the server finishes collecting all the parts and processing the requests&lt;span style="font-style: italic;"&gt;.&lt;br /&gt;&lt;br /&gt;myError&lt;/span&gt; is a JavaScript function already defined in the page that would take perhaps an error object/message as the only parameter. &lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;partComplete&lt;/span&gt; is a JavaScript function already defined in the page that would take the part number that was just completed by the server. The server's response would call this method as the very last line in the response.&lt;br /&gt;&lt;br /&gt;As the JavaScript gets notification of a successful part being processed&lt;br /&gt;(via the &lt;span style="font-style: italic;"&gt;partComplete&lt;/span&gt; function), it would attach the next part as a SCRIPT element to the page.&lt;br /&gt;&lt;br /&gt;The method callback parameters only need to be sent up as part of the first part of the total request.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;2. Data has to be JavaScript&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Frameworks like &lt;a href="https://dwr.dev.java.net/"&gt;DWR&lt;/a&gt; or &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt; (in the Java world) may be able to help with dynamic data (based on request or user data). If it is static data, custom tags using Tagneto's&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;span style="font-style: italic;"&gt;org.tagnetic.core.tags.define.DefineInclude&lt;/span&gt; tag handler or the &lt;a href="http://tagneto.org/how/reference/tags/ViewTags.html#xmldatasource"&gt;view:xmldatasource tag&lt;/a&gt; could be used to transform XML data into JavaScript.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;3. Knowing when script load is complete&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Completion is known by the calling of the &lt;span style="font-style: italic;"&gt;success/partComplete/error&lt;/span&gt; functions. Srvr.Script should be changed to allow the checkString to be optional, and to provide a wrapper around this approach.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217111272019047" rel="service.edit" title="CVS source update to make building easier" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:58:00-08:00</issued>
<modified>2005-11-16T19:58:32Z</modified>
<created>2005-11-16T19:58:32Z</created>
<link href="http://tagneto.blogspot.com/2005/11/cvs-source-update-to-make-building.html" rel="alternate" title="CVS source update to make building easier" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217111272019047</id>
<title mode="escaped" type="text/html">CVS source update to make building easier</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">I updated the CVS source last night to make it easier for people who try to build the source from a CVS checkout.  Changes:<br/>
<ul>
<li>No missing dependencies</li>
<li>tagneto/src/test/RunTests.bat should now run all the tests (still have to check RunTests.sh)</li>
<li>Fixed warnings when building in Eclipse (warnings mostly from the autogenerated JAXB code that is used to parse tagneticconfig files).</li>
</ul>You will only see these changes if you get the source from CVS.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217081084948095" rel="service.edit" title="Comments for http://tagneto.org/when" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:53:00-08:00</issued>
<modified>2005-11-16T19:53:31Z</modified>
<created>2005-11-16T19:53:30Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoorgwhen.html" rel="alternate" title="Comments for http://tagneto.org/when" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217081084948095</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/when</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/when<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217086737564177" rel="service.edit" title="http://tagneto.org/who" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:53:00-08:00</issued>
<modified>2005-11-16T19:54:27Z</modified>
<created>2005-11-16T19:54:27Z</created>
<link href="http://tagneto.blogspot.com/2005/11/httptagnetoorgwho.html" rel="alternate" title="http://tagneto.org/who" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217086737564177</id>
<title mode="escaped" type="text/html">http://tagneto.org/who</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/who<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217073487168847" rel="service.edit" title="Comments for http://tagneto.org/how/reference/tagneticconfig/" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:52:00-08:00</issued>
<modified>2005-11-16T19:52:14Z</modified>
<created>2005-11-16T19:52:14Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoor_113217073487168847.html" rel="alternate" title="Comments for http://tagneto.org/how/reference/tagneticconfig/" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217073487168847</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/how/reference/tagneticconfig/</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/how/reference/tagneticconfig/<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217077303210872" rel="service.edit" title="Comments for http://tagneto.org/how/reference/js" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:52:00-08:00</issued>
<modified>2005-11-16T19:52:53Z</modified>
<created>2005-11-16T19:52:53Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoor_113217077303210872.html" rel="alternate" title="Comments for http://tagneto.org/how/reference/js" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217077303210872</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/how/reference/js</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/how/reference/js<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217068480393401" rel="service.edit" title="Comments for http://tagneto.org/how/reference/tags/HtmlTags.html" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:51:00-08:00</issued>
<modified>2005-11-16T19:51:24Z</modified>
<created>2005-11-16T19:51:24Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoorghowreferenc_16.html" rel="alternate" title="Comments for http://tagneto.org/how/reference/tags/HtmlTags.html" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217068480393401</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/how/reference/tags/HtmlTags.html</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/how/reference/tags/HtmlTags.html<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217070206970553" rel="service.edit" title="Comments for http://tagneto.org/how/reference/tags/CtrlTags.html" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:51:00-08:00</issued>
<modified>2005-11-16T19:52:26Z</modified>
<created>2005-11-16T19:51:42Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoor_113217070206970553.html" rel="alternate" title="Comments for http://tagneto.org/how/reference/tags/CtrlTags.html" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217070206970553</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/how/reference/tags/CtrlTags.html</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/how/reference/tags/CtrlTags.html<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113261428247823233" rel="service.edit" title="Comments for http://tagneto.org/how/reference/js/DynamicScriptRequest.html" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:50:00-08:00</issued>
<modified>2005-11-21T23:04:42Z</modified>
<created>2005-11-21T23:04:42Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoor_113261428247823233.html" rel="alternate" title="Comments for http://tagneto.org/how/reference/js/DynamicScriptRequest.html" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113261428247823233</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/how/reference/js/DynamicScriptRequest.html</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/how/reference/js/DynamicScriptRequest.html<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217058365425425" rel="service.edit" title="Comments for http://tagneto.org/how/quickstart/AlternateSyntax.html" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:49:00-08:00</issued>
<modified>2005-11-16T19:49:43Z</modified>
<created>2005-11-16T19:49:43Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoor_113217058365425425.html" rel="alternate" title="Comments for http://tagneto.org/how/quickstart/AlternateSyntax.html" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217058365425425</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/how/quickstart/AlternateSyntax.html</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/how/quickstart/AlternateSyntax.html<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217055859316270" rel="service.edit" title="Comments for http://tagneto.org/how/quickstart/Overlays.html" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:49:00-08:00</issued>
<modified>2005-11-16T19:49:18Z</modified>
<created>2005-11-16T19:49:18Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoor_113217055859316270.html" rel="alternate" title="Comments for http://tagneto.org/how/quickstart/Overlays.html" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217055859316270</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/how/quickstart/Overlays.html</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/how/quickstart/Overlays.html<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217063311498232" rel="service.edit" title="Comments for http://tagneto.org/how/reference/tags/ViewTags.html" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:49:00-08:00</issued>
<modified>2005-11-16T19:50:33Z</modified>
<created>2005-11-16T19:50:33Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoorghowreferenc.html" rel="alternate" title="Comments for http://tagneto.org/how/reference/tags/ViewTags.html" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217063311498232</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/how/reference/tags/ViewTags.html</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/how/reference/tags/ViewTags.html<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217050553886406" rel="service.edit" title="Comments for http://tagneto.org/how/quickstart/Xml.html" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:48:00-08:00</issued>
<modified>2005-11-16T19:48:25Z</modified>
<created>2005-11-16T19:48:25Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoorghowquicksta_16.html" rel="alternate" title="Comments for http://tagneto.org/how/quickstart/Xml.html" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217050553886406</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/how/quickstart/Xml.html</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/how/quickstart/Xml.html<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217053210498569" rel="service.edit" title="Comments for http://tagneto.org/how/quickstart/CustomTag.html" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:48:00-08:00</issued>
<modified>2005-11-16T19:48:52Z</modified>
<created>2005-11-16T19:48:52Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoor_113217053210498569.html" rel="alternate" title="Comments for http://tagneto.org/how/quickstart/CustomTag.html" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217053210498569</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/how/quickstart/CustomTag.html</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/how/quickstart/CustomTag.html<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217048314406936" rel="service.edit" title="Comments for http://tagneto.org/how/quickstart/Html.html" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:47:00-08:00</issued>
<modified>2005-11-16T19:48:03Z</modified>
<created>2005-11-16T19:48:03Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoorghowquicksta.html" rel="alternate" title="Comments for http://tagneto.org/how/quickstart/Html.html" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217048314406936</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/how/quickstart/Html.html</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/how/quickstart/Html.html<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217043045852768" rel="service.edit" title="Comments for http://tagneto.org/how" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:46:00-08:00</issued>
<modified>2005-11-16T19:47:10Z</modified>
<created>2005-11-16T19:47:10Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoorghow.html" rel="alternate" title="Comments for http://tagneto.org/how" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217043045852768</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/how</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/how<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217040606526447" rel="service.edit" title="Comments for http://tagneto.org/where" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:45:00-08:00</issued>
<modified>2005-11-16T19:46:46Z</modified>
<created>2005-11-16T19:46:46Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoorgwhere.html" rel="alternate" title="Comments for http://tagneto.org/where" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217040606526447</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/where</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/where<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217027854325298" rel="service.edit" title="Comments for http://tagneto.org/why" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:44:00-08:00</issued>
<modified>2005-11-16T19:45:53Z</modified>
<created>2005-11-16T19:44:38Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoorgwhy.html" rel="alternate" title="Comments for http://tagneto.org/why" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217027854325298</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/why</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/why<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217022280268218" rel="service.edit" title="Comments for http://tagneto.org/what" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:43:00-08:00</issued>
<modified>2005-11-16T19:43:42Z</modified>
<created>2005-11-16T19:43:42Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoorgwhat.html" rel="alternate" title="Comments for http://tagneto.org/what" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217022280268218</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/what</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/what<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113217015188966122" rel="service.edit" title="Comments for http://tagneto.org/" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-16T11:39:00-08:00</issued>
<modified>2005-11-16T19:45:31Z</modified>
<created>2005-11-16T19:42:31Z</created>
<link href="http://tagneto.blogspot.com/2005/11/comments-for-httptagnetoorg.html" rel="alternate" title="Comments for http://tagneto.org/" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113217015188966122</id>
<title mode="escaped" type="text/html">Comments for http://tagneto.org/</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">Entry for allowing comments about the following page:<br/>
<br/>http://tagneto.org/<br/>
<br/>Comments may be modified/purged periodically as the content of the page referenced above changes.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link href="https://www.blogger.com/atom/19002723/113208612514374777" rel="service.edit" title="Tagneto 0.3.0 Released" type="application/atom+xml"/>
<author>
<name>James</name>
</author>
<issued>2005-11-15T12:15:00-08:00</issued>
<modified>2005-11-15T20:23:39Z</modified>
<created>2005-11-15T20:22:05Z</created>
<link href="http://tagneto.blogspot.com/2005/11/tagneto-030-released.html" rel="alternate" title="Tagneto 0.3.0 Released" type="text/html"/>
<id>tag:blogger.com,1999:blog-19002723.post-113208612514374777</id>
<title mode="escaped" type="text/html">Tagneto 0.3.0 Released</title>
<content type="application/xhtml+xml" xml:base="http://tagneto.blogspot.com" xml:space="preserve">
<div xmlns="http://www.w3.org/1999/xhtml">I just released version 0.3.0 of Tagneto.  From <a href="http://tagneto.org/">tagneto.org:</a>
<br/>
<br/>Tagneto is a web developer tool and JavaScript libraries to aid MVC development of XML user interfaces, with HTML web applications (DHTML, AJAX, RIA, Web 2.0, etc...) being the primary target. It is available under the <a href="http://www.opensource.org/licenses/lgpl-license.php" target="_blank">GNU Lesser General Public License (LGPL)</a>.<br/>
<br/>Tagneto includes a "View Assembly" web developer tool written in Java (1.4+ supported). It does not require Java to run on a web server or to be installed on the end user's computer. The Java tool is an HTML/XML parser that allows the web developer to assemble the HTML/XML source into the final set of pages that will be used as the web application. The source does not have to be valid HTML or XML, but the tags that Tagneto handles do have to be well-formed, as defined by one of the <a href="http://tagneto.sourceforge.net/how/quickstart/AlternateSyntax.html">supported syntaxes</a>. Similar technologies to the View Assembly tool would be JSP/ASP/PHP. Read the <a href="http://tagneto.sourceforge.net/why/index.html">Why</a> document to understand the motivation for Tagneto and how it is different (it will also work with JSP/ASP/PHP).<br/>
<br/>Tagneto also comes with some JavaScript (JS) libraries that aid building the Controller in JavaScript ("JavaScript" is used on this web site, even though ECMAScript is the proper name). The helper JS libraries are not required to use the View assembly part of the tool.<br/>
<br/>Tagneto was designed to support internationalization (I18N) and localization (L10N), both in the output pages and in the syntax and wording of the actual Tagneto tags. However, the I18N and L10N support has the least amount of testing, so you may find issues.<br/>
<br/>For more information on Tagneto features (like non-invasive source configuration, overlays, custom tags), please read the <a href="http://tagneto.sourceforge.net/what/index.html">What</a> page.</div>
</content>
<draft xmlns="http://purl.org/atom-blog/ns#">false</draft>
</entry>
</feed>
