<?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>dev.enekoalonso.com &#187; javascript</title>
	<atom:link href="http://dev.enekoalonso.com/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://dev.enekoalonso.com</link>
	<description>having fun with code</description>
	<lastBuildDate>Sat, 31 Jul 2010 05:51:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Titanium Developer: love and hate</title>
		<link>http://dev.enekoalonso.com/2010/07/30/titanium-developer-love-and-hate/</link>
		<comments>http://dev.enekoalonso.com/2010/07/30/titanium-developer-love-and-hate/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 04:57:16 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[appcelerator]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[pc]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[titanium]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=615</guid>
		<description><![CDATA[I&#8217;ve been using Titanium Developer for a while now, since I installed it to do some mobile app research one or two months ago. But up until now I barely used it again other than to maintain a desktop app I created for a game, which thanks to Titanium runs in both Mac and PC. [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using <a href="http://www.appcelerator.com/products/titanium-mobile-application-development/">Titanium Developer</a> for a while now, since I installed it to do some mobile app research one or two months ago. But up until now I barely used it again other than to maintain a desktop app I created for a game, which thanks to Titanium runs in both Mac and PC. Thus, up until this week, I hadn&#8217;t really get in depth with it.</p>
<h3>The good things</h3>
<p>Nice, easy and fast. Creating apps is piece of cake, loading JSON feeds from Internet, using local storage, placing buttons and labels on the screen&#8230; it&#8217;s all easy and it works on both iPhone and Android right away.</p>
<h3>The bad things</h3>
<p>Titanium Developer looks like an unfinished app. It shouldn&#8217;t be version 1.X, not even 0.X. Looks like an alpha, buggy and very easy to get screwed up, specially if you share your projects between Windows and Mac. This time it launches the emulator, this time it does not. This time your project does not load properly. Next time, you try to create a new project and it fails. And the errors are totally useless. Not very helpful.</p>
<h3>Conclusion</h3>
<p>The idea is great, awesome. The code is clean and using Javascript for development makes it easy for web developers to get easily involved into mobile app development. If only the <a href="http://twitter.com/appcelerator">Appcelerator</a> team could improve their app, we would save a lot of headaches.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>February 19, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/" title="Having fun with Mooml &#038; Twitter">Having fun with Mooml &#038; Twitter</a> (0)</li><li>January 28, 2010 -- <a href="http://dev.enekoalonso.com/2010/01/28/things-to-do/" title="Things to do">Things to do</a> (0)</li><li>August 29, 2009 -- <a href="http://dev.enekoalonso.com/2009/08/29/spaniards-for-iphone-available-now/" title="Spaniards for iPhone available now">Spaniards for iPhone available now</a> (0)</li><li>June 30, 2009 -- <a href="http://dev.enekoalonso.com/2009/06/30/iphone-3-0-geolocation-with-javascript/" title="iPhone 3.0 geolocation with Javascript">iPhone 3.0 geolocation with Javascript</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/07/30/titanium-developer-love-and-hate/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Little tricks: string padding in Javascript</title>
		<link>http://dev.enekoalonso.com/2010/07/20/little-tricks-string-padding-in-javascript/</link>
		<comments>http://dev.enekoalonso.com/2010/07/20/little-tricks-string-padding-in-javascript/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 22:35:45 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[number]]></category>
		<category><![CDATA[pad]]></category>
		<category><![CDATA[padding]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[zeropad]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=611</guid>
		<description><![CDATA[I just found this little trick to zero pad numbers in Javascript. It is also applicable to padding with any character, not just zeros. var n = 123 String&#40;&#34;00000&#34; + n&#41;.slice&#40;-5&#41;; // returns 00123 &#40;&#34;00000&#34; + n&#41;.slice&#40;-5&#41;; // returns 00123 &#40;&#34; &#160; &#160; &#34; + n&#41;.slice&#40;-5&#41;; // returns &#34; &#160;123&#34; (with two spaces) Found here. [...]]]></description>
			<content:encoded><![CDATA[<p>I just found this little trick to zero pad numbers in Javascript. It is also applicable to padding with any character, not just zeros.</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> n = <span class="nu0">123</span></div>
</li>
<li class="li1">
<div class="de1">String<span class="br0">&#40;</span><span class="st0">&quot;00000&quot;</span> + n<span class="br0">&#41;</span>.<span class="me1">slice</span><span class="br0">&#40;</span><span class="nu0">-5</span><span class="br0">&#41;</span>; <span class="co1">// returns 00123</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="st0">&quot;00000&quot;</span> + n<span class="br0">&#41;</span>.<span class="me1">slice</span><span class="br0">&#40;</span><span class="nu0">-5</span><span class="br0">&#41;</span>; <span class="co1">// returns 00123</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="st0">&quot; &nbsp; &nbsp; &quot;</span> + n<span class="br0">&#41;</span>.<span class="me1">slice</span><span class="br0">&#40;</span><span class="nu0">-5</span><span class="br0">&#41;</span>; <span class="co1">// returns &quot; &nbsp;123&quot; (with two spaces)</span></div>
</li>
</ol>
</div>
<p>Found <a href="http://ricochen.wordpress.com/2010/04/24/javascript-zero-padding-numbers/">here</a>.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>July 2, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/02/equivalent-of-parseint-in-freemarker/" title="Equivalent of parseInt() in Freemarker">Equivalent of parseInt() in Freemarker</a> (0)</li><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li><li>September 2, 2009 -- <a href="http://dev.enekoalonso.com/2009/09/02/creating-html-blocks-with-mootools/" title="Creating HTML blocks with Mootools">Creating HTML blocks with Mootools</a> (3)</li><li>July 30, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/30/titanium-developer-love-and-hate/" title="Titanium Developer: love and hate">Titanium Developer: love and hate</a> (2)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/07/20/little-tricks-string-padding-in-javascript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Little tricks: editing strings by index in Javascript and Python</title>
		<link>http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/</link>
		<comments>http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 16:57:04 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[edit]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[readonly]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=591</guid>
		<description><![CDATA[Editing strings by index maybe something that we don&#8217;t do all the time. But it&#8217;s one of these things that, coming from languages like C, one would assume is as trivial as assigning the value of an indexed position. Something like this: var a = &#34;hello world&#34; a&#91;0&#93; = &#34;H&#34; console.log&#40;a&#41; // outputs &#34;hello world&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>Editing strings by index maybe something that we don&#8217;t do all the time. But it&#8217;s one of these things that, coming from languages like C, one would assume is as trivial as assigning the value of an indexed position. Something like this:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> a = <span class="st0">&quot;hello world&quot;</span></div>
</li>
<li class="li1">
<div class="de1">a<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="st0">&quot;H&quot;</span></div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span> <span class="co1">// outputs &quot;hello world&quot;</span></div>
</li>
</ol>
</div>
<p>Go ahead and paste that code in your favorite javascript console. You would expect the output to be &#8220;Hello there&#8221;, but it is not.<br />
Same goes with Python, check this code:</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a = <span class="st0">&quot;hello world&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="st0">&quot;H&quot;</span></div>
</li>
<li class="li1">
<div class="de1">Traceback <span class="br0">&#40;</span>most recent call last<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; File <span class="st0">&quot;&lt;stdin&gt;&quot;</span>, line <span class="nu0">1</span>, <span class="kw1">in</span> <span class="sy0">&lt;</span>module<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">TypeError</span>: <span class="st0">&#39;str&#39;</span> <span class="kw2">object</span> does <span class="kw1">not</span> support item assignment</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="st0">&#39;H&#39;</span></div>
</li>
<li class="li1">
<div class="de1">Traceback <span class="br0">&#40;</span>most recent call last<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; File <span class="st0">&quot;&lt;stdin&gt;&quot;</span>, line <span class="nu0">1</span>, <span class="kw1">in</span> <span class="sy0">&lt;</span>module<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">TypeError</span>: <span class="st0">&#39;str&#39;</span> <span class="kw2">object</span> does <span class="kw1">not</span> support item assignment</div>
</li>
</ol>
</div>
<p>This is because strings are read only and cannot be modified at all. Only replaced with new strings.</p>
<h2>The solution: convert to array and back to string</h2>
<p>There may be other solutions out there, I&#8217;m sure, but this is the solution I use: Both in Python and Javascript, a string can be converted into an array or list of characters (actually, list of strings). Then we can modify values by index and finally join the output into a new string.</p>
<p>Javascript:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> a = <span class="st0">&quot;hello world&quot;</span></div>
</li>
<li class="li1">
<div class="de1">a = a.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">a<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="st0">&quot;H&quot;</span></div>
</li>
<li class="li1">
<div class="de1">a = a.<span class="me1">join</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span> <span class="co1">// outputs &quot;Hello world&quot;</span></div>
</li>
</ol>
</div>
<p>Python:</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a = <span class="st0">&quot;hello world&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a = <span class="kw2">list</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="st0">&quot;H&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a = <span class="st0">&quot;&quot;</span>.<span class="me1">join</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&#39;Hello world&#39;</span></div>
</li>
</ol>
</div>
<p>It&#8217;s interesting to see how the syntax for joining arrays into strings is totally the opposite in Javascript and Python. In Javascript, <a href="https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects#Array_Methods">join()</a> is a function of the Array object while in Python <a href="http://docs.python.org/py3k/library/stdtypes.html?highlight=join#str.join">join()</a> is a function of the string class.</p>
<p>In the other hand, <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/split">split()</a> is a method of the String object in Javascript. There is a <a href="http://docs.python.org/py3k/library/stdtypes.html?highlight=split#str.split">split()</a> function on the string class in Python, but it cannot be used to split strings without a specific separator. The <a href="http://docs.python.org/py3k/library/functions.html?highlight=list#list">list()</a> function/constructor does the trick.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>July 20, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/20/little-tricks-string-padding-in-javascript/" title="Little tricks: string padding in Javascript">Little tricks: string padding in Javascript</a> (2)</li><li>May 22, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/" title="More WebSockets, now with Python!">More WebSockets, now with Python!</a> (1)</li><li>September 2, 2009 -- <a href="http://dev.enekoalonso.com/2009/09/02/creating-html-blocks-with-mootools/" title="Creating HTML blocks with Mootools">Creating HTML blocks with Mootools</a> (3)</li><li>July 30, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/30/titanium-developer-love-and-hate/" title="Titanium Developer: love and hate">Titanium Developer: love and hate</a> (2)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>More WebSockets, now with Python!</title>
		<link>http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/</link>
		<comments>http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/#comments</comments>
		<pubDate>Sun, 23 May 2010 06:41:27 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[websocket]]></category>
		<category><![CDATA[websockets]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=576</guid>
		<description><![CDATA[A couple of weeks ago, Tim and I worked on a little game/demo using WebSockets and C# (I haven&#8217;t been able to put it online since I do not have a Windows server). It was a lot of fun and we were able to see the potential of WebSockets and how much internet can will [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago, <a href="http://twitter.com/SkullDuggerT">Tim</a> and I worked on a <a href="http://dev.enekoalonso.com/2010/05/03/playing-with-websockets/">little game/demo using WebSockets and C#</a> (I haven&#8217;t been able to put it online since I do not have a Windows server). It was a lot of fun and we were able to see the potential of WebSockets and how much internet <del datetime="2010-05-23T06:09:54+00:00">can</del> will change in the next few years because of them.</p>
<p>Today I spent a couple of hours researching and implementing a WebSocket solution that I could run in my linux servers, and I found this very nice tutorial for creating a Python WebSockets server: <a href="http://yz.mit.edu/wp/web-sockets-tutorial-with-simple-python-server/">http://yz.mit.edu/wp/web-sockets-tutorial-with-simple-python-server/</a></p>
<p>So I took that code and modified to create a very, very basic chat, that broadcasts received messages to all connected clients. You can try it here (as long as the python server is still up): <a href="http://enekoalonso.com/research/html5/websockets/python/">http://enekoalonso.com/research/html5/websockets/python/</a></p>
<p>Here is the client code:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> form = document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&#39;form&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> msg = document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&#39;msg&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> output = document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&#39;serveroutput&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> s = <span class="kw2">new</span> WebSocket<span class="br0">&#40;</span><span class="st0">&quot;ws://&quot;</span>+window.<span class="me1">location</span>.<span class="me1">hostname</span>+<span class="st0">&quot;:9876/&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;s.<span class="me1">onopen</span> = <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;opened&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; out<span class="br0">&#40;</span><span class="st0">&#39;Connected.&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;s.<span class="me1">onclose</span> = <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;closed&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; out<span class="br0">&#40;</span><span class="st0">&#39;Connection closed.&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;s.<span class="me1">onmessage</span> = <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;got: &quot;</span> + e.<span class="me1">data</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; out<span class="br0">&#40;</span>e.<span class="me1">data</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;form.<span class="me1">onsubmit</span> = <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; e.<span class="me1">preventDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; msg.<span class="me1">value</span> = <span class="st0">&#39;&#39;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; window.<span class="me1">scrollTop</span> = window.<span class="me1">scrollHeight</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> sendMsg<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; s.<span class="me1">send</span><span class="br0">&#40;</span>msg.<span class="me1">value</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> out<span class="br0">&#40;</span>text<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> el = document.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">&#39;p&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; el.<span class="me1">innerHTML</span> = text;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; output.<span class="me1">appendChild</span><span class="br0">&#40;</span>el<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;msg.<span class="kw3">focus</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>And the server code:</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#!/usr/bin/env python</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">socket</span>, <span class="kw3">threading</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># httphost = &quot;localhost:8888&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># sockethost = &quot;localhost:9876&quot;</span></div>
</li>
<li class="li1">
<div class="de1">httphost = <span class="st0">&quot;enekoalonso.com&quot;</span></div>
</li>
<li class="li1">
<div class="de1">sockethost = <span class="st0">&quot;enekoalonso.com:9876&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> handle<span class="br0">&#40;</span>s, addr<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; handsake = <span class="st0">&quot;HTTP/1.1 101 Web Socket Protocol Handshake<span class="es0">\r</span><span class="es0">\n</span>Upgrade: WebSocket<span class="es0">\r</span><span class="es0">\n</span>Connection: Upgrade<span class="es0">\r</span><span class="es0">\n</span>WebSocket-Origin: http://%s<span class="es0">\r</span><span class="es0">\n</span>WebSocket-Location: ws://%s/<span class="es0">\r</span><span class="es0">\n</span>WebSocket-Protocol: sample<span class="es0">\r</span><span class="es0">\n</span><span class="es0">\r</span><span class="es0">\n</span>&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>httphost, sockethost<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; s.<span class="me1">send</span><span class="br0">&#40;</span>handsake<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; data = s.<span class="me1">recv</span><span class="br0">&#40;</span><span class="nu0">1024</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; lock = <span class="kw3">threading</span>.<span class="me1">Lock</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">while</span> <span class="nu0">1</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; data = s.<span class="me1">recv</span><span class="br0">&#40;</span><span class="nu0">1024</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw1">not</span> data: <span class="kw1">break</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&#39;Data from&#39;</span>, addr, <span class="st0">&#39;:&#39;</span>, data</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; lock.<span class="me1">acquire</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#91;</span>conn.<span class="me1">send</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span> <span class="kw1">for</span> conn <span class="kw1">in</span> clients<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; lock.<span class="me1">release</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">print</span> <span class="st0">&#39;Client closed:&#39;</span>, addr</div>
</li>
<li class="li1">
<div class="de1">&nbsp; lock.<span class="me1">acquire</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; clients.<span class="me1">remove</span><span class="br0">&#40;</span>s<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; lock.<span class="me1">release</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; s.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> start_server<span class="br0">&#40;</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;s = <span class="kw3">socket</span>.<span class="kw3">socket</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;s.<span class="me1">setsockopt</span><span class="br0">&#40;</span><span class="kw3">socket</span>.<span class="me1">SOL_SOCKET</span>, <span class="kw3">socket</span>.<span class="me1">SO_REUSEADDR</span>, <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;s.<span class="me1">bind</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="st0">&#39;&#39;</span>, <span class="nu0">9876</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;s.<span class="me1">listen</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">while</span> <span class="nu0">1</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;conn, addr = s.<span class="me1">accept</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">print</span> <span class="st0">&#39;Connected by&#39;</span>, addr</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;clients.<span class="me1">append</span><span class="br0">&#40;</span>conn<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">threading</span>.<span class="me1">Thread</span><span class="br0">&#40;</span>target = handle, args = <span class="br0">&#40;</span>conn,addr<span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">clients = <span class="br0">&#91;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">start_server<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Check the live demo (be aware WebSockets are only supported by Google Chrome right now): <a href="http://enekoalonso.com/research/html5/websockets/python/">http://enekoalonso.com/research/html5/websockets/python/</a><br />
Open a few tabs and send some text. You should see it appearing in all of them. It will also work if you open the page in multiple browser windows or even if you open the page in different computers.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>May 3, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/03/playing-with-websockets/" title="Playing with WebSockets">Playing with WebSockets</a> (2)</li><li>May 6, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/06/tech-talks-at-level-studios/" title="Tech talks at LEVEL Studios">Tech talks at LEVEL Studios</a> (0)</li><li>February 19, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/" title="Having fun with Mooml &#038; Twitter">Having fun with Mooml &#038; Twitter</a> (0)</li><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Performance matters</title>
		<link>http://dev.enekoalonso.com/2010/05/16/performance-matters/</link>
		<comments>http://dev.enekoalonso.com/2010/05/16/performance-matters/#comments</comments>
		<pubDate>Sun, 16 May 2010 18:36:24 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[check]]></category>
		<category><![CDATA[checking]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[parameter]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[runtime]]></category>
		<category><![CDATA[value]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=543</guid>
		<description><![CDATA[I just read this on an email from a Google&#8217;s Closure developer: Adding runtime checks for invalid usage is something we have policy against. It adds to the code size as well as to the runtime cost. I totally agree. Developers should be responsible for their usage of APIs or third party libraries, while these [...]]]></description>
			<content:encoded><![CDATA[<p>I just read this on an email <a href="http://groups.google.com/group/closure-library-discuss/msg/15fae0a2aee76721">from a Google&#8217;s Closure developer</a>:</p>
<blockquote><p>Adding runtime checks for invalid usage is something we have policy against. It adds to the code size as well as to the runtime cost.</p></blockquote>
<p>I totally agree. Developers should be responsible for their usage of APIs or third party libraries, while these should focus on working as efficient as possible given the correct parameters. Being Javascript a non-strongly-typed language, checking the parameters passed to every function are right at runtime would be a huge overkill.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>March 15, 2010 -- <a href="http://dev.enekoalonso.com/2010/03/15/more-updates-to-mooml-coming-soon/" title="More updates to Mooml coming soon">More updates to Mooml coming soon</a> (0)</li><li>January 28, 2010 -- <a href="http://dev.enekoalonso.com/2010/01/28/dojo-y-yo/" title="Dojo y yo">Dojo y yo</a> (0)</li><li>May 6, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/06/tech-talks-at-level-studios/" title="Tech talks at LEVEL Studios">Tech talks at LEVEL Studios</a> (0)</li><li>January 28, 2010 -- <a href="http://dev.enekoalonso.com/2010/01/28/things-to-do/" title="Things to do">Things to do</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/05/16/performance-matters/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Interesting JSON vulnerability (old stuff)</title>
		<link>http://dev.enekoalonso.com/2010/05/14/interesting-json-vulnerability-old-stuff/</link>
		<comments>http://dev.enekoalonso.com/2010/05/14/interesting-json-vulnerability-old-stuff/#comments</comments>
		<pubDate>Fri, 14 May 2010 21:00:56 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[constructor]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[issue]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[vulnerability]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=532</guid>
		<description><![CDATA[Somebody at work passed this article about an interesting vulnerability in web APIs that use JSON. The exploit combines Cross Site Request Forgery (CSRF) with a JSON Array hack allowing an evil site to grab sensitive user data from an unsuspecting user. The hack involves redefining the Array constructor, which is totally legal in Javascript. http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx [...]]]></description>
			<content:encoded><![CDATA[<p>Somebody at work passed this article about an interesting vulnerability in web APIs that use JSON.</p>
<blockquote><p>The exploit combines <a title="Cross Site Request Forgery" href="http://www.codinghorror.com/blog/archives/001175.html">Cross Site Request Forgery</a> (CSRF) with a JSON Array hack allowing an evil site to grab sensitive user data from an unsuspecting user. The hack involves redefining the Array constructor, which is totally legal in Javascript.</p></blockquote>
<p><a href="http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx">http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx</a></p>
<p>I&#8217;ve found a while ago that you can put pretty much any URL on a script tag and the browser will download the content right away, whether it&#8217;s javascript or not, as long as the type attribute in the tag is set to &#8216;text/javascript&#8217;.  But although browsers download the URL content and place it inside the script tag, you can&#8217;t get to the content from Javascript (using innerHTML, for instance). Or can you? Apparently, Firebug can, at least on the HTML tab. I&#8217;m not sure if Firebug has direct access to the DOM, other than through Javascript, but I hope that is the case.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>February 19, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/" title="Having fun with Mooml &#038; Twitter">Having fun with Mooml &#038; Twitter</a> (0)</li><li>July 30, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/30/titanium-developer-love-and-hate/" title="Titanium Developer: love and hate">Titanium Developer: love and hate</a> (2)</li><li>July 20, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/20/little-tricks-string-padding-in-javascript/" title="Little tricks: string padding in Javascript">Little tricks: string padding in Javascript</a> (2)</li><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/05/14/interesting-json-vulnerability-old-stuff/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mooml 1.2.3 &#8211; Bye, bye, with()</title>
		<link>http://dev.enekoalonso.com/2010/04/28/mooml-1-2-3-bye-bye-with/</link>
		<comments>http://dev.enekoalonso.com/2010/04/28/mooml-1-2-3-bye-bye-with/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 04:26:54 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[eval]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mooml]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[version]]></category>
		<category><![CDATA[with]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=517</guid>
		<description><![CDATA[Mooml 1.1 was the first version of Mooml that didn&#8217;t rely on eval(), a javascript function that causes lot&#8217;s of problems when not used properly, but that also prevent minimizers and compilers like Closure to generate valid code. The new Mooml 1.2.3 release also gets rid of with(), which will no longer be used to [...]]]></description>
			<content:encoded><![CDATA[<p>Mooml 1.1 was the first version of Mooml that didn&#8217;t rely on eval(), a javascript function that causes lot&#8217;s of problems when not used properly, but that also prevent minimizers and compilers like Closure to generate valid code.</p>
<p>The new Mooml 1.2.3 release also gets rid of with(), which will no longer be used to render Mooml templates. Instead, templates are prepared when they get registered, so all template tag functions (div(), span(), p()) get replaced by calls to the Mooml engine. Although this means there will be a performance hit when registering templates, it also means templates will render faster. As a plus, template parameter names will no longer conflict with template tag function names. Thus, you can now have a template with a parameter named &#8216;div&#8217; and the template wont fail rendering.</p>
<p>Download: http://mootools.net/forge/p/mooml<br />
Source: http://github.com/eneko/mooml</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>March 15, 2010 -- <a href="http://dev.enekoalonso.com/2010/03/15/more-updates-to-mooml-coming-soon/" title="More updates to Mooml coming soon">More updates to Mooml coming soon</a> (0)</li><li>March 24, 2010 -- <a href="http://dev.enekoalonso.com/2010/03/24/mooml-1-1-no-more-eval-say-hi-to-mooml-template-and-mooml-templates/" title="Mooml 1.1 &#8211; No more eval(), say Hi to Mooml.Template and Mooml.Templates">Mooml 1.1 &#8211; No more eval(), say Hi to Mooml.Template and Mooml.Templates</a> (0)</li><li>February 19, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/" title="Having fun with Mooml &#038; Twitter">Having fun with Mooml &#038; Twitter</a> (0)</li><li>February 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/01/mooml-globalize-mooml-template-functions-going-global/" title="Mooml.globalize(): Mooml template functions going global">Mooml.globalize(): Mooml template functions going global</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/04/28/mooml-1-2-3-bye-bye-with/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting unique timestamps in Javascript</title>
		<link>http://dev.enekoalonso.com/2010/04/14/getting-unique-timestamps-in-javascript/</link>
		<comments>http://dev.enekoalonso.com/2010/04/14/getting-unique-timestamps-in-javascript/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 18:16:18 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[gettime]]></category>
		<category><![CDATA[id]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[time]]></category>
		<category><![CDATA[timestamp]]></category>
		<category><![CDATA[uid]]></category>
		<category><![CDATA[unique]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=510</guid>
		<description><![CDATA[Sometimes, when you want to generate unique id&#8217;s or similar, it is very common to use the current date as unix timestamp (new Date().getTime() or $time() in Mootools). The problem is that if we get the current timestamp multiple times too fast, it may happen that we get exactly the same value. Actually, this will [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes, when you want to generate unique id&#8217;s or similar, it is very common to use the current date as unix timestamp (new Date().getTime() or $time() in Mootools). The problem is that if we get the current timestamp multiple times too fast, it may happen that we get exactly the same value. Actually, this will happen very easily, as this tests shows:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> times = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span>times.<span class="me1">length</span> <span class="sy0">&lt;</span> <span class="nu0">20</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; times.<span class="me1">push</span><span class="br0">&#40;</span><span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span>times<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// All timestamps returned would be pretty much the same</span></div>
</li>
</ol>
</div>
<p>To prevent this, we can use this little function which ensures we get a unique timestamp every time we call it:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Mootools</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> getUniqueTime<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> time = $time<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>time == $time<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> $time<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Javascript generic</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> getUniqueTime<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> time = <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>time == <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Test it in Firebug:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> getUniqueTime<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> time = <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>time == <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> times = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span>times.<span class="me1">length</span> <span class="sy0">&lt;</span> <span class="nu0">20</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; times.<span class="me1">push</span><span class="br0">&#40;</span>getUniqueTime<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span>times<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Now all timestamps are unique</span></div>
</li>
</ol>
</div>
<p>Nice, uh?</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>April 28, 2010 -- <a href="http://dev.enekoalonso.com/2010/04/28/mooml-1-2-3-bye-bye-with/" title="Mooml 1.2.3 &#8211; Bye, bye, with()">Mooml 1.2.3 &#8211; Bye, bye, with()</a> (0)</li><li>March 24, 2010 -- <a href="http://dev.enekoalonso.com/2010/03/24/mooml-1-1-no-more-eval-say-hi-to-mooml-template-and-mooml-templates/" title="Mooml 1.1 &#8211; No more eval(), say Hi to Mooml.Template and Mooml.Templates">Mooml 1.1 &#8211; No more eval(), say Hi to Mooml.Template and Mooml.Templates</a> (0)</li><li>February 19, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/" title="Having fun with Mooml &#038; Twitter">Having fun with Mooml &#038; Twitter</a> (0)</li><li>February 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/01/mooml-globalize-mooml-template-functions-going-global/" title="Mooml.globalize(): Mooml template functions going global">Mooml.globalize(): Mooml template functions going global</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/04/14/getting-unique-timestamps-in-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mooml 1.1 &#8211; No more eval(), say Hi to Mooml.Template and Mooml.Templates</title>
		<link>http://dev.enekoalonso.com/2010/03/24/mooml-1-1-no-more-eval-say-hi-to-mooml-template-and-mooml-templates/</link>
		<comments>http://dev.enekoalonso.com/2010/03/24/mooml-1-1-no-more-eval-say-hi-to-mooml-template-and-mooml-templates/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 20:54:01 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mooml]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[render]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=501</guid>
		<description><![CDATA[Mooml 1.1 has been finally released today and made available to everybody via Github and Mootools Forge plugin repository. What is new in Mooml 1.1 Mooml 1.1 has a lot of new features, but these are worth to mention: No more eval() Mooml.Template Mooml.Templates Pass functions as arguments to template functions References to elements with [...]]]></description>
			<content:encoded><![CDATA[<p>Mooml 1.1 has been finally released today and made available to everybody via Github and Mootools Forge plugin repository.</p>
<h2>What is new in Mooml 1.1</h2>
<p>Mooml 1.1 has a lot of new features, but these are worth to mention:</p>
<ul>
<li>No more eval()</li>
<li>Mooml.Template</li>
<li>Mooml.Templates</li>
<li>Pass functions as arguments to template functions</li>
<li>References to elements with an Id</li>
</ul>
<h2>No more eval()</h2>
<p>Although the use of eval() was transparent to the final user, Mooml 1.0.X depended on it to properly generate the dom elements using the template functions like div(), span(), table(), etc. Mooml 1.1 does not use eval() anymore, which prevents issues when compressing the code with compilers like Google Closure Compiler and also increments the overall performance of template rendering.</p>
<h2>Mooml.Template</h2>
<p>Mooml.Template is the new constructor for Mooml templates. This constructor will allow to create standalone templates like this:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> tpl = <span class="kw2">new</span> Mooml.<span class="me1">Template</span><span class="br0">&#40;</span><span class="st0">&#39;mytemplate&#39;</span>, <span class="kw2">function</span><span class="br0">&#40;</span>params<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; div<span class="br0">&#40;</span><span class="br0">&#123;</span> id: params.<span class="me1">divId</span> <span class="br0">&#125;</span>, params.<span class="me1">divContent</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">document.<span class="me1">body</span>.<span class="me1">grab</span><span class="br0">&#40;</span>tpl.<span class="me1">render</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; divId: <span class="st0">&#39;mydiv&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; divContent: <span class="st0">&#39;Hi there!&#39;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// will create: &lt;div id=&quot;mydiv&quot;&gt;Hi there!&lt;/div&gt;</span></div>
</li>
</ol>
</div>
<p> There is no need to create a Mooml.Template object when using Mooml.register(), which will work as in previous versions of Mooml.</p>
<h2>Mooml.Templates</h2>
<p>Mooml.Templates is a mixing that can be implemented into other Mootools classes. This will allow these classes to create their own templates internally and use them without the need of registering global templates with Mooml.register(). Here is an example of a Dog class:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Dog = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; Implements: <span class="br0">&#91;</span>Options, Mooml.<span class="me1">Templates</span><span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; options: <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; bark: <span class="st0">&#39;Bark! Bark!&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">setOptions</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">register</span><span class="br0">&#40;</span><span class="st0">&#39;dog&#39;</span>, <span class="kw2">function</span><span class="br0">&#40;</span>bark<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;div<span class="br0">&#40;</span><span class="br0">&#123;</span> <span class="st0">&#39;class&#39;</span>: <span class="st0">&#39;dog&#39;</span><span class="br0">&#125;</span>, bark<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; toElement: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">this</span>.<span class="me1">render</span><span class="br0">&#40;</span><span class="st0">&#39;dog&#39;</span>, <span class="kw1">this</span>.<span class="me1">options</span>.<span class="me1">bark</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">document.<span class="me1">body</span>.<span class="me1">grab</span><span class="br0">&#40;</span><span class="kw2">new</span> Dog<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="co1">// &lt;div class=&quot;dog&quot;&gt;Bark! Bark!&lt;/div&gt;</span></div>
</li>
<li class="li1">
<div class="de1">document.<span class="me1">body</span>.<span class="me1">grab</span><span class="br0">&#40;</span><span class="kw2">new</span> Dog<span class="br0">&#40;</span><span class="br0">&#123;</span> bark: <span class="st0">&#39;Woof! Woof!&#39;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="co1">// &lt;div class=&quot;dog&quot;&gt;Woof! Woof!&lt;/div&gt;</span></div>
</li>
<li class="li1">
<div class="de1">document.<span class="me1">body</span>.<span class="me1">grab</span><span class="br0">&#40;</span><span class="kw2">new</span> Dog<span class="br0">&#40;</span><span class="br0">&#123;</span> bark: <span class="st0">&#39;Arf!&#39;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="co1">// &lt;div class=&quot;dog&quot;&gt;Arf!&lt;/div&gt;</span></div>
</li>
</ol>
</div>
<h2>Pass functions as arguments to template functions</h2>
<p>With Mooml 1.1, template functions accept functions as arguments. These function can be any function that returns an element, array of elements, string, number or any other argument type supported by Mooml template functions. For example:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> tpl = <span class="kw2">new</span> Mooml.<span class="me1">Template</span><span class="br0">&#40;</span><span class="st0">&#39;mytemplate&#39;</span>, <span class="kw2">function</span><span class="br0">&#40;</span>content<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; div<span class="br0">&#40;</span>content<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">document.<span class="me1">body</span>.<span class="me1">grab</span><span class="br0">&#40;</span>tpl.<span class="me1">render</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> <span class="st0">&#39;Html &lt;u&gt;returned&lt;/u&gt; by a function()&#39;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// will create: &lt;div&gt;Html &lt;u&gt;returned&lt;/u&gt; by a function()&lt;/div&gt;</span></div>
</li>
</ol>
</div>
<h2>References to elements with an Id</h2>
<p>Finally, Mooml 1.1 templates can return references to all elements rendered that contain an Id, including elements rendered in nested templates:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> tpl = <span class="kw2">new</span> Mooml.<span class="me1">Template</span><span class="br0">&#40;</span><span class="st0">&#39;mytemplate&#39;</span>, <span class="kw2">function</span><span class="br0">&#40;</span>content<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; div<span class="br0">&#40;</span><span class="br0">&#123;</span>id:<span class="st0">&#39;div1&#39;</span><span class="br0">&#125;</span>, content<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; div<span class="br0">&#40;</span><span class="br0">&#123;</span>id:<span class="st0">&#39;div2&#39;</span><span class="br0">&#125;</span>, content<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; div<span class="br0">&#40;</span><span class="br0">&#123;</span>id:<span class="st0">&#39;div3&#39;</span><span class="br0">&#125;</span>, content<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>, <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; saveElementRefs: <span class="kw2">true</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">document.<span class="me1">body</span>.<span class="me1">adopt</span><span class="br0">&#40;</span>tpl.<span class="me1">render</span><span class="br0">&#40;</span><span class="st0">&#39;some text&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">tpl.<span class="me1">elementRefs</span>.<span class="me1">div1</span>; <span class="co1">// reference to &lt;div id=&quot;div1&quot;&gt;some text&lt;/div&gt;</span></div>
</li>
<li class="li1">
<div class="de1">tpl.<span class="me1">elementRefs</span>.<span class="me1">div2</span>; <span class="co1">// reference to &lt;div id=&quot;div2&quot;&gt;some text&lt;/div&gt;</span></div>
</li>
<li class="li1">
<div class="de1">tpl.<span class="me1">elementRefs</span><span class="br0">&#91;</span><span class="st0">&#39;div3&#39;</span><span class="br0">&#93;</span>; <span class="co1">// reference to &lt;div id=&quot;div3&quot;&gt;some text&lt;/div&gt;</span></div>
</li>
</ol>
</div>
<p>Don&#8217;t miss the new demo: <a href="http://enekoalonso.com/projects/mooml/">http://enekoalonso.com/projects/mooml/</a><br />
Enjoy!</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>April 28, 2010 -- <a href="http://dev.enekoalonso.com/2010/04/28/mooml-1-2-3-bye-bye-with/" title="Mooml 1.2.3 &#8211; Bye, bye, with()">Mooml 1.2.3 &#8211; Bye, bye, with()</a> (0)</li><li>March 15, 2010 -- <a href="http://dev.enekoalonso.com/2010/03/15/more-updates-to-mooml-coming-soon/" title="More updates to Mooml coming soon">More updates to Mooml coming soon</a> (0)</li><li>February 19, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/" title="Having fun with Mooml &#038; Twitter">Having fun with Mooml &#038; Twitter</a> (0)</li><li>February 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/01/mooml-globalize-mooml-template-functions-going-global/" title="Mooml.globalize(): Mooml template functions going global">Mooml.globalize(): Mooml template functions going global</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/03/24/mooml-1-1-no-more-eval-say-hi-to-mooml-template-and-mooml-templates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Having fun with Mooml &amp; Twitter</title>
		<link>http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/</link>
		<comments>http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 20:43:54 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[jsonp]]></category>
		<category><![CDATA[mooml]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[sample]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=472</guid>
		<description><![CDATA[Mooml is a templating engine for Mootools. With it, you can create HTML from Javascript using a very clean syntax. Plus, it is extremely useful when you have to generate repeating elements, since Mooml automatically renders arrays of data multiple times. Let&#8217;s see an example. Searching Twitter Nowadays there are a lot of APIs out [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://mootools.net/plugins/p/mooml">Mooml</a> is a templating engine for Mootools. With it, you can create HTML from Javascript using a very clean syntax. Plus, it is extremely useful when you have to generate repeating elements, since Mooml automatically renders arrays of data multiple times. Let&#8217;s see an example.</p>
<h3>Searching Twitter</h3>
<p>Nowadays there are a lot of APIs out there that support JSON or JSONP, which we can use directly from the front end using Javascript. Also, there are other APIs that return tons of JS data, like Google Maps. In this example we are going to be searching Twitter and displaying the search results in a container div, properly rendered as HTML.</p>
<p>The url for searching Twitter is <a href="http://search.twitter.com/search.json?q=mootools&#038;show_user=true">http://search.twitter.com/search.json?q=mootools&#038;show_user=true</a> (searching for Mootools in this case). Check the output:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;results&quot;</span>:<span class="br0">&#91;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;profile_image_url&quot;</span>:<span class="st0">&quot;http://a3.twimg.com/profile_images/547672997/twitterProfilePhoto_normal.jpg&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;created_at&quot;</span>:<span class="st0">&quot;Fri, 19 Feb 2010 17:08:55 +0000&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;from_user&quot;</span>:<span class="st0">&quot;digitalr3bel&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;to_user_id&quot;</span>:<span class="nu0">1212494</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;text&quot;</span>:<span class="st0">&quot;@davidwalshblog Hi David &#8211; im a big fan of your site! Can you recommend a good MooTools tutorial for someone who can already program? thx&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;id&quot;</span>:<span class="nu0">9343656026</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;from_user_id&quot;</span>:<span class="nu0">23704390</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;to_user&quot;</span>:<span class="st0">&quot;davidwalshblog&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;geo&quot;</span>:<span class="kw2">null</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;iso_language_code&quot;</span>:<span class="st0">&quot;en&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="st0">&quot;source&quot;</span>:<span class="st0">&quot;&lt;a href=&quot;</span>http:<span class="co1">//apiwiki.twitter.com/&quot; rel=&quot;nofollow&quot;&gt;API&lt;/a&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// More results here&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;max_id&quot;</span>:<span class="nu0">9343656026</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;since_id&quot;</span>:<span class="nu0">0</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;refresh_url&quot;</span>:<span class="st0">&quot;?since_id=9343656026&amp;q=mootools&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;next_page&quot;</span>:<span class="st0">&quot;?page=2&amp;max_id=9343656026&amp;q=mootools&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;results_per_page&quot;</span>:<span class="nu0">15</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;page&quot;</span>:<span class="nu0">1</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;completed_in&quot;</span>:<span class="nu0">0.0352710000000001</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;query&quot;</span>:<span class="st0">&quot;mootools&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>We want to render each result inside out container div. On this example, we will just render the user name, user image and message text. Here is our Mooml template:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1">Mooml.<span class="me1">register</span><span class="br0">&#40;</span><span class="st0">&#39;twitter-search-result&#39;</span>, <span class="kw2">function</span><span class="br0">&#40;</span>entry<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; div<span class="br0">&#40;</span><span class="br0">&#123;</span>id: <span class="st0">&quot;tweet-&quot;</span> + entry.<span class="me1">id</span><span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; img<span class="br0">&#40;</span><span class="br0">&#123;</span>src: entry.<span class="me1">profile_image_url</span>, alt: entry.<span class="me1">from_user</span><span class="br0">&#125;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; span<span class="br0">&#40;</span>entry.<span class="me1">from_user</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; p<span class="br0">&#40;</span>entry.<span class="me1">text</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Since all results are returned into an array, we can pass it directly to Mooml which will render all of the elements in it:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Data is the JSON response from Twitter</span></div>
</li>
<li class="li1">
<div class="de1">Mooml.<span class="me1">render</span><span class="br0">&#40;</span><span class="st0">&#39;twitter-search-result&#39;</span>, data.<span class="me1">results</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>So, let&#8217;s do a live test. Type something you want to search for and hit the search button to see Mooml in action :)<br />

<p>Search: <input type="text" id="twitter-mooml-search" value="mootools" /> <input type="button" value="search" id="twitter-mooml-search-btn"/></p>
<div id="mooml-twitter-demo" style="width:400px;border:solid 1px #444;font-size:11px;font-face:Arial,Helvetica;margin:0 auto;"></div>

<script type="text/javascript" src="http://enekoalonso.com/lib/mootools-1.2.4-core-nc.js"></script>
<script type="text/javascript" src="http://enekoalonso.com/lib/mooml.js"></script>
<script type="text/javascript">
Mooml.register('twitter-search-result', function(entry) {
  div({id: "tweet-" + entry.id},
    img({src: entry.profile_image_url, alt: entry.from_user}),
    span(entry.from_user),
    p(entry.text)
  );
});

function searchTwitter() {
  new Element('script', {type:'text/javascript', src:'http://search.twitter.com/search.json?q={text}&show_user=true&callback=renderData'.substitute({text:$('twitter-mooml-search').get('value')})}).inject(document.head);
}
function renderData(data) {
  $('mooml-twitter-demo').empty().adopt(Mooml.render('twitter-search-result', data.results));
}
$('twitter-mooml-search-btn').addEvent('click', searchTwitter);
searchTwitter();
</script>
</p>
<p>How cool is that?</p>
<h3>The code</h3>
<p>Ok, so here is the whole code I have used in this post for this mini-demo:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>script type=<span class="st0">&quot;text/javascript&quot;</span> src=<span class="st0">&quot;http://enekoalonso.com/lib/mootools-1.2.4-core-nc.js&quot;</span><span class="sy0">&gt;&lt;/</span>script<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>script type=<span class="st0">&quot;text/javascript&quot;</span> src=<span class="st0">&quot;http://enekoalonso.com/lib/mooml.js&quot;</span><span class="sy0">&gt;&lt;/</span>script<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>script type=<span class="st0">&quot;text/javascript&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">Mooml.<span class="me1">register</span><span class="br0">&#40;</span><span class="st0">&#39;twitter-search-result&#39;</span>, <span class="kw2">function</span><span class="br0">&#40;</span>entry<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; div<span class="br0">&#40;</span><span class="br0">&#123;</span>id: <span class="st0">&quot;tweet-&quot;</span> + entry.<span class="me1">id</span><span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; img<span class="br0">&#40;</span><span class="br0">&#123;</span>src: entry.<span class="me1">profile_image_url</span>, alt: entry.<span class="me1">from_user</span><span class="br0">&#125;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; span<span class="br0">&#40;</span>entry.<span class="me1">from_user</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; p<span class="br0">&#40;</span>entry.<span class="me1">text</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> searchTwitter<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">new</span> Element<span class="br0">&#40;</span><span class="st0">&#39;script&#39;</span>, <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; type:<span class="st0">&#39;text/javascript&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; src:<span class="st0">&#39;http://search.twitter.com/search.json?q={text}&amp;show_user=true&amp;callback=renderData&#39;</span>.<span class="me1">substitute</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; text:$<span class="br0">&#40;</span><span class="st0">&#39;twitter-mooml-search&#39;</span><span class="br0">&#41;</span>.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&#39;value&#39;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">inject</span><span class="br0">&#40;</span>document.<span class="me1">head</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> renderData<span class="br0">&#40;</span>data<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; $<span class="br0">&#40;</span><span class="st0">&#39;mooml-twitter-demo&#39;</span><span class="br0">&#41;</span>.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">adopt</span><span class="br0">&#40;</span>Mooml.<span class="me1">render</span><span class="br0">&#40;</span><span class="st0">&#39;twitter-search-result&#39;</span>, data.<span class="me1">results</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span><span class="st0">&#39;twitter-mooml-search-btn&#39;</span><span class="br0">&#41;</span>.<span class="me1">addEvent</span><span class="br0">&#40;</span><span class="st0">&#39;click&#39;</span>, searchTwitter<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">searchTwitter<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>As you can see, the code is very basic and so is the Mooml template. The coolest thing here is that you don&#8217;t need to iterate over the results to render each element.</p>
<p>Have fun!</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>April 28, 2010 -- <a href="http://dev.enekoalonso.com/2010/04/28/mooml-1-2-3-bye-bye-with/" title="Mooml 1.2.3 &#8211; Bye, bye, with()">Mooml 1.2.3 &#8211; Bye, bye, with()</a> (0)</li><li>March 24, 2010 -- <a href="http://dev.enekoalonso.com/2010/03/24/mooml-1-1-no-more-eval-say-hi-to-mooml-template-and-mooml-templates/" title="Mooml 1.1 &#8211; No more eval(), say Hi to Mooml.Template and Mooml.Templates">Mooml 1.1 &#8211; No more eval(), say Hi to Mooml.Template and Mooml.Templates</a> (0)</li><li>March 15, 2010 -- <a href="http://dev.enekoalonso.com/2010/03/15/more-updates-to-mooml-coming-soon/" title="More updates to Mooml coming soon">More updates to Mooml coming soon</a> (0)</li><li>February 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/01/mooml-globalize-mooml-template-functions-going-global/" title="Mooml.globalize(): Mooml template functions going global">Mooml.globalize(): Mooml template functions going global</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mooml.globalize(): Mooml template functions going global</title>
		<link>http://dev.enekoalonso.com/2010/02/01/mooml-globalize-mooml-template-functions-going-global/</link>
		<comments>http://dev.enekoalonso.com/2010/02/01/mooml-globalize-mooml-template-functions-going-global/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 15:49:35 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[global]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mooml]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[scope]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=448</guid>
		<description><![CDATA[Since version 1.0.9, Mooml includes a new feature: globalize. It maybe handy for some websites to globalize all the Mooml template functions (div, a, p, span&#8230;) to the window object scope, so they can be used anywhere in the code without the need of defining or evaluating a template. For example, in normal Mootools code [...]]]></description>
			<content:encoded><![CDATA[<p>Since version 1.0.9, <a href="http://github.com/eneko/mooml">Mooml</a> includes a new feature: <string>globalize</strong>. It maybe handy for some websites to globalize all the Mooml template functions (div, a, p, span&#8230;) to the window object scope, so they can be used anywhere in the code without the need of defining or evaluating a template.</p>
<p>For example, in normal Mootools code we would create a div like this:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// options can have attributes, css, events and more</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> mydiv = <span class="kw2">new</span> Element<span class="br0">&#40;</span><span class="st0">&#39;div&#39;</span>, options<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>With Mooml.globalize() we can do this:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1">Mooml.<span class="me1">globalize</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Only need to call this once</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> mydiv = div<span class="br0">&#40;</span>options<span class="br0">&#41;</span>; <span class="co1">// Same options as Mootools new Element()</span></div>
</li>
</ol>
</div>
<p>Mooml globalized functions can also have nested elements, which makes very easy to create dom elements:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> mydiv = div<span class="br0">&#40;</span>options, </div>
</li>
<li class="li1">
<div class="de1">&nbsp;p<span class="br0">&#40;</span><span class="st0">&#39;First paragraph&#39;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;p<span class="br0">&#40;</span><span class="st0">&#39;Second paragraph&#39;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;div<span class="br0">&#40;</span><span class="st0">&#39;Nested div:&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; span<span class="br0">&#40;</span><span class="st0">&#39;div content&#39;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;Mooml.<span class="me1">render</span><span class="br0">&#40;</span><span class="st0">&#39;nested_template&#39;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="st0">&#39;Some &lt;b&gt;inline&lt;/b&gt; &lt;em&gt;html&lt;/em&gt; too&#39;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Will generate the dom elements for this html:</p>
<div class="geshi no html">
<ol>
<li class="li1">
<div class="de1">&lt;div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;&lt;p&gt;First paragraph&lt;/p&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;&lt;p&gt;Second paragraph&lt;/p&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;&lt;div&gt;Nested div:
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;span&gt;div content&lt;/span&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;&lt;/div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;&lt;!&#8211; nested template here &#8211;&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;Some &lt;b&gt;inline&lt;/b&gt; &lt;em&gt;html&lt;/em&gt; too
</div>
</li>
<li class="li1">
<div class="de1">&lt;/div&gt;</div>
</li>
</ol>
</div>
<p>Elements created by Mooml template functions are not automatically injected in the DOM. They are just created like when you use new Element().</p>
<p>Please be aware that using Mooml.globalize() feature will pollute the window object scope, overriding any methods with the same name and/or possibly conflicting with other Javascript libraries. As a tip, Mooml.tags can be edited before calling Mooml.globalize(), so only functions for those tags we are interested on will be created.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>April 28, 2010 -- <a href="http://dev.enekoalonso.com/2010/04/28/mooml-1-2-3-bye-bye-with/" title="Mooml 1.2.3 &#8211; Bye, bye, with()">Mooml 1.2.3 &#8211; Bye, bye, with()</a> (0)</li><li>March 24, 2010 -- <a href="http://dev.enekoalonso.com/2010/03/24/mooml-1-1-no-more-eval-say-hi-to-mooml-template-and-mooml-templates/" title="Mooml 1.1 &#8211; No more eval(), say Hi to Mooml.Template and Mooml.Templates">Mooml 1.1 &#8211; No more eval(), say Hi to Mooml.Template and Mooml.Templates</a> (0)</li><li>February 19, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/" title="Having fun with Mooml &#038; Twitter">Having fun with Mooml &#038; Twitter</a> (0)</li><li>March 15, 2010 -- <a href="http://dev.enekoalonso.com/2010/03/15/more-updates-to-mooml-coming-soon/" title="More updates to Mooml coming soon">More updates to Mooml coming soon</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/02/01/mooml-globalize-mooml-template-functions-going-global/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dojo y yo</title>
		<link>http://dev.enekoalonso.com/2010/01/28/dojo-y-yo/</link>
		<comments>http://dev.enekoalonso.com/2010/01/28/dojo-y-yo/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 05:48:02 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[dependencies]]></category>
		<category><![CDATA[dependency]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[goog]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[include]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[require]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=423</guid>
		<description><![CDATA[Back in November 2008 I had a chance to work with Dojo on a project for Cisco WebEx. I didn&#8217;t like it at all. I was used to the simplicity of jQuery and Mootools and I couldn&#8217;t understand how Dojo had been designed so complicated. Well, one year later I just realized that it is [...]]]></description>
			<content:encoded><![CDATA[<p>Back in November 2008 I had a chance to work with <a href="http://dojotoolkit.org/">Dojo</a> on a project for <a href="http://www.webex.com/iphone/">Cisco WebEx</a>. I didn&#8217;t like it at all. I was used to the simplicity of jQuery and Mootools and I couldn&#8217;t understand how Dojo had been designed so complicated. Well, one year later I just realized that it is not that Dojo was that complicated. It is that I wasn&#8217;t ready for it. Now it is time to give it another chance.</p>
<h3>Some cool stuff about Dojo</h3>
<p>Reading Dojo&#8217;s documentation I have finally understood something that I was wondering how it works. It&#8217;s nothing really complicated, but it&#8217;s actually very cool: <a href="http://api.dojotoolkit.org/jsdoc/HEAD/dojo.require">dojo.require</a></p>
<p>Javascript requests to the server are asynchronous (not sure if synchronous request can be done). So we depend on callback functions to continue the flow of your program. That means that when we put <code lang="javascript">dojo.require('somefancyjs');</code> on a line, the execution does not stop and it continues to the next line of code while the browser downloads that file from the server in the background.</p>
<p>Looks like Dojo puts those requests on some kind of array, array that is checked when you use <code>dojo.addOnLoad()</code> which does not execute your callback function until all elements of the array have been downloaded. That is very cool because that means you can do as many dojo.require&#8217;s as you need. The down side is that you need to put your code inside a callback function, which is not very bad when working with objects.</p>
<p>Next, I have to find out how goog.require works ;)</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>May 16, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/16/performance-matters/" title="Performance matters">Performance matters</a> (2)</li><li>January 28, 2010 -- <a href="http://dev.enekoalonso.com/2010/01/28/things-to-do/" title="Things to do">Things to do</a> (0)</li><li>May 6, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/06/tech-talks-at-level-studios/" title="Tech talks at LEVEL Studios">Tech talks at LEVEL Studios</a> (0)</li><li>March 15, 2010 -- <a href="http://dev.enekoalonso.com/2010/03/15/more-updates-to-mooml-coming-soon/" title="More updates to Mooml coming soon">More updates to Mooml coming soon</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/01/28/dojo-y-yo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Happy New Year 2010</title>
		<link>http://dev.enekoalonso.com/2009/12/31/happy-new-year-2010/</link>
		<comments>http://dev.enekoalonso.com/2009/12/31/happy-new-year-2010/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 02:19:52 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[happy]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[new]]></category>
		<category><![CDATA[year]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=386</guid>
		<description><![CDATA[&#40;function&#40;&#41;&#123; t=&#91;72,97,112,112,121,32,78,101,119,32,89,101,97,114,32,50,48,49,48&#93;; alert&#40;String.fromCharCode.apply&#40;null, t&#41;&#41;; &#125;&#41;&#40;&#41;​ Related Posts:July 30, 2010 -- Titanium Developer: love and hate (2)July 20, 2010 -- Little tricks: string padding in Javascript (2)July 1, 2010 -- Little tricks: editing strings by index in Javascript and Python (1)May 22, 2010 -- More WebSockets, now with Python! (1)]]></description>
			<content:encoded><![CDATA[<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">t=<span class="br0">&#91;</span><span class="nu0">72</span>,<span class="nu0">97</span>,<span class="nu0">112</span>,<span class="nu0">112</span>,<span class="nu0">121</span>,<span class="nu0">32</span>,<span class="nu0">78</span>,<span class="nu0">101</span>,<span class="nu0">119</span>,<span class="nu0">32</span>,<span class="nu0">89</span>,<span class="nu0">101</span>,<span class="nu0">97</span>,<span class="nu0">114</span>,<span class="nu0">32</span>,<span class="nu0">50</span>,<span class="nu0">48</span>,<span class="nu0">49</span>,<span class="nu0">48</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">alert</span><span class="br0">&#40;</span>String.<span class="me1">fromCharCode</span>.<span class="me1">apply</span><span class="br0">&#40;</span><span class="kw2">null</span>, t<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span>​</div>
</li>
</ol>
</div>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>July 30, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/30/titanium-developer-love-and-hate/" title="Titanium Developer: love and hate">Titanium Developer: love and hate</a> (2)</li><li>July 20, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/20/little-tricks-string-padding-in-javascript/" title="Little tricks: string padding in Javascript">Little tricks: string padding in Javascript</a> (2)</li><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li><li>May 22, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/" title="More WebSockets, now with Python!">More WebSockets, now with Python!</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2009/12/31/happy-new-year-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating HTML blocks with Mootools</title>
		<link>http://dev.enekoalonso.com/2009/09/02/creating-html-blocks-with-mootools/</link>
		<comments>http://dev.enekoalonso.com/2009/09/02/creating-html-blocks-with-mootools/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 20:50:16 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[block]]></category>
		<category><![CDATA[extend]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[implement]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=376</guid>
		<description><![CDATA[Sometimes we need to create HTML from JS. There are multiple ways to do this, from using innerHTML to creating element by element appending child to parents, setting attributes, etc. And there are as many different opinions about what is the right way to do it. Meanwhile, once thing I missed from jQuery, not available [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes we need to create HTML from JS. There are multiple ways to do this, from using innerHTML to creating element by element appending child to parents, setting attributes, etc. And there are as many different opinions about what is the right way to do it.</p>
<p>Meanwhile, once thing I missed from jQuery, not available on Mootools, was the ability to do something like this:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> element = jQuery<span class="br0">&#40;</span><span class="st0">&#39;&lt;div id=&quot;foo&quot;&gt;bar&lt;/div&gt;&#39;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>In Mootools, the equivalent should be:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> element = <span class="kw2">new</span> Element<span class="br0">&#40;</span><span class="st0">&#39;&lt;div id=&quot;foo&quot;&gt;bar&lt;/div&gt;&#39;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>But that does not work.</p>
<p>On the Mootools mailing list, someone was asking about how to implement this and we just found a different approach, which instead of using the Element class, extends the String class like this:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1">String.<span class="me1">implement</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;toElement: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="kw2">new</span> Element<span class="br0">&#40;</span><span class="st0">&#39;div&#39;</span>, <span class="br0">&#123;</span>html:<span class="kw1">this</span><span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">getFirst</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Now you can do this:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> element &nbsp;= <span class="st0">&#39;&lt;div id=&quot;foo&quot;&gt;bar&lt;/div&gt;&#39;</span>.<span class="me1">toElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>To try it, paste this snippet on Firebug&#8217;s console:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1">String.<span class="me1">implement</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;toElement: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="kw2">new</span> Element<span class="br0">&#40;</span><span class="st0">&#39;div&#39;</span>, <span class="br0">&#123;</span>html:<span class="kw1">this</span><span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">getFirst</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&#39;&lt;div id=&quot;foo&quot;&gt;bar&lt;/div&gt;&#39;</span>.<span class="me1">toElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&#39;id&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Nice, uh? Of course, the HTML can be as complex as you need and where do you get the content of the string is up to you :)</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>March 24, 2010 -- <a href="http://dev.enekoalonso.com/2010/03/24/mooml-1-1-no-more-eval-say-hi-to-mooml-template-and-mooml-templates/" title="Mooml 1.1 &#8211; No more eval(), say Hi to Mooml.Template and Mooml.Templates">Mooml 1.1 &#8211; No more eval(), say Hi to Mooml.Template and Mooml.Templates</a> (0)</li><li>July 20, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/20/little-tricks-string-padding-in-javascript/" title="Little tricks: string padding in Javascript">Little tricks: string padding in Javascript</a> (2)</li><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li><li>April 28, 2010 -- <a href="http://dev.enekoalonso.com/2010/04/28/mooml-1-2-3-bye-bye-with/" title="Mooml 1.2.3 &#8211; Bye, bye, with()">Mooml 1.2.3 &#8211; Bye, bye, with()</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2009/09/02/creating-html-blocks-with-mootools/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Bad practices writing Javascript &amp; good tips for everyone</title>
		<link>http://dev.enekoalonso.com/2009/08/17/bad-practices-writing-javascript-good-tips-for-everyone/</link>
		<comments>http://dev.enekoalonso.com/2009/08/17/bad-practices-writing-javascript-good-tips-for-everyone/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 18:56:12 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=371</guid>
		<description><![CDATA[I found specially interesting the use of document fragments.. Didn’t know about them before :) http://james.padolsey.com/javascript/javascript-bad-practices/ Related Posts:July 30, 2010 -- Titanium Developer: love and hate (2)July 20, 2010 -- Little tricks: string padding in Javascript (2)July 1, 2010 -- Little tricks: editing strings by index in Javascript and Python (1)May 22, 2010 -- More [...]]]></description>
			<content:encoded><![CDATA[<p>I found specially interesting the use of document fragments.. Didn’t know about them before :)<br />
<a href="http://james.padolsey.com/javascript/javascript-bad-practices/">http://james.padolsey.com/javascript/javascript-bad-practices/</a></p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>July 30, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/30/titanium-developer-love-and-hate/" title="Titanium Developer: love and hate">Titanium Developer: love and hate</a> (2)</li><li>July 20, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/20/little-tricks-string-padding-in-javascript/" title="Little tricks: string padding in Javascript">Little tricks: string padding in Javascript</a> (2)</li><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li><li>May 22, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/" title="More WebSockets, now with Python!">More WebSockets, now with Python!</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2009/08/17/bad-practices-writing-javascript-good-tips-for-everyone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setters &amp; Getters on Mootools classes</title>
		<link>http://dev.enekoalonso.com/2009/07/20/setters-getters-on-mootools-classes/</link>
		<comments>http://dev.enekoalonso.com/2009/07/20/setters-getters-on-mootools-classes/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 23:45:15 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[getter]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[setter]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=343</guid>
		<description><![CDATA[Although I haven&#8217;t need them for my classes, I thought it would be very cool to have the possibility to use them. Setters and Getters are very popular in modern programming languages, since they let you do some actions when a member/property of an object is being accessed or modified. Setters and Getters are native [...]]]></description>
			<content:encoded><![CDATA[<p>Although I haven&#8217;t need them for my classes, I thought it would be very cool to have the possibility to use them. Setters and Getters are very popular in modern programming languages, since they let you do some actions when a member/property of an object is being accessed or modified. <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/set_Operator">Setters</a> and <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/get_Operator">Getters</a> are native on Javascript objects.</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Setter on plain JS</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> b = <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; saveCount: <span class="nu0">0</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; set count <span class="br0">&#40;</span>c<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&#39;Setting count (B):&#39;</span> + c<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">saveCount</span> = c;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; get count <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&#39;count is being accessed (B)&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">this</span>.<span class="me1">saveCount</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">b.<span class="me1">count</span> = <span class="nu0">5</span>;</div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;Count (B): &quot;</span> + b.<span class="me1">count</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Well, Mootools objects created using Class do not support that syntax. Fortunately, we can use the <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/defineSetter">__defineSetter__</a> and <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/defineGetter">__defineGetter__</a> functions:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Setter in Mootools</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> A = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; saveCount: <span class="nu0">0</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.__defineSetter__<span class="br0">&#40;</span><span class="st0">&quot;count&quot;</span>, <span class="kw1">this</span>.<span class="me1">setCount</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.__defineGetter__<span class="br0">&#40;</span><span class="st0">&quot;count&quot;</span>, <span class="kw1">this</span>.<span class="me1">getCount</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; setCount: <span class="kw2">function</span><span class="br0">&#40;</span>c<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&#39;Setting count(A):&#39;</span> + c<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">saveCount</span> = c;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; getCount: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&#39;count is being accessed (A)&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">this</span>.<span class="me1">saveCount</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> a = <span class="kw2">new</span> A<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">a.<span class="me1">count</span> = <span class="nu0">5</span>;</div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;Count(A): &quot;</span> + a.<span class="me1">count</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Nice, uh? </p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>April 23, 2009 -- <a href="http://dev.enekoalonso.com/2009/04/23/sending-messages-between-javascript-objects/" title="Sending messages between Javascript objects">Sending messages between Javascript objects</a> (2)</li><li>April 7, 2009 -- <a href="http://dev.enekoalonso.com/2009/04/07/setting-up-timers-and-intervals-inside-js-objects/" title="Setting up timers and intervals inside JS objects">Setting up timers and intervals inside JS objects</a> (2)</li><li>January 2, 2009 -- <a href="http://dev.enekoalonso.com/2009/01/02/solving-the-8-queen-puzzle-in-javascript/" title="Solving the 8 Queen Puzzle in Javascript">Solving the 8 Queen Puzzle in Javascript</a> (1)</li><li>April 28, 2010 -- <a href="http://dev.enekoalonso.com/2010/04/28/mooml-1-2-3-bye-bye-with/" title="Mooml 1.2.3 &#8211; Bye, bye, with()">Mooml 1.2.3 &#8211; Bye, bye, with()</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2009/07/20/setters-getters-on-mootools-classes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone 3.0 geolocation with Javascript</title>
		<link>http://dev.enekoalonso.com/2009/06/30/iphone-3-0-geolocation-with-javascript/</link>
		<comments>http://dev.enekoalonso.com/2009/06/30/iphone-3-0-geolocation-with-javascript/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 16:13:43 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[safari]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=338</guid>
		<description><![CDATA[I was watching one of the video tutorials from Apple last night about some custom JS available on Safari, only on the iPhone 3.0, that let’s you interact with the phone and obtain data like the current location, etc. So I built a little page to see how it works. I included Mootools 1.2.3 from [...]]]></description>
			<content:encoded><![CDATA[<p>I was watching one of the video tutorials from Apple last night about some custom JS available on Safari, only on the iPhone 3.0, that let’s you interact with the phone and obtain data like the current location, etc.</p>
<p>So I built a little page to see how it works. I included Mootools 1.2.3 from Google servers and the Google Maps API. And voilá, with a few lines of code we have a totally functional web based GSP navigation system. A little bit ugly, but functional. Currenlty it only centers the map on the coordinates given by the phone, and also does a reverse geolocation to obtain the address (actually city, state and country). But it could be easily extended to add markers to the map, or even paths to track the movement.</p>
<p>If you have an iPhone (or an iPhone simulator) go to:<br />
<a href="http://enekoalonso.com/research/iphone/geolocation.html">http://enekoalonso.com/research/iphone/geolocation.html</a></p>
<p>The source code:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Navigator = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Listen for position changes</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">watchId</span> = navigator.<span class="me1">geolocation</span>.<span class="me1">watchPosition</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span>position<span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="kw1">this</span>.<span class="me1">position</span><span class="br0">&#40;</span>position<span class="br0">&#41;</span> <span class="br0">&#125;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span> enableHighAccuracy: <span class="kw2">true</span>, timeout: <span class="nu0">1000</span>, maximumAge: <span class="nu0">10000</span> <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">infoPanel</span> = $<span class="br0">&#40;</span><span class="st0">&#39;info&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Create the Geocoder and the Map</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">geocoder</span> = <span class="kw2">new</span> google.<span class="me1">maps</span>.<span class="me1">Geocoder</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">map</span> = <span class="kw2">new</span> google.<span class="me1">maps</span>.<span class="me1">Map</span><span class="br0">&#40;</span>$<span class="br0">&#40;</span><span class="st0">&#39;map&#39;</span><span class="br0">&#41;</span>, <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; zoom: <span class="nu0">12</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; mapTypeId: google.<span class="me1">maps</span>.<span class="me1">MapTypeId</span>.<span class="me1">ROADMAP</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; position: <span class="kw2">function</span><span class="br0">&#40;</span>position<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Update labels</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">infoPanel</span>.<span class="me1">getElement</span><span class="br0">&#40;</span><span class="st0">&#39;p.date&#39;</span><span class="br0">&#41;</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;text&#39;</span>, position.<span class="me1">timestamp</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">infoPanel</span>.<span class="me1">getElement</span><span class="br0">&#40;</span><span class="st0">&#39;p.coords&#39;</span><span class="br0">&#41;</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;text&#39;</span>, position.<span class="me1">coords</span>.<span class="me1">latitude</span> + <span class="st0">&#39;, &#39;</span> + position.<span class="me1">coords</span>.<span class="me1">longitude</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">infoPanel</span>.<span class="me1">getElement</span><span class="br0">&#40;</span><span class="st0">&#39;p.altitude&#39;</span><span class="br0">&#41;</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;text&#39;</span>, position.<span class="me1">coords</span>.<span class="me1">altitude</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">infoPanel</span>.<span class="me1">getElement</span><span class="br0">&#40;</span><span class="st0">&#39;p.heading&#39;</span><span class="br0">&#41;</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;text&#39;</span>, position.<span class="me1">coords</span>.<span class="me1">heading</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">infoPanel</span>.<span class="me1">getElement</span><span class="br0">&#40;</span><span class="st0">&#39;p.speed&#39;</span><span class="br0">&#41;</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;text&#39;</span>, position.<span class="me1">coords</span>.<span class="me1">speed</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Center map</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> latLng = <span class="kw2">new</span> google.<span class="me1">maps</span>.<span class="me1">LatLng</span><span class="br0">&#40;</span>position.<span class="me1">coords</span>.<span class="me1">latitude</span>, position.<span class="me1">coords</span>.<span class="me1">longitude</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">map</span>.<span class="me1">set_center</span><span class="br0">&#40;</span>latLng<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Reverse geolocation (get current address)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">geocoder</span>.<span class="me1">geocode</span><span class="br0">&#40;</span><span class="br0">&#123;</span><span class="st0">&#39;latLng&#39;</span>: latLng<span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span>results, <span class="kw3">status</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>google.<span class="me1">maps</span>.<span class="me1">GeocoderStatus</span>.<span class="me1">OK</span><span class="br0">&#41;</span> <span class="kw1">this</span>.<span class="me1">showAddress</span><span class="br0">&#40;</span>results<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; showAddress: <span class="kw2">function</span><span class="br0">&#40;</span>results<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// console.dir(response);</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>results<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">infoPanel</span>.<span class="me1">getElement</span><span class="br0">&#40;</span><span class="st0">&#39;p.location&#39;</span><span class="br0">&#41;</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#39;text&#39;</span>, results<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>.<span class="me1">formatted_address</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">window.<span class="me1">addEvent</span><span class="br0">&#40;</span><span class="st0">&#39;load&#39;</span>, <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">new</span> Navigator<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Enjoy.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>February 19, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/" title="Having fun with Mooml &#038; Twitter">Having fun with Mooml &#038; Twitter</a> (0)</li><li>January 28, 2010 -- <a href="http://dev.enekoalonso.com/2010/01/28/things-to-do/" title="Things to do">Things to do</a> (0)</li><li>February 28, 2009 -- <a href="http://dev.enekoalonso.com/2009/02/28/kyte-rest-api/" title="Kyte&#8217;s REST API">Kyte&#8217;s REST API</a> (0)</li><li>July 30, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/30/creating-qr-codes-with-google-charts-api/" title="Creating QR Codes with Google Charts API">Creating QR Codes with Google Charts API</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2009/06/30/iphone-3-0-geolocation-with-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sending messages between Javascript objects</title>
		<link>http://dev.enekoalonso.com/2009/04/23/sending-messages-between-javascript-objects/</link>
		<comments>http://dev.enekoalonso.com/2009/04/23/sending-messages-between-javascript-objects/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 04:44:34 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[instance]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[messages]]></category>
		<category><![CDATA[messaging]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[msg]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[oriented]]></category>
		<category><![CDATA[register]]></category>
		<category><![CDATA[system]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=296</guid>
		<description><![CDATA[When applications (or websites) get pretty big, it usually happens that a lot of different objects or classes interact with each other or, even worst, depend on each other to achieve the site functionality. A simple example could be a Tabs manager class, which controls a set of tabs in the page. Sometimes, the content [...]]]></description>
			<content:encoded><![CDATA[<p>When applications (or websites) get pretty big, it usually happens that a lot of different objects or classes interact with each other or, even worst, depend on each other to achieve the site functionality. </p>
<p>A simple example could be a Tabs manager class, which controls a set of tabs in the page. Sometimes, the content in this tabs is sensitive to when the tabs are shown or hidden. At this point you have three options: either the Tabs class needs to know about the content or you create a set of callback functions or you use custom events. Still, for every one of these options you are going to need variables referencing the instances of your classes (this is: var myTabs = new Tabs())</p>
<p>Personally, I don&#8217;t like having global variables for the objects I create. I think the code gets very messy and complicated.</p>
<p>So, after dealing with all these issues at work day after day I thought it would be very cool to have a messaging system between my classes, the same way other languages like Cocoa do (in a more simpler way, at least for now).</p>
<h3>Sending messages between classes</h3>
<p>Wouldn&#8217;t it be nice if the Tabs class would send a message every time a new tab is selected? Wouldn&#8217;t it be nice if the objects that are going to reside inside those tabs could listen to that message and update accordingly?</p>
<p>To do this, I created a Base class and a Register, where my objects will register automatically upon instantiation (thanks to the Base class).</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> InstanceRegister = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; instances: <span class="br0">&#91;</span><span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; addInstance: <span class="kw2">function</span><span class="br0">&#40;</span>object<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">instances</span>.<span class="me1">push</span><span class="br0">&#40;</span>object<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; broadcastMessage: <span class="kw2">function</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $A<span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">instances</span><span class="br0">&#41;</span>.<span class="me1">each</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="kw1">item</span>, index<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">item</span>.<span class="me1">processMessage</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Register = <span class="kw2">new</span> InstanceRegister<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Base = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; ClassName: <span class="st0">&#39;Base&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; Implements: Options,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">setOptions</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Register.<span class="me1">addInstance</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; processMessage: <span class="kw2">function</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">ClassName</span>, <span class="st0">&#39; msg received: &#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; console.<span class="me1">dir</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; sendMessage: <span class="kw2">function</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Register.<span class="me1">broadcastMessage</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>As you can see, the register is just an array of Instances. Yes, Register is a global object, but it will be the only one we will need. Meanwhile, the Base class adds the new instance to the Register automatically. For convenience, the Base class has a sendMessage method. Also, for convenience, I like to add a ClassName property to all my classes in case I need it later for logging, instance class type identification, etc.</p>
<p>Now, thanks to MooTools, we can create our classes and make them inherit from Base. We can override the processMessages method and act accordingly:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Tabs = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;ClassName: <span class="st0">&#39;Tabs&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">Extends</span>: Base,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="me1">activateTab</span>: <span class="kw2">function</span><span class="br0">&#40;</span>tab<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">this</span>.<span class="me1">sendMessage</span><span class="br0">&#40;</span><span class="br0">&#123;</span>msg:<span class="st0">&#39;tabActivated&#39;</span>, data:tab<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> VideoPlayer = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;ClassName: <span class="st0">&#39;VideoPlayer&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">Extends</span>: Base,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="me1">processMessage</span>: <span class="kw2">function</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>msg.<span class="me1">msg</span> == <span class="st0">&#39;tabActivated&#39;</span> <span class="sy0">&amp;&amp;</span> msg.<span class="me1">data</span> = <span class="st0">&#39;video-tab&#39;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">// Play video</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>The beautifulness of this code resides, as I mentioned before, in the absence of any object references. Tabs doesn&#8217;t know anything about the VideoPlayer class nor any other object listening to the messages. And the VideoPlayer doesn&#8217;t know anything about the Tabs class either. It only knows about the message it has to listen to. No object references, no methods, no callbacks.</p>
<p>Pay attention now. This is the best part! Whenever we instance our classes, no matter how many times we do, we don&#8217;t need variable references anymore:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">new</span> Tabs<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">new</span> VideoPlayer<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Nice, uh?</p>
<p>Since I implemented this class I use it a lot on every project at work. It makes my life easier, keeping my classes simple and independent from each other. It&#8217;s even better. We have got to a point where we have integrated this feature with our Flash components, so these send messages to the Register when needed and any JS object listening reacts to them as needed. </p>
<p>By doing this, even being unidirectional (Flash to JS only), we have achieved something great: from now on, our Flash objects don&#8217;t need to know anything about our JS objects at all. Just send a message to the register and done.</p>
<p>At any point, even from Firebug, you can send a message to the Register. This is very nice, even for debugging:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1">Register.<span class="me1">broadcastMessage</span><span class="br0">&#40;</span><span class="br0">&#123;</span>msg:<span class="st0">&#39;hello&#39;</span>,data:<span class="st0">&#39;world&#39;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<h3>A listener class</h3>
<p>I found it is very nice, while in development, to have a Listener class debugging any message received. This way I don&#8217;t need to add a console.log call on all my classes to output received messages. The Listener will do it for me:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Listener = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">Extends</span>: Base,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;initialize: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">this</span>.<span class="me1">parent</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">this</span>.<span class="me1">ignoreMessages</span> = <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;processMessage: <span class="kw2">function</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>msg.<span class="me1">msg</span> == <span class="st0">&#39;stopListener&#39;</span><span class="br0">&#41;</span> <span class="kw1">this</span>.<span class="me1">ignoreMessages</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>msg.<span class="me1">msg</span> == <span class="st0">&#39;startListener&#39;</span><span class="br0">&#41;</span> <span class="kw1">this</span>.<span class="me1">ignoreMessages</span> = <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">ignoreMessages</span><span class="br0">&#41;</span> <span class="kw1">return</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&#39;Listener: msg received:&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; console.<span class="me1">dir</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">new</span> Listener<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Even you can control the Listener by sending custom messages to it! Awesome!</p>
<h3>Could this be achieved with custom events?</h3>
<p>With Mootools, creating custom events is piece of cake. But from what I understand, custom events work only inside the object that is firing them. This is, if object A fires an event &#8216;customEvent&#8217;, you can only listen to it if you add a callback function when you instantiate that class:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> A = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; Implements: Events,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; document.<span class="me1">body</span>.<span class="me1">addEvent</span><span class="br0">&#40;</span><span class="st0">&#39;click&#39;</span>, <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&#39;A: body clicked&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">fireEvent</span><span class="br0">&#40;</span><span class="st0">&#39;bodyClicked&#39;</span>, <span class="br0">&#91;</span><span class="kw1">this</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> B = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; doSomething: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&#39;B: doing something&#8230;&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">new</span> A<span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; onBodyClicked: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Tell B to do something (you need a reference to B!)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">new</span> B<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Will never do something</span></div>
</li>
</ol>
</div>
<p>Ideally, B should be able to listen to the bodyClicked event without passing any info when A is instantiated. But if I&#8217;m not mistaken, this is not possible.</p>
<h3>Revised version</h3>
<p>I decided that it would be cool to have the Messenger as something my classes could implement, instead of inherit from (Base). Also, it would be good if one object could register for a specific message only, which would improve performance too.</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> NotificationServiceCenter = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;instances: <span class="br0">&#123;</span><span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;addObserver: <span class="kw2">function</span><span class="br0">&#40;</span>msg, instance<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw1">this</span>.<span class="me1">instances</span><span class="br0">&#91;</span>msg<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">this</span>.<span class="me1">instances</span><span class="br0">&#91;</span>msg<span class="br0">&#93;</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">this</span>.<span class="me1">instances</span><span class="br0">&#91;</span>msg<span class="br0">&#93;</span>.<span class="me1">push</span><span class="br0">&#40;</span>instance<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;broadcastMessage: <span class="kw2">function</span><span class="br0">&#40;</span>msg, data<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">instances</span><span class="br0">&#91;</span>msg<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;$A<span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">instances</span><span class="br0">&#91;</span>msg<span class="br0">&#93;</span><span class="br0">&#41;</span>.<span class="me1">each</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="kw1">item</span>, index<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">item</span>.<span class="me1">processMessage</span><span class="br0">&#40;</span>msg, data<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> NotificationService = <span class="kw2">new</span> NotificationServiceCenter<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Messenger = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;addMsgEvent: <span class="kw2">function</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; NotificationService.<span class="me1">addObserver</span><span class="br0">&#40;</span>msg, <span class="kw1">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;sendMessage: <span class="kw2">function</span><span class="br0">&#40;</span>msg, data<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; NotificationService.<span class="me1">broadcastMessage</span><span class="br0">&#40;</span>msg, data<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;processMessage: <span class="kw2">function</span><span class="br0">&#40;</span>msg, data<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// For implementation on the final Class</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> A = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;Implements: Messenger,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;initialize: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; document.<span class="me1">body</span>.<span class="me1">addEvent</span><span class="br0">&#40;</span><span class="st0">&#39;click&#39;</span>, <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&#39;A: document body clicked&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">this</span>.<span class="me1">sendMessage</span><span class="br0">&#40;</span><span class="st0">&#39;documentbodyclicked&#39;</span>, <span class="st0">&#39;Hello world!&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> B = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;Implements: Messenger,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;initialize: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">this</span>.<span class="me1">addMsgEvent</span><span class="br0">&#40;</span><span class="st0">&#39;documentbodyclicked&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp;processMessage: <span class="kw2">function</span><span class="br0">&#40;</span>msg, data<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&#39;B: msg received: &#39;</span>, data<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">new</span> A<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">new</span> B<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Here you go!</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>July 20, 2009 -- <a href="http://dev.enekoalonso.com/2009/07/20/setters-getters-on-mootools-classes/" title="Setters &#038; Getters on Mootools classes">Setters &#038; Getters on Mootools classes</a> (0)</li><li>April 7, 2009 -- <a href="http://dev.enekoalonso.com/2009/04/07/setting-up-timers-and-intervals-inside-js-objects/" title="Setting up timers and intervals inside JS objects">Setting up timers and intervals inside JS objects</a> (2)</li><li>January 2, 2009 -- <a href="http://dev.enekoalonso.com/2009/01/02/solving-the-8-queen-puzzle-in-javascript/" title="Solving the 8 Queen Puzzle in Javascript">Solving the 8 Queen Puzzle in Javascript</a> (1)</li><li>January 18, 2010 -- <a href="http://dev.enekoalonso.com/2010/01/18/finally-singletons-the-mootools-way/" title="Finally: Singletons, the Mootools way">Finally: Singletons, the Mootools way</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2009/04/23/sending-messages-between-javascript-objects/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Setting up timers and intervals inside JS objects</title>
		<link>http://dev.enekoalonso.com/2009/04/07/setting-up-timers-and-intervals-inside-js-objects/</link>
		<comments>http://dev.enekoalonso.com/2009/04/07/setting-up-timers-and-intervals-inside-js-objects/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 05:00:58 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[call]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[instance]]></category>
		<category><![CDATA[interval]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[setinterval]]></category>
		<category><![CDATA[settimer]]></category>
		<category><![CDATA[this]]></category>
		<category><![CDATA[timeout]]></category>
		<category><![CDATA[timer]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=301</guid>
		<description><![CDATA[It may seem trivial but it has its tricky point. Usually, in procedural Javascript (this is, non object oriented programming), timers are set up passing the callback function on a string: function hello&#40;&#41; &#123; &#160; alert&#40;&#34;hello&#34;&#41;; &#125; // Will execute hello() after 10 seconds setTimeout&#40;&#39;hello()&#39;, 10000&#41;; For this code to work, hello() has to be [...]]]></description>
			<content:encoded><![CDATA[<p>It may seem trivial but it has its tricky point. Usually, in procedural Javascript (this is, non object oriented programming), timers are set up passing the callback function on a string:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> hello<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;hello&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Will execute hello() after 10 seconds</span></div>
</li>
<li class="li1">
<div class="de1">setTimeout<span class="br0">&#40;</span><span class="st0">&#39;hello()&#39;</span>, <span class="nu0">10000</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>For this code to work, hello() has to be a global function (actually a function of the window object). Otherwise, when the timer times out, it won&#8217;t find it.</p>
<p>When writing object oriented code, one would like to call a function inside the object itself, not a global function. We can achieve this passing an anonymous function to the setTimeout function that calls our function:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> MyClass = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setTimeout<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">this</span>.<span class="me1">hello</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="br0">&#125;</span>, <span class="nu0">10000</span><span class="br0">&#41;</span>; <span class="co1">// This wont work</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; hello: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;hello&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>The previous code wont work, since <strong>this</strong> inside the anonymous function points to the window object and not to our instance of MyClass. We solve this using the bind function provided by Mootools:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> MyClass = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setTimeout<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">this</span>.<span class="me1">hello</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="br0">&#125;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>, <span class="nu0">10000</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; hello: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;hello&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>This code will work fine, but it still has a big problem. If we wanted to access any member or function of our instance inside the hello() function, it wouldn&#8217;t work. This is because when the timer times out, the context of our instance is lost. Inside the hello() function, this will point to the window object.</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> MyClass = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">text</span> = <span class="st0">&#39;hello&#39;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setTimeout<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">this</span>.<span class="me1">hello</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="br0">&#125;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>, <span class="nu0">10000</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; hello: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">text</span><span class="br0">&#41;</span>; <span class="co1">// This wont work</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>There are multiple ways to solve this issue but my favorite is to use the function call() of the function object. This function let&#8217;s you pass an object while calling your function that will become this inside it.</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> MyClass = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">text</span> = <span class="st0">&#39;hello&#39;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setTimeout<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">this</span>.<span class="me1">hello</span>.<span class="me1">call</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>; <span class="br0">&#125;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>, <span class="nu0">10000</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; hello: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">text</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Now we can use this inside the hello() function and everything will work fine, no matter how many instances of MyClass we create.</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> MyClass = <span class="kw2">new</span> <span class="kw2">Class</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; initialize: <span class="kw2">function</span><span class="br0">&#40;</span>text<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">text</span> = text;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setTimeout<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">this</span>.<span class="me1">hello</span>.<span class="me1">call</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>; <span class="br0">&#125;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>, <span class="nu0">10000</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; hello: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">text</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">new</span> MyClass<span class="br0">&#40;</span><span class="st0">&#39;hello&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">new</span> MyClass<span class="br0">&#40;</span><span class="st0">&#39;hi there!&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">new</span> MyClass<span class="br0">&#40;</span><span class="st0">&#39;wassup?&#39;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Enjoy :)</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>April 23, 2009 -- <a href="http://dev.enekoalonso.com/2009/04/23/sending-messages-between-javascript-objects/" title="Sending messages between Javascript objects">Sending messages between Javascript objects</a> (2)</li><li>February 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/01/mooml-globalize-mooml-template-functions-going-global/" title="Mooml.globalize(): Mooml template functions going global">Mooml.globalize(): Mooml template functions going global</a> (0)</li><li>January 18, 2010 -- <a href="http://dev.enekoalonso.com/2010/01/18/finally-singletons-the-mootools-way/" title="Finally: Singletons, the Mootools way">Finally: Singletons, the Mootools way</a> (0)</li><li>July 20, 2009 -- <a href="http://dev.enekoalonso.com/2009/07/20/setters-getters-on-mootools-classes/" title="Setters &#038; Getters on Mootools classes">Setters &#038; Getters on Mootools classes</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2009/04/07/setting-up-timers-and-intervals-inside-js-objects/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Chrome Experiments</title>
		<link>http://dev.enekoalonso.com/2009/03/29/290/</link>
		<comments>http://dev.enekoalonso.com/2009/03/29/290/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 23:34:52 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[experiments]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=290</guid>
		<description><![CDATA[chromeexperiments.com gathers a good amount of very impressive javascript demos, showing the future of the Internet, where javascript intensive sites and application will become more and more common. My favorites: Browser ball &#8211; bounce a ball between different browser windows Kaleidoscope &#8211; very smooth animation and beautiful colors Related Posts:July 30, 2010 -- Titanium Developer: [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.chromeexperiments.com">chromeexperiments.com</a> gathers a good amount of very impressive javascript demos, showing the future of the Internet, where javascript intensive sites and application will become more and more common.</p>
<p>My favorites:<br />
<a href="http://www.chromeexperiments.com/detail/browser-ball/">Browser ball</a> &#8211; bounce a ball between different browser windows<br />
<a href="http://www.chromeexperiments.com/detail/kaleidscope/">Kaleidoscope</a> &#8211; very smooth animation and beautiful colors</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>July 30, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/30/titanium-developer-love-and-hate/" title="Titanium Developer: love and hate">Titanium Developer: love and hate</a> (2)</li><li>July 20, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/20/little-tricks-string-padding-in-javascript/" title="Little tricks: string padding in Javascript">Little tricks: string padding in Javascript</a> (2)</li><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li><li>May 22, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/" title="More WebSockets, now with Python!">More WebSockets, now with Python!</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2009/03/29/290/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
