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

<channel>
	<title>Not Just a Hat Rack &#187; JavaScript</title>
	<atom:link href="http://notjustahatrack.com/posts/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://notjustahatrack.com</link>
	<description>Development, design, etc.</description>
	<lastBuildDate>Mon, 18 Apr 2011 16:05:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Must-Read JavaScript Articles</title>
		<link>http://notjustahatrack.com/posts/must-read-javascript-articles/</link>
		<comments>http://notjustahatrack.com/posts/must-read-javascript-articles/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 18:50:50 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Must-Read/Reference]]></category>

		<guid isPermaLink="false">http://notjustahatrack.com/?p=51</guid>
		<description><![CDATA[A re-introduction to JavaScript from the Mozilla Developer center. I challenge you to find a more clear and comprehensive overview of the JavaScript language. Covers everything from the history of the language to its more advanced concepts (closures, memory leaks, etc.) Code Conventions for the JavaScript Programming Language from Crockford. The man, the myth, the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="https://developer.mozilla.org/en/A_re-introduction_to_JavaScript">A re-introduction to JavaScript</a> from the Mozilla Developer center.  I challenge you to find a more clear and comprehensive overview of the JavaScript language.  Covers everything from the history of the language to its more advanced concepts (closures, memory leaks, etc.)</p>
<p><a href="http://javascript.crockford.com/code.html">Code Conventions for the JavaScript Programming Language</a> from Crockford.  The man, the myth, the legend.  <a href="http://javascript.crockford.com/">Everything he&#8217;s written about JavaScript</a> should be read, but this article in particular offers a good starting point.</p>
<p><span id="more-51"></span></p>
<p><a href="http://javascript.crockford.com/style1.html">The Elements of JavaScript Style Part One</a>, and <a href="http://javascript.crockford.com/style2.html">Part Two</a>, again from Crockford.  Together with the aforementioned Code Conventions article, they make a pretty good basis for writing clean, efficient code.</p>
<p><a href="http://developer.yahoo.com/performance/rules.html">Best Practices for Speeding Up Your Web Site</a> from Yahoo.  The JavaScript advice is invaluable.  It talks about the big stuff that will actually make a noticeable difference to your users.</p>
<p><a href="http://www.hunlock.com/">The JavaScript Reference Series</a> by Pat Hunlock.  Much more comprehensive and useful than similar, more common references (I&#8217;m looking at you w3Schools).  </p>
]]></content:encoded>
			<wfw:commentRss>http://notjustahatrack.com/posts/must-read-javascript-articles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript Standards</title>
		<link>http://notjustahatrack.com/posts/javascript-standards/</link>
		<comments>http://notjustahatrack.com/posts/javascript-standards/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 19:23:57 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://notjustahatrack.com/?p=40</guid>
		<description><![CDATA[When working with a group of developers, it&#8217;s important to agree on and maintain similar coding practices. Consistency in syntax, structure, and included components will allow for easier cooperation, at little to no expense. Recently I tried to put together a list of such standards for JavaScript development, based on what I believe to be [...]]]></description>
			<content:encoded><![CDATA[<p>When working with a group of developers, it&#8217;s important to agree on and maintain similar coding practices.  Consistency in syntax, structure, and included components will allow for easier cooperation, at little to no expense.  Recently I tried to put together a list of such standards for JavaScript development, based on what I believe to be best practices.  Check it out:</p>
<p><span id="more-40"></span></p>
<h3>Syntax</h3>
<p>Douglas Crockford&#8217;s (extremely detailed) <a href="http://javascript.crockford.com/code.html">JavaScript code conventions</a> article should be gospel.  Also, use his <a href="http://www.jslint.com/">JSLint</a> to &#8220;validate&#8221; code. Warnings can actually cause errors, especially if the code becomes minified. </p>
<h3>General Tenets</h3>
<ul>
<li>Put all scripts at the bottom of the page, directly before the closing body tag, unless it&#8217;s absolutely necessary to put them in the head tag.</li>
<li>jQuery (or other JavaScript framework) should be included by default on any new site build.</li>
<li>JavaScript should not be required for pages to function as intended.</li>
<li>Keep your global JavaScript in a .js file or files. Even if it&#8217;s not a ton of code.  A site&#8217;s main global JavaScript file should follow the convention: [client abbreviation].js. Additional files should follow a similar convention [client abbreviation]-[reason/location].js.</li>
<li>When using third-party plugins/scripts, make every attempt to find something that fits only what you want to accomplish. Keep file size as small as possible.</li>
<li>Strive for reusable code, which should be namespaced, or written in the form of a jQuery plugin.</li>
<li>Minify general/reusable JavaScript components that you don&#8217;t plan on editing often. <a href="http://www.refresh-sf.com/yui/">http://www.refresh-sf.com/yui/</a> or <a href="http://yui.2clics.net/">http://yui.2clics.net/</a> both work. </li>
</ul>
<h3>Firebug</h3>
<p>Simply put, get and use Firebug. Specifically for JavaScript purposes, you&#8217;ll want to use the Console and Script features. </p>
<h4>Console</h4>
<p>Very similar to Firefox&#8217;s built-in JavaScript error console, but gives you the ability to log things to it and test out basically any JavaScript. Use it for the following:</p>
<ul>
<li>Validation: Like Firefox&#8217;s built in &#8220;script debugger&#8221;&#8230; it will tell you if there are JavaScript errors on the page.</li>
<li>Logging Test Values: Use &#8220;console.log()&#8221; whenever you would typically &#8220;alert&#8221; a value for testing purposes. You get much more useful information. See <a href="http://getfirebug.com/logging.html">Firebug and logging</a>.</li>
<li>AJAX Request Tracking: Spits out extremely important request/response info.</li>
</ul>
<p>More:</p>
<ul>
<li><a href="http://getfirebug.com/cl.html">Firebug&#8217;s Console Overview</a></li>
<li><a href="http://www.joehewitt.com/software/firebug/docs.php">Documentation</a></li>
</ul>
<h4>Script</h4>
<p>Mainly for more in depth applications, but still invaluable for troubleshooting. More info:</p>
<ul>
<li><a href="http://getfirebug.com/js.html">Firebug&#8217;s Debugger Overview</a></li>
<li><a href="http://michaelsync.net/2007/09/30/firebug-tutorial-script-tab-javascript-debugging">Tutorial</a></li>
</ul>
<h3>JavaScript Frameworks</h3>
<p>Make use of a JavaScript framework for DOM manipulation, AJAX utilities, animation, etc.  It&#8217;s outside the scope of this standard to argue which framework to use, but we&#8217;ll be assuming the use of jQuery.</p>
<h4>Incorporating jQuery</h4>
<p>Given <a href="http://encosia.com/2008/12/10/3-reasons-why-you-should-let-google-host-jquery-for-you/">this argument,</a> jQuery should be included as such: </p>
<pre><code>
&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js&quot;&gt;&lt;/script&gt;
</code></pre>
<p>Before including jQuery in a new site build, check to make sure you&#8217;re using the most recent version. </p>
<h3>Advanced Topics</h3>
<h4>Object Literal Notation and Namespacing</h4>
<p>The general concept is to mimic a more object-oriented approach to programming, with the added benefits of simplified code and removing the potential for conflicts.  Simple examples:</p>
<ul>
<li><a href="http://www.lixo.org/archives/2007/09/14/javascript-put-everything-in-a-namespace/">http://www.lixo.org/archives/2007/09/14/javascript-put-everything-in-a-namespace/</a></li>
<li><a href="http://www.brainonfire.net/blog/javascript-object-literal-namespace/">http://www.brainonfire.net/blog/javascript-object-literal-namespace/</a></li>
</ul>
<h4>jQuery Plugins</h4>
<p>Writing your own jQuery plugins is good motivation to maintain generalized, reusable, object-oriented code. If there isn&#8217;t an existing plugin, or if the existing plugins are unnecessary complex, then it&#8217;s recommended to <a href="http://www.learningjquery.com/2007/10/a-plugin-development-pattern">roll your own</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://notjustahatrack.com/posts/javascript-standards/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cross-Domain AJAX with DOMAssistant</title>
		<link>http://notjustahatrack.com/posts/cross-domain-ajax-with-domassistant/</link>
		<comments>http://notjustahatrack.com/posts/cross-domain-ajax-with-domassistant/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 19:37:20 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[(X)HTML]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://notjustahatrack.com/?p=28</guid>
		<description><![CDATA[In a previous post I mentioned that I would revisit cross-domain AJAX calls to measure the helpfulness of JavaScript frameworks like DOMAssistant and Prototype. In this post I&#8217;ll use DOMAssistant to perform the same basic tests I did previously, while evaluating the potential increase in efficiency. Creating a XMLHttp Object The first thing you&#8217;ll notice [...]]]></description>
			<content:encoded><![CDATA[<p>In a <a href="/posts/cross-domain-ajax-without-javascript-frameworks/">previous post</a> I mentioned that I would revisit cross-domain AJAX calls to measure the helpfulness of JavaScript frameworks like <a href="http://www.domassistant.com/">DOMAssistant</a> and <a href="http://www.prototypejs.org/">Prototype</a>.  In this post I&#8217;ll use DOMAssistant to perform the same basic tests I did previously, while evaluating the potential increase in efficiency.<span id="more-28"></span></p>
<h3>Creating a <code>XMLHttp</code> Object</h3>
<p>The first thing you&#8217;ll notice when using the aid of a JavaScript framework AJAX library is that you don&#8217;t have to bother creating a <code>XMLHttp</code> object.  That means right off the bat you&#8217;ll save yourself some (often painful) cross-browser scripting.  You can also be assured that any future improvements to this object implementation will be delivered to your code as long as you keep the framework updated.  Thank you JavaScript frameworks!</p>
<h3>Setting Up and Sending the Request</h3>
<p>Here&#8217;s the code I wrote earlier to perform both get and post requests without the help of a framework:</p>
<pre><code>
// Create and send an XMLHttp request
function doRequest(url, postVars) {
	// Get the request object (see previous function)
	req = getReqObject()
	// Make sure we have a XMLHttp object created
	if (req) {
		// If it's a post, we have to create and send the request slightly differently.
		if (postVars) {
			req.open('POST', url, true);
			req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			req.send(postVars);
		} else {
			req.open('GET', url, true);
			req.send(null);
		}
		// Set the function that handles the results
		req.onreadystatechange = function () { displayContents(req) };
	}
}

// Request via GET
doRequest('test.php?var=1', null);

// Request via POST
doRequest('test.php', 'var=1');
</code></pre>
<p>With DOMAssistant, you have to decide before your call what you are going to do with the data.  For simple calls where you just need to return the text, you can use the library&#8217;s <code>get</code> or <code>post</code> methods:</p>
<pre><code>
// Request via GET
DOMAssistant.AJAX.get('test.php?var=1', displayContents);

// Request via POST
DOMAssistant.AJAX.post('test.php?var=1', displayContents);
</code></pre>
<p>However, if you need an XML result that you can parse (like in our working example), you&#8217;ll need to make more complex calls:</p>
<pre><code>
// Create and send an XMLHttp request
function doRequest(url, postVars) {
	// If it's a post, we have to create and send the request slightly differently.
	if (postVars) {
		DOMAssistant.AJAX.ajax({
			url: url,
			method: "POST",
			params : postVars,
			callback: displayContents,
			responseType: "xml",
			headers : {
				"Content-type" : "application/x-www-form-urlencoded"
			}
		});
	} else {
		DOMAssistant.AJAX.ajax({
			url: url,
			method: "GET,
			callback: displayContents,
			responseType: "xml"
		});
	}
	// Set the function that handles the results
	req.onreadystatechange = function () { displayContents(req) };
}

// Request via GET
doRequest('test.php?var=1', null);

// Request via POST
doRequest('test.php', 'var=1');
</code></pre>
<p>As you can see, if you need an XML document for additional post-processing, you&#8217;ll end up with almost as much code with DOMAssistant!</p>
<h3>Handling the Result</h3>
<p>Here&#8217;s the function I wrote to alert specific data from the response content:</p>
<pre><code>
// Display resulting content from req
function displayContents(req) {
	// Only do something when the request is done
	if (req.readyState == 4) {
		// Make sure it was a success
		if (req.status == 200) {
			// Traverse the resulting XML, alerting titles of items
			var xml = req.responseXML;
			var items = xml.getElementsByTagName("item");
			for (var i = 0; i &lt; items.length; i++) {
				alert(items[i].getElementsByTagName('title').item(0).firstChild.nodeValue);
			}
		} else {
			alert('Problem with the request.');
		}
	}
}
</code></pre>
<p>An odd thing about DOMAssistant is that your specified callback function is hardcoded in the framework to be executed after the request is complete.  This means you won&#8217;t be able to troubleshoot based on the ready state of the request.  I also found that the callback function doesn&#8217;t have access to the status of the completed request, meaning you won&#8217;t know if your request was successful or not.  I&#8217;m sure there were logical reasons by the developers for this, but in the meantime all you can do is work with the response text.</p>
<p>If you used the <code>get</code> or <code>post</code> methods, you&#8217;ll be provided the text of the response:</p>
<pre><code>
// Display resulting content from responseText
function displayContents(rText) {
	alert(rText);
}
</code></pre>
<p>For our example, we needed an XML document, and as such we need to loop through and extract the information in much the same manner as we did before:</p>
<pre><code>
// Display resulting content from req
function displayContents(rXML) {
	var items = rXML.getElementsByTagName("item");
	for (var i = 0; i &lt; items.length; i++) {
		alert(items[i].getElementsByTagName('title').item(0).firstChild.nodeValue);
	}
}
</code></pre>
<p>As you can see there really isn&#8217;t <em>any</em> difference here except that DOMAssistant actually limits our troubleshooting capabilities.</p>
<h3>Cross-Domain Requests</h3>
<p>JavaScript frameworks don&#8217;t provide a built-in solution for addressing cross-domain request security issues.  In fact, the Prototype documentation makes this extremely prominent at the top of their documentation:</p>
<blockquote><p>
Remember that for security reasons (that is preventing cross-site scripting attacks) Ajax requests can only be made to URLs of the same protocol, host and port of the page containing the Ajax request. Some browsers might allow arbitrary URLs, but you shouldn&#8217;t rely on support for this.
</p></blockquote>
<h3>Conclusion</h3>
<p>All in all I&#8217;m rather disappointed with DOMAssistant&#8217;s AJAX library.  For very simple tasks like grabbing, posting and printing text it works great.  But for complicated cases, it offers little to no benefit.  It could be effective if used in conjunction with a more complex server-side proxy, so that the proxy could handle parsing and the DOMAssistant would just have to retrieve and display text.  Next time I&#8217;ll take a look at Prototype, and see if it offers more flexible and comprehensive functionality.</p>
]]></content:encoded>
			<wfw:commentRss>http://notjustahatrack.com/posts/cross-domain-ajax-with-domassistant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Embeddable WYSIWYG Editors</title>
		<link>http://notjustahatrack.com/posts/embeddable-wysiwyg-editors/</link>
		<comments>http://notjustahatrack.com/posts/embeddable-wysiwyg-editors/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 20:36:14 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://notjustahatrack.com/?p=27</guid>
		<description><![CDATA[I&#8217;ve had several projects in the past few months which have called for some limited content management capabilities. In cases like these, where only small sections of the site need to be handled by an administrator, it seems silly to build the entire site on top of existing CMS platforms like Joomla or Drupal. The [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had several projects in the past few months which have called for some limited content management capabilities.  In cases like these, where only small sections of the site need to be handled by an administrator, it seems silly to build the entire site on top of existing CMS platforms like <a href="http://joomla.org/">Joomla</a> or <a href="http://drupal.org/">Drupal</a>. The problem is, if you build a small administration area, you&#8217;ll have to have some mechanism for specifying simple HTML content for the non-tech savvy.<span id="more-27"></span></p>
<p>A co-worker recommended <a href="http://fckeditor.net/">FCKeditor</a>, so I implemented it in a recent administration interface to control text for a few pages.  So far it&#8217;s worked extremely well, and was a breeze to implement.  Here&#8217;s a summary of my implementation:</p>
<ul>
<li><a href="http://www.fckeditor.net/download">Downloaded</a>, unzipped, and stored the FCKeditor files</li>
<li>Created a custom editor style file (myeditorstyles.css), and put the site&#8217;s content styling rules in it so the editor would mimic the site&#8217;s style</li>
<li>Created a custom configuration file (myconfig-default.js), which serves to remove a bunch of the unnecessary functionality, and reference the style:</li>
</ul>
<pre><code>
FCKConfig.FontFormats = 'h1;h2;h3;p';
FCKConfig.ToolbarCanCollapse = false;
FCKConfig.EditorAreaCSS = '/lib/includes/FCKeditor/myeditorstyles.css';
FCKConfig.ToolbarSets[&quot;Default&quot;] = [
	['Save'],
	['Undo','Redo'],
	['Bold','Italic','Underline'],
	['OrderedList','UnorderedList','-','Outdent','Indent'],
	['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
	['Link','Unlink'],
	['FontFormat'],
	['About', 'Source']
];
</code></pre>
<ul>
<li>Included the initialization files on the pages I put the editor:</li>
</ul>
<pre><code>
&lt;?php
include_once(&quot;[myeditorpath]/fckeditor.php&quot;) ;
?&gt;
</code></pre>
<ul>
<li>Then referenced the editor where I wanted to add it in my code:</li>
</ul>
<pre><code>
$oFCKeditor = new FCKeditor([myeditorid]);
$oFCKeditor-&gt;BasePath = '/[myeditorpath]/';
$oFCKeditor-&gt;Config[&quot;CustomConfigurationsPath&quot;] = &quot;/[myeditorpath]/myconfig-default.js&quot;;
$oFCKeditor-&gt;Height = '500';
$oFCKeditor-&gt;Create();
</code></pre>
<p>That&#8217;s it!  There&#8217;s a ton of other customization options, help with implementation, and general resources in <a href="http://docs.fckeditor.net/">the documentation</a>.</p>
<h3>Other Options</h3>
<p>I highly recommend FCKeditor, but if it doesn&#8217;t work for some reason you can always try <a href="http://tinymce.moxiecode.com/">TinyMCE</a> or <a href="http://openwebware.com/">openwysiwyg</a>.  Both seem full-featured and easy to implement, and both have significant recent activity.  </p>
<p>If you think content won&#8217;t require any additional HTML formatting, you could always just programmatically replace line breaks in text areas with HTML line breaks and vice versa.  This would allow the administrator to use carriage returns to separate text, but would require some HTML knowledge for additional formatting.</p>
]]></content:encoded>
			<wfw:commentRss>http://notjustahatrack.com/posts/embeddable-wysiwyg-editors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Synching Flash Elements with JavaScript</title>
		<link>http://notjustahatrack.com/posts/synching-flash-with-javascript/</link>
		<comments>http://notjustahatrack.com/posts/synching-flash-with-javascript/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 18:47:42 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://notjustahatrack.com/?p=26</guid>
		<description><![CDATA[I recently worked on a site which called for two separate Flash elements to begin their actions simultaneously. Our extremely talented Flash developer couldn&#8217;t accomplish this using only the Flash, as they were two completely separate files. Enter Flash&#8217;s ExternalInterface. This new (to versions 8 and above) object allows for easier-than-ever coordination between JavaScript and [...]]]></description>
			<content:encoded><![CDATA[<p>I recently worked on a site which called for two separate Flash elements to begin their actions simultaneously.  Our <a href="http://ae4rv.com/">extremely talented Flash developer</a> couldn&#8217;t accomplish this using only the Flash, as they were two completely separate files.  Enter Flash&#8217;s <a href="http://livedocs.adobe.com/flash/8/main/00002200.html">ExternalInterface</a>.  This new (to versions 8 and above) object allows for easier-than-ever coordination between JavaScript and Flash.<span id="more-26"></span> After our Flash guy implemented it and added some functions for me to reference, I was able to make calls to each file and tell them to start at the same time when they were ready.</p>
<h3>The Code</h3>
<p>First you&#8217;ll have to set up your Flash with two functions, one which will return the &#8220;ready state&#8221; of the element (just return true when you have loaded sufficiently), and another which will start the action.  Then you just have to reference the functions in the following code: </p>
<pre><code>
// Given an array of flash element references,
// these functions will ensure they are ready,
// then launch them more or less simultaneously
var flashLoader = flashLoader ? flashLoader : {
	flash: new Array(),
	checkInterval: 1000,

	// Get references to flash elements
	init: function(elms) {
		for (var i = 0; i &lt; elms.length; i++) {
			flashLoader.flash[i] = document.getElementById(elms[i]);
		}
		flashLoader.checkReady();
	},

	// Make sure they are both ready
	checkReady: function() {
		// Bail if an element is not ready
		for (var i = 0; i &lt; flashLoader.flash.length; i++) {
			if (!flashLoader.flash[i].ready || !flashLoader.flash[i].ready()) {
				setTimeout(flashLoader.checkReady,flashLoader.checkInterval);
				return false
			}
		}
		// If we got this far, launch the elements!
		flashLoader.startThem();
	}, 

	// Start the flash elements
	startThem: function() {
		for (var i = 0; i &lt; flashLoader.flash.length; i++) {
			flashLoader.flash[i].commence();
		}
	}
}

// Load the init without screwing anything up
loadLoader = function () {
	flashLoader.init( ['yourFlash1', 'yourFlash2'] );
}
var oldonload = window.onload;
if (typeof window.onload != 'function') {
	window.onload = loadLoader;
} else {
	window.onload = function() {
		oldonload();
		loadLoader();
	}
}
</code></pre>
<p>Notice the two Flash function calls: </p>
<pre><code>
if (!flashLoader.flash[i].ready || !flashLoader.flash[i].ready()) {
</code></pre>
<p>&#8230;and:</p>
<pre><code>
flashLoader.flash[i].commence();
</code></pre>
<p>In some cases you don&#8217;t have to perform the ready check, because calling the function on load of the page means it waits until <em>after</em> the Flash is completely loaded.  But in other browsers (Safari), the JavaScript is executed earlier, and as such needs the ready check.</p>
]]></content:encoded>
			<wfw:commentRss>http://notjustahatrack.com/posts/synching-flash-with-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

