<?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>JonnyReeves.co.uk &#187; actionscript</title>
	<atom:link href="http://www.jonnyreeves.co.uk/tag/actionscript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jonnyreeves.co.uk</link>
	<description>Actionscript, Flash, PHP and stuff</description>
	<lastBuildDate>Mon, 19 Jul 2010 15:36:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>FDT and FlexUnit 4.1 Beta</title>
		<link>http://www.jonnyreeves.co.uk/2010/06/fdt-and-flexunit-4-1-beta/</link>
		<comments>http://www.jonnyreeves.co.uk/2010/06/fdt-and-flexunit-4-1-beta/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 16:26:22 +0000</pubDate>
		<dc:creator>Jonny</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[fdt]]></category>
		<category><![CDATA[flexunit]]></category>

		<guid isPermaLink="false">http://www.jonnyreeves.co.uk/?p=185</guid>
		<description><![CDATA[FlexUnit 4 was a massive leap forward for Test Driven ActionScript 3 Development allowing us to make use of metadata annotations, hamcrest and easier asynchronous testing and I was delighted to discover that the flexunit.org team are still busy working away preparing for the next milestone release of FlexUnit 4.1 which boasts some great new [...]]]></description>
			<content:encoded><![CDATA[<p>FlexUnit 4 was a massive leap forward for Test Driven ActionScript 3 Development allowing us to make use of metadata annotations, hamcrest and easier asynchronous testing and I was delighted to discover that the <a href="http://flexunit.org/">flexunit.org</a> team are still busy working away preparing for the next milestone release of <a href="http://github.com/flexunit/flexunit/downloads">FlexUnit 4.1</a> which boasts some <a href="http://www.flexunit.org/?p=62">great new features</a>, my favourite being an ANT Task to generate TestSuite&#8217;s automatically (something that only Antennae appeared to offer before).</p>
<p>This wiki post will show you how to get the FlexUnit 4.1 beta up and running in <a href="http://www.fdt.powerflasher.com/developer-tools/fdt-3/home/">FDT 3.5</a> by making use of the FlexUnit ANT tasks.</p>
<p>First up we will download the FlexUnit 4.1 beta; I will be downloading the <a href="http://www.flexunit.org/releases/flexunit-4.1.0-beta1-flex3.5-AS3.zip">build for FlexSDK 3.5, AS3 Pure</a>.</p>
<p>Once unzipped, you will want to add the FlexUnit 4.1 libraries to your project&#8217;s libs folder; once copied across your project should look something like the screenshot below:</p>
<div id="attachment_186" class="wp-caption aligncenter" style="width: 486px"><img src="http://www.jonnyreeves.co.uk/wp-content/uploads/2010/06/flexunit4.1-libs.PNG" alt="Copying the FlexUnit 4.1 libs into your FDT project" title="flexunit4.1-libs" width="476" height="374" class="size-full wp-image-186" /><p class="wp-caption-text">Copying the FlexUnit 4.1 libs into your FDT project</p></div>
<p>Once you have copied the FlexUnit 4.1 libs into your project you will want to add the FlexUnit core library SWC to your FDT Class Path so you get code completion on FlexUnit methods; this is done by right-clicking on the <b>flexunit-core-4.1.0-beta1.swc</b> file; again see the screnshow below:<br />
<div id="attachment_187" class="wp-caption aligncenter" style="width: 510px"><img src="http://www.jonnyreeves.co.uk/wp-content/uploads/2010/06/flexunit4.1-add-to-classpath.PNG" alt="Adding the FlexUnit 4.1 Core SWC to your project&#039;s Class Path" title="flexunit4.1-add-to-classpath" width="500" class="size-full wp-image-187" /><p class="wp-caption-text">Adding the FlexUnit 4.1 Core SWC to your project's Class Path</p></div></p>
<p>Next up we will add a very simple, sample test to the project, start by adding a new &#8220;Source Folder&#8221; to your project by selecting File -> New -> Source Folder; name the folder <b>test-src</b>.  Now create a new ActionScript Class in the test-src folder and name it TestExample.as.</p>
<p>Because FlexUnit 4 is driven by metadata, there is no need to extend a base class; instead you just need to annotate the methods which represent test with the <b>[Test]</b> metadata tag.  Our example test will do nothing, but will at least allow FlexUnit 4.1 to fire up and show some output:</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
package &nbsp;<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">import</span> org.<span class="me1">flexunit</span>.<span class="me1">asserts</span>.<span class="me1">assertTrue</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* An example Test Case to get FlexUnit 4.1 Beta up and running.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @author Jonny Reeves<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">class</span> TestExample <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>Test<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> exampleTest<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Not much of a test! :)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; assertTrue<span class="br0">&#40;</span><span class="st0">&quot;FlexUnit 4.1 Beta is running under FDT&quot;</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>The final step is to setup the ANT Build File which will automatically create our TestSuite and launch the FlexUnit 4 Visual Test Runner to display the outcome of our test.  If you have not used ANT before in FDT then you may need to open the ANT View by selecting Window -> Show View -> Ant.</p>
<p>Create a new file named <b>build.xml</b> in your project; when you open this file for editing FDT should automatically fire up the ANT editor which provides syntax highlighting for you.  Start off by creating a barebones ANT file:</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="sc3"><span class="re1">&lt;project</span> <span class="re0">name</span>=<span class="st0">&quot;FlexUnit4.1-Example&quot;</span><span class="re2">&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;/project<span class="re2">&gt;</span></span></span><br />
&nbsp;</div>
<p>Now drag the build.xml into the ANT View; once added it should appear like the screenshot below:</p>
<div id="attachment_189" class="wp-caption aligncenter" style="width: 510px"><img src="http://www.jonnyreeves.co.uk/wp-content/uploads/2010/06/flexunit4.1-buildfile.PNG" alt="Creating an ANT BuildFile and adding it to the ANT View" title="flexunit4.1-buildfile" width="500" class="size-full wp-image-189" /><p class="wp-caption-text">Creating an ANT BuildFile and adding it to the ANT View</p></div>
<p>Now we want to create a new Build Task which will generate a Test Suite from our test-src folder and then compile a FlexUnit 4.1 SWF which runs those tests.</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="sc3"><span class="re1">&lt;project</span> <span class="re0">name</span>=<span class="st0">&quot;FlexUnit4.1-Example&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="coMULTI">&lt;!&#8211; Update this property to point to your FLEX SDK; note there is<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a bug in FlexUnit 4.1 Beta 1 where the FLEX SDK path must<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NOT include any spaces, otherwise you will get an error during<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; the MXMLC compilation stage; this has already been fixed in the<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; latest Builds of FlexUnit 4.1, see: http://bit.ly/dpHcHT &#8211;&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;FLEX_HOME&quot;</span> <span class="re0">location</span>=<span class="st0">&quot;${eclipse.fdt.flexsdk}&quot;</span> <span class="re2">/&gt;</span></span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;bin.dir&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;${basedir}/bin&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;report.dir&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;${basedir}/reports&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;lib.dir&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;${basedir}/libs&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;test-src.dir&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;${basedir}/test-src&quot;</span> <span class="re2">/&gt;</span></span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;taskdef</span> <span class="re0">resource</span>=<span class="st0">&quot;flexTasks.tasks&quot;</span> <span class="re0">classpath</span>=<span class="st0">&quot;${FLEX_HOME}/ant/lib/flexTasks.jar&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;taskdef</span> <span class="re0">resource</span>=<span class="st0">&quot;flexUnitTasks.tasks&quot;</span> <span class="re0">classpath</span>=<span class="st0">&quot;${lib.dir}/flexUnitTasks-4.1.0-beta1.14.jar&quot;</span> <span class="re2">/&gt;</span></span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="coMULTI">&lt;!&#8211; Run FlexUnit 4.1 and generate JUnit Output &#8211;&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;target</span> <span class="re0">name</span>=<span class="st0">&quot;test&quot;</span> <span class="re0">depends</span>=<span class="st0">&quot;init&quot;</span> <span class="re0">description</span>=<span class="st0">&quot;Run Unit Tests&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;flexunit</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">workingDir</span>=<span class="st0">&quot;${bin.dir}&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">toDir</span>=<span class="st0">&quot;${report.dir}&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">verbose</span>=<span class="st0">&quot;true&quot;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">haltonfailure</span>=<span class="st0">&quot;true&quot;</span><span class="re2">&gt;</span></span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;testSource</span> <span class="re0">dir</span>=<span class="st0">&quot;${test-src.dir}&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;include</span> <span class="re0">name</span>=<span class="st0">&quot;**/*Test*.as&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/testSource<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;library</span> <span class="re0">dir</span>=<span class="st0">&quot;${lib.dir}&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/flexunit<span class="re2">&gt;</span></span></span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;junitreport</span> <span class="re0">todir</span>=<span class="st0">&quot;${report.dir}&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;fileset</span> <span class="re0">dir</span>=<span class="st0">&quot;${report.dir}&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;include</span> <span class="re0">name</span>=<span class="st0">&quot;TEST-*.xml&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/fileset<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;report</span> <span class="re0">format</span>=<span class="st0">&quot;frames&quot;</span> <span class="re0">todir</span>=<span class="st0">&quot;${report.dir}/html&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/junitreport<span class="re2">&gt;</span></span></span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/target<span class="re2">&gt;</span></span></span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="coMULTI">&lt;!&#8211; Create the required directories and clean out the reports folder &#8211;&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;target</span> <span class="re0">name</span>=<span class="st0">&quot;init&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;delete</span> <span class="re0">dir</span>=<span class="st0">&quot;${report.dir}&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;mkdir</span> <span class="re0">dir</span>=<span class="st0">&quot;${bin.dir}&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;mkdir</span> <span class="re0">dir</span>=<span class="st0">&quot;${report.dir}&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/target<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/project<span class="re2">&gt;</span></span></span><br />
&nbsp;</div>
<p>Once you&#8217;re build file is setup you can execute the <b>test</b> ANT task.  If the task completes succesfully, FlexUnit will have populated the reports folder with both JUnit style reports and an HTML version which can be opened in a web browser.</p>
<div id="attachment_190" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.jonnyreeves.co.uk/wp-content/uploads/2010/06/flexunit4.1-testresults.PNG"><img src="http://www.jonnyreeves.co.uk/wp-content/uploads/2010/06/flexunit4.1-testresults-300x175.PNG" alt="SUCCESS! My Test Passed :)" title="flexunit4.1-testresults" width="300" height="175" class="size-medium wp-image-190" /></a><p class="wp-caption-text">SUCCESS! My Test Passed :)</p></div>
<p>If the build fails then the Output Console view should provide you with some debugging hints; if you are using FlexUnit 4.1 Beta 1 then make sure your Flex SDK path does not include any spaces (this particular bug will be fixed in beta 2 of FlexUnit 4.1).</p>
<p>Further reading:</p>
<ul>
<li><a href="http://docs.flexunit.org/index.php?title=Ant_Task">FlexUnit ANT Task documentation</a></li>
<li><a href="http://forums.adobe.com/community/opensource/flexunit">FlexUnit Support Forum</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jonnyreeves.co.uk/2010/06/fdt-and-flexunit-4-1-beta/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Reducing the size of SWF Files</title>
		<link>http://www.jonnyreeves.co.uk/2010/06/reducing-the-size-of-swf-files/</link>
		<comments>http://www.jonnyreeves.co.uk/2010/06/reducing-the-size-of-swf-files/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 20:20:11 +0000</pubDate>
		<dc:creator>Jonny</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[filesize]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[mxmlc]]></category>
		<category><![CDATA[optimisation]]></category>

		<guid isPermaLink="false">http://www.jonnyreeves.co.uk/?p=180</guid>
		<description><![CDATA[Over at Moshi HQ, we&#8217;ve spent a fair bit of time looking at how to reduce the size of the SWFs we publish; here&#8217;s a quick checklist to rattle through to get the most bang for your buck (or in this case, Kb)
1. Joa Ebert&#8217;s Apparat.
Joa is an ActionScript hero (infact he won an award [...]]]></description>
			<content:encoded><![CDATA[<p>Over at Moshi HQ, we&#8217;ve spent a fair bit of time looking at how to reduce the size of the SWFs we publish; here&#8217;s a quick checklist to rattle through to get the most bang for your buck (or in this case, Kb)</p>
<p>1. Joa Ebert&#8217;s Apparat.<br />
Joa is an ActionScript hero (infact <a href="http://blog.joa-ebert.com/2010/06/10/fatc-awards/">he won an award</a> to prove it); one of his tools is <a href="http://blog.joa-ebert.com/2010/05/07/apparat-crunching-swf-files-since-2009/">Apparat</a>; a Scala application which optimises SWFs by tinkering with the compression they use.  Apparat is a real quick win as once you&#8217;ve integrated it into your build process you will immediately being reaping the rewards.</p>
<p>2. Sothink SWF Decompiler<br />
Yes, number two on my list is a decompiler; this is not a mistake.  <a href="http://www.sothink.com/product/flashdecompiler/index.htm">Sothink SWF Decompiler</a> is an essential part of the optimisation process as it allows you to explore all the assets, ActionScript classes, fonts, bitmaps, etc which are lurking around in your SWF &#8211; think of it like a visual Size Report for a SWF.</p>
<p>3. Make use of Run Time Shared Libraries<br />
Flex developers seem very comfortable with <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=rsl_02.html#220675">Runtime Shared Libraries</a>, but it&#8217;s something that most ActionScript dev&#8217;s aren&#8217;t so hot on.  The MXMLC compiler provides a couple of ways to reduce the size of your published SWF by allowing you to automatically exclude duplicated class definitions across SWFs loaded at run time.   The problem is a very simple one; you have a Main application which loads in a bunch of child &#8220;sub apps&#8221; into the same Application Domain; both of the SWFs end up with the same classes compiled into them (for example, you may be using famework elements in both) &#8211; because the Main application SWF has already loaded these classes there is no need to include them into the child swf as well.  </p>
<p>The simplest MXMLC compiler flag you can use is, <b>runtime-shared-libraries</b>, simply point it at the location of your Main SWF when compiling the subapps and it will do the rest for you. Alternatively, Those of you who worked in AS2 back in the day may recall the old <a href="http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&#038;file=00000817.html">exclude.xml</a>; well it&#8217;s still alive and kicking with MXMLC, it just goes under the name of <b>link-report</b>.</p>
<p>The process is pretty straight forward, compile your main application supplying the link-report flag, this will dump out an XML file.  Next, compile all your subapps supplying the load-externs flag.  <a href="http://www.bit-101.com/blog/?p=941">Keith Peters goes into more detail on his blog</a>.</p>
<p>4. Check your Compiler Flags<br />
This may seem pretty obvious, but it&#8217;s important to check; The MXMLC compiler which ships with the Flex SDK supports a <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=compilers_14.html">crazy number of switches and options</a>, the following options can impact on the size of the compiled SWF:</p>
<ul>
<li><b>debug</b> &#8211; Pretty obvious, if you set the debug flag to true when compiling, MXMLC will embed a whole bunch of debugging information to your SWF, bloating out the filesize.  The main thing to watch out for is that you don&#8217;t end up deploying SWFs compiled with the debug flag set to true on your live server.  Sames goes for the <b>optimise</b> and <b>verbose-stacktraces</b> flags</li>
<li><b>include-libraries</b> &#8211; Make sure that you didn&#8217;t mean to use <i>library-path</i> instead!  include-libraries will compile the entire contents of a SWC into your final SWF file even if you never actually use any of it! Using library-path, on the other hand, results in only the classes which you import being compiled into the SWF</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jonnyreeves.co.uk/2010/06/reducing-the-size-of-swf-files/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>My Development Environment.</title>
		<link>http://www.jonnyreeves.co.uk/2008/11/my-development-environment/</link>
		<comments>http://www.jonnyreeves.co.uk/2008/11/my-development-environment/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 20:49:00 +0000</pubDate>
		<dc:creator>Jonny</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[fdt]]></category>
		<category><![CDATA[pdt]]></category>
		<category><![CDATA[sendmail]]></category>
		<category><![CDATA[vista]]></category>

		<guid isPermaLink="false">http://www.jonnyreeves.co.uk/?p=63</guid>
		<description><![CDATA[I spend most of my development time sat in Eclipse, I find it funny (or maybe slightly alarming) that only four moths ago I had never ventured near an Integrated Development Environment and spent a lot of time toiling away with a Crimson Editor.  All I can say is that if you haven&#8217;t tried getting [...]]]></description>
			<content:encoded><![CDATA[<p>I spend most of my development time sat in Eclipse, I find it funny (or maybe slightly alarming) that only four moths ago I had never ventured near an Integrated Development Environment and spent a lot of time toiling away with a Crimson Editor.  All I can say is that if you haven&#8217;t tried getting to grips with Eclipse, then now is the time.</p>
<p>As my work is split between programming in PHP and ActionScript, I use Flex Builder as the base for my Eclipse Setup (Flex Builder 3 is built ontop of the Eclipse 3.3 platform).  Flex Builder comes with an ActionScript parser and debugger.  The parser is not as good as <a href="http://fdt.powerflasher.com/">FDT</a> (which I use at work), but is a damn sight cheaper which is always welcome.   Eclipse is incredibly modular and allows you to enhance it&#8217;s basic functionality buy installing components which provide additional perspective and functionality.   I make use of the following:</p>
<ul>
<li><a href="http://wiki.eclipse.org/PDT/Installation#Eclipse_3.3_.2F_Europa_.2F_PDT_1.0">PDT</a> 1.x &#8211; PHP Development Tool, includes code completion and syntax highlighting.</li>
<li><a href="http://subclipse.tigris.org/">Subclipse</a> 1.4 &#8211; SVN Integration for eclipse, essentail for checking in my own code and 3rd party code which I make sure of (Such as the CakePHP Core).  Again, if you&#8217;re not using SVN then you really should!</li>
</ul>
<p>I keep my PHP and ActionScript development seperate by using two Workspaces and swtiching between the two (I do a similar thing at work by having two workspaces for our ActionScript 2 and ActionScript 3 projects at <a href="http://mindcandy.com/">Mindcandy</a>).  To avoid any potential UAC problems in Vista, I make sure that my Workspace is located in my User folder &#8211; this also helps with backups keeping everything in one place.</p>
<p>To back this up, I run a straight forward Apache 2.2, MySQL 5 and PHP 5.2 stack ontop of Windows Vista x64 (Even with UAC turned on!).  I had no problems installing the stack, I just made sure that everything was installed inside my User folder.  (ie: C:\Users\Jonny\Webroot\Apache2-2, etc).  I configure individual vhosts for the projects I work on and point the webroot at my Eclipse Workspace (ie: C:\Users\Jonny\Projects\PHP\Project_Name). This allows me to simulate a webdeploy environment which makes deploying sites to a web server easier.  To complete my local dev setup I setup <a href="http://bfish.xaedalus.net/?p=163">fake sendmail</a> which allows the mail() funcitons inside PHP 5 to be relayed to a remote mail server (very handy! &#8212; again, I was suprised that this worked without a hitch on Vista x64).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonnyreeves.co.uk/2008/11/my-development-environment/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The State of Logging in ActionScript 3</title>
		<link>http://www.jonnyreeves.co.uk/2008/10/the-state-of-logging-in-actionscript-3/</link>
		<comments>http://www.jonnyreeves.co.uk/2008/10/the-state-of-logging-in-actionscript-3/#comments</comments>
		<pubDate>Sun, 19 Oct 2008 11:14:45 +0000</pubDate>
		<dc:creator>Jonny</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[logging]]></category>
		<category><![CDATA[utils]]></category>

		<guid isPermaLink="false">http://www.jonnyreeves.co.uk/?p=62</guid>
		<description><![CDATA[I&#8217;ve been looking at Logging Frameworks in ActionScript 3 over the past few days and I&#8217;m afraid that I&#8217;m slightly at a loss as for which approach is the best to take.  There are a few Logging Frameworks out there, but Adobe has kindly supplied an intrinic Logging Framework, however, it&#8217;s not without it&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been looking at Logging Frameworks in ActionScript 3 over the past few days and I&#8217;m afraid that I&#8217;m slightly at a loss as for which approach is the best to take.  There are a few Logging Frameworks out there, but Adobe has kindly supplied an intrinic Logging Framework, however, it&#8217;s not without it&#8217;s shortcomings.</p>
<p>The biggest problem that I&#8217;ve come up against is that there is no easy way to set the Category for the Log.  The Flex Logging Framework allows you to set the category of the log when you retrieve the ILogger instance.  This can in turn be used by the Log Filtering system to specify which categories you would like to log.  Ideally you set the category String to be the name of the Class you are currently Logging, however, due to the rather shaky reflection tools available, there&#8217;s no easy way to automatically get the name of the current Class.  To compound the problem even further, getQualifiedClassName returns illegal characters (The semi-colon separating the Package and the Class Name) and Flex Logging Framework will throw and Illegal Arguments error if you try and use it as the category name.  So, in order to have automatic categories generated, we have to do a bit of a curly shuffle with a StackTrace and a Helper Method</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
package uk.<span class="me1">co</span>.<span class="me1">jonnyreeves</span>.<span class="me1">logging</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">import</span> mx.<span class="me1">logging</span>.<span class="me1">ILogger</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">import</span> mx.<span class="me1">logging</span>.<span class="me1">ILoggingTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">import</span> mx.<span class="me1">logging</span>.<span class="kw3">Log</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">import</span> flash.<span class="me1">utils</span>.<span class="me1">getQualifiedClassName</span>;&nbsp; &nbsp; &nbsp; &nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Flex Logger Helper, automatically returns the Category Name when used inside<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* a Class.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @author jonny reeves<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">class</span> Logger <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Returns an instance of Flex Logger with the correct category name for the calling Class<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @return ILogger instance with the correct category set for the calling Class.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">function</span> getLogger<span class="br0">&#40;</span><span class="br0">&#41;</span> : ILogger<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> category : <span class="kw3">String</span> = <span class="st0">&quot;&quot;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; category = getCallerFromStackTrace<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">Log</span>.<span class="me1">getLogger</span><span class="br0">&#40;</span>category<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Triggers a StackTrace and extracts the calling method from it, neat.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">function</span> getCallerFromStackTrace<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">String</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> callerMethod : <span class="kw3">String</span> = <span class="st0">&quot;&quot;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> nullArray : <span class="kw3">Array</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Pop a StackTrace by creating a RunTime error.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nullArray.<span class="kw3">push</span><span class="br0">&#40;</span><span class="st0">&quot;whoops&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">catch</span> <span class="br0">&#40;</span><span class="kw3">e</span> : <span class="kw3">Error</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> stackTrace : <span class="kw3">String</span> = <span class="kw2">new</span> <span class="kw3">Error</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Extract the ClassName from the StackTrack</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>stackTrace != <span class="kw2">null</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> parts : <span class="kw3">Array</span> = <span class="kw2">new</span> <span class="kw3">Array</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stackTrace.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>.<span class="kw3">join</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parts = stackTrace.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&quot;&nbsp; &nbsp; &nbsp; at &quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>parts<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span> != <span class="kw2">null</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Handle Both Class Init and internal method cases</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>parts<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span>.<span class="kw3">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;$cinit&quot;</span><span class="br0">&#41;</span> != <span class="nu0">-1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; callerMethod = parts<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&quot;$cinit&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; callerMethod = parts<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&quot;/&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> getCategoryNameFor<span class="br0">&#40;</span>callerMethod<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Helper method which takes an ActionScript 3 Formatted Class Name<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* and replaces the semi-colons seperating the package and Class name<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* with a Single Period for use as teh Flex Logging Category name<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param qualifiedClassName<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @return String Legal Flex Logging Category String<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">function</span> getCategoryNameFor<span class="br0">&#40;</span>qualifiedClassName : <span class="kw3">String</span><span class="br0">&#41;</span> : <span class="kw3">String</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> qualifiedClassName.<span class="kw3">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;::&quot;</span><span class="br0">&#41;</span> &gt; <span class="nu0">-1</span> ? qualifiedClassName.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&quot;::&quot;</span><span class="br0">&#41;</span>.<span class="kw3">join</span><span class="br0">&#40;</span><span class="st0">&quot;.&quot;</span><span class="br0">&#41;</span> : qualifiedClassName;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>This can now be used inside any Class you wish to Log by delcaring a private, static instance of ILogger, for example:</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
package uk.<span class="me1">co</span>.<span class="me1">jonnyreeves</span>.<span class="me1">logging</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">class</span> LoggingExample<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Instance of the Flex Logging Framework via the Logger Helper Class which will<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* automatically set the Category name to uk.co.jonnyreeves.logging.LoggingExample<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">var</span> Logger : ILogger = Logger.<span class="me1">getLogger</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* You can now log away, don&#8217;t forget to initialise your Flex Logger Instance (Log) first<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* by setting the Target Publisher (not shown).<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> LoggingExample<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Logger.<span class="me1">info</span><span class="br0">&#40;</span><span class="st0">&quot;Hello World!&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Although this is helpful it still does not address a couple of other fundamental issues:</p>
<ul>
<li>The output from the Flex Logging Framework does not include the enclosing method or line number from which the error was triggered (although this information can extracted from a StackTrace and automatically appended to the Logged Message by the Publisher).</li>
<li>The Flex Logging Framework does not intelligently handle datatypes &#8211; unfortunately we can only passing String&#8217;s to Flex Logger &#8211; however, we can get around this by making use of 3rd Party Consoles such as Thunderbolt (which also, helpfully includes a LoggingTarget).</li>
<li>Although the Flex Logging Framework allows you to supply a custom Filters Array (and this can even be updated at runtime), it does not appear to include a simple way to configure this via an external XML configuration file.  However, I&#8217;m fairly confident that I can roll my own (just a shame that I have to!)</li>
</ul>
<p>I&#8217;m going to be working on the three points above over the next few days and see if I can come up with a solution which stays as faithful to the intrinsic Logging framework as possible but allows the flexibility of some of the other Loggers out there (Luminic Box, XRay, etc).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonnyreeves.co.uk/2008/10/the-state-of-logging-in-actionscript-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Typesafe Enums in ActionScript 2</title>
		<link>http://www.jonnyreeves.co.uk/2008/07/typesafe-enums-in-actionscript-2/</link>
		<comments>http://www.jonnyreeves.co.uk/2008/07/typesafe-enums-in-actionscript-2/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 09:24:07 +0000</pubDate>
		<dc:creator>Jonny</dc:creator>
				<category><![CDATA[ActionScript 2]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[as2]]></category>
		<category><![CDATA[enum]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[oo]]></category>

		<guid isPermaLink="false">http://www.jonnyreeves.co.uk/?p=59</guid>
		<description><![CDATA[Typesafe Enums are perfect when you want to get the message across loud and clear, with no room for error.  The classic use for an Enum is handling events, to give some context I&#8217;ll demonstrate how you could handle events without using an Enum:

/**
&#160;* This example method will send an event back to a [...]]]></description>
			<content:encoded><![CDATA[<p>Typesafe <a href="http://en.wikipedia.org/wiki/Enumerated_type">Enums</a> are perfect when you want to get the message across loud and clear, with no room for error.  The classic use for an Enum is handling events, to give some context I&#8217;ll demonstrate how you could handle events without using an Enum:</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="coMULTI">/**<br />
&nbsp;* This example method will send an event back to a Registered Listener, in this<br />
&nbsp;* case we&#8217;re going to inform the listener that we have loaded our data and <br />
&nbsp;* are ready for use.<br />
&nbsp;*<br />
&nbsp;* &nbsp; &nbsp; &nbsp;@param Void<br />
&nbsp;* &nbsp; &nbsp; &nbsp;@return Void<br />
*/</span><br />
<span class="kw3">private</span> <span class="kw2">function</span> __onLoadComplete<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// This forms the basis of the event we are going to send.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> eventObject:<span class="kw3">Object</span> = <span class="kw2">new</span> <span class="kw3">Object</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Populate our eventObject with its type &amp; the event message to send</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; eventObject.<span class="kw3">type</span> = <span class="st0">&#8216;ModelEvent&#8217;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; eventObject.<span class="me1">event</span> = <span class="st0">&#8216;data_loaded&#8217;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// And send the object via mx.events.EventDispatcher</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span>eventObject<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>The listener object (in this case, a Controller), will then have a similar method for handling callbacks, again, without using an enum we would be left to switch on a string, something like this:</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="coMULTI">/**<br />
&nbsp;* Example function, showing us registering the event listener to the Model with<br />
&nbsp;* a delegated callback to the __onModelEvent() function.<br />
&nbsp;*<br />
&nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
*/</span><br />
<span class="kw3">private</span> <span class="kw2">function</span> registerModel<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; model.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;modelEvent&quot;</span>, Delegate.<span class="me1">create</span><span class="br0">&#40;</span><span class="kw3">this</span>, __onModelEvent<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p>
<span class="coMULTI">/**<br />
&nbsp;* Callback method which was registered at the same time as adding the eventListener<br />
&nbsp;* this method handles incoming events from registered models<br />
&nbsp;*<br />
&nbsp;*&nbsp; &nbsp; &nbsp; @param Object event object dispatched from registered model.<br />
&nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
*/</span><br />
<span class="kw3">private</span> <span class="kw2">function</span> __onModelEvent<span class="br0">&#40;</span>event:<span class="kw3">Object</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>event.<span class="me1">event</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#8216;data_loaded&#8217;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span> <span class="br0">&#40;</span><span class="st0">&#8216;Controller::__onModelEvent &#8212; Data Loaded!&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">default</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span> <span class="br0">&#40;</span><span class="st0">&#8216;Controller::__onModelEvent &#8212; Unkown Model State recieved: &#8216;</span> + event.<span class="me1">event</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Obviously this approach works, but it can lead to some quite obvious, yet tricky to find errors.   For example, what if I set the value of eventObject.state to &#8216;Data_Loaded&#8217;, or mashed the keyboard and entered &#8216;data_laoded&#8217;?  Of course, both these problems can be spotted (the trace() on default will help you debug typos, and a `event.state.toLowerCase()` would help with the first problem, but what about when other people are working with the code &#8211; how will they be able to tell which states are available to them, this is especially true if there are multiple listeners to modelEvents, maybe all the state&#8217;s aren&#8217;t show in each switch() &#8211; now we&#8217;re starting to see the bigger issue &#8211; one of software design.  Wouldn&#8217;t it be great if we could bring all the Model State messages into one place?</p>
<p>Say hello to the ModelEvent Enum Class:</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="coMULTI">/**<br />
&nbsp;* ModelEvent.as<br />
&nbsp;* John Reeves, http://www.jonnyreeves.co.uk/<br />
&nbsp;* May 2008<br />
&nbsp;*<br />
&nbsp;* Typesafe Event dispatched from Models.<br />
*/</span><br />
<span class="kw2">class</span> ModelEvent<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> <span class="kw3">_name</span>:<span class="kw3">String</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _level:<span class="kw3">Number</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Private Constructor for creating ModelEvent instances. &nbsp;This stops developers<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; * creating their own ModelEvent&#8217;s in the code, instead we encourage people<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* to create Static Model Events below:<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> ModelEvent<span class="br0">&#40;</span><span class="kw3">name</span>:<span class="kw3">String</span>, <span class="kw3">level</span>:<span class="kw3">Number</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="kw3">_name</span> = <span class="kw3">name</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._level = <span class="kw3">level</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Static Events Models can Send.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">static</span> <span class="kw3">public</span> <span class="kw2">var</span> DATA_LOADED:ModelEvent = <span class="kw2">new</span> ModelEvent<span class="br0">&#40;</span><span class="st0">&#8216;DATA_LOADED&#8217;</span>, <span class="nu0">1</span><span class="br0">&#41;</span>;&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">static</span> <span class="kw3">public</span> <span class="kw2">var</span> DATA_ERROR:ModelEvent = <span class="kw2">new</span> ModelEvent<span class="br0">&#40;</span><span class="st0">&#8216;DATA_ERROR&#8217;</span>, <span class="nu0">2</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Returns the ModelEvent object for the given ModelEvent String<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param mediaType the MediaType&#8217;s name<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return the MediaType object<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span>&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw3">static</span> <span class="kw2">function</span> forName<span class="br0">&#40;</span>ModelEvent:<span class="kw3">String</span><span class="br0">&#41;</span>:ModelEvent<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>ModelEvent<span class="br0">&#91;</span>ModelEvent.<span class="kw3">toUpperCase</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> <span class="kw3">instanceof</span> ModelEvent<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> ModelEvent<span class="br0">&#91;</span>ModelEvent.<span class="kw3">toUpperCase</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Returns the current ModelEvent&#8217;s name as a String<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> getName<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">String</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">this</span>.<span class="kw3">_name</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Returns the current ModelEvent&#8217;s Level as a Number<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> getLevel<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Number</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">this</span>._level;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Compares an incoming ModelEvent (x) to the current Object.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param ModelEvent x Incoming ModelEvent Object to perform comparison on.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Boolean true if it matches<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> equals<span class="br0">&#40;</span>x:ModelEvent<span class="br0">&#41;</span>:<span class="kw3">Boolean</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>x.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> == <span class="kw3">this</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &amp;&amp; x.<span class="me1">getLevel</span><span class="br0">&#40;</span><span class="br0">&#41;</span> == <span class="kw3">this</span>.<span class="me1">getLevel</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>&nbsp; &nbsp; &nbsp; &nbsp;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>This class is used a little differently to most others.  As the constructor is set to private, we don&#8217;t expect developers to be creating instances of ModelEvent&#8217;s in their own code (so in the case of the Model&#8217;s __onLoadComplete() function which was shown above, we wouldn&#8217;t other developers using the new keyword to create their own instance of ModelEvent).  Instead, we expect developers to access the pre-defined ModelStates via the <strong>static</strong> public properties defined inside the class, let&#8217;s show a quick example and revisit our Model&#8217;s onLoadComplete method:</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="coMULTI">/**<br />
&nbsp;* Now we will update this method to use the ModelEvent Enum class.<br />
&nbsp;*<br />
&nbsp;* &nbsp; &nbsp; &nbsp;@param Void<br />
&nbsp;* &nbsp; &nbsp; &nbsp;@return Void<br />
*/</span><br />
<span class="kw3">private</span> <span class="kw2">function</span> __onLoadComplete<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// This forms the basis of the event we are going to send.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> eventObject:<span class="kw3">Object</span> = <span class="kw2">new</span> <span class="kw3">Object</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Populate our eventObject with its type &amp; the state message to send, </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// this time instead of setting state as a String, we set it to be on the </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// ModelEvent&#8217;s static properties.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; eventObject.<span class="kw3">type</span> = <span class="st0">&#8216;ModelEvent&#8217;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; eventObject.<span class="me1">event</span> = ModelEvent.<span class="me1">DATA_LOADED</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// And send the object via mx.events.EventDispatcher</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span>eventObject<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>That was straight forward &#8211; an now we don&#8217;t have to worry about typo&#8217;s or mixing the case, any mistakes at this point will be caught by the Compiler when you build the swf.  Okay, that&#8217;s cool, but how do we handle recieving the events in the Controller?  Even easier!</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="coMULTI">/**<br />
&nbsp;* Callback method, this time update to handle the incoming ModelEvent<br />
&nbsp;*<br />
&nbsp;*&nbsp; &nbsp; &nbsp; @param Object event object dispatched from registered model.<br />
&nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
*/</span><br />
<span class="kw3">private</span> <span class="kw2">function</span> __onModelEvent<span class="br0">&#40;</span>event:<span class="kw3">Object</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// extract the ModelEvent Enum from the event Object</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> event:ModelEvent = event.<span class="me1">event</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Use the ModelEvent::equals method to perform comparison</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>event.<span class="me1">equals</span><span class="br0">&#40;</span>ModelEvent.<span class="me1">DATA_LOADED</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span> <span class="br0">&#40;</span><span class="st0">&#8216;Controller::__onModelEvent &#8212; Data Loaded!&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Of course, if you prefer you could switch based on event.getLevel() with the case statements performing comparisons on ModelEvent.DATA_LOADED.getLevel();</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonnyreeves.co.uk/2008/07/typesafe-enums-in-actionscript-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Actionscript &#8211; Loading Acute and UTF-8 Characters from XML into Dynamic Text with Flash</title>
		<link>http://www.jonnyreeves.co.uk/2008/06/actionscript-acute-utf-8-data-xml-flash/</link>
		<comments>http://www.jonnyreeves.co.uk/2008/06/actionscript-acute-utf-8-data-xml-flash/#comments</comments>
		<pubDate>Thu, 19 Jun 2008 09:17:32 +0000</pubDate>
		<dc:creator>Jonny</dc:creator>
				<category><![CDATA[ActionScript 2]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[acute]]></category>
		<category><![CDATA[dynamic text]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://www.jonnyreeves.co.uk/?p=54</guid>
		<description><![CDATA[Writing flexible applications in Flash is easy, (/me points in the direction of my XML Configuration Class) and there&#8217;s few reasons why all your text strings should not be read in at run time to allow for easy internationalization.
However, one pitfall to be aware of is trying to use Acutes and other &#8220;non-latin&#8221; characters in [...]]]></description>
			<content:encoded><![CDATA[<p>Writing flexible applications in Flash is easy, (/me points in the direction of my <a href="http://www.jonnyreeves.co.uk/2008/06/actionscript-20-configuration-class/">XML Configuration Class</a>) and there&#8217;s few reasons why all your text strings should not be read in at run time to allow for easy internationalization.</p>
<p>However, one pitfall to be aware of is trying to use Acutes and other &#8220;non-latin&#8221; characters in dynamic text fields (é, etc).  I was having a problem when these characters were not only not showing up, but all characters after the acute were being truncated!  Here&#8217;s my configuration XML:</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span> <span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;configuration<span class="re2">&gt;</span></span></span><br />
&nbsp;<span class="sc3"><span class="re1">&lt;textValue<span class="re2">&gt;</span></span></span>armén<span class="sc3"><span class="re1">&lt;/textValue<span class="re2">&gt;</span></span></span><br />
&nbsp;<span class="sc3"><span class="re1">&lt;/configuration<span class="re2">&gt;</span></span></span><br />
&nbsp;</div>
<p><em>Side Note: Flash Player 9 appears to ignore the <a href="http://www.w3schools.com/XML/xml_encoding.asp">XML Encoding</a> value specified in XML files, however it&#8217;s good practice to adhere to web standards, so make sure your XML&#8217;s encoding is set to UTF-8</em></p>
<p>The next obvious set is to ensure that you embedding all the required glyphs in your .fla file, you do this by clicking on the <em>Embed&#8230;</em> button for your Dynamic Textfield &#8211; make sure you embed all the Latin characters you need and then specify the acutes and other UTF-8 characters seperatley in the &#8220;include these characters:&#8221; textbox:</p>
<p><img src="http://www.jonnyreeves.co.uk/wp-content/uploads/2008/06/flash-character-embedding.gif" alt="The Character Embedding Dialouge in Flash CS3" title="flash-character-embedding" width="500" height="283" class="aligncenter size-full wp-image-55" /></p>
<p>Now this is where the problem comes in &#8211; when I try to compile and run this flash movie, instead of getting the text <em>armén</em> in my textfield, I get <em>arm</em> with both the acute (é) and any trailing characters truncated (in some cases (as in the screen shot below), I even get some of the trailing XML&#8230; eek!)</p>
<p><img src="http://www.jonnyreeves.co.uk/wp-content/uploads/2008/06/utf-8-dynamic-text-error1.jpg" alt="The UTF-8 Text String \&quot;armén\&quot; is breaking the layout" title="utf-8-dynamic-text-error1" width="442" height="334" class="aligncenter size-full wp-image-57" /></p>
<p>After a bit of head scratching I finally managed to track down the problem: The XML file must be saved as UTF-8 encoding!  (d&#8217;oh!)  However, in tracking down the problem I also discovered another workaround using <a href="http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary723.html">System.useCodepage</a>.  Setting this value to &#8216;true&#8217; in the first frame of your actionscript will force flash to ignore the character encoding of the XML document.</p>
<p>Hope this saves someone some time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonnyreeves.co.uk/2008/06/actionscript-acute-utf-8-data-xml-flash/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ActionScript 2.0 Configuration Class</title>
		<link>http://www.jonnyreeves.co.uk/2008/06/actionscript-20-configuration-class/</link>
		<comments>http://www.jonnyreeves.co.uk/2008/06/actionscript-20-configuration-class/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 13:19:27 +0000</pubDate>
		<dc:creator>Jonny</dc:creator>
				<category><![CDATA[ActionScript 2]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[flashvar]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://www.jonnyreeves.co.uk/?p=38</guid>
		<description><![CDATA[This is an update to my original Actionscript 2.0 Configuration Class which I wrote back in February.  It features a new access method for reading and writing values and allows you to load in external XML configuration documents with an easy to understand Schema.  All comments welcome.

This class allows simple loading of Configuration [...]]]></description>
			<content:encoded><![CDATA[<p>This is an update to my original <a href="http://www.jonnyreeves.co.uk/2008/02/actionscript-20-configuration-class-readwrite/">Actionscript 2.0 Configuration Class</a> which I wrote back in February.  It features a new access method for reading and writing values and allows you to load in external XML configuration documents with an easy to understand Schema.  All comments welcome.<br />
<span id="more-38"></span><br />
This class allows simple loading of Configuration values into your ActionScript 2.0 Flash application &#8211; you can either defined your values in an external XML file (which is easy to read and edit &#8211; even by XML novices) or by using flashVars attached to the root of the stage.</p>
<p>Once you have loaded in your configuration values you can easily access or alter them by using the static method Configure.read(&#8217;key&#8217;) or Configure.write(&#8217;key&#8217;, &#8216;value&#8217;).</p>
<p>This class follows the <a href="http://en.wikipedia.org/wiki/Singleton_pattern">Singleton Design Pattern</a> (or <a href="http://en.wikipedia.org/wiki/Anti-pattern">Anti-Pattern</a> depending on what side of the fence you sit on) &#8211; what this means, in a nutshell is that you can access the values stored in the Configuration from anywhere in your code &#8211; it also means that if you update the values using Configure.write() they will be updated globally.</p>
<p>You can <a href="http://www.jonnyreeves.co.uk/wp-content/uploads/2008/06/jonnyreeeves_configure.zip">download a .zip file of the Class</a> complete with a detailed example of how to use it in your application.</p>
<p>Any questions &#8211; feel free to post in the comments below.</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="kw3">import</span> mx.<span class="me1">events</span>.<span class="me1">EventDispatcher</span>;<br />
<span class="kw3">import</span> mx.<span class="me1">utils</span>.<span class="me1">Delegate</span>; </p>
<p><span class="coMULTI">/**<br />
&nbsp;* ActionScript 2.0 Configuration Class<br />
&nbsp;* John Reves, http://www.jonnyreeves.co.uk/<br />
&nbsp;* June 2008<br />
&nbsp;*<br />
&nbsp;* Singleton configuration class with class notation value access and XML<br />
&nbsp;* import.<br />
*/</span><br />
<span class="kw2">class</span> co.<span class="me1">uk</span>.<span class="me1">jonnyreeves</span>.<span class="me1">Configure</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Event Listener</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> dispatchEvent:<span class="kw2">Function</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> addEventListener:<span class="kw2">Function</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> removeEventListener:<span class="kw2">Function</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Singleton Instance of this Object.<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw3">static</span> <span class="kw2">var</span> _INSTANCE:Configure;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Dynamic Object containing all configuration values<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @see Configure::read()<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _values:<span class="kw3">Object</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Interval used to handle Timeouts when retrieving XML Documents.<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _xmlTimeoutInterval:<span class="kw3">Number</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Indicates if the XML document timed out whilst loading.<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _hasTimedOut:<span class="kw3">Boolean</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Constructor<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Private, Access via getInstance() only.<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> Configure<span class="br0">&#40;</span><span class="kw3">Void</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._values = <span class="kw2">new</span> <span class="kw3">Object</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EventDispatcher.<span class="me1">initialize</span><span class="br0">&#40;</span><span class="kw3">this</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Return a singleton instance of Configure.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Configure instance<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">static</span> <span class="kw3">public</span> <span class="kw2">function</span> getInstance<span class="br0">&#40;</span><span class="kw3">Void</span><span class="br0">&#41;</span>:Configure<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>_INSTANCE == <span class="kw3">undefined</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _INSTANCE = <span class="kw2">new</span> Configure<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _INSTANCE;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Attempts to load in Configuration from an XML File, will dispatch<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* an Event depending on the result of this method.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param xmlFile Location of XML File containing Configuration Values<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">static</span> <span class="kw3">public</span> <span class="kw2">function</span> loadXML<span class="br0">&#40;</span>xmlFile:<span class="kw3">String</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> _this:Configure = getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> parser:<span class="kw3">XML</span> = <span class="kw2">new</span> <span class="kw3">XML</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parser.<span class="kw3">ignoreWhite</span> = <span class="kw2">true</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Handles XML Document Retreval.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parser.<span class="kw3">onLoad</span> = <span class="kw2">function</span><span class="br0">&#40;</span>success:<span class="kw3">Boolean</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>success &amp;amp;&amp;amp; _this.__validates<span class="br0">&#40;</span><span class="kw3">this</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _this.__clearXMLTimeout<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _this.__parseXML<span class="br0">&#40;</span><span class="kw3">this</span>.<span class="kw3">childNodes</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>, _this._values<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _this.__onXMLLoadSuccess<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _this.__onXMLLoadError<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Create an Interval to handle timeouts.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _this.__createXMLTimeout<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parser.<span class="kw3">load</span><span class="br0">&#40;</span>xmlFile<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Attemps to load all flashVars from _root which exist in the &#8216;config&#8217;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* namespace. &nbsp;flashVars should be written using dot notation, but with<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* underscores replacing the dots.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* For example:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; _root.config_testMessage = &#8216;hello world!&#8217;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; _root.config_shapes_rectangle_width&#8217; = &#8216;250&#8242;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Or using SWFObject notation in the HTML<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; fo.AddVariable(&#8217;config_testMessage&#8217;, &#8216;hello world!&#8217;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; fo.AddVariable(&#8217;config_shapes_rectangle_width&#8217;, &#8216;250&#8242;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">static</span> <span class="kw3">public</span> <span class="kw2">function</span> loadFlashVars<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> flashVar:<span class="kw3">String</span> <span class="kw1">in</span> <span class="kw3">_root</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>flashVar.<span class="kw3">substr</span><span class="br0">&#40;</span><span class="nu0">0</span>, <span class="nu0">7</span><span class="br0">&#41;</span> == <span class="st0">&#8216;config_&#8217;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Configure.<span class="me1">write</span><span class="br0">&#40;</span>flashVar.<span class="kw3">substr</span><span class="br0">&#40;</span><span class="nu0">7</span><span class="br0">&#41;</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&#8216;_&#8217;</span><span class="br0">&#41;</span>.<span class="kw3">join</span><span class="br0">&#40;</span><span class="st0">&#8216;.&#8217;</span><span class="br0">&#41;</span>, <span class="kw3">unescape</span><span class="br0">&#40;</span><span class="kw3">_root</span><span class="br0">&#91;</span>flashVar<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Read a Variable from the Loaded Configuration. &nbsp;Access to Conifg Groups<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* is handled in {dot} notation. &nbsp;So to access _config[Omniture][tracking][dc]<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* you would pass in the String &#8216;omniture.tracking.dc&#8217;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param key Variable to obtain in . notation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return String value of Configure::_values[key]<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">static</span> <span class="kw3">public</span> <span class="kw2">function</span> read<span class="br0">&#40;</span><span class="kw3">key</span>:<span class="kw3">String</span><span class="br0">&#41;</span>:<span class="kw3">String</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Turn the . syntax notation into AS2.0 Array access notation.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> keys:<span class="kw3">Array</span> = <span class="kw3">key</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&#8216;.&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> thisGroup:<span class="kw3">Object</span> = getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span>._values<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>keys.<span class="kw3">length</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; thisGroup = thisGroup<span class="br0">&#91;</span>keys.<span class="me1">shift</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Debugging.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>thisGroup.<span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> == <span class="kw3">undefined</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span><span class="br0">&#40;</span><span class="st0">&#8216;Configure::read &#8211; Returning Undefined Value for: &#8216;</span> + <span class="kw3">arguments</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> thisGroup.<span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Write a Key, Value pair to the Config Object at Run Time. &nbsp;The key<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* should be supplied in {dot} notation. &nbsp;The return value could slow<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* down performance on writes.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param key Varible to write in . notation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param value Value to write to @param key as a String<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return indicates write was succesfull.<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">static</span> <span class="kw3">public</span> <span class="kw2">function</span> write<span class="br0">&#40;</span><span class="kw3">key</span>:<span class="kw3">String</span>, value:<span class="kw3">String</span><span class="br0">&#41;</span>:<span class="kw3">Boolean</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Helper method used for recursion</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span>.__recurseWrite<span class="br0">&#40;</span><span class="kw3">key</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&#8216;.&#8217;</span><span class="br0">&#41;</span>, value, getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span>._values<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>read<span class="br0">&#40;</span><span class="kw3">key</span><span class="br0">&#41;</span> == value<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Helper method used by Configure::write() when dealing with &quot;deep&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* values inside the _values object. &nbsp;Method will recurse through the<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* input String (x), and write value to the current configObj node.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param keys Array contianing the &quot;path&quot; of _values object to write to<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param value String value to write to ConfigObject.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param configObj Current Node of the Configuration Values _values object<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> __recurseWrite<span class="br0">&#40;</span>keys:<span class="kw3">Array</span>, value:<span class="kw3">String</span>, configObj:<span class="kw3">Object</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Write if that was the last key index.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>keys.<span class="kw3">length</span> == <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; configObj<span class="br0">&#91;</span>keys.<span class="me1">shift</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> = value;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Otherwise Recurse again, create new object if needed.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> thisKey = keys.<span class="me1">shift</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>configObj<span class="br0">&#91;</span>thisKey<span class="br0">&#93;</span> == <span class="kw3">undefined</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; configObj<span class="br0">&#91;</span>thisKey<span class="br0">&#93;</span> = <span class="kw2">new</span> <span class="kw3">Object</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.__recurseWrite<span class="br0">&#40;</span>keys, value, configObj<span class="br0">&#91;</span>thisKey<span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Callback to handle failed attempts to Load the configuration XML.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> __onXMLLoadError<span class="br0">&#40;</span><span class="kw3">Void</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.__clearXMLTimeout<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> eventObject:<span class="kw3">Object</span> = <span class="kw2">new</span> <span class="kw3">Object</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eventObject.<span class="kw3">target</span> = <span class="kw3">this</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eventObject.<span class="kw3">type</span> = <span class="st0">&#8216;configureEvent&#8217;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eventObject.<span class="kw3">name</span> = <span class="st0">&#8216;Configure.onXMLLoadError&#8217;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span>eventObject<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* XML has been successfully loaded and is ready to be interacted with.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> __onXMLLoadSuccess<span class="br0">&#40;</span><span class="kw3">Void</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> eventObject:<span class="kw3">Object</span> = <span class="kw2">new</span> <span class="kw3">Object</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eventObject.<span class="kw3">target</span> = <span class="kw3">this</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eventObject.<span class="kw3">type</span> = <span class="st0">&#8216;configureEvent&#8217;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eventObject.<span class="kw3">name</span> = <span class="st0">&#8216;Configure.onXMLLoaded&#8217;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span>eventObject<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Validates the loaded XML Document<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param xml XMLObject loaded by Configure::loadXML()<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Boolean false on validation errors<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> __validates<span class="br0">&#40;</span><span class="kw3">xml</span>:<span class="kw3">XML</span><span class="br0">&#41;</span>:<span class="kw3">Boolean</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Abort if we have already timed out.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">this</span>._hasTimedOut<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span> <span class="br0">&#40;</span><span class="st0">&#8216;Configure::__validateXML &#8211; Refusing to Parse XML, timed out&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Check the first node is </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#40;</span><span class="kw3">xml</span>.<span class="kw3">childNodes</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="kw3">nodeName</span><span class="br0">&#41;</span> !== <span class="st0">&quot;configuration&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.__onInvalidXML<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Parses the Loaded XML Documents, populating this object&#8217;s _values prop.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param xml XMLObject loaded by Configure::loadXML()<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param config Internal Configuration Object to write values to<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> __parseXML<span class="br0">&#40;</span><span class="kw3">xml</span>:<span class="kw3">XMLNode</span>, config:<span class="kw3">Object</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// loop through all Children of this Node.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> nodeCount:<span class="kw3">Number</span> = <span class="kw3">xml</span>.<span class="kw3">childNodes</span>.<span class="kw3">length</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i:<span class="kw3">Number</span> = <span class="nu0">0</span>; i &lt; nodeCount; i++<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> thisNode:<span class="kw3">XMLNode</span> = <span class="kw3">xml</span>.<span class="kw3">childNodes</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Recurse into Config Groups (tricky because values are considered to have Length.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>thisNode.<span class="kw3">childNodes</span>.<span class="kw3">length</span> &gt; <span class="nu0">0</span> &amp;amp;&amp;amp; thisNode.<span class="kw3">childNodes</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="kw3">nodeValue</span> == <span class="kw2">null</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Create new Object off of this._values</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; config<span class="br0">&#91;</span>thisNode.<span class="kw3">nodeName</span><span class="br0">&#93;</span> = <span class="kw2">new</span> <span class="kw3">Object</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.__parseXML<span class="br0">&#40;</span>thisNode, config<span class="br0">&#91;</span>thisNode.<span class="kw3">nodeName</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Write Value</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; config<span class="br0">&#91;</span>thisNode.<span class="kw3">nodeName</span><span class="br0">&#93;</span> = thisNode.<span class="kw3">childNodes</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="kw3">nodeValue</span>.<span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Creates an Interval used by Configure::loadXML to handle XML documents<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* which timeout.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> __createXMLTimeout<span class="br0">&#40;</span><span class="kw3">Void</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._xmlTimeoutInterval = <span class="kw2">_global</span>.<span class="me1">setTimeout</span><span class="br0">&#40;</span><span class="kw3">this</span>, <span class="st0">&#8216;__onXMLTimeout&#8217;</span>, <span class="nu0">1000</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._hasTimedOut = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Triggered when the timeout in createXMLTimeout() has expired, indicates<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* that the XML document failed to load.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> __onXMLTimeout<span class="br0">&#40;</span><span class="kw3">Void</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span> <span class="br0">&#40;</span><span class="st0">&#8216;Configure::__onXMLTimeout&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._hasTimedOut = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.__clearXMLTimeout<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.__onXMLLoadError<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Gets called when the Parser fails to parse the incoming configuration<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* XML.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> __onInvalidXML<span class="br0">&#40;</span><span class="kw3">Void</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span><span class="br0">&#40;</span><span class="st0">&#8216;Configure::__onInvalidXML&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Clears the Interval, tidies up.<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> __clearXMLTimeout<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">clearInterval</span><span class="br0">&#40;</span><span class="kw3">this</span>._xmlTimeoutInterval<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.jonnyreeves.co.uk/2008/06/actionscript-20-configuration-class/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Accurate Timing in ActionScript</title>
		<link>http://www.jonnyreeves.co.uk/2007/11/accurate-timing-in-actionscript/</link>
		<comments>http://www.jonnyreeves.co.uk/2007/11/accurate-timing-in-actionscript/#comments</comments>
		<pubDate>Wed, 07 Nov 2007 20:26:18 +0000</pubDate>
		<dc:creator>Jonny</dc:creator>
				<category><![CDATA[ActionScript 2]]></category>
		<category><![CDATA[accurate]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[interval]]></category>
		<category><![CDATA[timing]]></category>

		<guid isPermaLink="false">http://www.jonnyreeves.co.uk/2007/11/test/</guid>
		<description><![CDATA[@Update: 23rd May 2008.  Small refactoring of the code without changing the interface, the .zip archive now includes a working example.
There are many things that require timing when programming, for me the challenge is accurately timing how long a user has been viewing a video for.  There are a couple of well documented [...]]]></description>
			<content:encoded><![CDATA[<p><em>@Update: 23rd May 2008.  Small refactoring of the code without changing the interface, the .zip archive now includes a working example.</em></p>
<p>There are many things that require timing when programming, for me the challenge is accurately timing how long a user has been viewing a video for.  There are a couple of well documented approaches to creating a virtual stopwatch in ActionScript, most of which rely on using SetInterval() to increment a counter, however such methods <a href="http://www.bit-101.com/blog/?p=910">can cause problems</a> due to Flash Player&#8217;s unreliable timings.</p>
<p>My suggested solution is to instead poll the user&#8217;s local system&#8217;s clock, using the <a href="http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary153.html">Date() Object</a>, to get the current timestamp, by then using an interval, polling the system clock again and comparing the difference.  From the testing I have conducted this yields accurate and reliable timing in Flash, perfect for tracking the progress of video playback.</p>
<p>Code and downloads after the break, comments welcome.<br />
<span id="more-20"></span></p>
<h4>Download ActionScript Class</h4>
<p><a href='http://www.jonnyreeves.co.uk/wp-content/uploads/2008/05/timerhelper.zip'>Download the TimerHelper Class</a> with example code (.as and .fla) demonstrating how to use TimerHelper in your own code.</p>
<h4>ActionScript 2 Source Code</h4>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="coMULTI">/**<br />
&nbsp;* TimerHelper<br />
&nbsp;* John Reeves, john.reeves@mailc.net, http://www.jonnyreeves.co.uk/<br />
&nbsp;* March 2008<br />
&nbsp;*<br />
&nbsp;* Timer Class based on user&#8217;s system clock for accurate timing in ActionScript<br />
&nbsp;* When creating an instance of this class, use the `onTick` prototype to get<br />
&nbsp;* readings, a simple example would be:<br />
&nbsp;*<br />
&nbsp;*&nbsp; &nbsp; &nbsp; class TimerExample<br />
&nbsp;*&nbsp; &nbsp; &nbsp; {<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private var _timer:TimerHelper;<br />
&nbsp;*<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Constructor, create instance of Timer.<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public function TimerExample() {<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._timer = new TimerHelper();<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this._timer.onTick = mx.utils.Delegate.create(this, onTimerTick);<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp;*<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Timer callback, handled by the Delegate above.<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public function onTimerTick():Void {<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trace(&#8217;Timer Callback: &#8216; + this._timer.getElapsed() + &#8216; seconds&#8217;);<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp;*<br />
*/</span><br />
<span class="kw2">class</span> co.<span class="me1">uk</span>.<span class="me1">jonnyreeves</span>.<span class="me1">helpers</span>.<span class="me1">TimerHelper</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Indicaqtes if the TimerHelper is Running.<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _isRunning:<span class="kw3">Boolean</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Interval for Tracking the clock&#8217;s ticks<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _tickInterval:<span class="kw3">Number</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Time in seconds elapsed whilist the timer has been running<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _secondsElpased:<span class="kw3">Number</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Previous Reading from the Date Object.<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _previousTime:<span class="kw3">Number</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Is the TimerHelper using the system clock, or falling back to using an<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Interval.<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _useSystemClock:<span class="kw3">Boolean</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Constructor.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> TimerHelper<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._isRunning = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._tickInterval = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._secondsElpased = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Check that we can use the local system clock</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">isNaN</span><span class="br0">&#40;</span><span class="kw2">new</span> <span class="kw3">Date</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="kw3">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._useSystemClock = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span> <span class="br0">&#40;</span><span class="st0">&#8216;Timer::construct() -&gt; Could not initialise Local System Clock&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._useSystemClock = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Starts the timer.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Remove an existing interval</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">this</span>._isRunning<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="kw3">pause</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Update last time</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">this</span>._useSystemClock<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._previousTime = <span class="kw2">new</span> <span class="kw3">Date</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="kw3">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Create the new interval.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._tickInterval = <span class="kw3">setInterval</span><span class="br0">&#40;</span><span class="kw3">this</span>, <span class="st0">&#8216;__advanceOneTick&#8217;</span>, <span class="nu0">1000</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._isRunning = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Pauses the timer on its current value.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">pause</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">clearInterval</span><span class="br0">&#40;</span><span class="kw3">this</span>._tickInterval<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Resets the Timer back to 0.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> reset<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="kw3">pause</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._secondsElpased = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._isRunning = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/** <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Advance the timer one &quot;tick&quot; either by polling the System Clock, or<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* incrementing.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> __advanceOneTick<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">this</span>._useSystemClock<span class="br0">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> <span class="kw3">date</span>:<span class="kw3">Date</span> = <span class="kw2">new</span> <span class="kw3">Date</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._secondsElpased += <span class="br0">&#40;</span><span class="kw3">date</span>.<span class="kw3">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; <span class="kw3">this</span>._previousTime<span class="br0">&#41;</span> / <span class="nu0">1000</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._previousTime = <span class="kw3">date</span>.<span class="kw3">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Fall back to incremening, this method is less acurate.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>._secondsElpased += <span class="nu0">1</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Call the callback Method (depricated)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">onTick</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Accessor method for getting the number of seconds elapsed<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> getElapsed<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Number</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">this</span>._secondsElpased<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Call back method letting you hook into the timer.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @depricated<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> onTick<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">Void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jonnyreeves.co.uk/2007/11/accurate-timing-in-actionscript/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
