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

<channel>
	<title>BogoJoker &#187; javascript</title>
	<atom:link href="http://blog.bogojoker.com/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.bogojoker.com</link>
	<description>&#039;My humble abode&#039;.sub(/ab/,&#039;c&#039;)</description>
	<lastBuildDate>Mon, 04 Apr 2011 07:33:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Web Analytics Taken to the Next Level</title>
		<link>http://blog.bogojoker.com/2009/06/web-analytics-taken-to-the-next-level/</link>
		<comments>http://blog.bogojoker.com/2009/06/web-analytics-taken-to-the-next-level/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 14:15:19 +0000</pubDate>
		<dc:creator>Joseph Pecoraro</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[monitor]]></category>
		<category><![CDATA[p2p]]></category>
		<category><![CDATA[tabs]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=872</guid>
		<description><![CDATA[I came up with a neat idea the other night. Using localStorage and sessionStorage you could theoretically monitor the number of tabs or windows a visitor has opened for your site. As far as I know, this capability has never before been possible. Well, now it is. Check out this crude example. Once you open [...]]]></description>
			<content:encoded><![CDATA[<p>I came up with a neat idea the other night.  Using localStorage and sessionStorage you could theoretically monitor the number of tabs or windows a visitor has opened for your site.  As far as I know, this capability has never before been possible.  Well, now it is.</p>
<p>Check out <a href="http://bogojoker.com/x/tab_monitor/monitor.html">this crude example</a>.</p>
<p>Once you open the monitor, leave that tab/window put.  Use the &#8220;Spawn Tab&#8221; link to create new tabs and windows.  The monitor will be notified and display some simple debug.  There are 10 second updates per tab/window so that when they close the monitor can detect it.  The monitor will detect a close within 15 seconds of the tab/window closing and will display the total time the tab/window plus or minus 10 seconds.  Correct values are maintained as the tab/windows browse across pages as long as they stay on the domain!  Just about everything you&#8217;d want or need.</p>
<p>Again, I mentioned this is rather crude.  The fact that the monitor tab remains open is only due to the fact that I wanted to prototype the idea. The majority of the state is stored in localStorage, and each tab/window maintains a single identifier in its sessionStorage to remind the tab/window what id it was while it navigates to multiple pages.  Because everything is stored in the storage this system has the capability to become completely distributed.  Meaning no &#8220;monitor&#8221; tab is necessary, and the scripts can determine, and monitor, on their own the existence of all other tabs.  Thus, this would be a viable option for the next level of web analytics.</p>
<p>As cool as this is, I don&#8217;t think it will provide too much value to the analytics.  For the first time webmasters will be able to know how many windows or tabs a visitor opens (and to what pages they open).  The webmaster will know more about how its user&#8217;s use the website, but I don&#8217;t think this statistic will be a game changer.  Who knows!</p>
<p>So, how does it work?  Very simple.  Each tab includes the client.js code to handle updating the localStorage and maintaining its own &#8220;tab_id&#8221; in sessionStorage.  Data it maintains can be whatever you want, I went with some simple information such as its start time, current url, and latest keepalive:</p>
<p><img src="http://blog.bogojoker.com/wp-content/uploads/2009/06/Picture-1.png" alt="localStorage values" title="localStorage values" width="586" height="363" style="border: 1px solid lightGray; margin: 0 15px"/></p>
<p>The upkeep for a Tab Client is to restore their session information when you navigate to any new page:</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> Create or Restore tab_id
</span><span class="storage storage_type storage_type_js">var</span> myTabId <span class="keyword keyword_operator keyword_operator_js">=</span> sessionStorage<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>tab<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_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> myTabId <span class="keyword keyword_operator keyword_operator_js">===</span> <span class="constant constant_language constant_language_js">undefined</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="storage storage_type storage_type_js">var</span> tabs <span class="keyword keyword_operator keyword_operator_js">=</span> localStorage<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>tabs<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_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> tabs <span class="keyword keyword_operator keyword_operator_js">===</span> <span class="constant constant_language constant_language_js">undefined</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>
    myTabId <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>
    localStorage<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>tabs <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>0<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="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span> <span class="keyword keyword_control keyword_control_js">else</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
    <span class="storage storage_type storage_type_js">var</span> largest <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="support support_function support_function_js">parseInt</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> tabs<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">split</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_regexp string_regexp_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">/</span>,<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="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js">pop</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</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">10</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>
    myTabId <span class="keyword keyword_operator keyword_operator_js">=</span> largest<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>
    localStorage<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>tabs <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>,<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="keyword keyword_operator keyword_operator_js">+</span> myTabId<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>
  sessionStorage<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>tab <span class="keyword keyword_operator keyword_operator_js">=</span> myTabId<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>
<p>And to perform its keepalives:</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> Update the Latest Timestamp
</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"> setLatest</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</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> key <span class="keyword keyword_operator keyword_operator_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>tab<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="keyword keyword_operator keyword_operator_js">+</span>myTabId<span class="keyword keyword_operator keyword_operator_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>_latest<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>
  localStorage<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>setItem<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>key<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span> <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_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="meta meta_brace meta_brace_curly meta_brace_curly_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> Update Status every 10 seconds
</span><span class="support support_class support_class_js">window</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">setInterval</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>setLatest<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">10000</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>
setLatest<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>I put a few more convenience functions in there to help it update these localStorage keys, and communicate with the monitor which was crudely done through localStorage.  That is explained next.</p>
<p>The Tab Monitor as it stands right now receives messages through localStorage&#8217;s &#8220;storage&#8221; event.  It also checks all the tab&#8217;s &#8220;lastest&#8221; keepalives to make sure they didn&#8217;t pass their 10 second limit.  In the case of a tab being closed, it will remove references to that tab and output an approximation of the time the tab was open:</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> Listener - receive messages from tabs
</span><span class="support support_class support_class_js">window</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>addEventListener<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>storage<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="meta meta_function meta_function_js"><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">e</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> e<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>storageArea <span class="keyword keyword_operator keyword_operator_js">===</span> localStorage <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> e<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>key <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>tab_msg<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="meta meta_brace meta_brace_curly meta_brace_curly_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>newValue <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>
      addMsg<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>newValue <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> Appends to the page
</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="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> Purger - clean out tabs that died for 15 seconds
</span><span class="support support_class support_class_js">window</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">setInterval</span><span class="meta meta_brace meta_brace_round meta_brace_round_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="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</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="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><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>purging<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> now <span class="keyword keyword_operator keyword_operator_js">=</span> <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_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="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>
      tabs <span class="keyword keyword_operator keyword_operator_js">=</span> localStorage<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>tabs<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_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> tabs <span class="keyword keyword_operator keyword_operator_js">!==</span> <span class="constant constant_language constant_language_js">undefined</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="storage storage_type storage_type_js">var</span> toRemove <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_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span> toKeep <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>
    tabs <span class="keyword keyword_operator keyword_operator_js">=</span> tabs<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">split</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_regexp string_regexp_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">/</span>,<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="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="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span> len<span class="keyword keyword_operator keyword_operator_js">=</span>tabs<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="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> i<span class="keyword keyword_operator keyword_operator_js">&lt;</span>len<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>
      <span class="storage storage_type storage_type_js">var</span> tabId <span class="keyword keyword_operator keyword_operator_js">=</span> tabs<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>i<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>
          tabLatest <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="support support_function support_function_js">parseInt</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> localStorage<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>getItem<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>tab<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span><span class="keyword keyword_operator keyword_operator_js">+</span>tabId<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>_latest<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="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_round meta_brace_round_js">(</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>now<span class="keyword keyword_operator keyword_operator_js">-</span>tabLatest<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="keyword keyword_operator keyword_operator_js">&gt;=</span><span class="constant constant_numeric constant_numeric_js">15000</span> ? toRemove : toKeep <span class="meta meta_brace meta_brace_round meta_brace_round_js">)</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">push</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>tabId<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>
    localStorage<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>tabs <span class="keyword keyword_operator keyword_operator_js">=</span> toKeep<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">join</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>,<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="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="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span> len<span class="keyword keyword_operator keyword_operator_js">=</span>toRemove<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="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> i<span class="keyword keyword_operator keyword_operator_js">&lt;</span>len<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>
      <span class="storage storage_type storage_type_js">var</span> tabId <span class="keyword keyword_operator keyword_operator_js">=</span> toRemove<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>i<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>
          tabLatest <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="support support_function support_function_js">parseInt</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> localStorage<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>getItem<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>tab<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span><span class="keyword keyword_operator keyword_operator_js">+</span>tabId<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>_latest<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="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>
          tabStart <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="support support_function support_function_js">parseInt</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> localStorage<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>getItem<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>tab<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span><span class="keyword keyword_operator keyword_operator_js">+</span>tabId<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>_start<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="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span>
          time <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>tabLatest<span class="keyword keyword_operator keyword_operator_js">-</span>tabStart<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span>/<span class="constant constant_numeric constant_numeric_js">1000</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
      addMsg<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>Tab <span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="keyword keyword_operator keyword_operator_js">+</span> tabId <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> Closed after <span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="keyword keyword_operator keyword_operator_js">+</span> time <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> seconds!<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_curly meta_brace_curly_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="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span> <span class="constant constant_numeric constant_numeric_js">5000</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>This took a little under an hour to get working.  There are still minor issues that I didn&#8217;t attempt to resolve.  However, if there is interest this could be developed into a completely distributed peer-to-peer communication between tabs/windows on a single domain.  However, a little warning. Web Storage is not set in stone.  Not all browsers have implemented it and the specification is subject to change at any minute.  There has been some rather heated debate on the subject of Web Storage recently, with good reason.  All I know is that when its settled, this functionality will continue to exist!</p>
<p>Let me know what you think.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2009/06/web-analytics-taken-to-the-next-level/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Handling the tab key in a &lt;textarea&gt;</title>
		<link>http://blog.bogojoker.com/2009/06/handling-the-tab-key-in-a-textarea/</link>
		<comments>http://blog.bogojoker.com/2009/06/handling-the-tab-key-in-a-textarea/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 13:30:43 +0000</pubDate>
		<dc:creator>Joseph Pecoraro</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[tab key]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=867</guid>
		<description><![CDATA[Traversing through input elements with the tab key is important for accessibility reasons. However, every once in a while you come across a situation where traversal isn&#8217;t really important. Instead, you want the tab key to actually do something for you. Even still, you may want to do something fancy with the tab key. Wether [...]]]></description>
			<content:encoded><![CDATA[<p>Traversing through input elements with the tab key is important for accessibility reasons.  However, every once in a while you come across a situation where traversal isn&#8217;t really important.  Instead, you want the tab key to actually do something for you.  Even still, you may want to do something fancy with the tab key. Wether its replacing it with spaces or something else.</p>
<p>I found an interesting website today that had an interesting idea.  You could run some test code on the page to test their library.  Their instructions said, &#8220;push tab to evaluate the code.&#8221;  Sure enough you could tell it was working &#8220;onblur&#8221; for the textarea.  The problem with this was that when you pushed tab you lost focus.</p>
<p>I thought about it, and figured you could do a rather simple trick to run some code and refocus on the textarea.  It goes a little like this:</p>
<pre class="textmate-source twilight"><span class="source source_js"><span class="support support_class support_class_js">window</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>addEventListener<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>load<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="meta meta_function meta_function_js"><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="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> textarea <span class="keyword keyword_operator keyword_operator_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">getElementById</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>txt<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>
  textarea<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>addEventListener<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>keydown<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="meta meta_function meta_function_js"><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">e</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>e<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>keyCode <span class="keyword keyword_operator keyword_operator_js">===</span> <span class="constant constant_numeric constant_numeric_js">9</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>
      e<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>preventDefault<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="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>stopPropagation<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> operation goes here
</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="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_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span></span></pre>
<p>Note that to get the actual character you have to get the character from the event.  There are many ways to do it, keyCode, charCode, which, even keyIdentifier.  You&#8217;ll have to mix things up to work across all browsers.  Basically 9 is the code for the tab key.  So when you get the tab key, it prevents the default behavior and allows you to execute whatever code you want: run some functions, eval some code, display something, ajax request, whatever you want.  Simple.  I think it would improve a few interfaces.  Neat idea to make use of the tab key to perform a function.</p>
<p>You can check out <a href="http://bogojoker.com/x/tab_trigger.html">this example</a> of what I mean.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2009/06/handling-the-tab-key-in-a-textarea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Markdown =&gt; Tutorial in 1 Step</title>
		<link>http://blog.bogojoker.com/2009/05/markdown-tutorial-in-1-step/</link>
		<comments>http://blog.bogojoker.com/2009/05/markdown-tutorial-in-1-step/#comments</comments>
		<pubDate>Mon, 18 May 2009 15:00:10 +0000</pubDate>
		<dc:creator>Joseph Pecoraro</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[markdown]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=787</guid>
		<description><![CDATA[When I wrote my Ruby Readline tutorial I felt I came up with a cool concept. I started with a Markdown file, translated it to html, and I used the headers to generate a Table of Contents on the fly. It didn&#8217;t take me long to realize that I could turn this into a framework [...]]]></description>
			<content:encoded><![CDATA[<p>When I wrote my <a href="http://bogojoker.com/readline/">Ruby Readline</a> tutorial I felt I came up with a cool concept.  I started with a Markdown file, translated it to html, and I used the headers to generate a Table of Contents on the fly.</p>
<p><a href="http://github.com/JosephPecoraro/markdownorial/tree/master"><img src="http://blog.bogojoker.com/wp-content/uploads/2009/05/picture-11.png" alt="table of contents" title="table of contents" width="516" height="366" style="border: 1px solid lightGray; margin: 10px 20px;" /></a></p>
<p>It didn&#8217;t take me long to realize that I could turn this into a framework where I could turn <em>any</em> Markdown file into a tutorial exactly like this one.  So with surprisingly little work I modified the scripts to work with any markdown file and the html automatically generated from the standard Markdown.pl script.</p>
<p>I called this <a href="http://github.com/JosephPecoraro/markdownorial/tree/master">markdownorial</a>.  Laugh all you want at the name, but I still think the concept is very cool.  I&#8217;ll probably be using this more and more to automatically generate and format a pretty cool looking tutorial from a single markdown file.  The start to finish time for a project like this has instantly dropped to just the raw content part, no design or coding needed!</p>
<p>Advantages include:</p>
<ul>
<li>
<p>Writing Markdown is very fast and efficient.</p>
</li>
<li>
<p>Time is spent writing the content.  Not messing with design,</p>
</li>
<li>
<p>Table of Contents is automatically built for you.</p>
</li>
<li>
<p>Useful permalinks are automatically generated.  Very useful when passing around links.</p>
</li>
<li>
<p>Clean user interface that focuses entirely on the content but the Table of Contents is always available!</p>
</li>
<li>
<p>Git Repository means if I update the design its just a `git pull` away to get the update.</p>
</ul>
<p>Right now the tutorials shows up elegantly in all standards compliant browsers. Safari/Webkit and Chrome display it perfectly.  Opera has some very minor Unicode issues but displays everything perfectly. Firefox has some separate Unicode issues and if you don&#8217;t have the latest version it has some working but slow animation.  Overall, its entirely usable for people using decent browsers.</p>
<p>Let me know what you think.  Feel free to use it and improve it.  Its all up on Github.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2009/05/markdown-tutorial-in-1-step/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Freenode JSBot Command Line Script</title>
		<link>http://blog.bogojoker.com/2009/03/freenode-jsbot-command-line-script-sotd/</link>
		<comments>http://blog.bogojoker.com/2009/03/freenode-jsbot-command-line-script-sotd/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 15:00:45 +0000</pubDate>
		<dc:creator>Joseph Pecoraro</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[SotD]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[jsbot]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[shell script]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=552</guid>
		<description><![CDATA[So over my week break from college I spent a bunch of time in ##javascript learning and helping others with Javascript problems. This was to help me prepare for one of the projects that I&#8217;m working on (still to be announced). One of the things I really liked in ##javascript was the freenode jsbot that [...]]]></description>
			<content:encoded><![CDATA[<p>So over my week break from college I spent a bunch of time in <a href="irc://irc.freenode.net/##javascript">##javascript</a> learning and helping others with Javascript problems.  This was to help me prepare for one of the projects that I&#8217;m working on (still to be announced).</p>
<p>One of the things I really liked in ##javascript was the <a href="http://js.isite.net.au/jsbot?q=help">freenode jsbot</a> that could do all sorts of things.  It was so useful in fact that I felt I had to have it for when I&#8217;m not using IRC.  The website mentioned an API, so I dug in.</p>
<p>I wrote a command line <a href="http://github.com/JosephPecoraro/scripts/blob/master/jsbot">jsbot script</a> and added it to my <a href="http://bogojoker.com/shell/">~/bin</a>:</p>
<p><img src="http://blog.bogojoker.com/wp-content/uploads/2009/03/jsbot.png" alt="jsbot" title="jsbot" width="601" height="692" class="aligncenter size-full wp-image-555" style="margin-left: -10px;" /></p>
<p>A clip of the source code (yes its horrible&#8230; but its so compact!) shows how easy it is to work with JSON in Ruby.  Just a few includes and its just as easy as Javascript, without the cross-site request issues:</p>
<pre class="textmate-source twilight"><span class="source source_ruby"><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span>!/usr/bin/env ruby
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Author: Joseph Pecoraro
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Date: Friday March 6, 2009
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Description: Simple Interface for the
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> really neat jsbot!
</span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>rubygems<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>open-uri<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>json<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>cgi<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="support support_class support_class_ruby">File</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>dirname<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="variable variable_language variable_language_ruby">__FILE__</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span> <span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby">+</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>/escape<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>

<span class="meta meta_class meta_class_ruby"><span class="keyword keyword_control keyword_control_class keyword_control_class_ruby">class</span> <span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby">JSBot</span></span>

  <span class="variable variable_other variable_other_constant variable_other_constant_ruby">JSON_PREFIX</span> <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>http://fn-js.info/jsbot.xhr?<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>
  <span class="variable variable_other variable_other_constant variable_other_constant_ruby">SITE_PREFIX</span> <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>http://js.isite.net.au/jsbot?<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>

  <span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">search</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby">str</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">)</span></span>
    uri <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> url<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>str<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="variable variable_other variable_other_constant variable_other_constant_ruby">JSON_PREFIX</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>search=<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
    <span class="support support_class support_class_ruby">JSON</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>parse<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span> open<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span> uri <span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>read <span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>

  <span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">show</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby">str</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">)</span></span>
    uri <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> url<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>str<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="variable variable_other variable_other_constant variable_other_constant_ruby">JSON_PREFIX</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>show=<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
    <span class="support support_class support_class_ruby">JSON</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>parse<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span> open<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span> uri <span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>read <span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>

  <span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">url</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby">str<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> u<span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span><span class="variable variable_other variable_other_constant variable_other_constant_ruby">SITE_PREFIX</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> q<span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span><span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>q=<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">)</span></span>
    u <span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby">+</span> q <span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby">+</span> <span class="support support_class support_class_ruby">CGI</span><span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby">::</span>escape<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>str<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>

<span class="keyword keyword_control keyword_control_ruby">end</span>

<span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">...</span>
</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2009/03/freenode-jsbot-command-line-script-sotd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Back and Forth&#8221; Greasemonkey For The Whole Web</title>
		<link>http://blog.bogojoker.com/2009/02/back-and-forth-greasemonkey-for-the-whole-web/</link>
		<comments>http://blog.bogojoker.com/2009/02/back-and-forth-greasemonkey-for-the-whole-web/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 15:30:30 +0000</pubDate>
		<dc:creator>Joseph Pecoraro</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[greasemonkey]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[SotD]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[position]]></category>
		<category><![CDATA[shortcut]]></category>
		<category><![CDATA[window.scroll]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=480</guid>
		<description><![CDATA[Recently I wrote a Greasemonkey script to add keyboard shortcuts to The Big Picture, to improve on some of their already existing shortcuts. Once I started using some of the shortcuts I made I ended up wanting to use them all over the place at other blogs. This functionality is so tiny, but so useful, [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I wrote a Greasemonkey script to add keyboard shortcuts to The Big Picture, to improve on some of their already existing shortcuts.  Once I started using some of the shortcuts I made I ended up wanting to use them all over the place at other blogs.  This functionality is so tiny, but so useful, that I bundled it into its own script that runs on all web pages!</p>
<p><a href="http://bogojoker.com/greasemonkey/back_and_forth.user.js">Grab it here</a>:</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> ==UserScript==
</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> @name          Back and Forth
</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> @namespace     http://blog.bogojoker.com
</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> @description   Keyboard Shortcut to Jump back and forth on a page. (esc key).
</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> @include       *
</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> @version       1.0 - Initial Version - Sunday February 15, 2009
</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> ==/UserScript==
</span>
<span class="meta meta_brace meta_brace_round meta_brace_round_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="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</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="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> Global States
</span>  <span class="storage storage_type storage_type_js">var</span> x <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="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="storage storage_type storage_type_js">var</span> y <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="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> Add a new Global Key Listener for `esc`
</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>addEventListener<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>keypress<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="meta meta_function meta_function_js"><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">e</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><span class="keyword keyword_operator keyword_operator_js">!</span>e<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> e<span class="keyword keyword_operator keyword_operator_js">=</span><span class="support support_class support_class_js">window</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_class support_class_js">event</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
    <span class="storage storage_type storage_type_js">var</span> key <span class="keyword keyword_operator keyword_operator_js">=</span> e<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>keyCode ? e<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>keyCode : e<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>which<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_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> key <span class="keyword keyword_operator keyword_operator_js">==</span> <span class="constant constant_numeric constant_numeric_js">27</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="storage storage_type storage_type_js">var</span> tempx <span class="keyword keyword_operator keyword_operator_js">=</span> x<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
      <span class="storage storage_type storage_type_js">var</span> tempy <span class="keyword keyword_operator keyword_operator_js">=</span> y<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
      x <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">max</span><span class="meta meta_brace meta_brace_round meta_brace_round_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_constant support_constant_dom support_constant_dom_js">documentElement</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>scrollLeft<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_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_constant support_constant_dom support_constant_dom_js">body</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>scrollLeft<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>
      y <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">max</span><span class="meta meta_brace meta_brace_round meta_brace_round_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_constant support_constant_dom support_constant_dom_js">documentElement</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>scrollTop<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_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_constant support_constant_dom support_constant_dom_js">body</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>scrollTop<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">if</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> tempx <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="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> First time it should be null
</span>        <span class="support support_class support_class_js">window</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">scrollTo</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>tempx<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span> tempy<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="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="constant constant_language constant_language_boolean constant_language_boolean_true constant_language_boolean_true_js">true</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="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>On any webpage the first time you push the `esc` key position A gets stored.  The next time you push `esc` position B gets stored and the browser jumps to position A.  The next time you push it, A gets stored and you jump to B.  So you always jump back to wherever you pushed `esc` last.  Hence the name &#8220;back and forth.&#8221;</p>
<p>This is useful to me when I jump between comments and the content.  When I&#8217;m reading a comment and I want to check back to the article, I just just push `esc` to save my position, go back to the article, and when I&#8217;m all set I just jump back to my saved position (the comments) with `esc`.</p>
<p>Short, Sweet, Simple: <a href="http://bogojoker.com/greasemonkey/back_and_forth.user.js">The Back and Forth Greasemonkey Script.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2009/02/back-and-forth-greasemonkey-for-the-whole-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>More Big Picture Keyboard Functionality!</title>
		<link>http://blog.bogojoker.com/2009/02/more-big-picture-keyboard-functionality/</link>
		<comments>http://blog.bogojoker.com/2009/02/more-big-picture-keyboard-functionality/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 00:03:51 +0000</pubDate>
		<dc:creator>Joseph Pecoraro</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[greasemonkey]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[keyboard]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=452</guid>
		<description><![CDATA[I&#8217;ve mentioned before how I&#8217;m a big fan of The Big Picture blog. One of the things that makes it so great is that it has keyboard navigation! You can use &#8216;j&#8217; and &#8216;k&#8217; to automatically jump between pictures. Its so much nicer then scrolling because it jumps to the exact height to maximize the [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve mentioned before how I&#8217;m a big fan of <a href="http://www.boston.com/bigpicture/">The Big Picture</a> blog.  One of the things that makes it so great is that it has keyboard navigation!  You can use &#8216;j&#8217; and &#8216;k&#8217; to automatically jump between pictures.  Its so much nicer then scrolling because it jumps to the exact height to maximize the picture in the browser.  Huge usability improvement!</p>
<p>Like before, the problem I had was that users were mentioning pictures in their comments.  Jumping back to that picture was hard or annoying.  So, I wrote a Greasemonkey script that allows you to <em>type in a number</em> and it will automatically jump to that picture!  <a href="http://bogojoker.com/greasemonkey/big_picture_keyboard_commands.user.js">Click here to get the script!</a></p>
<p>Oh, and if you&#8217;re reading comments and you want to jump back and forth between images and comments that works too.  Once you&#8217;ve jumped to the image, just hit &#8216;esc&#8217; and you will be taken back to where you were before.  Too cool!</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> ==UserScript==
</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> @name          The Big Picture Keyboard Enhancements
</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> @namespace     http://blog.bogojoker.com
</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> @description   Keyboard Shortcut Enhancements
</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> @include       http://www.boston.com/bigpicture/*
</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> @version       1.1 - Added Back+Forth - Thursday February 12, 2009
</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>                1.0 - Initial Version - Monday February 9, 2009
</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>
</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 allows the user to type in numbers, and after about
</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>   a half second it will jump directly to that image.
</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>   For example:
</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>     Push '1'... '2'... User is taken directly to Image "12"
</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>     Push '9'... '9'... User is taken to the last picture.
</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>   Use 'esc' to jump back and forth between two positions.
</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>   For example if a comment mentions picture 4:
</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>     Push '4'...        User is taken directory to Image "4"
</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>     Push 'esc'         User is taken back to the comment!
</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>     Push 'esc'         User is taken back to Image "4"
</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> ==/UserScript==
</span>
<span class="meta meta_brace meta_brace_round meta_brace_round_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="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</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="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> GreaseMonkey (Firefox - unsafeWindow) and GreaseKit (Safari - window)
</span>  <span class="storage storage_type storage_type_js">var</span> w <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_regexp string_regexp_js"> <span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">/</span>a<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_square meta_brace_square_js">[</span><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_square meta_brace_square_js">]</span><span class="keyword keyword_operator keyword_operator_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>a<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> ? unsafeWindow : <span class="support support_class support_class_js">window</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> Global States
</span>  <span class="storage storage_type storage_type_js">var</span> x<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span> y<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="storage storage_type storage_type_js">var</span> keypressnumber  <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="constant constant_language constant_language_boolean constant_language_boolean_false constant_language_boolean_false_js">false</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="storage storage_type storage_type_js">var</span> builtupnumber   <span class="keyword keyword_operator keyword_operator_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><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> quicknumtimeout <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="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="storage storage_type storage_type_js">var</span> imgArr <span class="keyword keyword_operator keyword_operator_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>getElementsByClassName<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>bpImage<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> Keep the old and create a New Global Keypress listener on top of it
</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>addEventListener<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>keypress<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="meta meta_function meta_function_js"><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">e</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="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> Get the key
</span>    <span class="keyword keyword_control keyword_control_js">if</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="keyword keyword_operator keyword_operator_js">!</span>e<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> e<span class="keyword keyword_operator keyword_operator_js">=</span><span class="support support_class support_class_js">window</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_class support_class_js">event</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
    <span class="storage storage_type storage_type_js">var</span> key <span class="keyword keyword_operator keyword_operator_js">=</span> e<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>keyCode ? e<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>keyCode : e<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>which<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> Store the current x/y position
</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"> storePos</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</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>
      x <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">max</span><span class="meta meta_brace meta_brace_round meta_brace_round_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_constant support_constant_dom support_constant_dom_js">documentElement</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>scrollLeft<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_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_constant support_constant_dom support_constant_dom_js">body</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>scrollLeft<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>
      y <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">max</span><span class="meta meta_brace meta_brace_round meta_brace_round_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_constant support_constant_dom support_constant_dom_js">documentElement</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>scrollTop<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_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_constant support_constant_dom support_constant_dom_js">body</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>scrollTop<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="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> # Character =&gt; Jump to that image, Store Position
</span>    <span class="keyword keyword_control keyword_control_js">if</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> key <span class="keyword keyword_operator keyword_operator_js">&gt;=</span> <span class="constant constant_numeric constant_numeric_js">48</span> <span class="keyword keyword_operator keyword_operator_js">&amp;&amp;</span> key <span class="keyword keyword_operator keyword_operator_js">&lt;=</span> <span class="constant constant_numeric constant_numeric_js">57</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">if</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_constant support_constant_dom support_constant_dom_js">target</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_dom support_constant_dom_js">nodeName</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">match</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_regexp string_regexp_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">/</span>TEXTAREA|INPUT<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="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="keyword keyword_control keyword_control_js">return</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
      <span class="support support_function support_function_js">clearTimeout</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>quicknumtimeout<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>
      keypressnumber <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="constant constant_language constant_language_boolean constant_language_boolean_true constant_language_boolean_true_js">true</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
      builtupnumber <span class="keyword keyword_operator keyword_operator_js">+=</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>key <span class="keyword keyword_operator keyword_operator_js">-</span> <span class="constant constant_numeric constant_numeric_js">0x30</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>
      quicknumtimeout <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="support support_function support_function_js">setTimeout</span><span class="meta meta_brace meta_brace_round meta_brace_round_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="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</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>
        w<span class="meta meta_brace meta_brace_square meta_brace_square_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>currImg<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_square meta_brace_square_js">]</span> <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="support support_function support_function_js">parseInt</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>builtupnumber<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">10</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">1</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_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>w<span class="meta meta_brace meta_brace_square meta_brace_square_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>currImg<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_square meta_brace_square_js">]</span> <span class="keyword keyword_operator keyword_operator_js">&gt;=</span> imgArr<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="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span> w<span class="meta meta_brace meta_brace_square meta_brace_square_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>currImg<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_square meta_brace_square_js">]</span> <span class="keyword keyword_operator keyword_operator_js">=</span> imgArr<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">-</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="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span>
        storePos<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="support support_class support_class_js">window</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">scrollTo</span><span class="meta meta_brace meta_brace_round meta_brace_round_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>imgArr<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span> w<span class="meta meta_brace meta_brace_square meta_brace_square_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>currImg<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_square meta_brace_square_js">]</span> <span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>offsetTop<span class="keyword keyword_operator keyword_operator_js">+</span><span class="constant constant_numeric constant_numeric_js">174</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>
        keypressnumber <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="constant constant_language constant_language_boolean constant_language_boolean_false constant_language_boolean_false_js">false</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
        builtupnumber <span class="keyword keyword_operator keyword_operator_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><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>
        quicknumtimeout <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="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_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span> <span class="constant constant_numeric constant_numeric_js">300</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="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> Esc =&gt; Jump back to a Saved Position
</span>    <span class="keyword keyword_control keyword_control_js">if</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> key <span class="keyword keyword_operator keyword_operator_js">==</span> <span class="constant constant_numeric constant_numeric_js">27</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="storage storage_type storage_type_js">var</span> tempx <span class="keyword keyword_operator keyword_operator_js">=</span> x<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> <span class="storage storage_type storage_type_js">var</span> tempy <span class="keyword keyword_operator keyword_operator_js">=</span> y<span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span> storePos<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="support support_class support_class_js">window</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">scrollTo</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>tempx<span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span> tempy<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="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">,</span> <span class="constant constant_language constant_language_boolean constant_language_boolean_true constant_language_boolean_true_js">true</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="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>All I do is register a new global keyboard listener to catch numeric keys and act accordingly.  I tested thoroughly on Firefox and Safari to make sure it works correctly in all cases.  It jumps to the correct image, it maintains the &#8220;current image&#8221; so j/k will still work, it won&#8217;t jump if you&#8217;re typing in a textfield/input, etc.  It even properly handles situations that the current j/k functionality doesn&#8217;t.  For instance mine allows the user to type in the comment box, click outside the box and reuse the keyboard shortcuts.  When you type a j/k or even click inside the search box at the top the j/k functionality is gone.  I didn&#8217;t feel like correcting that in this Greasemonkey script in case it gets fixed by the developers behind the Big Picture. (Note to those developers: reset isLoaded back to true or take a different approach.)</p>
<p>I&#8217;m open to New Ideas.  I have some myself but I have to focus on schoolwork in these next few weeks.  Let me know if you want anything.</p>
<p><a href="http://bogojoker.com/greasemonkey/big_picture_keyboard_commands.user.js">Big Picture Keyboard Commands Greasemonkey Script!</a></p>
<p>Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2009/02/more-big-picture-keyboard-functionality/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Playing With Some More jQuery Plugins</title>
		<link>http://blog.bogojoker.com/2009/01/playing-with-some-more-jquery-plugins/</link>
		<comments>http://blog.bogojoker.com/2009/01/playing-with-some-more-jquery-plugins/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 05:45:16 +0000</pubDate>
		<dc:creator>Joseph Pecoraro</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[facebox]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[pageslider]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=354</guid>
		<description><![CDATA[I decided to play with some more jQuery plugins. I&#8217;m building up some experience, learning a lot, and having a ton of fun doing it. So, what did I decide to do this time? I added a sidebar to ~/bin. When you click on the logo in the top right an instructions panel will slide [...]]]></description>
			<content:encoded><![CDATA[<p>I decided to play with some more jQuery plugins.  I&#8217;m building up some experience, learning a lot, and having a ton of fun doing it.  So, what did I decide to do this time?  I added a sidebar to <a href="http://bogojoker.com/shell/">~/bin</a>.  When you click on the logo in the top right an instructions panel will slide out on the right hand side of the screen.  There is also a little magic going on with the logo.</p>
<p><img src="http://blog.bogojoker.com/wp-content/uploads/2009/01/picture-22.png" alt="sidebar" title="sidebar" width="550" height="427" class="aligncenter size-full wp-image-355" style="border:none; margin: 10px 20px;" /></p>
<p>This sidebar has some neat animation so it was fun to put into the page.  It is a modified version of the <a href="http://halobrite.com/blog/jquery-pageslide/">jQuery pageSlide plugin</a>.  To my pleasant surprise the plugin already had the capability to run callback functions before and after the transition is run.  I added a property allowing for static html so I wouldn&#8217;t need to depend on an Ajax call.  Also, the default behavior of the plugin is that clicking anywhere on the document, except in the sidebar, will cause the page to slide back to normal.  This is okay except that I wanted a button for usability purposes to close the sidebar and also links in the sidebar (normal anchor tags) to work.  That took a little creativity but I eventually got it:</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> Make it so if the user clicks in the pageslide, it won't close
</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> Exception for given closers that may be in the pageslide
</span>      <span class="keyword keyword_operator keyword_operator_js">$</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>#pageslide-slide-wrap<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="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">click</span><span class="meta meta_brace meta_brace_round meta_brace_round_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="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">e</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> <span class="keyword keyword_operator keyword_operator_js">$</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>a, <span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span> <span class="keyword keyword_operator keyword_operator_js">+</span> settings<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>closers<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</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_dom support_constant_dom_js">index</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>e<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">target</span><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="keyword keyword_operator keyword_operator_js">==</span> <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="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
          <span class="keyword keyword_control keyword_control_js">return</span> <span class="constant constant_language constant_language_boolean constant_language_boolean_false constant_language_boolean_false_js">false</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="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>&nbsp;</p>
<h2>Protecting the Innocent</h2>
<p>I also wanted to play around with some jQuery lightboxes.  The one that always comes to mind is <a href="http://famspam.com/facebox">facebox</a>.  For once I didn&#8217;t have to make any major changes to the source of this plugin, instead I made a few small tweaks to the CSS.</p>
<p>My goal here was to provide IE6 users with a simple little &#8220;Please Upgrade Your Browser&#8221; message.  I went to work, learned a lot, and came up with the following: (to view this yourself go to <a href="http://bogojoker.com/shell/">~/bin</a> and paste &#8220;javascript:if_i_were_ie6()&#8221; in your URL bar, without the quotes!):</p>
<p><img src="http://blog.bogojoker.com/wp-content/uploads/2009/01/picture-41.png" alt="facebox browser upgrade warning" title="facebox browser upgrade warning" width="550" height="382" class="aligncenter size-full wp-image-361" style="border:none; margin: 10px 20px" /></p>
<p>Sure that looked great, and it had a nice message, but it ended up looking disgraceful in IE6 itself!  Rather then scrap the work I left it there, to prove the point to whatever few IE6 visitors I get.  The facebox works perfectly in IE8 (I haven&#8217;t tried IE7) and so I can make use of what I&#8217;ve learned elsewhere  I just hope that <a href="http://dearie6.com/tweets/index/">IE6 will go away soon</a>.  I said <a href="http://dearie6.com/tweets/reply/1125386563">my goodbye</a> already.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2009/01/playing-with-some-more-jquery-plugins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding Looping to a Content Slider</title>
		<link>http://blog.bogojoker.com/2009/01/adding-looping-to-a-content-slider/</link>
		<comments>http://blog.bogojoker.com/2009/01/adding-looping-to-a-content-slider/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 07:13:29 +0000</pubDate>
		<dc:creator>Joseph Pecoraro</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[looping]]></category>
		<category><![CDATA[slider]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://blog.bogojoker.com/?p=305</guid>
		<description><![CDATA[A few days ago I came across the wonderfully magnificent easySlider jQuery plugin. It makes sliding content vertically or horizontal drop dead simple using totally natural markup and CSS. I immediately worked it into the design of ~/bin (this animation was in my original design on paper) and it worked flawlessly. However, like the plugin&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>A few days ago I came across the wonderfully magnificent <a href="http://cssglobe.com/post/3783/jquery-plugin-easy-image-or-content-slider">easySlider jQuery plugin</a>.  It makes sliding content vertically or horizontal drop dead simple using totally natural markup and CSS.  I immediately worked it into the design of <a href="http://bogojoker.com/shell/">~/bin</a> (this animation was in my original design on paper) and it worked flawlessly. However, like the plugin&#8217;s title implies, it was and is meant to be simple and therefore lacks some features in order to gain ease of use.</p>
<p>I took some time to become more fluent in jQuery, and add some enhancements by modifying the plugin.  One of those enhancements was looping, and is the topic of this article.  I had no prior experience working with these types of galleries and implementing looping seemed like a fun idea.  So here was the result of my tinkering:</p>
<style type="text/css">
#content #slider1 ul li p {padding:0}
#content #slider1 ul li a {text-indent:0;padding:0;}
</style>
<div id="slider1" class="slider" style="margin: 20px 0 0 0;display: none;">
<ul>
<li style="border:none;">
<p><a href="http://templatica.com/preview/30"><img src="http://bogojoker.com/easySlide/images/01.jpg" alt="Css Template Preview" /></a></p>
</li>
<li>
<p><a href="http://templatica.com/preview/7"><img src="http://bogojoker.com/easySlide/images/02.jpg" alt="Css Template Preview" /></a></p>
</li>
<li>
<p><a href="http://templatica.com/preview/25"><img src="http://bogojoker.com/easySlide/images/03.jpg" alt="Css Template Preview" /></a></p>
</li>
<li>
<p><a href="http://templatica.com/preview/26"><img src="http://bogojoker.com/easySlide/images/04.jpg" alt="Css Template Preview" /></a></p>
</li>
<li>
<p><a href="http://templatica.com/preview/27"><img src="http://bogojoker.com/easySlide/images/05.jpg" alt="Css Template Preview" /></a></p>
</li>
</ul></div>
<p><script type="text/javascript" src="http://bogojoker.com/easySlide/js/jquery.js"></script><script type="text/javascript" src="http://bogojoker.com/easySlide/js/easySlider.js"></script><script type="text/javascript">
$(document).ready(function(){
  $("#slider1").easySlider({
    loop: true,
    autoplayDuration: 2000
  }).show();
});
</script><br />
<style type="text/css">
#slider1 ul, #slider1 ul li {
  margin:0;
  padding:0;
  list-style:none;
}
#slider1, #slider1 ul li { 
  width:591px; /*696px;*/
  height:204px; /*241px;*/
  overflow:hidden;
}
#slider1 img { border: none; padding: 0; width:591px; height: 204px; }
#slider1 a:hover img { border: none; text-decoration: none; }
</style>
<h2>How Do You Implement Looping?</h2>
<p>Give yourself a minute to get creative.  Develop some ideas and strategies on how you would take the following markup for the slides, and make it loop.</p>
<pre class="textmate-source twilight"><span class="text text_html text_html_basic"><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_begin punctuation_definition_tag_begin_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">div</span> <span class="meta meta_attribute-with-value meta_attribute-with-value_id meta_attribute-with-value_id_html"><span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_id entity_other_attribute-name_id_html">id</span><span class="punctuation punctuation_separator punctuation_separator_key-value punctuation_separator_key-value_html">=</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><span class="meta meta_toc-list meta_toc-list_id meta_toc-list_id_html">slider</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_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_begin punctuation_definition_tag_begin_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">ul</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_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_begin punctuation_definition_tag_begin_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">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>content here...<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_begin punctuation_definition_tag_begin_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">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_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_begin punctuation_definition_tag_begin_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">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>content here...<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_begin punctuation_definition_tag_begin_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">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_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_begin punctuation_definition_tag_begin_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">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>content here...<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_begin punctuation_definition_tag_begin_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">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_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_begin punctuation_definition_tag_begin_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">ul</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_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_begin punctuation_definition_tag_begin_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">div</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span></span></pre>
<p>I came up with two strategies that use a similar technique to implement the loops.  The above loop is an implementation of one of these strategies, but I wanted to compare and contrast my two versions here, and hopefully get some reader feedback on different techniques!</p>
<h3>Hidden Moves Strategy</h3>
<p>This strategy actually involves physically moving unseen slides around in the DOM.  By moving the slides in such a way that there is always the proper &#8220;next slide&#8221; and looping can continue forever in either direction without errors.</p>
<p><img src="http://blog.bogojoker.com/wp-content/uploads/2009/01/picture-1.png" alt="Hidden Moves Strategy" title="Hidden Moves Strategy" width="314" height="343" class="aligncenter size-full wp-image-324" style="border:1px solid lightGray;margin: 20px 140px;" /></p>
<h3>Instantaneous Jumps between Clones Strategy</h3>
<p>This strategy actually involves cloning the first slide and adding it to the end of the list.  This now makes the first and last slides exactly the same.  When we need to handling transitions to and from these slides we can instantly jump between them, and the user is none the wiser.</p>
<p><img src="http://blog.bogojoker.com/wp-content/uploads/2009/01/picture-11.png" alt="Instantaneous Jumps Between Clones" title="Instantaneous Jumps Between Clones" width="333" height="329" class="aligncenter size-full wp-image-343" style="border:1px solid lightGray;margin: 20px 140px;"/></p>
<h3>Comparing the Pros and Cons of Each</h3>
<p></p>
<p>Hidden Moves:
<ul>
<li>
<p>Requires no extra space (in theory).</p>
</li>
<li>
<p>Simple to implement moves.  1 line executed as a callback on &#8220;next&#8221; and before the transition if &#8220;prev&#8221;</p>
</li>
<li>
<p>Expensive.  Requires moving slides on every transition.  This is actual DOM manipulation.  Sure in nearly all cases this is negligible but it could be a pain for large, complex slides.</p>
</li>
<li>
<p>Wouldn&#8217;t work on looping a single slide.  Kinda useless though right?</p>
</li>
<li>
<p>Does it work? By taking a slide off of the front won&#8217;t everything shift?  Yes, this could get tricky, I honestly haven&#8217;t tried it.</p>
</li>
</ul>
<p>Instant Jumps:</p>
<ul>
<li>
<p>Requires extra space to duplicate the first slide.</p>
</li>
<li>
<p>Simple to clone a slide.  1 line of jQuery.</p>
</li>
<li>
<p>1 time cost to clone, never again is there a DOM Manipulation cost.</p>
</li>
<li>
<p>Has the ability to loop on a single slide.</p>
</li>
<li>
<p>Tricky code to handle when to jump.  Nothing difficult, just messy.</p>
</li>
<li>
<p>Does it work? Yes, Its what I&#8217;m using above..</p>
</li>
</ul>
<p>Thats it for my analysis.  Do you have any suggestions?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2009/01/adding-looping-to-a-content-slider/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>Stack Overflow &#8211; 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>Joseph Pecoraro</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 the team. [...]]]></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; border: 1px solid lightGray" 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">Script to Add Edit Summary Quicklinks</a></p>
<p><a href="http://bogojoker.com/greasemonkey/so_prevent_blank_edit_summary.user.js">Script to Prevent Blank Edit Summaries</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>
<p><strong>DOUBLE UPDATE:</strong> Sam put out a &#8220;wanted ad&#8221; for a Greasemonkey script to prevent blank edit summaries.  I whipped that script up and linked to it up above.  Thanks Sam!  <a href="http://screencast.com/t/HkGq0bvf">Quick Demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2008/09/stack-overflow-edit-summary-quicklinks/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</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>Joseph Pecoraro</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 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>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="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>
        prop <span class="keyword keyword_operator keyword_operator_js">=</span> arr<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>i<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>
        asub <span class="keyword keyword_operator keyword_operator_js">=</span> a<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>prop<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>
        bsub <span class="keyword keyword_operator keyword_operator_js">=</span> b<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span>prop<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">if</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> asub <span class="keyword keyword_operator keyword_operator_js">&lt;</span> bsub <span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span>
          <span class="keyword keyword_control keyword_control_js">return</span> <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_control keyword_control_js">if</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span> asub <span class="keyword keyword_operator keyword_operator_js">&gt;</span> bsub <span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span>
          <span class="keyword keyword_control keyword_control_js">return</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="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span>
      <span class="keyword keyword_control keyword_control_js">return</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_curly meta_brace_curly_js">}</span> <span class="keyword keyword_control keyword_control_js">else</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="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>
<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span>
</span></pre>
<p>Sample usage would be:</p>
<pre class="textmate-source twilight"><span class="source source_js"><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> name: <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>Joe<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>age: <span class="constant constant_numeric constant_numeric_js">20</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> name: <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>Joe<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>age: <span class="constant constant_numeric constant_numeric_js">10</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> name: <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>Joe<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>age: <span class="constant constant_numeric constant_numeric_js">30</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> name: <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>Joe<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>age: <span class="constant constant_numeric constant_numeric_js">40</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> name: <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>Joe<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>age: <span class="constant constant_numeric constant_numeric_js">20</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> name: <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>Joe<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>age: <span class="constant constant_numeric constant_numeric_js">15</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> name: <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>Joe<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>age: <span class="constant constant_numeric constant_numeric_js">35</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> name: <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>Joe<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>age: <span class="constant constant_numeric constant_numeric_js">25</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> name: <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>Bill<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>age: <span class="constant constant_numeric constant_numeric_js">5</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> name: <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>Barry<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>age: <span class="constant constant_numeric constant_numeric_js">20</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> name: <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>Paul<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>age: <span class="constant constant_numeric constant_numeric_js">20</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> name: <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>Peter<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>age: <span class="constant constant_numeric constant_numeric_js">1</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> name: <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>Smith<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>age: <span class="constant constant_numeric constant_numeric_js">25</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> name: <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>Kary<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>age: <span class="constant constant_numeric constant_numeric_js">30</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>

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> buildCompareFunction<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="meta meta_brace meta_brace_square meta_brace_square_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>name<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_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>age<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_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></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.bogojoker.com/2008/06/javascript-sort-an-array-of-objects/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

