<?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"
	>

<channel>
	<title>BogoJoker</title>
	<atom:link href="http://blog.bogojoker.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.bogojoker.com</link>
	<description>'My humble abode'.sub(/ab/,'c')</description>
	<pubDate>Fri, 05 Sep 2008 22:14:30 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Stack Overflow - Edit Summary Quicklinks</title>
		<link>http://blog.bogojoker.com/2008/09/stack-overflow-edit-summary-quicklinks/</link>
		<comments>http://blog.bogojoker.com/2008/09/stack-overflow-edit-summary-quicklinks/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 02:11:01 +0000</pubDate>
		<dc:creator>joe</dc:creator>
		
		<category><![CDATA[free]]></category>

		<category><![CDATA[greasemonkey]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[Stack Overflow]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=80</guid>
		<description><![CDATA[I requested a feature to make the few edit summary suggestions clickable.  I, like many developers, don&#8217;t normally let my keys leave the keyboard.  However, this was one case where I felt making those suggestions of &#8220;corrected spelling&#8221; and &#8220;fixed grammar&#8221; should automatically be inserted.

Well the suggestion was declined.  I can&#8217;t blame [...]]]></description>
			<content:encoded><![CDATA[<p>I <a href="http://stackoverflow.uservoice.com/pages/general/suggestions/21044">requested a feature</a> to make the few edit summary suggestions clickable.  I, like many developers, don&#8217;t normally let my keys leave the keyboard.  However, this was one case where I felt making those suggestions of &#8220;corrected spelling&#8221; and &#8220;fixed grammar&#8221; should automatically be inserted.</p>
<p><img style="display: block; margin: 25px 40px;" src="http://blog.bogojoker.com/wp-content/uploads/2008/09/edit_summary.png" alt="Showing the Usage" title="Stack Overflow Edit Summary" width="500" height="165" class="size-full wp-image-82" /></p>
<p>Well the suggestion was declined.  I can&#8217;t blame the team.  Nobody upvoted the suggestion.  But I felt strongly enough about it, and knew that it was very simple to implement that I whipped up a GreaseMonkey script to do it myself.  The script runs like a charm and even adds a few extra suggestions to the original three.  It handles formatting and commas all automatically, so don&#8217;t worry about a thing, just click.  Enjoy!</p>
<p><a href="http://bogojoker.com/greasemonkey/so_edit_summary_quicklinks.user.js">Click Here to Grab the GreaseMonkey Script</a></p>
<p><strong>UPDATE:</strong> Fixed to use keng&#8217;s URL and added just plain old stackoverflow.com without the beta sub-domain in preparation for a launch.  Thanks keng!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2008/09/stack-overflow-edit-summary-quicklinks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Spaces, Exposé, Hot Corners, Dashboard Broken?</title>
		<link>http://blog.bogojoker.com/2008/08/spaces-expose-hot-corners-dashboard-broken/</link>
		<comments>http://blog.bogojoker.com/2008/08/spaces-expose-hot-corners-dashboard-broken/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 03:00:56 +0000</pubDate>
		<dc:creator>joe</dc:creator>
		
		<category><![CDATA[mac]]></category>

		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=72</guid>
		<description><![CDATA[I ferociously make use of Spaces and Exposé.  To utilize them I use QuickSilver, Cmd+Tab, the Dock, special Mouse Buttons, but most of all I use the Hot Corners!  Occasionally, when I wake my Mac Book Pro these features won&#8217;t work.  No reason given, just when I try I get the usual [...]]]></description>
			<content:encoded><![CDATA[<p>I ferociously make use of Spaces and Exposé.  To utilize them I use QuickSilver, Cmd+Tab, the Dock, special Mouse Buttons, but most of all I use the Hot Corners!  Occasionally, when I wake my Mac Book Pro these features won&#8217;t work.  No reason given, just when I try I get the usual chime meaning &#8220;this can&#8217;t be done.&#8221;  At the time the only sure solution was to reboot the computer.  Not anymore.  Just open up your terminal and run:</p>
<p><code>killall Dock</code></p>
<p>Since those major features (Spaces, Exposé, and the Dashboard) are tied to the Dock, this command will restart the Dock and, like magic, those features will work again.  Killing the Dock and even Finder with `killall` are special cases.  Those two will automatically restart on their own.  However, for other programs, it will just quit.  For instance if Firefox hangs you could type `killall Firefox` and Firefox would be force quit but would not reopen.  Check the man page for more information.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2008/08/spaces-expose-hot-corners-dashboard-broken/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Command Line svn:ignore a file</title>
		<link>http://blog.bogojoker.com/2008/07/command-line-svnignore-a-file/</link>
		<comments>http://blog.bogojoker.com/2008/07/command-line-svnignore-a-file/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 17:59:07 +0000</pubDate>
		<dc:creator>joe</dc:creator>
		
		<category><![CDATA[unix]]></category>

		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=63</guid>
		<description><![CDATA[This took me far too long to do, but its because no one explained it correctly to me.  I&#8217;m frustrated enough that I&#8217;m not going to go back to those other websites and see if I just overlooked something.  Instead I&#8217;m going to put it right here.
You don&#8217;t svn:ignore a file.  You [...]]]></description>
			<content:encoded><![CDATA[<p>This took me far too long to do, but its because no one explained it correctly to me.  I&#8217;m frustrated enough that I&#8217;m not going to go back to those other websites and see if I just overlooked something.  Instead I&#8217;m going to put it right here.</p>
<p><em>You don&#8217;t svn:ignore a file.  You put an svn:ignore property on the directory to ignore that filename pattern.</em></p>
<p>It makes sense, but I didn&#8217;t immediately think of that, and no source sufficiently made that point to me.  So if you were struggling, please grasp that concept and take a look at the commands below (which you no doubt have seen and did not think worked) and you&#8217;ll really understand what they do.</p>
<pre class="textmate-source twilight"><span class="source source_shell"><span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> ---------------------------------------------------------------------
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span>  Ignore all the .wdgtuser files in the /trunk/Blah.dcproj directory
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> ---------------------------------------------------------------------
</span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> Go to the directory
</span>cd trunk/Blah.dcproj/     <span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> The directory with the files
</span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> Start editing the properties for the current directory
</span>svn propedit svn:ignore .   <span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> Opens an editor (SVN_EDITOR, EDITOR)
</span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> Add the following value with a new line, save, and exit:
</span>*.wdgtuser

<span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> See that things worked
</span>svn propget svn:ignore .    <span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> So you can see the properties
</span>svn status --no-ignore      <span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> You should see an 'I' next to the ignored files
</span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> Commit
</span>svn commit -m <span class="string string_quoted string_quoted_double string_quoted_double_shell"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell">"</span>New Ignores<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell">"</span></span> <span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> You must commit the new property change
</span>

<span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> ---------------------------------------------------------------------
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span>     Ignore a single file secret.txt in the /trunk/ directory
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> ---------------------------------------------------------------------
</span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> Go to the directory
</span>cd trunk/

<span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> Add just the single file to the current directories ignore list (like above)
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> Note the dot at the end of the command is important
</span>svn propset svn:ignore secret.txt .

<span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> See that things worked
</span>svn propget svn:ignore .    <span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> Notice the single file was added to the list
</span>svn status --no-ignore      <span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> You should see an 'I' next to the ignored files
</span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> Commit
</span>svn commit -m <span class="string string_quoted string_quoted_double string_quoted_double_shell"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell">"</span>Its secret<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell">"</span></span>  <span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell">#</span> You must commit the new property change
</span></span></pre>
<p>That also means in GUI programs if you can&#8217;t seem to ignore a single file that is unversioned you should instead go to the directory that file is in and (like the above) add the filename to the svn:ignore list.</p>
<p>Cheers.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2008/07/command-line-svnignore-a-file/feed/</wfw:commentRss>
		</item>
		<item>
		<title>My Blog Is</title>
		<link>http://blog.bogojoker.com/2008/06/my-blog-is/</link>
		<comments>http://blog.bogojoker.com/2008/06/my-blog-is/#comments</comments>
		<pubDate>Fri, 20 Jun 2008 01:55:54 +0000</pubDate>
		<dc:creator>joe</dc:creator>
		
		<category><![CDATA[misc.]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=60</guid>
		<description><![CDATA[
That right there is the only tag cloud that I have ever found interesting.  The cool part is that you can generate those tag clouds and with a lot more jazz at this really great service called Wordle.
How I Did It
For those interested on how I got all the tags for the above cloud [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://blog.bogojoker.com/wp-content/uploads/2008/06/cloud.png'><img src="http://blog.bogojoker.com/wp-content/uploads/2008/06/cloud.png" alt="tag cloud" title="cloud" width="610" height="234" class="aligncenter size-full wp-image-61" /></a></p>
<p>That right there is the only tag cloud that I have ever found interesting.  The cool part is that you can generate those tag clouds and with a lot more jazz at this really great service called <a href="http://wordle.net/">Wordle</a>.</p>
<h3>How I Did It</h3>
<p>For those interested on how I got all the tags for the above cloud (with weight) I decided to grab them myself.  Here were the <a href="http://pastie.textmate.org/218551">simple 4 steps</a> I took.</p>
<p><img src="http://blog.bogojoker.com/wp-content/uploads/2008/06/buildtags.png" alt="How to Build the Tag List" title="buildtags" width="600" height="539" class="aligncenter size-full wp-image-62" /></p>
<p>The SQL grabs all of the tags used on blog posts (so not categories) at least once.  It also grabs the number of times the tag appears on a post.  Using a simple ruby script I take the tags (all single words) and multiply them by the number of times they appear.  So a &#8220;ruby 3&#8243; turns into &#8220;ruby ruby ruby.&#8221;  Once that multiplication has taken place I can just plop them into Wordle and make the magic happen!</p>
<p><a href="http://bogojoker.com/dump/clouds/">More clouds here!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2008/06/my-blog-is/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SotD - Remove the First N Characters From a Line</title>
		<link>http://blog.bogojoker.com/2008/06/sotd-remove-the-first-n-characters-from-a-line/</link>
		<comments>http://blog.bogojoker.com/2008/06/sotd-remove-the-first-n-characters-from-a-line/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 02:58:37 +0000</pubDate>
		<dc:creator>joe</dc:creator>
		
		<category><![CDATA[SotD]]></category>

		<category><![CDATA[code]]></category>

		<category><![CDATA[gawk]]></category>

		<category><![CDATA[perl]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[sed]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=59</guid>
		<description><![CDATA[I was asked today to remove the first 6 characters from every line in a document.  It was known that each line contained at least 6 characters.  For me, that means a find a replace.  Here is how I did it (in a number of different ways).  Can you think of [...]]]></description>
			<content:encoded><![CDATA[<p>I was asked today to remove the first 6 characters from every line in a document.  It was known that each line contained at least 6 characters.  For me, that means a find a replace.  Here is how I did it (in a number of different ways).  Can you think of any other ways to do it?</p>
<pre class="textmate-source twilight"><span class="source source_shell">cut -c7-
rr ^.{6}
colrm 1 6
rr s/^.{6}//
sed <span class="string string_quoted string_quoted_single string_quoted_single_shell"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell">'</span>s/^.\{6\}//<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell">'</span></span>
perl -pe <span class="string string_quoted string_quoted_single string_quoted_single_shell"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell">'</span>s/^.{6}//<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell">'</span></span>
ruby -pe <span class="string string_quoted string_quoted_single string_quoted_single_shell"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell">'</span>sub /^.{6}/,""<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell">'</span></span>
gawk <span class="string string_quoted string_quoted_single string_quoted_single_shell"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell">'</span>BEGIN{FIELDWIDTHS="6 999"}{print$2}<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell">'</span></span>
</span></pre>
<p>I was pretty happy with rr taking the prize for least characters.  I do want to point out that since rr defaults to multi-line and global replacements the &#8220;^&#8221; is required.  If you wanted to remove the &#8220;^&#8221; (like you could with sed, perl, and ruby) then you would have to use the &#8220;&#8211;line&#8221; or &#8220;-l&#8221; and &#8220;&#8211;notglobal&#8221; or &#8220;-ng&#8221; options.  So a single character replaces 7!  If you want to grab rr just do:</p>
<pre><code>$ sudo gem install regex_replace</code></pre>
<p>Also, here is a link to <a href="http://www.gnu.org/software/gawk/">gawk - GNU&#8217;s awk</a>.  This has the very nice FIELDWIDTHS variable, which is extremely useful!</p>
<p>Also keep in mind that the regular expressions above ^.{6} only work because the lines were known to have at least 6 characters.  If we didn&#8217;t know that we would have had to use something like ^.{0,6} to allow up to 6 characters (and even that could be ^.{1.6} ignoring blank lines which can&#8217;t change).  So again the requirements for this challenge were important.</p>
<h3>Update!</h3>
<p>I came across a neat little unix utility I didn&#8217;t know about called &#8220;cut&#8221;.  As you can see, the new command tops the list quite handily too.  &#8220;cut -c 7-&#8221; is actually cutting from each line the 7th character onwards (counting starts from 1).  In this case once it spits what it cuts out to stdout; so it leaves behind those first 6 characters and therefore accomplishes our goal.  In the above list I removed the optional space after &#8220;-c&#8221; to make it just a tad shorter.  Pretty neat.</p>
<p>Then I found &#8220;colrm&#8221; which is the most straightforward.  This one wins in simplicity.  No hacks, just straightforward does exactly what you think it does.  Very cool.</p>
<h3>Double Update!</h3>
<p>I figured since quite a bit of my rr usage has an empty string for the second argument, I figured it would be okay to throw that in as the default case.  So now there is a third usage for rr, which is great for pipes, that just strips something out.  That brings rr back up to a tie for first place.  Very cool.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2008/06/sotd-remove-the-first-n-characters-from-a-line/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Why CDATA Matters in XML</title>
		<link>http://blog.bogojoker.com/2008/06/why-cdata-matters-in-xml/</link>
		<comments>http://blog.bogojoker.com/2008/06/why-cdata-matters-in-xml/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 03:31:51 +0000</pubDate>
		<dc:creator>joe</dc:creator>
		
		<category><![CDATA[code]]></category>

		<category><![CDATA[web]]></category>

		<category><![CDATA[cdata]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=53</guid>
		<description><![CDATA[You&#8217;ve seen it before, but you may not know what it means.  Wikipedia describes CDATA as meaning &#8220;Character Data&#8221; which makes sense.  w3school goes one step further and points out that this text should not be parsed by the XML Parser.  The general idea is when you want to display straight textual [...]]]></description>
			<content:encoded><![CDATA[<p>You&#8217;ve seen it before, but you may not know what it means.  Wikipedia describes <a href="http://en.wikipedia.org/wiki/CDATA">CDATA</a> as meaning &#8220;Character Data&#8221; which makes sense.  <a href="http://www.w3schools.com/XML/xml_cdata.asp">w3school</a> goes one step further and points out that this text should <em>not</em> be parsed by the XML Parser.  The general idea is when you want to display straight textual data, without needing to encode characters or wanting them interpreted by the parser, you can just wrap that data inside of a CDATA tag.</p>
<p>Needless to say this is clearly the ugliest tag currently in existence (lets leave room for the future though):</p>
<pre><code>&lt;![CDATA[ ... ]]&gt;</code></pre>
<h3>I promised to tell you why it mattered</h3>
<p>Yes, words in the title become a promise.  You can hold me to that in the future.  Why does CDATA matter?  Well, I&#8217;ll actually side-step the question for a minute and show you what looks like a perfectly fine looking XHTML document (keep in mind that XHTML is a subset of XML):</p>
<pre class="textmate-source twilight"><span class="text text_html text_html_basic"><span class="meta meta_tag meta_tag_sgml meta_tag_sgml_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;!</span><span class="meta meta_tag meta_tag_sgml meta_tag_sgml_doctype meta_tag_sgml_doctype_html"><span class="entity entity_name entity_name_tag entity_name_tag_doctype entity_name_tag_doctype_html">DOCTYPE</span> html PUBLIC <span class="string string_quoted string_quoted_double string_quoted_double_doctype string_quoted_double_doctype_identifiers-and-DTDs string_quoted_double_doctype_identifiers-and-DTDs_html">"-//W3C//DTD XHTML 1.0 Strict//EN"</span>
  <span class="string string_quoted string_quoted_double string_quoted_double_doctype string_quoted_double_doctype_identifiers-and-DTDs string_quoted_double_doctype_identifiers-and-DTDs_html">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span>
<span class="meta meta_tag meta_tag_structure meta_tag_structure_any meta_tag_structure_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_structure entity_name_tag_structure_any entity_name_tag_structure_any_html">html</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">xmlns</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>http://www.w3.org/1999/xhtml<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">xml:lang</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>en<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">lang</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>en<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span>
<span class="meta meta_tag meta_tag_structure meta_tag_structure_any meta_tag_structure_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_structure entity_name_tag_structure_any entity_name_tag_structure_any_html">head</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span>
  <span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">meta</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">http-equiv</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>Content-type<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">content</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>text/html; charset=utf-8<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"> /&gt;</span></span>
  <span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">title</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span>Simple Example<span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">title</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span>
<span class="meta meta_tag meta_tag_structure meta_tag_structure_any meta_tag_structure_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_structure entity_name_tag_structure_any entity_name_tag_structure_any_html">head</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span>
<span class="meta meta_tag meta_tag_structure meta_tag_structure_any meta_tag_structure_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_structure entity_name_tag_structure_any entity_name_tag_structure_any_html">body</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span>
  <span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">h1</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span>Welcome<span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">h1</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span>
<span class="source source_js source_js_embedded source_js_embedded_html">  <span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_script entity_name_tag_script_html">script</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">type</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>text/javascript<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span>
    <span class="support support_class support_class_js">document</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_dom support_function_dom_js">write</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>&lt;p&gt;Hello, World&lt;/p&gt;<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_script entity_name_tag_script_html">script</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span>
</span><span class="meta meta_tag meta_tag_structure meta_tag_structure_any meta_tag_structure_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_structure entity_name_tag_structure_any entity_name_tag_structure_any_html">body</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span>
<span class="meta meta_tag meta_tag_structure meta_tag_structure_any meta_tag_structure_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_structure entity_name_tag_structure_any entity_name_tag_structure_any_html">html</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span></span></pre>
<p>Looks simple enough.  We can ignore the fact that its not really the best way of doing things, but who cares&#8230; its a Hello World example right?  Well, technically this is not Valid XHTML.  The validator shows we&#8217;ve got a single error:</p>
<blockquote><p>
Line 11, Column 20: document type does not allow element &quot;p&quot; here.<br />
document.write(&#39;&lt;p<span style="color:red;">&gt;</span>Hello, World&lt;/p&gt;&#39;);</p>
<p>The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements &#8212; such as a &#8220;style&#8221; element in the &#8220;body&#8221; section instead of inside &#8220;head&#8221; &#8212; or two elements that overlap (which is not allowed).
</p></blockquote>
<p>Well, the validator hints at the cause of the error, but it is hard to understand unless you really know your XML!  We are inside a &#8220;&lt;script&gt;&#8221; tag, we&#8217;ve got some text, and all of a sudden a &#8220;&lt;p&gt;&#8221; pops up!  XML Parsers don&#8217;t care that its in the middle of a string, it sees another tag and that tag doesn&#8217;t make sense.</p>
<p>So, here is why CDATA matters.  You want your Javascript to be left alone by the XML Parser.  In HTML, Javascript is interpreted as text, so it can just be left alone as plain text by wrapping it in a CDATA tag:</p>
<pre class="textmate-source twilight"><span class="text text_html text_html_basic"><span class="source source_js source_js_embedded source_js_embedded_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_script entity_name_tag_script_html">script</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">type</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>text/javascript<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span>
  <span class="keyword keyword_operator keyword_operator_js">&lt;!</span><span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>CDATA<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>
    <span class="support support_class support_class_js">document</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_dom support_function_dom_js">write</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>&lt;p&gt;Hello, World&lt;/p&gt;<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="meta meta_brace meta_brace_square meta_brace_square_js">]]</span><span class="keyword keyword_operator keyword_operator_js">&gt;</span>
<span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_script entity_name_tag_script_html">script</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span></span></pre>
<p>Don&#8217;t get excited yet.  Yes, that passes the W3C validator but the javascript fails to run.  Why?  Well, I actually haven&#8217;t got a clue.  My guess would be its not stripped out of the javascript and invalidates the javascript when it tries to run.  In any event, lets check our steps&#8230;  Is it valid xml?  Check.  Is it being served as xml?  Well, actually I don&#8217;t think so.</p>
<p>Here is a nice resource that talks about <a href="http://webkit.org/blog/68/understanding-html-xml-and-xhtml/">Understanding HTML, XML, and XHTML</a>.  If you haven&#8217;t read that article either read it now or once you&#8217;re done here; its important, no matter how old it is.  To pull a quote:</p>
<blockquote><p>to really send xhtml, an xhtml page must be served as xml and therefore have one of the following Content-Type&#8217;s (text/xml, application/xml, application/xhtml+xml) to a browser.</p></blockquote>
<p>This is a simple one liner in php.  I added the following code to the top of the page, and resent it to my browser:</p>
<pre class="textmate-source twilight"><span class="text text_html text_html_basic"><span class="source source_php source_php_embedded source_php_embedded_block source_php_embedded_block_html"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_begin punctuation_section_embedded_begin_php">&lt;?php</span> <span class="support support_function support_function_head support_function_head_php">header</span>(<span class="string string_quoted string_quoted_single string_quoted_single_php"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_php">'</span><span class="meta meta_string-contents meta_string-contents_quoted meta_string-contents_quoted_single meta_string-contents_quoted_single_php">Content-type: application/xhtml+xml</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_php">'</span></span>)<span class="punctuation punctuation_terminator punctuation_terminator_expression punctuation_terminator_expression_php">;</span> <span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_end punctuation_section_embedded_end_php"><span class="source source_php">?</span>&gt;</span></span></span></pre>
<p>Doh.  Well, we&#8217;ve covered all the bases and it still doesn&#8217;t work.  Its valid, its sent as xhtml, now everything is left up to the browser and it doesn&#8217;t seem to work.  If you know why, drop a comment.  Again my suspicion is that the browsers don&#8217;t properly handle XHTML and CDATA completely.  However, there is a pretty nice trick that we can make use of to get this to work and validate (even sent as text/html):</p>
<pre class="textmate-source twilight"><span class="text text_html text_html_basic"><span class="source source_js source_js_embedded source_js_embedded_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_script entity_name_tag_script_html">script</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">type</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>text/javascript<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span>
  <span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> &lt;![CDATA[
</span>    <span class="support support_class support_class_js">document</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_dom support_function_dom_js">write</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>&lt;p&gt;Hello, World&lt;/p&gt;<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> ]]&gt;
</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_script entity_name_tag_script_html">script</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">&gt;</span></span></span></pre>
<p>Well there you go.  A 100% valid page, that runs in all browsers, that properly tells the XML Parser &#8220;hey, leave these characters alone&#8221; and it works.  The problem is identifying when this is necessary.  For most people, having the original page, which rendered correctly but didn&#8217;t validate would be enough.  Browser developers are watching out for you and working around mistakes in HTML and XHTML.  However, that isn&#8217;t always the case.</p>
<h3>Real World Example</h3>
<p>Here I&#8217;ll pull a real world example.  Some XML Specifications allow the ability to send XML under a different namespace as content inside of an existing XML tag.  Some do so in a &#8220;psuedo&#8221; way.  Take a look at the Atom Publishing Protocol (commonly referred to as Atompub or APP for short).  Here is a snippet from the RFC describing the <a href="http://atompub.org/rfc4287.html#rfc.section.3.1.1.1">Atom Syndication Format</a>, specifically the structure for an atom:title tag with type=&#8221;html&#8221; within of an atom:entry:</p>
<blockquote>
<pre class="textmate-source twilight"><span class="text text_xml">...
<span class="meta meta_tag meta_tag_xml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_localname entity_name_tag_localname_xml">title</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_localname entity_other_attribute-name_localname_xml">type</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>html<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&gt;</span></span>
  Less: <span class="constant constant_character constant_character_entity constant_character_entity_xml"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_xml">&amp;</span>lt<span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_xml">;</span></span>em&gt; <span class="constant constant_character constant_character_entity constant_character_entity_xml"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_xml">&amp;</span>amp<span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_xml">;</span></span>lt; <span class="constant constant_character constant_character_entity constant_character_entity_xml"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_xml">&amp;</span>lt<span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_xml">;</span></span>/em&gt;
<span class="meta meta_tag meta_tag_xml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_localname entity_name_tag_localname_xml">title</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&gt;</span></span>
...</span></pre>
<p>If the value of &quot;type&quot; is &quot;html&quot;, the content of the Text construct MUST NOT contain child elements and SHOULD be suitable for handling as HTML [HTML]. Any markup within MUST be escaped; for example, &quot;&lt;br&gt;&quot; as &quot;&amp;lt;br&gt;&quot;. HTML markup within SHOULD be such that it could validly appear directly within an HTML &lt;DIV&gt; element, after unescaping. Atom Processors that display such content MAY use that markup to aid in its display.</p></blockquote>
<p>Okay, sorry for the long setup, but we have finally arrived at the point of this post.  That type=&#8221;html&#8221; element cannot have child elements.  The XML parser will identify child elements based on a &#8220;<" character.  Assuming whatever project you would be working on takes that input from the user that means you would have to pass it through a filter, encoding HTML characters like ampersands, less than and greater than signs, the list goes on.  That operation is expensive and may even cause problems in itself.  I ran into a situation just the other day where an ampersand for an encoded character (like the &amp; inside of an &amp;amp;) was causing errors by itself.</p>
<p>The solution is to make the XML Parsers ignore the data by wrapping it in a CDATA tag.  Lets take the above example and show how it could be done much easier:</p>
<pre class="textmate-source twilight"><span class="text text_xml">...
<span class="meta meta_tag meta_tag_xml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_localname entity_name_tag_localname_xml">title</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_localname entity_other_attribute-name_localname_xml">type</span>=<span class="string string_quoted string_quoted_double string_quoted_double_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">"</span>html<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&gt;</span></span>
  <span class="string string_unquoted string_unquoted_cdata string_unquoted_cdata_xml"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_xml">&lt;![CDATA[</span> Less: &lt;em&gt; &amp;lt; &lt;/em&gt; <span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_xml">]]&gt;</span></span>
<span class="meta meta_tag meta_tag_xml"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_localname entity_name_tag_localname_xml">title</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_xml">&gt;</span></span>
...</span></pre>
<p>Easier to understand?  You betcha.  Less costly for developers?  Of course.  So CDATA is there to help, not hurt.  Don&#8217;t look at its ugly face and think of it as a hack, look deeper and you will see its purpose and power.  Okay, I admit that sounds a little corny, but it could have been worse.</p>
<h3>Side note, Javascript</h3>
<p>As managers everywhere throw out buzz words like AJAX and encourage you to participate in new web 2.0 project ideas you&#8217;re going to end up sending and receiving XML requests with a server using the good old XMLHttpRequest object.  Well if encoding isn&#8217;t enough of a problem (and I&#8217;m still wrapping my head around it) you might get struck with a problem like the above case and want to make use of your knowledge with CDATA.  </p>
<p>Well, you&#8217;re in luck.  xmlDocument.createCDATASection(&#8230;) is part of the <a href="http://www.w3.org/TR/DOM-Level-2-Core/ecma-script-binding.html">Level 2 DOM ECMAScript Spec</a>.  Use it just like a createTextNode():</p>
<pre class="textmate-source twilight"><span class="source source_js"><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span>
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> Create an atom:title element with html content
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> assume xmlDocument is already an XML Document object
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> and entry is an atom:entry element in that document
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span>
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> &lt;entry&gt;
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span>   &lt;title type="html"&gt;&lt;![CDATA[&lt;em&gt; &amp;lt; &lt;/em&gt;]]&gt;&lt;/title&gt;
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> &lt;entry&gt;
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span>
</span>ATOM_NS <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>http://www.w3.org/2005/Atom<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="storage storage_type storage_type_js">var</span> node <span class="keyword keyword_operator keyword_operator_js">=</span> xmlDocument<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>createElementNS<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>ATOM_NS<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>title<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
node<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_dom support_function_dom_js">setAttribute</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>type<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>html<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="storage storage_type storage_type_js">var</span> cdata <span class="keyword keyword_operator keyword_operator_js">=</span> xmlDocument<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_dom support_function_dom_js">createCDATASection</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>&lt;em&gt; &amp;lt; &lt;/em&gt;<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
node<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_dom support_function_dom_js">appendChild</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>cdata<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
entry<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_dom support_function_dom_js">appendChild</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>node<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
</span></pre>
<p>Now all I have to learn is encoding, and how each browser deals with it differently.  That is an entirely new realm that I don&#8217;t expect to cover in single week, but I&#8217;ll report back with my findings.  Until then, don&#8217;t get caught up on the little things!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2008/06/why-cdata-matters-in-xml/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Installing Ruby 1.8.7 on Mac OS X 10.5.3</title>
		<link>http://blog.bogojoker.com/2008/06/installing-ruby-187-on-mac-os-x-1053/</link>
		<comments>http://blog.bogojoker.com/2008/06/installing-ruby-187-on-mac-os-x-1053/#comments</comments>
		<pubDate>Sun, 15 Jun 2008 18:37:10 +0000</pubDate>
		<dc:creator>joe</dc:creator>
		
		<category><![CDATA[ruby]]></category>

		<category><![CDATA[10.5.3]]></category>

		<category><![CDATA[install]]></category>

		<category><![CDATA[mac os x leopard]]></category>

		<category><![CDATA[readline]]></category>

		<category><![CDATA[ruby 1.8.7]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=58</guid>
		<description><![CDATA[Yah, this week is all about solving problems.  I run into a lot of them, but it gives me something to blog about.  But hey, if I can spend 20 minutes writing down a solution to a couple hour problem that I had, then I could save you a few hours too.
Problem
Trying to [...]]]></description>
			<content:encoded><![CDATA[<p>Yah, this week is all about solving problems.  I run into a lot of them, but it gives me something to blog about.  But hey, if I can spend 20 minutes writing down a solution to a couple hour problem that I had, then I could save you a few hours too.</p>
<h3>Problem</h3>
<p>Trying to install Ruby 1.8.7 (or even 1.9) on my Leopard machine produces warning messages on &#8220;make&#8221; that look like this:</p>
<pre><code>gcc -I. -I../../.ext/include/i686-darwin9.1.0 -I../.././include
-I../.././ext/readline -DRUBY_EXTCONF_H=\"extconf.h\"    -fno-common
-g -O2 -pipe -fno-common   -o readline.o -c readline.c
readline.c: In function 'filename_completion_proc_call':
readline.c:659: error: 'filename_completion_function' undeclared
(first use in this function)
readline.c:659: error: (Each undeclared identifier is reported only once
readline.c:659: error: for each function it appears in.)
readline.c:659: warning: assignment makes pointer from integer without a
cast
readline.c: In function 'username_completion_proc_call':
readline.c:684: error: 'username_completion_function' undeclared
(first use in this function)
readline.c:684: warning: assignment makes pointer from integer without a
cast
make[1]: *** [readline.o] Error 1
make: *** [all] Error 1</code></pre>
<h3>Solution</h3>
<p>I originally came across this problem right around new years and eventually found a solution thanks to Han Kessels on the <a href="http://www.ruby-forum.com/topic/136498">Ruby Forums</a>.  It involved the following steps:</p>
<ol>
<li>Download the newest version of readline (version 5.2 at the time of writing) at <a href="http://ftp.gnu.org/gnu/readline/">GNU.org</a>.  You may have to apply the following <a href="http://ftp.gnu.org/gnu/readline/readline-5.2-patches/readline52-012">patch</a>.  Thanks to <a href="http://michael.biven.org/2008/01/25/installing-ruby-on-rails-on-mac-os-105-or-patching-dan-benjamins-guide/">Michael Biven</a> for showing a nice simple way to do this from the command line:
<pre><code>$ curl -O ftp://ftp.gnu.org/gnu/readline/readline-5.2.tar.gz
$ tar xzvf readline-5.2.tar.gz
$ cd readline-5.2
$ curl -O http://ftp.gnu.org/gnu/readline/readline-5.2-patches/readline52-012
$ patch -p0 < readline52-012
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
$ cd ..</code></pre>
</li>
<li>Now you can download the 1.8.7 version of ruby, and install it but you should point to the version of readline that you just installed (to /usr/local) like so:
<pre><code>$ curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7.tar.gz
$ tar xzvf ruby-1.8.7.tar.gz
$ cd ruby-1.8.7
$ ./configure --prefix=/usr/local/ruby1.8.7 --with-readline-dir=/usr/local
$ make
$ sudo make install
$ cd /usr/local/ruby1.8.7/bin
$ ./ruby -v
ruby 1.8.7 (2008-05-31 patchlevel 0) [i686-darwin9.3.0]</code></pre>
</li>
</ol>
<h3>The End Result</h3>
<p>If you followed my terminal commands from above you should have a working Ruby 1.8.7 version installed in your &#8220;/usr/local/ruby1.8.7/bin&#8221;.  If you wanted ruby in a different directory then change the &#8220;&#8211;prefix=/usr/local/ruby1.8.7&#8243; option on ./configure to instead point to the directory you wanted it.</p>
<p>Why put it in its own directory at all?  Well, I happen to have multiple version of ruby.  By default I have 1.8.6, I have this version of 1.8.7, I even have a 1.9 version I installed a while ago.  Its easy to remember where each is if the directory they reside in clearly states the name.  This way I can test a script, maybe even run benchmarks, in each version of ruby.  However, you might not want to take this extra measure.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2008/06/installing-ruby-187-on-mac-os-x-1053/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A &#8220;blog.domain.com&#8221; That Works</title>
		<link>http://blog.bogojoker.com/2008/06/a-blogdomaincom-that-works/</link>
		<comments>http://blog.bogojoker.com/2008/06/a-blogdomaincom-that-works/#comments</comments>
		<pubDate>Sun, 15 Jun 2008 13:58:27 +0000</pubDate>
		<dc:creator>joe</dc:creator>
		
		<category><![CDATA[misc.]]></category>

		<category><![CDATA[redirect]]></category>

		<category><![CDATA[subdomain]]></category>

		<category><![CDATA[url]]></category>

		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=57</guid>
		<description><![CDATA[I seem to have had some really bad luck doing what I thought would be very simple.  I finally arrived at a solution that I really don&#8217;t feel is optimal, but it works and I&#8217;ll monitor it for a while and hope that it continues working.  (You&#8217;ll know if something ended up changing).
Problem
I [...]]]></description>
			<content:encoded><![CDATA[<p>I seem to have had some really bad luck doing what I thought would be very simple.  I finally arrived at a solution that I really don&#8217;t feel is optimal, but it works and I&#8217;ll monitor it for a while and hope that it continues working.  (You&#8217;ll know if something ended up changing).</p>
<h3>Problem</h3>
<p>I own &#8220;alpha.com&#8221; and I want to create a &#8220;blog.alpha.com&#8221; that actually pulls pages from &#8220;alpha.com/blog/&#8221; on the web server but the user should still see &#8220;blog.alpha.com&#8221; in their browser&#8217;s address bar.</p>
<h3>How I did it with this WordPress 2.5.1 Blog</h3>
<p>Hopefully if you look up at your address bar right now you see blog.bogojoker.com.  If not, then this failed and completely ignore me!  I ended up having to do three things:</p>
<ol>
<li>I Setup redirection for a subdomain.  I used my hosting company&#8217;s Control Panel to create &#8220;blog.bogojoker.com&#8221; and point it to &#8220;http://bogojoker.com/blog/&#8221;.  Please note this change does not start working immediately.  It took a few hours for the redirection to be broadcast over DNS Name Servers.  Once it did work I went to the next steps.  I wouldn&#8217;t recommend going to the next steps until this starts working because I believe they depend on this!</li>
<li>I logged into the WordPress Admin Dashboard.  I went to &#8220;Settings&#8221; and put &#8220;http://blog.bogojoker.com&#8221; into both the &#8220;WordPress address&#8221; and &#8220;Blog address&#8221; fields.  This put my browser into an infinite loop which I fixed in the final step.</li>
<li>I FTP&#8217;d into my server, went to the &#8220;public_html/blog/&#8221; directory and commented out these lines from the hidden &#8220;.htaccess&#8221; file: (Note that adding a &#8220;#&#8221; to the start of the line comments that line out)
<pre><code>#RewriteCond %{HTTP_HOST} ^blog.bogojoker.com$ [OR]
#RewriteCond %{HTTP_HOST} ^www.blog.bogojoker.com$
#RewriteRule ^(.*)$ http://bogojoker.com/blog/ [R=301,L]</code></pre>
</li>
</ol>
<p>Voila.  That is how I did it.  I ended up spending far too much time on what I considered &#8220;better&#8221; solutions that didn&#8217;t seem to work.  In doing so I found out some things, but I can&#8217;t really be sure what I learned anything valuable from it.</p>
<h3>Troubleshooting Tricks</h3>
<p>If you end up having the same trouble, if you want to experiment on your own, or if you tried something that totally failed hopefully this can help.</p>
<p>At one point during the week everything crashed on me.  Not only did the website not redirect properly but the direct paths weren&#8217;t working.  I chalked it up to me turning the redirection (step 1 above) off.  I stumbled upon a temporary solution to fix WordPress in the few hours it would take for that redirection to be reborn through DNS.  It involves a little familiarity with mysql or phpMyAdmin and knowing your database schemas.</p>
<p>For those with phpMyAdmin access:</p>
<ol>
<li>Log into your phpMyAdmin</li>
<li>Select the WordPress&#8217;s database.  Most servers have username_wp### or the like, this you should recognize pretty easily or can find from your Control Panel</li>
<li>Browse  the &#8220;wp_options&#8221; table</li>
<li>Modify the &#8220;siteurl&#8221; value to be the &#8220;real&#8221; path to the blog subdirectory, NOT what you want it to be but where it really is.  For example &#8220;http://bogojoker.com/blog/&#8221; for me.</li>
<li>Now log into your WordPress by manually going to your domains wp-admin page like so: &#8220;http://yourDomainHere.com/blog/wp-admin/&#8221;</li>
<li>Go to the &#8220;settings&#8221; tab and change both urls to the url mentioned in step 4.</li>
</ol>
<p>That should bring your website back up, albeit with the uglier URL structure.  For those without phpMyAdmin access the you should have some form of access to your database, be it command line using the &#8220;mysql&#8221; command or via another graphical interface.  Just try to follow the steps above as closely as possible.</p>
<p>I hope this helps you out a little if you want to accomplish the same thing.  Even better though, come up with a better solution and let me know.  I dreamed of solving this in a couple minutes and ended up spending a little over 3 hours taking a number of approaches.  So I figured, what better to do but write about it!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2008/06/a-blogdomaincom-that-works/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JavaScript Sort an Array of Objects</title>
		<link>http://blog.bogojoker.com/2008/06/javascript-sort-an-array-of-objects/</link>
		<comments>http://blog.bogojoker.com/2008/06/javascript-sort-an-array-of-objects/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 02:38:03 +0000</pubDate>
		<dc:creator>joe</dc:creator>
		
		<category><![CDATA[code]]></category>

		<category><![CDATA[free]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[web]]></category>

		<category><![CDATA[array]]></category>

		<category><![CDATA[js]]></category>

		<category><![CDATA[sort]]></category>

		<guid isPermaLink="false">http://bogojoker.com/blog/?p=52</guid>
		<description><![CDATA[I ran into an interesting problem today.  I had an array of objects that I wanted sorted on a certain property.  My obvious thought didn&#8217;t work! (Update: I got a comment below from Peter Michaux who points out a nicer solution, it is included here:)
// Array of Objects
var obj_arr = [ { age: [...]]]></description>
			<content:encoded><![CDATA[<p>I ran into an interesting problem today.  I had an array of objects that I wanted sorted on a certain property.  My obvious thought didn&#8217;t work! (Update: I got a comment below from <a href="http://peter.michaux.ca/">Peter Michaux</a> who points out a nicer solution, it is included here:)</p>
<pre class="textmate-source twilight"><span class="source source_js"><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> Array of Objects
</span><span class="storage storage_type storage_type_js">var</span> obj_arr <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> age: <span class="constant constant_numeric constant_numeric_js">21</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>name: <span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>Larry<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>
                <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> age: <span class="constant constant_numeric constant_numeric_js">34</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>name: <span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>Curly<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>
                <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> age: <span class="constant constant_numeric constant_numeric_js">10</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>name: <span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>Moe<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span> <span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>

<span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> This doesn't work!
</span>obj_arr<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">sort</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> <span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>a<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>b<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> <span class="keyword keyword_control keyword_control_js">return</span> a<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> <span class="keyword keyword_operator keyword_operator_js">&lt;</span> b<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>

<span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> This does work! (Peter's update, very fast)
</span>obj_arr1<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">sort</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>a<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>b<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> <span class="keyword keyword_control keyword_control_js">return</span> a<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> <span class="keyword keyword_operator keyword_operator_js">&lt;</span> b<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> ? <span class="keyword keyword_operator keyword_operator_js">-</span><span class="constant constant_numeric constant_numeric_js">1</span> :
                                     a<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> <span class="keyword keyword_operator keyword_operator_js">&gt;</span> b<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> ?  <span class="constant constant_numeric constant_numeric_js">1</span> : <span class="constant constant_numeric constant_numeric_js">0</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
</span></pre>
<p>That kind of frustrated me.  Sorting is one of those things I expect to be available in all languages.  I don&#8217;t want to have to write a sorting algorithm every time I need to sort.  So I looked into things, pulled up a <a href="http://en.literateprograms.org/Quicksort_(JavaScript)">Javascript Quicksort Algorithm</a> and manipulated it to support any compare function.</p>
<p>Now that I have the freedom to truly write a compare function that works for objects!  I also changed around certain parts of the code I found online to actually extend the Array class and make the extra functions hidden.  Take a look at the sample usage:</p>
<pre class="textmate-source twilight"><span class="source source_js"><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> Defaults to (a&lt;=b) sorting.  Great for numbers.
</span><span class="storage storage_type storage_type_js">var</span> arr <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span><span class="constant constant_numeric constant_numeric_js">1234</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">2346</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">21234</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">3456</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">32134</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">3456</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">1234</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">2345</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">23</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">42523</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">1234</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">345</span><span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>

<span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> Object Array
</span><span class="storage storage_type storage_type_js">var</span> obj_arr <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> age: <span class="constant constant_numeric constant_numeric_js">21</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>name: <span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>Larry<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>
                <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> age: <span class="constant constant_numeric constant_numeric_js">34</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>name: <span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>Curly<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>
                <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> age: <span class="constant constant_numeric constant_numeric_js">10</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>name: <span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>Moe<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span> <span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>

arr<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>quick_sort<span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> =&gt; [23, 345, 1234, 1234, 1234, 2345, 2346, 3456, 3456, 21234, 32134, 42523]
</span>
obj_arr<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>quick_sort<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>a<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>b<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> <span class="keyword keyword_control keyword_control_js">return</span> a<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> <span class="keyword keyword_operator keyword_operator_js">&lt;</span> b<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> =&gt; Curly, Larry, Moe
</span>
obj_arr<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>quick_sort<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>a<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>b<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> <span class="keyword keyword_control keyword_control_js">return</span> a<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>age <span class="keyword keyword_operator keyword_operator_js">&lt;</span> b<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>age <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> =&gt; Moe (10), Larry (21), Curly (34)</span></span></pre>
<p>For those who want to see the code be glad, its free.  I carried the copyright with it but its rather loose.  Grab the <a href="http://bogojoker.com/free/quicksort.js">JavaScript Source Here</a>!  Enjoy:</p>
<pre class="textmate-source twilight"><span class="source source_js"><span class="meta meta_function meta_function_prototype meta_function_prototype_js"><span class="support support_class support_class_js">Array</span>.<span class="support support_constant support_constant_js">prototype</span>.<span class="entity entity_name entity_name_function entity_name_function_js">swap</span>=<span class="storage storage_type storage_type_function storage_type_function_js">function</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_js">a, b</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_js">)</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
  <span class="storage storage_type storage_type_js">var</span> tmp<span class="keyword keyword_operator keyword_operator_js">=</span><span class="variable variable_language variable_language_js">this</span><span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>a<span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="variable variable_language variable_language_js">this</span><span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>a<span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="keyword keyword_operator keyword_operator_js">=</span><span class="variable variable_language variable_language_js">this</span><span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>b<span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="variable variable_language variable_language_js">this</span><span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>b<span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="keyword keyword_operator keyword_operator_js">=</span>tmp<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span>

<span class="meta meta_function meta_function_prototype meta_function_prototype_js"><span class="support support_class support_class_js">Array</span>.<span class="support support_constant support_constant_js">prototype</span>.<span class="entity entity_name entity_name_function entity_name_function_js">quick_sort</span> = <span class="storage storage_type storage_type_function storage_type_function_js">function</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_js">compareFunction</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_js">)</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>

  <span class="meta meta_function meta_function_js"><span class="storage storage_type storage_type_function storage_type_function_js">function</span> <span class="entity entity_name entity_name_function entity_name_function_js">partition</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_js">array, compareFunction, begin, end, pivot</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_js">)</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
    <span class="storage storage_type storage_type_js">var</span> piv <span class="keyword keyword_operator keyword_operator_js">=</span> array<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>pivot<span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
    array<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>swap<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>pivot<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>end<span class="keyword keyword_operator keyword_operator_js">-</span><span class="constant constant_numeric constant_numeric_js">1</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
    <span class="storage storage_type storage_type_js">var</span> store <span class="keyword keyword_operator keyword_operator_js">=</span> begin<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
    <span class="keyword keyword_control keyword_control_js">for</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">var</span> ix <span class="keyword keyword_operator keyword_operator_js">=</span> begin<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> ix <span class="keyword keyword_operator keyword_operator_js">&lt;</span> end<span class="keyword keyword_operator keyword_operator_js">-</span><span class="constant constant_numeric constant_numeric_js">1</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> <span class="keyword keyword_operator keyword_operator_js">++</span>ix<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
      <span class="keyword keyword_control keyword_control_js">if</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> compareFunction<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>array<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>ix<span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>piv<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
        array<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>swap<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>store<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>ix<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
        <span class="keyword keyword_operator keyword_operator_js">++</span>store<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
      <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span>
    <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span>
    array<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>swap<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>end<span class="keyword keyword_operator keyword_operator_js">-</span><span class="constant constant_numeric constant_numeric_js">1</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>store<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
    <span class="keyword keyword_control keyword_control_js">return</span> store<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span>

  <span class="meta meta_function meta_function_js"><span class="storage storage_type storage_type_function storage_type_function_js">function</span> <span class="entity entity_name entity_name_function entity_name_function_js">qsort</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_js">array, compareFunction, begin, end</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_js">)</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
    <span class="keyword keyword_control keyword_control_js">if</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> end<span class="keyword keyword_operator keyword_operator_js">-</span><span class="constant constant_numeric constant_numeric_js">1</span> <span class="keyword keyword_operator keyword_operator_js">&gt;</span> begin <span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
      <span class="storage storage_type storage_type_js">var</span> pivot <span class="keyword keyword_operator keyword_operator_js">=</span> begin <span class="keyword keyword_operator keyword_operator_js">+</span> <span class="support support_class support_class_js">Math</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">floor</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="support support_class support_class_js">Math</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">random</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span> <span class="keyword keyword_operator keyword_operator_js">*</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>end<span class="keyword keyword_operator keyword_operator_js">-</span>begin<span class="meta meta_brace meta_brace_round meta_brace_round_js">))</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
      pivot <span class="keyword keyword_operator keyword_operator_js">=</span> partition<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>array<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>compareFunction<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>begin<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>end<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>pivot<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
      qsort<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>array<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>compareFunction<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>begin<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>pivot<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
      qsort<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>array<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>compareFunction<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>pivot<span class="keyword keyword_operator keyword_operator_js">+</span><span class="constant constant_numeric constant_numeric_js">1</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>end<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
    <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span>
  <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span>

  <span class="keyword keyword_control keyword_control_js">if</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> compareFunction <span class="keyword keyword_operator keyword_operator_js">==</span> <span class="constant constant_language constant_language_null constant_language_null_js">null</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
    <span class="meta meta_function meta_function_js"><span class="entity entity_name entity_name_function entity_name_function_js">compareFunction</span> = <span class="storage storage_type storage_type_function storage_type_function_js">function</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_js">a,b</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_js">)</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> <span class="keyword keyword_control keyword_control_js">return</span> a<span class="keyword keyword_operator keyword_operator_js">&lt;=</span>b<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span>
  qsort<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="variable variable_language variable_language_js">this</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>compareFunction<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">0</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="variable variable_language variable_language_js">this</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_js">length</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>

<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span></span></pre>
<h3>Update</h3>
<p>Peter Michaux pointed out something very important.  The sort() function can be made to work if it returns numeric output (-1,0,1).  His approach is far superior.  Here was a benchmark I took:</p>
<pre class="textmate-source twilight"><span class="source source_js"><span class="storage storage_type storage_type_js">var</span> obj_arr1 <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="meta meta_brace meta_brace_square meta_brace_square_js">[]</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="storage storage_type storage_type_js">var</span> obj_arr2 <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="meta meta_brace meta_brace_square meta_brace_square_js">[]</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="storage storage_type storage_type_js">var</span> filler <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> age: <span class="constant constant_numeric constant_numeric_js">21</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>name: <span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>Larry<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>
               <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> age: <span class="constant constant_numeric constant_numeric_js">34</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>name: <span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>Curly<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>
               <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> age: <span class="constant constant_numeric constant_numeric_js">10</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>name: <span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>Moe<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span> <span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="keyword keyword_control keyword_control_js">for</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">var</span> i<span class="keyword keyword_operator keyword_operator_js">=</span><span class="constant constant_numeric constant_numeric_js">0</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> i<span class="keyword keyword_operator keyword_operator_js">&lt;</span><span class="constant constant_numeric constant_numeric_js">5000</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> i<span class="keyword keyword_operator keyword_operator_js">++</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
  rand <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="support support_class support_class_js">Math</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">floor</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> <span class="support support_class support_class_js">Math</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">random</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span> <span class="keyword keyword_operator keyword_operator_js">*</span> <span class="constant constant_numeric constant_numeric_js">3</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  obj_arr1<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">push</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> filler<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>rand<span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  obj_arr2<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">push</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> filler<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>rand<span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span>

<span class="storage storage_type storage_type_js">var</span> s <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="meta meta_class meta_class_instance meta_class_instance_constructor"><span class="keyword keyword_operator keyword_operator_new keyword_operator_new_js">new</span> <span class="entity entity_name entity_name_type entity_name_type_instance entity_name_type_instance_js">Date</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
obj_arr1<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">sort</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>a<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>b<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> <span class="keyword keyword_control keyword_control_js">return</span> a<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> <span class="keyword keyword_operator keyword_operator_js">&lt;</span> b<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> ? <span class="keyword keyword_operator keyword_operator_js">-</span><span class="constant constant_numeric constant_numeric_js">1</span> : a<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> <span class="keyword keyword_operator keyword_operator_js">&gt;</span> b<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> ? <span class="constant constant_numeric constant_numeric_js">1</span> : <span class="constant constant_numeric constant_numeric_js">0</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="storage storage_type storage_type_js">var</span> e <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="meta meta_class meta_class_instance meta_class_instance_constructor"><span class="keyword keyword_operator keyword_operator_new keyword_operator_new_js">new</span> <span class="entity entity_name entity_name_type entity_name_type_instance entity_name_type_instance_js">Date</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="entity entity_name entity_name_type entity_name_type_object entity_name_type_object_js entity_name_type_object_js_firebug">console</span><span class="support support_function support_function_js support_function_js_firebug">.log</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>e<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">getTime</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span><span class="keyword keyword_operator keyword_operator_js">-</span>s<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">getTime</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">())</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> <span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> =&gt; 75 ms
</span>
s <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="meta meta_class meta_class_instance meta_class_instance_constructor"><span class="keyword keyword_operator keyword_operator_new keyword_operator_new_js">new</span> <span class="entity entity_name entity_name_type entity_name_type_instance entity_name_type_instance_js">Date</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
obj_arr2<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>quick_sort<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>a<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>b<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> <span class="keyword keyword_control keyword_control_js">return</span> a<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> <span class="keyword keyword_operator keyword_operator_js">&lt;</span> b<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_dom support_constant_dom_js">name</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
e <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="meta meta_class meta_class_instance meta_class_instance_constructor"><span class="keyword keyword_operator keyword_operator_new keyword_operator_new_js">new</span> <span class="entity entity_name entity_name_type entity_name_type_instance entity_name_type_instance_js">Date</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="entity entity_name entity_name_type entity_name_type_object entity_name_type_object_js entity_name_type_object_js_firebug">console</span><span class="support support_function support_function_js support_function_js_firebug">.log</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>e<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">getTime</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span><span class="keyword keyword_operator keyword_operator_js">-</span>s<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">getTime</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">())</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> <span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span>  =&gt; 4444 ms
</span>
</span></pre>
<p>That shows drastic differences for arrays as large as 5000 elements (with not too random data).  75 ms versus 4444 ms (over 4 seconds).  Doing the math: (4444/75) => 59.253 times better!  Moral of the story, don&#8217;t rush into thinking something doesn&#8217;t exist!</p>
<p>So if that&#8217;s the way to do it, then I want to make it easier on me.  My arrays are generally going to be under 100 in size, and at such a size building a function dynamically instead of writing a custom function works just about as well (although if you were using objects, polymorphism and a compare function would be the best way to go).  Here is a simple function I can use to more quickly build compare functions in order to ascend sort an array on multiple properties!</p>
<pre class="textmate-source twilight"><span class="source source_js"><span class="meta meta_function meta_function_js"><span class="storage storage_type storage_type_function storage_type_function_js">function</span> <span class="entity entity_name entity_name_function entity_name_function_js">buildCompareFunction</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_js">arr</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_js">)</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
  <span class="keyword keyword_control keyword_control_js">if</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>arr <span class="keyword keyword_operator keyword_operator_js">&amp;&amp;</span> arr<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_constant support_constant_js">length</span> <span class="keyword keyword_operator keyword_operator_js">&gt;</span> <span class="constant constant_numeric constant_numeric_js">0</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
    <span class="keyword keyword_control keyword_control_js">return</span> <span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>a<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>b<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
      <span class="storage storage_type storage_type_js">var</span> asub<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>bsub<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>prop<span