<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Devthought - Guillermo Rauch's Blog</title>
	
	<link>http://devthought.com</link>
	<description />
	<pubDate>Tue, 11 Nov 2008 23:04:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/devthought" type="application/rss+xml" /><item>
		<title>Devthought DNS Poisoned</title>
		<link>http://feeds.feedburner.com/~r/devthought/~3/406936205/</link>
		<comments>http://devthought.com/devthought-dns-poisoned/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 04:57:43 +0000</pubDate>
		<dc:creator>Guillermo Rauch</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://devthought.com/?p=42</guid>
		<description><![CDATA[If you got redirected to a random site during the last couple of hours, please do your best to erase that event from your memory.]]></description>
			<content:encoded><![CDATA[<p>If you got redirected to a random site during the last couple of hours, please do your best to erase that event from your memory.</p>]]></content:encoded>
			<wfw:commentRss>http://devthought.com/devthought-dns-poisoned/feed/</wfw:commentRss>
		<feedburner:origLink>http://devthought.com/devthought-dns-poisoned/</feedburner:origLink></item>
		<item>
		<title>Downtime</title>
		<link>http://feeds.feedburner.com/~r/devthought/~3/400758904/</link>
		<comments>http://devthought.com/downtime/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 01:21:24 +0000</pubDate>
		<dc:creator>Guillermo Rauch</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://devthought.com/?p=41</guid>
		<description><![CDATA[I finally migrated from MediaTemple to Joyent, a change I&#8217;ve been trying to make for a few months now. I wonder how it&#8217;ll work out.
Speaking of change, I&#8217;m glad to announce the future availability of WP-o-Matic 1.0 with its new website (which has been in the oven for longer than a year!). You&#8217;ll see many [...]]]></description>
			<content:encoded><![CDATA[<p>I finally migrated from MediaTemple to Joyent, a change I&#8217;ve been trying to make for a few months now. I wonder how it&#8217;ll work out.</p>
<p>Speaking of change, I&#8217;m glad to announce the future availability of WP-o-Matic 1.0 with its new website (which has been in the oven for longer than a year!). You&#8217;ll see many new features, bugfixes, and the birth of a great little community.</p>
<p>I&#8217;ll be releasing two other small Wordpress plugins that developers will find specially useful. One of them is <strong>Base-Plugin</strong>, a template plugin architecture aimed to make your own plugins preparation easier. It features a very small template management system, it sets variables and functions that you might find yourself writing over time after time, and more.</p>
<p>And for those who wish to include details about their plugins hosted at Wordpress Extend in their websites, <strong>Extendfetch</strong> will be nothing short of amazing. It fetches and lets you display the number of downloads, links and it&#8217;s dead easy to integrate.</p>]]></content:encoded>
			<wfw:commentRss>http://devthought.com/downtime/feed/</wfw:commentRss>
		<feedburner:origLink>http://devthought.com/downtime/</feedburner:origLink></item>
		<item>
		<title>WP-o-Matic 1.0RC4 released</title>
		<link>http://feeds.feedburner.com/~r/devthought/~3/338220281/</link>
		<comments>http://devthought.com/wp-o-matic-10rc4-released/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 17:16:13 +0000</pubDate>
		<dc:creator>Guillermo Rauch</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">http://devthought.com/?p=37</guid>
		<description><![CDATA[Some important and some not-as-important bug fixes in this version. Hopefully this will be the last release candidate before the grand 1.0 release:


Tables not deleted anymore upon installation
Fixed SimplePie error report.
Fixed small post content bug (not hidden by default)
Fixed cron url 
Removed inverted quotes from queries
Fixed notices in debug mode
No error showing for campaigns w/o [...]]]></description>
			<content:encoded><![CDATA[<p>Some important and some not-as-important bug fixes in this version. Hopefully this will be the <strong>last release candidate</strong> before the grand 1.0 release:</p>

<ul>
<li>Tables not deleted anymore upon installation</li>
<li>Fixed SimplePie error report.</li>
<li>Fixed small post content bug (not hidden by default)</li>
<li>Fixed cron url </li>
<li>Removed inverted quotes from queries</li>
<li>Fixed notices in debug mode</li>
<li>No error showing for campaigns w/o feeds fixed</li>
</ul>

<p><a href="http://downloads.wordpress.org/plugin/wp-o-matic.1.0RC4.zip" onclick="javascript:urchinTracker ('/outbound/article/downloads.wordpress.org');">Click here</a> to download</p>
<p>As usual, head to <a href="http://wpomatic.lighthouseapp.com" onclick="javascript:urchinTracker ('/outbound/article/wpomatic.lighthouseapp.com');">Lighthouse</a> for bug reports</p>]]></content:encoded>
			<wfw:commentRss>http://devthought.com/wp-o-matic-10rc4-released/feed/</wfw:commentRss>
		<feedburner:origLink>http://devthought.com/wp-o-matic-10rc4-released/</feedburner:origLink></item>
		<item>
		<title>BarackSlideshow - An elegant, lightweight slideshow script</title>
		<link>http://feeds.feedburner.com/~r/devthought/~3/309823101/</link>
		<comments>http://devthought.com/barackslideshow-an-elegant-lightweight-slideshow-script/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 06:44:53 +0000</pubDate>
		<dc:creator>Guillermo Rauch</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://devthought.com/?p=36</guid>
		<description><![CDATA[

I guess pretty much everyone has seen Barack Obama&#8217;s website by now, which is clearly one of the prettiest of all candidates we&#8217;ve heard of so far. Not only is it an example of state-of-the-art design, but it&#8217;s also nice to navigate and interact with.

I decided to imitate the homepage slideshow. I had already experimented [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://mt13.quickshareit.com/share/obama78133.jpg" /></p>

<p>I guess pretty much everyone has seen <a href="http://barackobama.com" onclick="javascript:urchinTracker ('/outbound/article/barackobama.com');">Barack Obama&#8217;s website</a> by now, which is clearly one of the prettiest of all candidates we&#8217;ve heard of so far. Not only is it an example of state-of-the-art design, but it&#8217;s also nice to navigate and interact with.</p>

<p>I decided to imitate the homepage slideshow. I had already experimented with <a href="http://devthought.com/cssjavascript-true-power-fancy-menu/" >similar animated lists</a>, which allowed me to have it ready within minutes</p>
<span id="more-36"></span>
<h3>The creation</h3>
<p>I took my previous class (SlideList), and made a few changes here and there. It works with MooTools 1.2, and supports all kinds of shape transformations (top and left coordinates, and height and width properties), which means it can now be used with vertical, horizontal, or even irregular lists.</p>

<p>I extended it and came up with a new class that receives the images and loading spinner as parameters (note: it&#8217;s arguable whether this is the best decision OOP-wise, but due to the simplicity of this script, this was the right call)</p>

<h3>The code</h3>
<p>To ensure all images are loaded before the user makes any interaction, the MooTools <strong>Assets</strong> component is used.</p>
<p>The CSS plays a major role (as in every other animation-focused script). I suggest you analyze it carefully before implementing it in your applications or websites. You&#8217;ll probably need to adjust the ids, or use classes instead to keep your stylesheets clean.</p>
<p>The markup is meaningful and simple. Two lists are used (one for the images and the other for the links). The loading element is included in the HTML, but it&#8217;s probably better to inject it from the script directly.</p>

<h3>The pictures</h3>
<p>The beautiful pictures were taken from Flickr with permission of the owners, unless they were directly released for non-commercial use. Thanks <a href="http://www.flickr.com/photos/vgm8383/1299339710/" onclick="javascript:urchinTracker ('/outbound/article/www.flickr.com');">vgm8383</a>, <a href="http://www.flickr.com/photos/93136519@N00/203892226/" onclick="javascript:urchinTracker ('/outbound/article/www.flickr.com');">dogonnit</a>, <a href="http://www.flickr.com/photos/topogigio_428/503418708/" onclick="javascript:urchinTracker ('/outbound/article/www.flickr.com');">M. TANIGUCHI</a>, <a href="http://www.flickr.com/photos/catambu/155201667/" onclick="javascript:urchinTracker ('/outbound/article/www.flickr.com');">GustavoBuriola</a> &#038; others!</p>

<h3>The demo</h3>
<a href="http://devthought.com/wp-content/moogets/BarackSlideshow/demo.html" >Click here</a> to see it in action or <a href="http://devthought.com/wp-content/moogets/BarackSlideshow/BarackSlideshow.zip" >download it</a>]]></content:encoded>
			<wfw:commentRss>http://devthought.com/barackslideshow-an-elegant-lightweight-slideshow-script/feed/</wfw:commentRss>
		<feedburner:origLink>http://devthought.com/barackslideshow-an-elegant-lightweight-slideshow-script/</feedburner:origLink></item>
		<item>
		<title>WP-o-Matic 1.0RC3 beta shipping.</title>
		<link>http://feeds.feedburner.com/~r/devthought/~3/283042940/</link>
		<comments>http://devthought.com/wp-o-matic-10rc3-beta-shipping/#comments</comments>
		<pubDate>Sun, 04 May 2008 01:53:18 +0000</pubDate>
		<dc:creator>Guillermo Rauch</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Project]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://devthought.com/?p=34</guid>
		<description><![CDATA[Here is the upcoming RC3 release!
Remember that, just like any release prior to 1.0, upgrading will erase your previous campaigns, feeds, logs, etc.

	Now compatible with Wordpress 2.5
	Categories shown with indentation (parent > children now separated)
	SimplePie updated to 1.1.1, and SimplePie Core now supported.
	Fixed broken cron command
	Fixed broken export on some systems
	Fixed broken redirect when resetting [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://downloads.wordpress.org/plugin/wp-o-matic.zip" onclick="javascript:urchinTracker ('/outbound/article/downloads.wordpress.org');">Here is the upcoming RC3 release</a>!</p>
<p><strong>Remember that, just like any release prior to 1.0, upgrading will erase your previous campaigns, feeds, logs, etc.</strong></p>
<ul>
	<li>Now compatible with Wordpress 2.5</li>
	<li>Categories shown with indentation (parent > children now separated)</li>
	<li>SimplePie updated to 1.1.1, and SimplePie Core now supported.</li>
	<li>Fixed broken cron command</li>
	<li>Fixed broken export on some systems</li>
	<li>Fixed broken redirect when resetting a campaign</li>
	<li>Everything now stored in GMT to avoid time issues. Gotten rid of NOW() functions in favor of WP time functions</li>
	<li>Fixed bug with validation upon deletion of feeds in existing campaigns </li>
	<li>Fixed bug with &#8216;allow comments&#8217; setting.</li>
	<li>Fixed bug with logs dates</li>
	<li>Fixed bug with double quote escaping (fixes campaign templates / rewrite html bugs)</li>
	<li>Username in options tab changed to a more handy select box.</li>
	<li>Interface now looks better on IE (d&#8217;oh)</li>
	<li>Added many help files</li>
	<li>Fixed annoying duplicates bug</li>
	<li>Fixed small bug in import with labels</li>
</ul>

<p><strong>I need feedback on:</strong></p>
<ul>
 <li>All sorts of errors, warnings, notices, blank screens</li>
 <li>Styling problems, indicating Browser, OS, URL and a screenshot.</li>
 <li>Behavioral problems: bad dates, bad content, duplicates, etc</li>
 <li>Performance problems</li>
 <li>Unexpected behavior</li>
</ul>

<p>Always include instructions on how to reproduce the issues please!</p>
<p>Go ahead and <a href="http://downloads.wordpress.org/plugin/wp-o-matic.zip" onclick="javascript:urchinTracker ('/outbound/article/downloads.wordpress.org');">download it</a></p>

<p><strong>Updates</strong> </p>
<ul>
 <li>1 - Fixed bugs with categories in edit mode and posts tools (thanks Mike)</li>
 <li>2 - Fixed empty rewrite bug (thanks Mike) and replacements now case insensitive</li>
 <li>3 - Fixed bugs with &#8216;use feed date&#8217; option, footer copyright, bad dates in &#8216;view all&#8217; logs, log message field made text, timestamps converted to datetime, &#8216;Clean logs&#8217; function fixed (<strong>big</strong> changes, please test)</li>
 <li>4 - Fixed bugs with older WP releases (now WP-o-Matic works with any version starting from 2.2). Now rewrite works with PHP4.</li>
 <li>5 - str_ireplace bug fixed, allow comments bug fixed, now user can choose comments state.</li>
 <li>6 - {content} not getting rewritten fixed, titles and other settings not being stored fixed.</li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://devthought.com/wp-o-matic-10rc3-beta-shipping/feed/</wfw:commentRss>
		<feedburner:origLink>http://devthought.com/wp-o-matic-10rc3-beta-shipping/</feedburner:origLink></item>
		<item>
		<title>WP-o-Matic 1.0RC3 on its way</title>
		<link>http://feeds.feedburner.com/~r/devthought/~3/239775680/</link>
		<comments>http://devthought.com/wp-o-matic-rc3-on-its-way/#comments</comments>
		<pubDate>Sat, 23 Feb 2008 04:30:23 +0000</pubDate>
		<dc:creator>Guillermo Rauch</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">http://devthought.com/wp-o-matic-rc3-on-its-way/</guid>
		<description><![CDATA[Update: here it is
Just writing to let you know that the upcoming release candidate of WP-o-Matic is being cooked and betatested!
This is a list of all the exciting changes, which include new features you&#8217;ve been requesting and lots of bugfixes

	   Categories shown with indentation (parent > children now separated)
	   Fixed broken [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update:</strong> <a href="http://devthought.com/wp-o-matic-10rc3-beta-shipping/" >here</a> it is</p>
<p>Just writing to let you know that the upcoming release candidate of WP-o-Matic is being cooked and betatested!</p>
<p>This is a list of all the exciting changes, which include new features you&#8217;ve been requesting and lots of bugfixes</p>
<ul>
	<li>   Categories shown with indentation (parent > children now separated)</li>
	<li>   <em>Fixed broken cron command</em></li>
	<li>   <em>SimplePie updated to 1.1</em></li>
	<li>   Fixed broken export on some systems</li>
	<li>   Fixed broken redirect when resetting a campaign</li>
	<li>   <em>Everything now stored in GMT to avoid time issues. Gotten rid of NOW() functions in favor of WP time functions</em></li>
	<li>   Fixed bug with validation upon deletion of feeds in existing campaigns </li>
	<li>   Fixed bug with &#8216;allow comments&#8217; setting.</li>
	<li>   Fixed bug with logs dates</li>
        <li><em>   Fixed bug with double quote escaping (fixes campaign templates / rewrite html bugs)</em></li>
	<li>   Username in options tab changed to a more handy select box.</li>
	<li>   Interface now looks better on IE (d&#8217;oh)</li>
	<li><em>New option added to select max number of items to process</em></li>
	<li><em>New option added to decide whether the permalink should point to the created blog post or to the source permalink</em></li>
	<li><em>New general option to get logs feedback while the campaign is being processed.</em></li>
</ul>

<p>As usual, stay tuned. Sorry for not being able to respond and release with more frequency, but I&#8217;ve been really busy.</p>]]></content:encoded>
			<wfw:commentRss>http://devthought.com/wp-o-matic-rc3-on-its-way/feed/</wfw:commentRss>
		<feedburner:origLink>http://devthought.com/wp-o-matic-rc3-on-its-way/</feedburner:origLink></item>
		<item>
		<title>How Flash currently aids Javascript development</title>
		<link>http://feeds.feedburner.com/~r/devthought/~3/218845674/</link>
		<comments>http://devthought.com/how-flash-currently-aids-javascript-development/#comments</comments>
		<pubDate>Mon, 14 Jan 2008 03:29:23 +0000</pubDate>
		<dc:creator>Guillermo Rauch</dc:creator>
		
		<category><![CDATA[Article]]></category>

		<category><![CDATA[Browsers]]></category>

		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://devthought.com/how-flash-currently-aids-javascript-development/</guid>
		<description><![CDATA[Most people tend to believe Javascript and Flash are meant to be rivals. However, for some important tasks, Javascript falls short and Macromedia comes to the rescue.

Let&#8217;s revise some of the most remarkable scenarios.

Uploading
One of the most common Flash and Javascript interaction is probably file uploading in forms. There&#8217;s almost no way to customize the [...]]]></description>
			<content:encoded><![CDATA[<p>Most people tend to believe Javascript and Flash are meant to be rivals. However, for some important tasks, Javascript falls short and Macromedia comes to the rescue.</p>

<p>Let&#8217;s revise some of the most remarkable scenarios.</p>
<span id="more-31"></span>
<h3>Uploading</h3>
<p>One of the most common Flash and Javascript interaction is probably file uploading in forms. There&#8217;s almost no way to customize the input style in a cross browser fashion. Firefox, for instance, makes it impossible (for security reasons) to trigger the upload file selection unless the user clicks the Browse button. Among many other limitations.</p>

<p>But Flash comes to the rescue, with some really stunning implementations. It&#8217;s worth mentioning open source implementations like Fancy Upload (MooTools), <a href="http://www.pixeline.be/experiments/jqUploader/" onclick="javascript:urchinTracker ('/outbound/article/www.pixeline.be');">jqUploader</a> (jQuery) and <a href="http://swfupload.org/" onclick="javascript:urchinTracker ('/outbound/article/swfupload.org');">SWFUpload</a>. Flickr&#8217;s <a href="http://flickr.com/photos/upload/" onclick="javascript:urchinTracker ('/outbound/article/flickr.com');">new upload</a> also takes advantege of this method.</p>

<p><img src='http://devthought.com/wp-content/1.png' alt='MooTools Upload implementation' /></p>

<h3>Clipboard access</h3>
<p>In most popular browsers, Javascript is not allowed to interact directly with the clipboard. The exception is the infamously insecure Internet Explorer 6:</p>

<div class="code jscode">
 <p class="top"><a href="#" class="seecode">Click here to see Javascript code</a></p>
 <ol class="codelist">
	<li class="tab0 odd first"><code>holdtext.innerText = copytext.innerText;</code></li>
	<li class="tab0 even"><code>Copied = holdtext.createTextRange();</code></li>
	<li class="tab0 odd last"><code>Copied.execCommand(&quot;Copy&quot;);</code></li>
</ol>
</div>

<p>Flash, however, allows developers to freely copy the text to the clipboard. <a href="http://www.jeffothy.com/weblog/clipboard-copy/" onclick="javascript:urchinTracker ('/outbound/article/www.jeffothy.com');">Jeffrey Larson</a> came up with the solution using a really small <a href="http://www.jeffothy.com/weblog/uploads/clipboard.php" onclick="javascript:urchinTracker ('/outbound/article/www.jeffothy.com');">swf file</a> from his Javascript code.</p>

<p>The code was further <a href="http://webchicanery.com/2006/11/14/clipboard-copy-javascript/" onclick="javascript:urchinTracker ('/outbound/article/webchicanery.com');">improved</a> to support Opera, which results in complete browsers compliance. There is a <a href="http://clientside.cnet.com/wiki/cnet-libraries/03-jswidgets/01-cms-and-form-helpers#clipboard.js" onclick="javascript:urchinTracker ('/outbound/article/clientside.cnet.com');">MooTools</a> implementation by Aaron Newton, and a <a href="http://joegornick.com/2007/10/29/extending-prototype-copy-to-clipboard/" onclick="javascript:urchinTracker ('/outbound/article/joegornick.com');">Prototype</a> one.</p>

<h3>Photo editing / Drawing</h3>
<p>Another area where Javascript is still not quite ready for is photo editing. Flash proves reliable for such a task, and it&#8217;s what is commonly used right now, while Javascript is being left behind. </p>
<p>Here is a quick example of Flash <a href="http://www.mainada.net/inputdraw" onclick="javascript:urchinTracker ('/outbound/article/www.mainada.net');">outputting SVG</a>, and here is a full featured (but not freely available) image editor, <a href="http://www.picnik.com/app" onclick="javascript:urchinTracker ('/outbound/article/www.picnik.com');">Picnik</a>, that really shows how suitable Flash is for this.</p>
<p>The main reason Javacript falls short here is its limitation to come up with most effects, which is the reason js-based editors will do that server-side, adding a delay and thus hurting the user experience.</p>
<p>Some cool effects can be achieved in Javascript alone thanks to the <a href="http://www.netzgesta.de/bevel/" onclick="javascript:urchinTracker ('/outbound/article/www.netzgesta.de');">canvas tag</a>. But we&#8217;re still far from close to full-featured image editing.</p>

<h3>Sound</h3>
<p>The only sure way to play a sound file in a crossbrowser, crossplatform way is nowadays Flash. </p>
<p>There&#8217;s a solution available for most frameworks: <a href="http://widgets.rabidlabs.net/sounds/" onclick="javascript:urchinTracker ('/outbound/article/widgets.rabidlabs.net');">MooSound</a>, <a href="http://code.google.com/p/gwt-voices/" onclick="javascript:urchinTracker ('/outbound/article/code.google.com');">GWT-Voices</a>, <a href="http://dev.jquery.com/view/trunk/plugins/sound/" onclick="javascript:urchinTracker ('/outbound/article/dev.jquery.com');">jquery.sound</a>. The most popular standalone ones are <a href="http://www.schillmania.com/projects/soundmanager2/" onclick="javascript:urchinTracker ('/outbound/article/www.schillmania.com');">SoundManager 2</a> and <a href="http://jssoundkit.sourceforge.net/" onclick="javascript:urchinTracker ('/outbound/article/jssoundkit.sourceforge.net');">JSSoundKit</a>.

<h3>Persistent Data Storage</h3>
<p>There might be certain scenarios where you&#8217;ll want to store large chunk of data in the client side (it could be for caching purposes, or for offline retrieval, for example. Flash is one of the most reliable ways, allowing you to store up to 100k seamlessly, and even more if the user authorizes it when prompted.</p>
<p>See <a href="http://manual.dojotoolkit.org/WikiHome/DojoDotBook/Book50" onclick="javascript:urchinTracker ('/outbound/article/manual.dojotoolkit.org');">dojo.storage</a> for a nice implementation and proof-of-concept</p>
<p><strong>Note:</strong> i&#8217;m currently working on a MooTools implementation of this.</p>

<h3>Some scenarios where flash might be involved</h3>
<p>Ajax: see the <a href="http://fjax.enginpost.com/" onclick="javascript:urchinTracker ('/outbound/article/fjax.enginpost.com');">fjax</a> project
<br />Charts: see the <a href="http://developer.yahoo.com/yui/charts//" onclick="javascript:urchinTracker ('/outbound/article/developer.yahoo.com');">YUI.charts</a> project (and see <a href="http://people.iola.dk/olau/flot/examples/" onclick="javascript:urchinTracker ('/outbound/article/people.iola.dk');">flot</a> for a sweet jQuery approach!)</p>]]></content:encoded>
			<wfw:commentRss>http://devthought.com/how-flash-currently-aids-javascript-development/feed/</wfw:commentRss>
		<feedburner:origLink>http://devthought.com/how-flash-currently-aids-javascript-development/</feedburner:origLink></item>
		<item>
		<title>TextboxList meets Autocompletion</title>
		<link>http://feeds.feedburner.com/~r/devthought/~3/215670027/</link>
		<comments>http://devthought.com/textboxlist-meets-autocompletion/#comments</comments>
		<pubDate>Sat, 12 Jan 2008 20:59:31 +0000</pubDate>
		<dc:creator>Guillermo Rauch</dc:creator>
		
		<category><![CDATA[Article]]></category>

		<category><![CDATA[Browsers]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">http://devthought.com/textboxlist-meets-autocompletion/</guid>
		<description><![CDATA[
Demo here
In my previous blogpost I explained how to extend TextboxList to add closing functionality via a link added to each box. But it was missing an important ingredient: autocompletion!

Again, all we have to do is extend the TextboxList class, override some methods, some events, and create some new ones (all prefixed by auto)


 Click [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://devthought.com/wp-content/auto.png' alt='TextboxList Autocompletion' /></p>
<p><a href="http://devthought.com/wp-content/articles/autocompletelist/test.html" >Demo here</a></p>
<p>In my <a href="http://devthought.com/textboxlist-fancy-facebook-like-dynamic-inputs/" >previous</a> blogpost I explained how to extend TextboxList to add closing functionality via a link added to each box. But it was missing an important ingredient: autocompletion!</p>
<span id="more-28"></span>
<p>Again, all we have to do is extend the TextboxList class, override some methods, some events, and create some new ones (all prefixed by <em>auto</em>)</p>

<div class="code jscode">
 <p class="top"><a href="#" class="seecode">Click here to see Javascript code</a></p>
 <ol class="codelist">
	<li class="tab0 odd first"><code>var FacebookList = new Class({</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab2 odd"><code>Extends: TextboxList,</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab2 odd"><code>data: [],</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab2 odd"><code>options: {</code></li>
	<li class="tab4 even"><code>onInputFocus: function() { this.autoShow(); },</code></li>
	<li class="tab4 odd"><code>onInputBlur: function(el) {</code></li>
	<li class="tab6 even"><code>el.value = '';</code></li>
	<li class="tab6 odd"><code>this.autoHide();</code></li>
	<li class="tab4 even"><code>},</code></li>
	<li class="tab4 odd"><code>onBoxDispose: function(item) {</code></li>
	<li class="tab6 even"><code>this.autoFeed(item.$attributes.$text);</code></li>
	<li class="tab4 odd"><code>},</code></li>
	<li class="tab4 even"><code>autocomplete: {</code></li>
	<li class="tab6 odd"><code>'opacity': 0.8,</code></li>
	<li class="tab6 even"><code>'maxresults': 10,</code></li>
	<li class="tab6 odd"><code>'minchars': 1</code></li>
	<li class="tab4 even"><code>}</code></li>
	<li class="tab2 odd"><code>},</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab2 odd"><code>initialize: function(element, autoholder, options) {</code></li>
	<li class="tab4 even"><code>arguments.callee.parent(element, options);</code></li>
	<li class="tab2 odd"><code>this.autoholder = $(autoholder).set('opacity', this.options.autocomplete.opacity);</code></li>
	<li class="tab2 even"><code>this.autoresults = this.autoholder.getElement('ul');</code></li>
	<li class="tab2 odd"><code>var children = this.autoresults.getElements('li');</code></li>
	<li class="tab4 even"><code>children.each(function(el) { this.add(el.innerHTML); }, this);</code></li>
	<li class="tab2 odd"><code>},</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab2 odd"><code>autoShow: function(search) {</code></li>
	<li class="tab4 even"><code>this.autoholder.setStyle('display', 'block');</code></li>
	<li class="tab4 odd"><code>this.autoholder.getElements('*').setStyle('display', 'none');</code></li>
	<li class="tab4 even"><code>if(! search || ! search.trim() || (! search.length || search.length &lt; this.options.autocomplete.minchars ))</code></li>
	<li class="tab4 odd"><code>{</code></li>
	<li class="tab6 even"><code>this.autoholder.getElement('.default').setStyle('display', 'block');</code></li>
	<li class="tab6 odd"><code>this.resultsshown = false;</code></li>
	<li class="tab4 even"><code>} else {</code></li>
	<li class="tab6 odd"><code>this.resultsshown = true;</code></li>
	<li class="tab6 even"><code>this.autoresults.setStyle('display', 'block').empty();</code></li>
	<li class="tab6 odd"><code>this.data.filter(function(str) { return str ? str.test(search, 'i') : false; }).each(function(result, ti) {</code></li>
	<li class="tab8 even"><code>if(ti &gt;= this.options.autocomplete.maxresults) return;</code></li>
	<li class="tab8 odd"><code>var el = new Element('li').set('html', this.autoHighlight(result, search)).inject(this.autoresults);</code></li>
	<li class="tab8 even"><code>el.$attributes.$result = result;</code></li>
	<li class="tab8 odd"><code>if(ti == 0) this.autoFocus(el);</code></li>
	<li class="tab6 even"><code>}, this);</code></li>
	<li class="tab4 odd"><code>}</code></li>
	<li class="tab2 even"><code>},</code></li>
	<li class="odd">&nbsp;</li>
	<li class="tab2 even"><code>autoHighlight: function(html, highlight) {</code></li>
	<li class="tab4 odd"><code>return html.replace(new RegExp(highlight, 'gi'), function(match) {</code></li>
	<li class="tab6 even"><code>return '&lt;em&gt;' + match + '&lt;/em&gt;';</code></li>
	<li class="tab4 odd"><code>});</code></li>
	<li class="tab2 even"><code>},</code></li>
	<li class="odd">&nbsp;</li>
	<li class="tab2 even"><code>autoHide: function() {</code></li>
	<li class="tab4 odd"><code>this.resultsshown = false;</code></li>
	<li class="tab4 even"><code>this.autoholder.setStyle('display', 'none');</code></li>
	<li class="tab2 odd"><code>},</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab2 odd"><code>autoFocus: function(el) {</code></li>
	<li class="tab4 even"><code>if(! el) return;</code></li>
	<li class="tab4 odd"><code>if(this.autocurrent) this.autocurrent.removeClass('auto-focus');</code></li>
	<li class="tab4 even"><code>this.autocurrent = el.addClass('auto-focus');</code></li>
	<li class="tab2 odd"><code>},</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab2 odd"><code>autoMove: function(direction) {</code></li>
	<li class="tab4 even"><code>if(!this.resultsshown) return;</code></li>
	<li class="tab4 odd"><code>this.autoFocus(this.autocurrent['get' + (direction == 'up' ? 'Previous' : 'Next')]());</code></li>
	<li class="tab2 even"><code>},</code></li>
	<li class="odd">&nbsp;</li>
	<li class="tab2 even"><code>autoFeed: function(text) {</code></li>
	<li class="tab4 odd"><code>if(this.data.indexOf(text) == -1)</code></li>
	<li class="tab6 even"><code>this.data.push(text);</code></li>
	<li class="tab2 odd"><code>},</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab2 odd"><code>autoAdd: function(el) {</code></li>
	<li class="tab4 even"><code>if(!el || ! el.$attributes.$result) return;</code></li>
	<li class="tab4 odd"><code>this.add(el.$attributes.$result);</code></li>
	<li class="tab4 even"><code>delete this.data[this.data.indexOf(el.$attributes.$result)];</code></li>
	<li class="tab4 odd"><code>this.autoHide();</code></li>
	<li class="tab4 even"><code>this.current.$attributes.$input.value = '';</code></li>
	<li class="tab2 odd"><code>},</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab2 odd"><code>createInput: function(options) {</code></li>
	<li class="tab4 even"><code>var li = arguments.callee.parent(options);</code></li>
	<li class="tab4 odd"><code>var input = li.$attributes.$input;</code></li>
	<li class="tab4 even"><code>input.addEvents({</code></li>
	<li class="tab6 odd"><code>'keydown': function(e) {</code></li>
	<li class="tab8 even"><code>e = new Event(e);</code></li>
	<li class="tab8 odd"><code>this.dosearch = false;</code></li>
	<li class="tab8 even"><code>switch(e.code) {</code></li>
	<li class="tab10 odd"><code>case Event.Keys.up: return this.autoMove('up');</code></li>
	<li class="tab10 even"><code>case Event.Keys.down: return this.autoMove('down');</code></li>
	<li class="tab10 odd"><code>case Event.Keys.enter:</code></li>
	<li class="tab12 even"><code>this.autoAdd(this.autocurrent);</code></li>
	<li class="tab12 odd"><code>this.autocurrent = false;</code></li>
	<li class="tab12 even"><code>this.autoenter = true;</code></li>
	<li class="tab12 odd"><code>break;</code></li>
	<li class="tab10 even"><code>default: this.dosearch = true;</code></li>
	<li class="tab8 odd"><code>}</code></li>
	<li class="tab6 even"><code>}.bind(this),</code></li>
	<li class="tab6 odd"><code>'keyup': function() {</code></li>
	<li class="tab8 even"><code>if(this.dosearch) this.autoShow(input.value);</code></li>
	<li class="tab6 odd"><code>}.bind(this)</code></li>
	<li class="tab4 even"><code>});</code></li>
	<li class="tab4 odd"><code>input.addEvent(Browser.Engine.trident ? 'keydown' : 'keypress', function(e) {</code></li>
	<li class="tab6 even"><code>if(this.autoenter) new Event(e).stop();</code></li>
	<li class="tab6 odd"><code>this.autoenter = false;</code></li>
	<li class="tab4 even"><code>}.bind(this));</code></li>
	<li class="tab4 odd"><code>return li;</code></li>
	<li class="tab2 even"><code>},</code></li>
	<li class="odd">&nbsp;</li>
	<li class="tab2 even"><code>createBox: function(text, options) {</code></li>
	<li class="tab4 odd"><code>var li = arguments.callee.parent(text, options);</code></li>
	<li class="tab4 even"><code>li.addEvents({</code></li>
	<li class="tab6 odd"><code>'mouseenter': function() { this.addClass('bit-hover') },</code></li>
	<li class="tab6 even"><code>'mouseleave': function() { this.removeClass('bit-hover') }</code></li>
	<li class="tab4 odd"><code>});</code></li>
	<li class="tab4 even"><code>li.adopt(new Element('a', {</code></li>
	<li class="tab6 odd"><code>'href': '#',</code></li>
	<li class="tab6 even"><code>'class': 'closebutton',</code></li>
	<li class="tab6 odd"><code>'events': {</code></li>
	<li class="tab8 even"><code>'click': function(e) {</code></li>
	<li class="tab10 odd"><code>new Event(e).stop();</code></li>
	<li class="tab10 even"><code>if(! this.current) this.focus(this.maininput);</code></li>
	<li class="tab10 odd"><code>this.dispose(li);</code></li>
	<li class="tab8 even"><code>}.bind(this)</code></li>
	<li class="tab6 odd"><code>}</code></li>
	<li class="tab4 even"><code>}));</code></li>
	<li class="tab4 odd"><code>li.$attributes.$text = text;</code></li>
	<li class="tab4 even"><code>return li;</code></li>
	<li class="tab2 odd"><code>}</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab0 odd"><code>});</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab0 odd"><code>window.addEvent('domready', function() {</code></li>
	<li class="tab2 even"><code>// init</code></li>
	<li class="tab2 odd"><code>var tlist2 = new FacebookList('facebook-demo', 'facebook-auto');</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab2 odd"><code>// fetch and feed</code></li>
	<li class="tab2 even"><code>new Request.JSON({'url': 'json.html', 'onComplete': function(j) {</code></li>
	<li class="tab4 odd"><code>j.each(tlist2.autoFeed, tlist2);</code></li>
	<li class="tab2 even"><code>}}).send();</code></li>
	<li class="tab0 odd last"><code>});</code></li>
</ol>
</div>

<p>It works by caching all the results from a JSON Request and feeding them to the autocompleter object. When a item is added as a box, it&#8217; removed from the feed array, and when the box is disposed it&#8217;s added back, so that it becomes available in the list when the user types.</p> 

<p>Another new feature is that you&#8217;ll be able to let it add boxes from the HTML directly:</p>
<div class="code htmlcode">
 <p class="top"><a href="#" class="seecode">Click here to see HTML code</a></p>
 <ol class="codelist">
	<li class="tab0 odd first"><code>&lt;label&gt;FacebookList input&lt;/label&gt;</code></li>
	<li class="tab0 even"><code>&lt;input type=&quot;text&quot; value=&quot;&quot; id=&quot;facebook-demo&quot; /&gt;</code></li>
	<li class="tab0 odd"><code>&lt;div id=&quot;facebook-auto&quot;&gt;</code></li>
	<li class="tab1 even"><code>&lt;div class=&quot;default&quot;&gt;Type the name of an argentine writer you like&lt;/div&gt;</code></li>
	<li class="tab1 odd"><code>&lt;ul class=&quot;feed&quot;&gt;</code></li>
	<li class="tab2 even"><code>&lt;li&gt;Jorge Luis Borges&lt;/li&gt;</code></li>
	<li class="tab2 odd"><code>&lt;li&gt;Julio Cortazar&lt;/li&gt;</code></li>
	<li class="tab1 even"><code>&lt;/ul&gt;</code></li>
	<li class="tab0 odd last"><code>&lt;/div&gt;</code></li>
</ol>
</div>

<p>The constructor now takes new parameters to configure the autocompletion, like the minimum number of characters to trigger the dropdown, and more.</p>

<h3>Changelog</h3>
<ul> 
  <li><strong>0.1:</strong> initial release
  <li><strong>0.2:</strong> added click support, removed $attributes use, code cleanup</li>
</ul>

<h3>Download</h3>
<p>Click here to download the zip with <a href="http://devthought.com/wp-content/articles/autocompletelist/AutocompleteList.zip?v0.2" >code and examples</a></p>]]></content:encoded>
			<wfw:commentRss>http://devthought.com/textboxlist-meets-autocompletion/feed/</wfw:commentRss>
		<feedburner:origLink>http://devthought.com/textboxlist-meets-autocompletion/</feedburner:origLink></item>
		<item>
		<title>TextboxList: Fancy Facebook-Like dynamic inputs!</title>
		<link>http://feeds.feedburner.com/~r/devthought/~3/215202948/</link>
		<comments>http://devthought.com/textboxlist-fancy-facebook-like-dynamic-inputs/#comments</comments>
		<pubDate>Fri, 11 Jan 2008 21:26:48 +0000</pubDate>
		<dc:creator>Guillermo Rauch</dc:creator>
		
		<category><![CDATA[Article]]></category>

		<category><![CDATA[Browsers]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">http://devthought.com/textboxlist-fancy-facebook-like-dynamic-inputs/</guid>
		<description><![CDATA[

Check out a demo of TextboxList before reading!

While working on my big and exciting new project, I decided to include an input that resembles the famous Apple Mail to: textfield. I&#8217;d seen it in Facebook before, which has a really decent implementation of this concept (it work well, but it doesn&#8217;t respect any modern programming [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://devthought.com/wp-content/untitled-14.png' alt='TextboxList Screenshot' /></p>

<p>Check out <a href="http://devthought.com/wp-content/articles/textboxlist/test.html" >a demo of TextboxList</a> before reading!</p>

<p>While working on my big and exciting new project, I decided to include an input that resembles the famous Apple Mail <strong>to:</strong> textfield. I&#8217;d seen it in Facebook before, which has a really decent implementation of this concept (it work well, but it doesn&#8217;t respect any modern programming principles; basically, it&#8217;s a big tag soup with lots of inline Javascript)</p>

<p>I created my own, MooTools 1.2 compatible, in just 5kb. It&#8217;s not only small, but also really frexible! Here are some notes of the creation process and how to implement it in your own projects.</p>
<span id="more-26"></span>

<h3>Anatomy of the control</h3>
<p>As usual, I try to come up with a semantic, unobstrusive approach. I start with the CSS and the markup that will be my end result.</p>

<p>I want to go from something like this:</p>
<div class="code htmlcode">
 <p class="top"><a href="#" class="seecode">Click here to see HTML code</a></p>
 <ol class="codelist">
	<li class="tab0 odd first"><code>&lt;li id=&quot;facebook-list&quot; class=&quot;input-text&quot;&gt;</code></li>
	<li class="tab1 even"><code>&lt;label&gt;FacebookList input&lt;/label&gt;</code></li>
	<li class="tab1 odd"><code>&lt;input type=&quot;text&quot; value=&quot;&quot; id=&quot;input-demo2&quot; /&gt;</code></li>
	<li class="tab0 even last"><code>&lt;/li&gt;</code></li>
</ol>
</div>

<p>to something like this (only one possible scenario, naturally)</p>
<div class="code htmlcode">
 <p class="top"><a href="#" class="seecode">Click here to see HTML code</a></p>
 <ol class="codelist">
	<li class="tab0 odd first"><code>&lt;li id=&quot;facebook-list&quot; class=&quot;input-text&quot;&gt;</code></li>
	<li class="tab1 even"><code>&lt;label&gt;FacebookList input&lt;/label&gt;</code></li>
	<li class="tab1 odd"><code>&lt;ul class=&quot;holder&quot;&gt;</code></li>
	<li class="tab2 even"><code>&lt;li class=&quot;bit-input&quot;&gt;&lt;input type=&quot;text&quot; value=&quot;&quot; class=&quot;smallinput&quot; /&gt;&lt;/li&gt;</code></li>
	<li class="tab2 odd"><code>&lt;li class=&quot;bit-box&quot;&gt;Jorge Luis Borges &lt;a href=&quot;#&quot; class=&quot;closebutton&quot;&gt;&lt;/a&gt;&lt;/li&gt;</code></li>
	<li class="tab2 even"><code>&lt;li class=&quot;bit-input&quot;&gt;&lt;input type=&quot;text&quot; value=&quot;&quot; class=&quot;smallinput&quot; /&gt;&lt;/li&gt;</code></li>
	<li class="tab2 odd"><code>&lt;li class=&quot;bit-box&quot;&gt;Julio Cortazar &lt;a href=&quot;#&quot; class=&quot;closebutton&quot;&gt;&lt;/a&gt;&lt;/li&gt;</code></li>
	<li class="tab2 even"><code>&lt;li class=&quot;bit-input&quot;&gt;&lt;input type=&quot;text&quot; value=&quot;&quot; class=&quot;maininput&quot; /&gt;&lt;/li&gt;</code></li>
	<li class="tab1 odd"><code>&lt;/ul&gt;</code></li>
	<li class="tab0 even last"><code>&lt;/li&gt;</code></li>
</ol>
</div>

<p>Basically, it&#8217;s a group of pieces (that I&#8217;ll call bits), that can be either a box or an input (small, except for the main one). The user is able to move around between the bits by using his keyboard or his mouse.</p>

<h3>Javascript</h3>
<p>As far as the javascript goes, I try to first think about reusable code (usually classes) that I may use. I thus first coded the class that adds resizing capabilities to the small fields as the user types, and a small utility method to find the caret position.</p>

<p>The only challenges I found was handling the complex events while keeping everything crossbrowser. Again, none of this would have been possible if it wasn&#8217;t for MooTools (1.2). </p>

<h3>Using it</h3>
<p>All you have to do is:</p>
<div class="code jscode">
 <p class="top"><a href="#" class="seecode">Click here to see Javascript code</a></p>
 <ol class="codelist">
	<li class="tab0 odd first last"><code>new TextboxList('input-demo');</code></li>
</ol>
</div>
<p>Where input-demo is the id of the desired input to replace</p>
<p>The constructor can take these options:</p>
<ul>
 <li><strong>onInputFocus</strong> (event, fired when an input gets focus)</li>
 <li><strong>onInputBlur</strong> (event, fired when an input loses focus)</li>
 <li><strong>onBoxFocus</strong> (event, fired when a box gets focus)</li>
 <li><strong>onBoxBlur</strong> (event, fired when a box loses focus)</li>
 <li><strong>onBoxDispose</strong> (event, fired when a box is removed)</li>
 <li><strong>resizable</strong> (option, hash, passed to ResizableTextbox constructor)</li>
 <li><strong>className</strong> (option, string, prefix of the classnames of the generated objects)</li>
 <li><strong>extrainputs</strong> (option, boolean, adds small inputs between boxes if true)</li>
 <li><strong>startinput</strong> (option, boolean, adds a small input before the first box if true)</li>
 <li><strong>hideempty</strong> (option, boolean, hides the small inputs by default)</li>
</ul>

<h3>Extending it</h3>
<p>One of the my favorite features of MooTools is how easily you can create and extend classes. It makes you feel in a truly Object-Oriented environment, overcoming all Javascript limitations and complexities to handle functionalities like this by default.</p>
<p>I decided that, for the sake of simplicity, the class would not incorporate stuff like boxes removal through clicks, or even autocompletion (like Facebook does), since the scenarios to use this control are multiple and diverse.</p>

<p>Here is an example of how easily you can add the small remove links next to the name (and some CSS, of course)</p>
<div class="code jscode">
 <p class="top"><a href="#" class="seecode">Click here to see Javascript code</a></p>
 <ol class="codelist">
	<li class="tab0 odd first"><code>var FacebookList = new Class({</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab0 odd"><code>Extends: TextboxList,</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab1 odd"><code>createBox: function(text, options) {</code></li>
	<li class="tab2 even"><code>var li = arguments.callee.parent(text, options);</code></li>
	<li class="tab2 odd"><code>li.addEvents({</code></li>
	<li class="tab3 even"><code>'mouseenter': function() { this.addClass('bit-hover') },</code></li>
	<li class="tab3 odd"><code>'mouseleave': function() { this.removeClass('bit-hover') }</code></li>
	<li class="tab2 even"><code>});</code></li>
	<li class="tab2 odd"><code>li.adopt(new Element('a', {</code></li>
	<li class="tab3 even"><code>'href': '#',</code></li>
	<li class="tab3 odd"><code>'class': 'closebutton',</code></li>
	<li class="tab3 even"><code>'events': {</code></li>
	<li class="tab4 odd"><code>'click': function(e) {</code></li>
	<li class="tab5 even"><code>new Event(e).stop();</code></li>
	<li class="tab5 odd"><code>if(! this.current) this.focus(this.maininput);</code></li>
	<li class="tab5 even"><code>this.dispose(li);</code></li>
	<li class="tab4 odd"><code>}.bind(this)</code></li>
	<li class="tab3 even"><code>}</code></li>
	<li class="tab2 odd"><code>}));</code></li>
	<li class="tab2 even"><code>return li;</code></li>
	<li class="tab1 odd"><code>}</code></li>
	<li class="even">&nbsp;</li>
	<li class="tab0 odd last"><code>});</code></li>
</ol>
</div>

<h3>Changelog</h3>
<ul>
 <li><strong>0.1:</strong> initial release</li>
 <li><strong>0.2:</strong> code cleanup, small blur/focus fixes</li>
</ul>

<h3>Download</h3>
<p><a href="http://devthought.com/wp-content/articles/textboxlist/TextboxList.zip?v0.2" >Click here</a> to download a zip file containing examples, TextboxList documented (8kb) and compressed (5kb)</p>

<p><strong>New!</strong> TextboxList with <a href="http://devthought.com/textboxlist-meets-autocompletion/" >autocompletion</a></p>]]></content:encoded>
			<wfw:commentRss>http://devthought.com/textboxlist-fancy-facebook-like-dynamic-inputs/feed/</wfw:commentRss>
		<feedburner:origLink>http://devthought.com/textboxlist-fancy-facebook-like-dynamic-inputs/</feedburner:origLink></item>
		<item>
		<title>My birthday</title>
		<link>http://feeds.feedburner.com/~r/devthought/~3/198360574/</link>
		<comments>http://devthought.com/my-birthday/#comments</comments>
		<pubDate>Tue, 11 Dec 2007 02:04:47 +0000</pubDate>
		<dc:creator>Guillermo Rauch</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://devthought.com/my-birthday/</guid>
		<description><![CDATA[Today, December the 10th, I turn 17. Lots of exciting stuff has happened this year&#8230; including being dugg twice, releasing a popular Wordpress plugin and meeting new really cool people.

We&#8217;re close to Devthought&#8217;s first anniversary too, which will mean an upgrade, a new design, and lots of new stuff. Stay tuned]]></description>
			<content:encoded><![CDATA[<p>Today, December the 10th, I turn 17. Lots of exciting stuff has happened this year&#8230; including being dugg twice, releasing a popular Wordpress plugin and meeting new really cool people.</p>

<p>We&#8217;re close to Devthought&#8217;s first anniversary too, which will mean an upgrade, a new design, and lots of new stuff. Stay tuned</p>]]></content:encoded>
			<wfw:commentRss>http://devthought.com/my-birthday/feed/</wfw:commentRss>
		<feedburner:origLink>http://devthought.com/my-birthday/</feedburner:origLink></item>
	<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetFeedData?uri=devthought</feedburner:awareness></channel>
</rss><!-- Dynamic Page Served (once) in 0.201 seconds -->
