<?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>Web 3.0, 6 Bladed Razors, 7 Minute Abs &#187; Interface Design</title>
	<atom:link href="http://www.zachleat.com/web/category/interface/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zachleat.com/web</link>
	<description></description>
	<lastBuildDate>Fri, 09 Dec 2011 21:53:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>A Race Against Time Pickers</title>
		<link>http://www.zachleat.com/web/a-race-against-time-pickers/</link>
		<comments>http://www.zachleat.com/web/a-race-against-time-pickers/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 23:57:25 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Time]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=633</guid>
		<description><![CDATA[The Date Picker component is one of the most popular user interface components on the web today. Its operation is very simple: focus into a field (sometimes a click on a dedicated calendar button is required) intended to contain a specific date and an on-screen calendar will be shown next to the form field, allowing [...]]]></description>
			<content:encoded><![CDATA[<p>The Date Picker component is one of the most popular user interface components on the web today.  Its operation is very simple: focus into a field (sometimes a click on a dedicated calendar button is required) intended to contain a specific date and an on-screen calendar will be shown next to the form field, allowing the user to click on a specific date to populate the form field.</p>
<p><a href="http://www.zachleat.com/web/wp-content/uploads/2010/06/Screen-shot-2010-06-01-at-8.57.37-PM.png"><img src="http://www.zachleat.com/web/wp-content/uploads/2010/06/Screen-shot-2010-06-01-at-8.57.37-PM.png" alt="" title="Date Picker Component" width="314" height="235" class="alignnone size-full wp-image-640" /></a></p>
<p>Date Pickers are helpful components that are useful for a couple of reasons:</p>
<ol>
<li>They allow you to easily <strong>map an existing real-world mental model</strong> (the Calendar) to form input (a text field). This provides <strong>additional context</strong> beyond what the simple string value of a date represents: days of the week, Calendar month labels, leap year information.</li>
<li>They allow for more usable and actionable data restrictions and error feedback.  Want the user to select a weekday?  Just show them on the calendar which days are available.</li>
<li>Visual cue as to what the form field&#8217;s data format should be.  If a calendar icon is next to the form field, it becomes very obvious what kind of data the user should put into the field.</li>
</ol>
<p>Now, the last two reasons are all well and good, but carry no intrinsic incentive for the user to actually click on and use the Date Picker component.  <strong>The first reason is what actually motivates a user</strong> to bring up the Date Picker and select a date on it.</p>
<p>Now, consider the following Time Picker component, popularized by <a href="http://ejohn.org/blog/picking-time/">a John Resig blog post</a>:<br />
<a href="http://haineault.com/media/jquery/ui-timepickr/page/"><img src="http://www.zachleat.com/web/wp-content/uploads/2010/06/Screen-shot-2010-06-06-at-3.28.22-PM.png" alt="" title="Time Picker Example #2" width="462" height="128" class="alignnone size-full wp-image-642" /></a></p>
<p>Comparing to the Date Picker component above, one could easily make the argument that it offers little to <strong>no incentive over simple keyboard input</strong>.  It offers no additional context, extra data, or an existing physical mental model for the user to associate with.  The only advantage it might offer is an easy calculator for those unfamiliar with 24-hour (military) time.  I would argue that placing the AM/PM selection at the beginning of the selection creates a reversal of the closest established mental model a person typically uses to represent a time: the digital clock (hours, minutes, seconds, and AM/PM at the end).</p>
<div style="font-style:italic; font-size: 86%; width: 400px; margin: auto;">
Here&#8217;s a sampling of some other time picker implementations:</p>
<p><a href="http://pttimeselect.sourceforge.net/example/index.html"><img src="http://www.zachleat.com/web/wp-content/uploads/2010/06/pttimeselect.png" alt="" title="Another Time Picker" width="271" height="239" class="alignnone size-full wp-image-670" /></a><br />
This implementation is very similar to the first example, just organized differently.  We can do better.</p>
<p><a href="http://www.pit-r.de/timepicker/demo/pickerDemo.htm"><img src="http://www.zachleat.com/web/wp-content/uploads/2010/06/picker.png" alt="" title="Yet Another Time Picker, Two Analog Clocks, one for hours and one for minutes" width="294" height="203" class="alignleft size-full wp-image-674" /></a></p>
<div style="clear: both"></div>
<p>Reading an analog clock isn&#8217;t the problem.  When we think of time, we start with numeric representations of the hours and minutes.  The first thing that pops into the average person&#8217;s head when they hear &#8220;6:00 PM&#8221; probably isn&#8217;t: the little hand on the 6 and the big hand on the 12.  The analog clock representation is <strong>a mental hurdle</strong>.</p>
<p><a href="http://www.zachleat.com/web/wp-content/uploads/2010/06/timedatepicker.png"><img src="http://www.zachleat.com/web/wp-content/uploads/2010/06/timedatepicker.png" alt="" title="A simple time picker" width="108" height="230" class="alignnone size-full wp-image-679" /></a><br />
Now we&#8217;re getting closer.  The user selects a full representation of the time, not just the last piece of the puzzle.  I like the intuitive and simple organization of this time picker.  You know immediately what you&#8217;re selecting.  I think we can organize the times a little bit better though, give them a visual hierarchy.</p>
<p><a href="http://www.jnathanson.com/index.cfm?page=jquery/clockpick/ClockPick#demog"><img src="http://www.zachleat.com/web/wp-content/uploads/2010/06/clockpick.png" alt="" title="Yet Another Time Picker" width="146" height="123" class="alignnone size-full wp-image-672" /></a><br />
This picker represents more of the spirit of what we&#8217;re looking for.  It shows a simple list of the hourly options and progressively discloses the minute selections.  I think switching to a single column layout would be more intuitive for keyboard navigation (combining the above two implementations into one super-component) and would do well with larger click targets.
</div>
<p>These implementation examples speak to a larger trend of front end engineers that concentrate too much on code optimization and cross browser compatibility, and <strong>not enough on usability and user driven design</strong>.  It&#8217;s an easy trap to fall prey to, but one we must be wary of.  A Time Picker might offer benefit in terms of data restriction (e.g.: select an hour in the range of a normal workday), but it does very little for the efficiency and usability of data entry.  So, before you start putting Time Pickers on all of your forms, make sure the Time Picker you add represents something like this:</p>
<p><img src="http://www.zachleat.com/web/wp-content/uploads/2010/06/ISPKA4134_large.jpg" alt="" title="Digital Clock" width="320" height="320" class="alignnone size-full wp-image-691" /></p>
<p>and not this:</p>
<p><img src="http://www.zachleat.com/web/wp-content/uploads/2010/06/Screen-shot-2010-06-06-at-4.04.50-PM.png" alt="" title="Onscreen Keyboard" width="489" height="176" class="alignnone size-full wp-image-646" /></p>
<ol style="font-size:70%; font-style:italic;">
Image Sources:</p>
<li><a href="http://www.tesora.com.au/Digibell_Retro_Alarm_Clock_.htm">tesora.com.au</a></li>
<li><a href="http://www.codeproject.com/">codeproject.com</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/a-race-against-time-pickers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>If the Menu Fitts, We Must Acquit</title>
		<link>http://www.zachleat.com/web/if-the-menu-fitts-we-must-acquit/</link>
		<comments>http://www.zachleat.com/web/if-the-menu-fitts-we-must-acquit/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 05:52:14 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Fitts's Law]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[Google Reader]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=542</guid>
		<description><![CDATA[One of the first things you&#8217;ll learn when diving into a self-taught course on usability is the hugely popular Fitts&#8217;s Law. In a nutshell, Fitts&#8217;s Law tries to predict the time needed to move to a &#8220;target area&#8221; (usually a link, menu, button, or form element) as a function of the distance to the element [...]]]></description>
			<content:encoded><![CDATA[<p>One of the first things you&#8217;ll learn when diving into a self-taught course on usability is the hugely popular Fitts&#8217;s Law.  In a nutshell, Fitts&#8217;s Law tries to predict the time needed to move to a &#8220;target area&#8221; (usually a link, menu, button, or form element) as a function of the distance to the element and its size.  <strong>The bigger/closer the element, the faster a user can move to it.</strong></p>
<p>Now, upon discovering myself a newly minted Mac OS convert from the hugely popular World of Windows, I quickly discovered that the application menus (File, Edit, etc) were one of the glaring differences I&#8217;d have to adjust to.  Mac OS had all menus separated from the application window, all the way at the top of the screen.  Coming from the Windows environment, this seemed unintuitive.  But after reading more about Fitts&#8217;s Law, I discovered the reasoning: the <a href="http://www.codinghorror.com/blog/2006/08/fitts-law-and-infinite-width.html">edges of the screen are treated as an infinite height or width</a>!  Which is just a way of modifying the Fitts&#8217;s Law to say: <strong>the easiest things to click on are at the edges of the screen.</strong>  That&#8217;s why the close icon or the Start Menu is so easy to access on Windows, and <a href="http://www.asktog.com/basics/firstPrinciples.html#fittsLaw">why the Application Menu is at the top of the screen in Mac OS</a>.</p>
<p>We know about Fitts&#8217;s Law, but <strong>why aren&#8217;t we applying it to our web applications?</strong>  Why aren&#8217;t we using the power of infinite height/width to help out on our designs?  It seems like this crucial usability law has been overlooked on the web, and without good reason. Let&#8217;s look at a few applications that get it wrong (of course, in my humble opinion).</p>
<p><img src="http://www.zachleat.com/web/wp-content/uploads/2010/02/Screen-shot-2010-02-15-at-11.08.15-PM.png" alt="Wordpress Admin Menu" title="Screen shot 2010-02-15 at 11.08.15 PM" width="174" height="307" class="alignleft size-full wp-image-550"/><img src="http://www.zachleat.com/web/wp-content/uploads/2010/02/Screen-shot-2010-02-15-at-11.12.57-PM.png" alt="Google Mail Menu" title="Screen shot 2010-02-15 at 11.12.57 PM" width="176" height="251" class="alignleft size-full wp-image-552"/><img src="http://www.zachleat.com/web/wp-content/uploads/2010/02/Screen-shot-2010-02-15-at-11.09.16-PM.png" alt="Google Reader Menu" title="Screen shot 2010-02-15 at 11.09.16 PM" width="192" height="367" class="alignleft size-full wp-image-551" /></p>
<div style="clear: left"></div>
<p>All of these screenshots were taken from 100% width designs, with no real reason not to incorporate the ideas behind Fitts&#8217;s Law into the menuing system.  At first glance when I brought up Google Reader, I was excited.  The hover behavior appeared when the mouse cursor was positioned at the very far left of the screen, but was disappointed to discover that the although the hover background color had changed, the entire hover target was not clickable.</p>
<p>Naturally, I decided to make a test of my own, to test which web browsers allowed <em>Fitts&#8217;s Law Menus</em>.  The test case encompassed both left and bottom aligned menus, for completeness.  A top menu was excluded, given that the top of the screen is reserved for browser chrome or application menuing.  A right menu was also excluded as the right portion of the screen is reserved for the page scrollbar (which is the easiest scrollbar to manipulate with your mouse, per the same rules).</p>
<p>Also, on the Mac OS 10.6 and Windows XP operating systems, a <em>Fitts&#8217;s Law Menu</em> at the bottom of the screen is not possible, given that the Dock and Taskbar in these operating systems occupy at least a 4 pixel trough of the bottom-most space on the monitor, even as a hover target in &#8220;auto-hide&#8221; mode.  <strong>Everyone is fighting over these crucial and very useful edge pixels.</strong></p>
<p>To test whether or not this behavior is working correctly, <strong>maximize your browser window</strong> and <strong>move the cursor as far left on the screen as possible</strong>, but still over the menu.  If the links are still clickable, congratulations, your browser works!</p>
<h2><a href="/test/fittmenu/">View the Demo / Test Page for the Fitts&#8217;s Law Menu</a></h2>
<h2>Compatibility Table</h2>
<style type="text/css"> 
#compatibility td { font-family: Verdana; }
#compatibility td.yes { background-color: #00882D; color: #fff; }
#compatibility td.no { background-color: #CB000F; color: #fff; }
#compatibility td.emulate { background-color: #40A662; color: #fff; }</p>
</style>
<table id="compatibility">
<thead>
<tr>
<th>Browser</th>
<th>Operating System</th>
<th>Left Menu</th>
<th>Bottom Menu</th>
<th>Status Bar</th>
<th>Detail</th>
</tr>
</thead>
<tbody>
<tr>
<td>Internet Explorer 8</td>
<td>Windows XP</td>
<td class="no">no</td>
<td class="no">no</td>
<td>yes</td>
<td>IE8 has a small 3 pixel border on the left and right of each window.</td>
</tr>
<tr>
<td>Internet Explorer 7</td>
<td>Windows XP</td>
<td class="no">no</td>
<td class="no">no</td>
<td>yes</td>
<td>IE7 has a small 3 pixel border on the left and right of each window.</td>
</tr>
<tr>
<td>Internet Explorer 6</td>
<td>Windows XP</td>
<td class="no">no</td>
<td class="no">no</td>
<td>yes</td>
<td>IE6 has a small 3 pixel border on the left and right of each window.</td>
</tr>
<tr>
<td>Google Chrome</td>
<td>Windows XP and Mac OS 10.6</td>
<td class="yes">yes</td>
<td class="no">no</td>
<td>no</td>
<td></td>
</tr>
<tr>
<td>Mozilla Firefox 3.5 and 3.6</td>
<td>Windows XP and Mac OS 10.6</td>
<td class="yes">yes</td>
<td class="no">no</td>
<td>yes</td>
<td></td>
</tr>
<tr>
<td>Safari 4.0.4</td>
<td>Windows XP and Mac OS 10.6</td>
<td class="yes">yes</td>
<td class="no">no</td>
<td>no</td>
<td></td>
</tr>
</tbody>
</table>
<p><em>The full screen mode of each individual browser was considered outside the scope of this study.</em></p>
<h2>Conclusion</h2>
<p>We should stand on the shoulders of giants and reuse the usability studies already completed on software that has gone before us.  The left side of the browser window is the best place to utilize Fitts&#8217;s Law, and we should move our left-aligned menus on fluid width designs to occupy the space flush with the window&#8217;s edge to increase the speed at which those menus will be accessible by users.  Having an infinite width menu is a big click target to hit.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/if-the-menu-fitts-we-must-acquit/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Trash that &#8220;Back to Top&#8221; Link</title>
		<link>http://www.zachleat.com/web/trash-that-back-to-top-link/</link>
		<comments>http://www.zachleat.com/web/trash-that-back-to-top-link/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 01:30:30 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Page Fold]]></category>
		<category><![CDATA[Scrolling]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=376</guid>
		<description><![CDATA[It would seem that perfection is attained not when no more can be added, but when no more can be removed. - Antoine de Saint Exupéry While most would argue that the principles espoused in the above quote might also be applied to the quote itself, it would serve us better to consider how we [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>It would seem that perfection is attained not when no more can be added, but when no more can be removed.</p>
<div style="text-align: right;">- Antoine de Saint Exupéry</div>
</blockquote>
<p><br/><br />
While most would argue that the principles espoused in the above quote might also be applied to the quote itself, it would serve us better to consider how we can <strong>attempt perfection in our User Interface designs</strong> instead.</p>
<p>The most complete litany of reasons why you should spend your page weight on more useful bytes has been <a href="http://www.cs.tut.fi/~jkorpela/www/totop.html">compiled by Jukka Korpela</a>, although he seems to both confirm that they are harmful and still use them on his site.</p>
<p>The rules of engagement I find useful when dealing with the ill-fated &#8220;Back to Top&#8221; or its ugly stepsister &#8220;Top of Page&#8221; link are as follows:</p>
<ol>
<li><strong>Delete the link.</strong></li>
</ol>
<p>Really, you don&#8217;t need the link. It&#8217;s a <strong>sacred cow remnant</strong> of a time when people believed that all content needed to be positioned <a href="http://iampaddy.com/lifebelow600/">above the page fold</a>.</p>
<p>Guess what?  <strong>People know how to scroll!</strong>  They know how to scroll down, they know how to scroll up.  Considering this prerequisite has been met, it becomes very apparent that the &#8220;Back to Top&#8221; link shares an <strong>unnecessary overlap in functionality with the scrollbar</strong> and is thus, unnecessary itself.</p>
<p>If you have an incredibly long page with a full set of &#8220;Table of Contents&#8221; links, it would be better to position your <a href="http://jqueryfordesigners.com/fixed-floating-elements/">table of contents fixed to the viewport</a>, so as to make it always available to the user.  If the Table of Contents is always available, the user will never have to click a link as a shortcut to find it.</p>
<p>While not a usability epidemic, the &#8220;Back to Top&#8221; link is still widely used.  <a href="http://www.instantshift.com/2009/07/14/90-creative-back-to-top-links-and-best-practices/">Instant Shift</a> and <a href="http://www.smashingmagazine.com/2008/11/27/short-story-about-top-links/">Smashing Magazine</a> both have articles with hundreds of examples of sites with these links.</p>
<p>Don&#8217;t agree? If you&#8217;re stubborn as hell and hate simplicity, you&#8217;re going to keep the link on your page no matter what reasons are presented.  In that case, at the very least follow these two guidelines:</p>
<ol>
<li>Use <strong>progressive enhancement</strong>:

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;back-to-top&quot;</span>&gt;</span>Back to Top<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// jQuery Prerequisite</span>
$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#back-to-top'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    window.<span style="color: #660066;">scrollTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// don't change the hash if not needed</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

</li>
<li><strong>Hide the link</strong> if the page doesn&#8217;t have a scrollbar.  If no scrollbar exists, the user will <strong>always be &#8220;at the top.&#8221;</strong>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// Continuing with Previous Example</span>
$<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#back-to-top'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// If the page scrolls, we know there is a scrollbar.</span>
$<span style="color: #009900;">&#40;</span>window<span style="color: #009900;">&#41;</span>.<span style="color: #000066;">scroll</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#back-to-top'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// For completeness, you may also want to</span>
<span style="color: #006600; font-style: italic;">//   add logic to the &quot;resize&quot; event.</span></pre></div></div>

</li>
</ol>
<p>Really though, <strong>just delete the link.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/trash-that-back-to-top-link/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Double Whammy: OpenID and Microformats</title>
		<link>http://www.zachleat.com/web/double-whammy-openid-and-microformats/</link>
		<comments>http://www.zachleat.com/web/double-whammy-openid-and-microformats/#comments</comments>
		<pubDate>Fri, 23 May 2008 06:13:01 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Application Design]]></category>
		<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Flickr]]></category>
		<category><![CDATA[hCard]]></category>
		<category><![CDATA[microformat]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[Technorati]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=141</guid>
		<description><![CDATA[<a href="http://www.ownyouridentity.com/2008/04/30/get-satisfactions-nice-import-profile-feature/">Own your Identity had a great post today</a> detailing a great feature on the signup form of the <a href="http://getsatisfaction.com/people/new">Get Satisfaction</a> site.

They rely on the fact that sites like Twitter and Flickr publish an <a href="http://microformats.org/wiki/hcard">hCard microformat</a> for all of their users publicly on their website.]]></description>
			<content:encoded><![CDATA[<h3>Microformategery</h3>
<p><a href="http://www.ownyouridentity.com/2008/04/30/get-satisfactions-nice-import-profile-feature/">Own your Identity had a great post today</a> detailing a great feature on the signup form of the <a href="http://getsatisfaction.com/people/new">Get Satisfaction</a> site.</p>
<p>They rely on the fact that sites like Twitter and Flickr publish an <a href="http://microformats.org/wiki/hcard">hCard microformat</a> for all of their users publicly on their website.  If you go to <a href="http://twitter.com/zachleat/">my twitter page</a> and view the source, you&#8217;ll find the following code available to anyone (without authentication):</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;address&gt;
   &lt;ul class=&quot;about vcard entry-author&quot;&gt;
      &lt;li&gt;&lt;span class=&quot;label&quot;&gt;Name&lt;/span&gt; &lt;span class=&quot;fn&quot;&gt;Zach Leatherman&lt;/span&gt;&lt;/li&gt;
      &lt;li&gt;&lt;span class=&quot;label&quot;&gt;Location&lt;/span&gt; &lt;span class=&quot;adr&quot;&gt;Omaha, NE USA&lt;/span&gt;&lt;/li&gt;
      &lt;li&gt;&lt;span class=&quot;label&quot;&gt;Web&lt;/span&gt; &lt;a href=&quot;http://www.zachleat.com/&quot; class=&quot;url&quot; rel=&quot;me&quot;&gt;http://www.zachle...&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;bio&quot;&gt;&lt;span class=&quot;label&quot;&gt;Bio&lt;/span&gt; &lt;span class=&quot;bio&quot;&gt;UI Programmer, JavaScript Enthusiast, Soccer Hooligan&lt;/span&gt;&lt;/li&gt;
   &lt;/ul&gt;
&lt;/address&gt;</pre></div></div>

<p>The premise here is that hCard tells you how to parse this markup to get usable information.  The <code>adr</code> CSS class tells you what my address is.  The <code>fn</code> CSS class tells you what my name is, and so on.  So, Get Satisfaction goes and spiders this page behind the scenes and autopopulates your profile with what it can find.  Pretty sweet.</p>
<p>Now, they don&#8217;t limit you to the services they provide, which are: Flickr, Technorati, Twitter, Upcoming, and last.fm.  They provide an Other category for any hCard enabled URL (your personal homepage or perhaps an <a href="http://microformats.org/wiki/hresume">hResume</a> you have posted on the web).</p>
<h3>Integrate with OpenID</h3>
<p>However, why not take it to the next level?  Why not integrate this microformat functionality WITH an openid login system?  You&#8217;d be able to kill two birds (not a twitter joke) with one stone in some cases, since both Twitter and Technorati are also OpenID producers (re-echo: We need more consumers).</p>
<p>So, not only do you get the benefits of having OpenID authentication on your website, but you&#8217;d be able to prepopulate a certain amount of profile data with an hCard parser.  And the best part is, if you already have a <a href="http://remysharp.com/2008/04/24/stop-using-openid-why-how/">nice clean user interface</a> set up to handle different OpenID producers, there wouldn&#8217;t be any additional clutter on the interface to get this benefit.  It&#8217;d be transparent to the user when it works, and fall back to a normal empty profile form when it doesn&#8217;t.</p>
<p>What I&#8217;d like to see, is more sites that are OpenID producers, also serve hCard microformats as well.  If we can get all the major producers on board, we&#8217;d have a nice tidy little system going.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/double-whammy-openid-and-microformats/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t Let the Door Hit You Onunload and Onbeforeunload</title>
		<link>http://www.zachleat.com/web/dont-let-the-door-hit-you-onunload-and-onbeforeunload/</link>
		<comments>http://www.zachleat.com/web/dont-let-the-door-hit-you-onunload-and-onbeforeunload/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 04:51:08 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web Browsers]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[Opera]]></category>
		<category><![CDATA[Undo]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=126</guid>
		<description><![CDATA[Many people attempt a last ditch effort to save page state in the browser by using the onunload or onbeforeunload events. This has been studied at great length by Patrick Hunlock, who uses the perhaps now common knowledge of using a Synchronous Ajax call to perform the page state save. Another use for the onbeforeunload [...]]]></description>
			<content:encoded><![CDATA[<p>Many people attempt a last ditch effort to save page state in the browser by using the onunload or onbeforeunload events.  This has been studied at great length by <a href="http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript">Patrick Hunlock</a>,  who uses the perhaps now common knowledge of using a Synchronous Ajax call to perform the page state save.</p>
<p>Another use for the onbeforeunload event to allow the user to cancel the action that initiated the user leaving in the first place.  Gmail uses this technique when the user is in the middle of writing a draft of an e-mail and attempts to leave the page.</p>
<p><a href='http://www.zachleat.com/web/wp-content/uploads/2008/04/gmail-confirm.png'><img src="http://www.zachleat.com/web/wp-content/uploads/2008/04/gmail-confirm.png" alt="" title="gmail-confirm" width="455" height="157" class="aligncenter size-full wp-image-129" /></a><br />
<em>Gmail&#8217;s pops up this prompt when the user attempts to leave the page while drafting an email.</em></p>
<p>Worthy to note, however, is that Opera <a href="http://www.quirksmode.org/bugreports/archives/2004/11/load_and_unload.html">doesn&#8217;t fire the unload event</a> when the browser refreshes the page, or uses the back/forward buttons to browse off of the page (I had no success with the fix posted in the comments on that page).  What&#8217;s worse, Opera never fires the onbeforeunload event.  This creates a serious problem with attempting to save page state prior to a user leaving your page.</p>
<p>Browser support aside, I believe that the onbeforeunload prompt is not an ideal way to protect the user from lost work (or unsaved page state).  Humanized has argued, and I agree, that <a href="http://www.alistapart.com/articles/neveruseawarning">an undo operation is much easier on the end user than a warning message</a>.  The strange thing is, Gmail could save the draft in a synchronous Ajax request in the onunload event.  They aren&#8217;t using the prompt to save Opera users from losing their drafts, since the Opera web browser doesn&#8217;t even fire the onbeforeunload event.  (Interestingly enough, they are using some sort of browser history management to fire a warning to the user when they press back, or forward, in Opera &#8212; but Reload can&#8217;t be caught using this method, so your could draft email be lost).</p>
<p>From a User Interface design standpoint, I would recommend just sticking with onunload.  You can still perform your synchronous Ajax call in the method to save the state of your page, so that the user can later resume their state or undo the operation. (Except for Back/Forward/Refresh in Opera, until they support a better onunload or any onbeforeunload).  The onbeforeunload prompt is an unnecessary evil, and doesn&#8217;t do much besides annoy the end user with another warning message and a mouse click.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/dont-let-the-door-hit-you-onunload-and-onbeforeunload/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Rethinking JavaScript Grids and DataTables</title>
		<link>http://www.zachleat.com/web/rethinking-javascript-grids-and-datatables/</link>
		<comments>http://www.zachleat.com/web/rethinking-javascript-grids-and-datatables/#comments</comments>
		<pubDate>Sun, 13 Apr 2008 20:29:26 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Conservative Design]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=122</guid>
		<description><![CDATA[In the world of front end engineering, one must consider the end-user of the interface first, and above all other things. The priorities should not start with development ease, nor external library preference. The priorities should start with the needs of the consumer of your end product. Evolution of your engineering skill is also a [...]]]></description>
			<content:encoded><![CDATA[<p>In the world of front end engineering, one must consider the end-user of the interface first, and above all other things.  The priorities should not start with development ease, nor external library preference.  The priorities should start with the needs of the consumer of your end product.</p>
<p>Evolution of your engineering skill is also a vital trait in this world, which means that as a developer increases his knowledge of good practices and proper methods, sometimes he must shirk his previous assertions about the world as he previously knew it.  And today I&#8217;m shirking a staple of the front end as all web users know it: The Grid (DataTable) Component.</p>
<p>Of course, I&#8217;ve written a few articles in the past about the <a href="http://developer.yahoo.com/yui/datatable/">YUI DataTable</a>, during my long love affair with Yahoo&#8217;s User Interface library.  Another popular one is jQuery&#8217;s <a href="http://tablesorter.com/docs/">TableSorter</a>.  Then there&#8217;s the <a href="http://dojotoolkit.org/book/dojo-book-0-9/docx-documentation-under-development/grid">Dojo Grid</a>, a component <a href="http://www.sitepen.com/blog/2007/09/16/the-dojo-grid/">inherited from TurboAjax</a>.  ExtJS has a variety of nice examples as well for their <a href="http://extjs.com/deploy/dev/examples/#sample-1">Ext 2.0 Grid</a>.</p>
<p>And after using these Grids and DataTables, I certainly respect the programming that went into developing these components.  But let&#8217;s take a step back for a second.  Why do the users need the bells and whistles in these components?  Are they worth the extra load time and complexity they add to the interface?</p>
<p>All we&#8217;re doing here is putting a nice coat of paint on a &lt;table&gt; tag.  Sure, it might have some nice ancillary features like Ajax Data Loading, but those don&#8217;t really matter &#8211; they are things that can be easily performed with some good Ajax and DOM insert utility functions.  In fact, most of the core features included in these components could be described as feature creep, and not beneficial to the end user at all.  Feature creep contributes to code bloat, which means the user is downloading bytes to their web browser that they don&#8217;t need, which can hamper performance.  Libraries usually have online examples of their components, and the include sizes are seen below.  (Gzip compression not considered)</p>
<table>
<thead>
<tr>
<th>Name</th>
<th>JavaScript Size</th>
<th>Minimized</th>
<th>Link</th>
</tr>
</thead>
<tbody>
<tr>
<td>YUI DataTable</td>
<td>216.6 KB</td>
<td>Minimized</td>
<td><a href="http://developer.yahoo.com/yui/examples/datatable/dt_basic_clean.html">Example</a></td>
</tr>
<tr>
<td>Dojo Grid</td>
<td>338.4 KB</td>
<td>Unminimized</td>
<td><a href="http://dojotoolkit.org/book/dojo-book-0-9/docx-documentation-under-development/grid/simple-grid">Example</a></td>
</tr>
<tr>
<td>Ext Grid</td>
<td>545.5 KB</td>
<td>Minimized</td>
<td><a href="http://extjs.com/deploy/dev/examples/grid/array-grid.html">Example</a></td>
</tr>
<tr>
<td>jQuery TableSorter</td>
<td>66 KB</td>
<td>Minimized</td>
<td><a href="http://www.tablesorter.com/">Example</a></td>
</tr>
</tbody>
</table>
<p>The JavaScript include sizes listed above are directly proportional to the feature set that the components provide, and should give you an idea of the overhead involved with using them.  Do we need 545.5 KB of features coming down the pipe to give our users an extra bell, or an extra whistle?  Let&#8217;s analyze the features to rationalize their usage, and remove items from the feature set.</p>
<ul>
<li>Sorting</li>
<li>Modifying column order and display</li>
<li>Resizing columns</li>
<li>Editing of row data directly on the grid itself</li>
<li>Scrolling</li>
<li>Pagination</li>
</ul>
<p><strong>Sorting</strong></p>
<p>Data should be used in the context of its usefulness.  You have a list of messages in your e-mail inbox.  What&#8217;s the most useful context for this list?  In order of date received.  The default sort order provided by the application, to facilitate proper use of the application.  Is comparing the rows in the grid by any other method as useful?  Does the user need to see the list of messages ordered alphabetically by subject?  In these cases where the user is in need of a specific message, <em>searching and filtering</em> is more useful than sorting.  The default sort is useful, but allowing the user to resort on the client, in most cases, is not as useful as other methods of finding a row.</p>
<p><strong>Modifying column order and display</strong></p>
<p>The same argument can be made for any of the other methods of customization provided to the end user.  Does the user need to reorder or hide columns?  The context provided by the application should be sufficient to use the applications data in the way it was intended.  Don&#8217;t overcomplicate your user interface with needless features or a deluge of useless data.  Provide succinct, appropriate data, and the user needn&#8217;t reorder or change the interface.</p>
<p><strong>Resizing columns</strong></p>
<p>The default HTML &lt;table&gt; tag expands to fit the data inside of its cells.  Even when you set the width of the table explicitly, the cells adjust themselves accordingly to fit the data.  This should be the behavior of your table.  You needn&#8217;t monkey around with widths, the browser is smart enough to do it for you.  You can even customize a cell to wrap its text to multiple lines with CSS, if need be.</p>
<p><strong>Editing of row data directly on the grid itself</strong></p>
<p>If you&#8217;re providing an Excel spreadsheet interface for the end user to customize your data, you haven&#8217;t designed your interface correctly.  Rethink how the user needs to interact with the data you&#8217;ve provided, and give them a better, simpler way to edit the data.</p>
<p><strong>Scrolling</strong></p>
<p>Everyone knows that internal scrollbars on a page are evil.  I don&#8217;t even like scrollbars on textareas, to be honest.  Previously, I had worked and reworked the YUI DataTable to handle horizontal scrolling.  Looking back on this, it was a mistake.  There are better ways to handle lots of data in a table, without the heavy mouse interaction and scanning that scrolling require.  Which brings me to my next point.</p>
<p><strong>Pagination</strong></p>
<p>This is the one exception to the feature set cutting board.  This is the one feature that&#8217;s is a requirement, when the data set has too many records to fit on a single page.</p>
<p>Keep these in mind, and look at the feature set provided by a few sites using tabular data centric interfaces that know a thing or two about interface design:</p>

<a href='http://www.zachleat.com/web/rethinking-javascript-grids-and-datatables/gmail/' title='Google Mail'><img width="150" height="150" src="http://www.zachleat.com/web/wp-content/uploads/2008/04/gmail-150x150.png" class="attachment-thumbnail" alt="Google Mail" title="Google Mail" /></a>
<a href='http://www.zachleat.com/web/rethinking-javascript-grids-and-datatables/wordpress-admin/' title='Wordpress 2.5 Admin Interface'><img width="150" height="150" src="http://www.zachleat.com/web/wp-content/uploads/2008/04/wordpress-admin-150x150.png" class="attachment-thumbnail" alt="Wordpress 2.5 Admin Interface" title="Wordpress 2.5 Admin Interface" /></a>
<a href='http://www.zachleat.com/web/rethinking-javascript-grids-and-datatables/google-reader/' title='Google Reader List View'><img width="150" height="150" src="http://www.zachleat.com/web/wp-content/uploads/2008/04/google-reader-150x150.png" class="attachment-thumbnail" alt="Google Reader List View" title="Google Reader List View" /></a>

<p><strong>So, what should we include?</strong></p>
<p>A simple CSS class to style your table is sufficient, with links to paginate the table (properly) and/or a hover for row selection if needed.  You&#8217;re looking at 10-20 lines of jQuery code, maximum, and a few CSS declarations.  In lieu of sorting, of course, you&#8217;ll need to program in a mechanism for searching and filtering as well.  But really, the difficulty with programming this component is knowing what to leave out.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/rethinking-javascript-grids-and-datatables/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ALARMd 2 Beta, with Google Calendar Integration</title>
		<link>http://www.zachleat.com/web/alarmd-2-beta-with-google-calendar-integration/</link>
		<comments>http://www.zachleat.com/web/alarmd-2-beta-with-google-calendar-integration/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 07:31:59 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Alarmd]]></category>
		<category><![CDATA[Google Calendar]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Youtube]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/?p=111</guid>
		<description><![CDATA[Take a look: ALARMd 2 Beta Update: added Metric and Unit Circle time formats. I know, some of you are reading this and thinking to yourself &#8212; genital herpes is more appealing than yet another online alarm clock. But to that I say, congratulations, that&#8217;s one of the new features in ALARMd 2! Why did [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zachleat.com/Projects/alarmd-beta/">Take a look: ALARMd 2 Beta</a></p>
<p><em><strong>Update</strong>: added Metric and Unit Circle time formats.</em></p>
<p>I know, some of you are reading this and thinking to yourself &#8212; genital herpes is more appealing than yet another online alarm clock.  But to that I say, congratulations, that&#8217;s one of the new features in ALARMd 2!</p>
<p>Why did I make another online alarm clock?  Mostly due to missing features and limitations in the old version, but also because it&#8217;s a good exercise in JavaScript programming and User Interface design.  Everyone likes to hone their skills, and this is my publicly viewable work desk.  But the real reason I went back to rewrite the old version is that I&#8217;m hooked on <a href="http://jquery.com">jQuery</a>.  I can&#8217;t get enough of that sweet, sweet, source code, and couldn&#8217;t stand to see my old, crusty, handwritten DOM manipulations polluting web browsers across the world.  Users of the Yahoo User Interface Library (what I used for the original version of ALARMd) would do well to consider jQuery a nice plugin to be used alongside YUI.  It will clean up your code MAX_INT-fold.</p>
<p>Here are a few new features and addressed limitations in ALARMd 2.</p>
<ul>
<li>Easy Alarm Mode: No more fumbling around when you just want one simple easy-to-add alarm.</li>
<li>Google Calendar Alarm Mode: Customize your alarm schedule to your heart&#8217;s content, it will load your alarms straight from a publicly available Google Calendar.  There are some great features with this:
<ul>
<li>Load only the first calendar event of every day</li>
<li>Day Limiter (Example: Only load calendar events within the next 3 days)</li>
<li>Minute Adjuster (Example: Alarm me 90 minutes before work without adding a separate event)</li>
<li>Google does a nice job of normalizing dates as well, so you don&#8217;t have to worry about calendar time syncing.  If it says 8AM on your calendar, it&#8217;s going to alarm you at 8AM on your computer&#8217;s local time.</li>
</ul>
</li>
<li>New Clock Formats:
<ul>
<li>Human Readable Clock Format: Think &#8220;Half Past Two&#8221;, or &#8220;Quarter Til Twelve&#8221;.  This idea is from <a href="http://www.insightoutsight.co.uk/viewproject.php?cid=2&#038;pid=3&#038;iid=2">Laurence Willmott&#8217;s Project &#8220;It&#8217;s about Time&#8221;</a>.  I took some liberties with his labeling scheme, I hope he doesn&#8217;t mind too much.</li>
<li><a href="http://zapatopi.net/metrictime/">Metric Time Format</a>: Shows the measurement Centi-days in Local Metric Time.  Basically, it&#8217;s a percentage of much of the day has passed.  If it&#8217;s 80.000, 80 percent of the day has passed, which coincides with 7:12 PM.</li>
<li>Unit Circle Time Format: Displays the time in radians that would be shown if a clock were <a href="http://www.cafepress.com/poofietomato.49111330">pasted on top of a unit circle</a>.  If it&#8217;s 12 o&#8217;clock, it will read &pi;/2.  After programming this one, it&#8217;s starting to seem normal in my brain.  Oh, it&#8217;s 3&pi;/2?  Time to eat dinner.  How the hell did it get 2&pi;/3??</li>
</ul>
</li>
<li><a href="http://www.zachleat.com/web/2008/03/23/yet-another-pretty-date-javascript/">Human Readable Alarm Dates</a>: Think &#8220;29 Minutes&#8221;, &#8220;1 Hour&#8221;, &#8220;2 Days Ago&#8221;.</li>
<li>Much cleaner interface, using a jQuery accordion to display the options.</li>
<li>The old ALARMd required an internet connection for all sources, and provided no safeguard if your internet went down whilst you were sleeping.  ALARMd 2 preloads all Youtube videos in the background when the page loads using the new <a href="http://apiblog.youtube.com/2008/03/something-to-write-home-about.html">Youtube JavaScript API</a>.  A nice benefit of this is that the browser window no longer requires focus to play the YouTube video.</li>
<li>Less clunky interface for adding new alarm sources.</li>
<li>Repeat option for YouTube videos and MP3&#8242;s.  Turn infinite loop on or off.  Careful with this one.  Don&#8217;t leave ALARMd going if you&#8217;re not going to be home when it goes off.</li>
<li>CSS Skins, Use the really simple ones I&#8217;ve included for Red, Green, or Blue, or include your own URL to your own hosted CSS file.  Have a good skin?  I&#8217;ll include it in the select list and give you some props here, just link to it in the comments below.  Use some CSS class hooks to spice up your skins (they are mutually exclusive).  These are CSS classes that are added to the body tag to allow you to style the alarm differently depending on the alarm clock&#8217;s current state.  <em>Future enhancements</em> might include more than just alarm-based hooks: Year, day of the year, and hour of the day might be useful, that way you could style the clock to show a lighter background during the day and a darker background at night.
<ul>
<li>.alarmWithin30Minutes</li>
<li>.alarmWithin15Minutes</li>
<li>.alarmWithin5Minutes</li>
<li>.alarmWithin1Minute</li>
<li>.alarmActive (Alarm is being played)</li>
</ul>
</li>
<li>Still has all the old favorites:
<ul>
<li>Test Button to make sure the video or source is working and to check your volume.</li>
<li>Count Down mode to show the time between now and the first alarm.</li>
<li>Store your own list of alarm sources, using YouTube, MP3, Last.FM, or any URL (Pandora is included).</li>
<li>Military time (24 hour clock) and seconds toggle.</li>
<li>Naked mode (get rid of the extras)</li>
</ul>
</li>
</ul>
<p>Finished reading?  I&#8217;m surprised you didn&#8217;t click the link at the top: <a href="http://www.zachleat.com/Projects/alarmd-beta/">ALARMd 2 Beta</a></p>
<p>Remember, this is BETA.  That means it&#8217;s new.  I&#8217;ve done my best to test and code out all the kinks, but there may be a few that slipped through.  Try it out and please report any bugs.  And once again, this code is released under the BSD license.</p>
<p>I&#8217;ll probably move this to the main ALARMd.com domain shortly.</p>
<p>Alarmd has been personally tested with Firefox 2, Firefox 3, Internet Explorer 7, Safari 3.1, and Opera 9.27, all on Windows.  Google GDATA reports an unsupported browser error on Safari and Opera, which you can hide using custom CSS.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/alarmd-2-beta-with-google-calendar-integration/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Wake up to YouTube on my Internet Alarm Clock</title>
		<link>http://www.zachleat.com/web/wake-up-to-youtube-on-my-internet-alarm-clock/</link>
		<comments>http://www.zachleat.com/web/wake-up-to-youtube-on-my-internet-alarm-clock/#comments</comments>
		<pubDate>Tue, 19 Jun 2007 01:40:07 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Alarmd]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/06/18/wake-up-to-youtube-on-my-internet-alarm-clock/</guid>
		<description><![CDATA[Update: Try the new ALARMd 2 Beta, with Google Calendar integration and offline Youtube caching. Did you take your contacts out last night and you can&#8217;t see the time on your alarm clock from all the way across the room? I&#8217;m here to calm your fears. Enter ALARMD, the Internet Alarm Clock. Wake up to [...]]]></description>
			<content:encoded><![CDATA[<p><em><strong>Update</strong>: Try the new <a href="http://www.zachleat.com/web/2008/04/06/alarmd-2-beta-with-google-calendar-integration/">ALARMd 2 Beta</a>, with Google Calendar integration and offline Youtube caching.</em></p>
<p>Did you take your contacts out last night and you can&#8217;t see the time on your alarm clock from all the way across the room?  </p>
<p>I&#8217;m here to calm your fears.  Enter <a href="http://www.zachleat.com/Projects/alarmd/">ALARMD, the Internet Alarm Clock</a>.  Wake up to any Youtube video (that allows embedding), a last.fm user stream or tag, or any mp3 hosted online.  There are a few defaults in there, but you can add and modify your own.</p>
<p><a href="http://www.flickr.com/photos/zachleat/531165035/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1067/531165035_d2ba407333.jpg" width="500" height="375" alt="Now that's an alarm clock" /></a></p>
<p>Features:</p>
<ul>
<li>Supports multiple alarms (ALT+R to add an alarm or use the Add Alarm button).</li>
<li>Options for 24 Hour (Military) time and Seconds display</li>
<li>Supports MP3 (hosted online), YouTube videos (that allow embedding), and last.fm user or tag streams.</li>
<li>Key Mash Mode to kill the alarm (hit five random keys in one second)</li>
<li>Time Font Size customization (automatically size to the width of the window using the Max option)</li>
<li>Typical alarm clock colors: Red, Green, or Blue</li>
<li>Alarm Toggle based on the Day of the Week</li>
<li>Test button to make sure your speaker volume is set correctly.</li>
<li>Sleep Mode button to get rid of the extra GUI while you don&#8217;t need it.</li>
<li>Save all of your settings, URL&#8217;s, and alarms locally in a cookie (you <strong>don&#8217;t</strong> need yet another account to use this)</li>
</ul>
<p>Things to think about:</p>
<ul>
<li>Power Settings &#8211; disable your screen saver, or any sort of automatic suspend or sleep setting.  In my testing, having your monitor go into power save mode is acceptable, and the alarms will still sound (but you might want to test this yourself and leave a comment with your result).</li>
<li>You might not want to use with a CRT, for fear of burn in.</li>
<li>Personally, I like to use this in Opera, just because their default full screen mode (F11) doesn&#8217;t have toolbars or a status bar.  But you can use the <a href="https://addons.mozilla.org/en-US/firefox/addon/4650">Fuller Screen Firefox plug-in</a> to soup up your Firefox for similar functionality.</li>
<li>Word of warning, the window <strong>must</strong> have focus to autoplay YouTube videos.</li>
<li>Make sure your local time on your computer is correct, especially if you are traveling between time zones.  It doesn&#8217;t do any server side validation on the time (yet?).</li>
</ul>
<p>Possible Future Improvements:</p>
<ul>
<li>Countdown mode, displays amount of time until next alarm in place of the clock (good for timed presentations, where you want to see how much time is left before you have to quit).</li>
<li>Google Gears integration for offline mode (if your internet goes out during the night)</li>
<li>Support customizing source URL&#8217;s on a per alarm basis.</li>
<li>Support days of the week toggle on a per alarm basis.</li>
<li>Support user specified color customization.</li>
<li>A crescendo alarm MP3 that increases in volume for a more peaceful wake up experience.</li>
<li>An alarm MP3 with especially violent noises for heavy sleepers.</li>
<li>An alarm MP3 of my mom&#8217;s voice to get that nice feeling of childhood back.</li>
</ul>
<p>This internet application was built using the Yahoo UI Libraries (YUI) and Jack Slocum&#8217;s Ext DomQuery class.  It is written entirely without using any server side programming languages, and therefore can be saved to your local machine.  Not that anyone might want to use the Internet Alarm Clock, but if you do, I declare it officially released under the BSD license.  Just don&#8217;t forget to cite the source when you redistribute.</p>
<p><strong>Update</strong>: added a couple more things to think about.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/wake-up-to-youtube-on-my-internet-alarm-clock/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Enlarging your YUI DataTable in 30 Seconds or Less!</title>
		<link>http://www.zachleat.com/web/enlarging-your-yui-datatable-in-30-seconds-or-less/</link>
		<comments>http://www.zachleat.com/web/enlarging-your-yui-datatable-in-30-seconds-or-less/#comments</comments>
		<pubDate>Fri, 08 Jun 2007 02:51:08 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Expandable]]></category>
		<category><![CDATA[Grid]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/06/07/enlarging-your-yui-datatable-in-30-seconds-or-less/</guid>
		<description><![CDATA[Please note that this post has been updated to the new version of YUI, 2.3.0 in an article called &#8220;Enlarging your YUI DataTable in 29 Seconds or Less!&#8221; Do you want to fit more content onto your DataTable, but don&#8217;t know how? Do you wish that you had fewer columns, or more horizontal screen-estate? Well [...]]]></description>
			<content:encoded><![CDATA[<p><b>Please note that this post has been updated to the new version of YUI, 2.3.0 in an article called <a href="http://www.zachleat.com/web/2007/08/28/enlarging-your-yui-datatable-in-29-seconds-or-less/">&#8220;Enlarging your YUI DataTable in 29 Seconds or Less!&#8221;</a></b></p>
<p>Do you want to fit more content onto your DataTable, but don&#8217;t know how?  Do you wish that you had fewer columns, or more horizontal screen-estate?  Well now you can enlarge your table easily with these simple functions!  Instead of adding more information into additional columns, we have used our patented method of not actually patenting anything to bring you a secret formula that will allow you to dynamically insert rows into your table, designed for holding additional, non-constrained customizable content!</p>
<p>Do you mean to tell me that your formula will give that special lady in your life the DataTable that she has always wanted?</p>
<p>Of course!  In fact, we guarantee this DataTable to satisfy all of the women you know and don&#8217;t know in the world or we&#8217;ll give you a full refund of the purchase price!</p>
<p>Wow! How does it work?</p>
<p><a href="http://www.zachleat.com/Projects/valdi/__test_yui_datatable_expandable.html"></p>
<p>Click here for an example!</p>
<p><img src='http://www.zachleat.com/web/wp-content/uploads/2007/06/datatable.gif' alt='Normal DataTable' /></p>
<p><img src='http://www.zachleat.com/web/wp-content/uploads/2007/06/datatableexpanded.gif' alt='Expanded DataTable' /><br />
</a></p>
<p>When you click on a row in the DataTable, it inserts a child row beneath the row with an HTML string passed in to populate the dynamic content.  When you click on the parent row or the new row that was inserted, the content disappears!  It&#8217;s that easy!  You don&#8217;t have to apply any gross awful smelling creams, or take any large horse-sized pills for this to work!  You literally only use the following code to do it:</p>
<p>Usage Code:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> myDataTable <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> YAHOO.<span style="color: #660066;">widget</span>.<span style="color: #660066;">DataTable</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;myContainer&quot;</span><span style="color: #339933;">,</span>myColumnSet<span style="color: #339933;">,</span>myDataSource<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
myDataTable.<span style="color: #660066;">subscribe</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;cellClickEvent&quot;</span><span style="color: #339933;">,</span> myDataTable.<span style="color: #660066;">onEventSelectRow</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// make sure you're firing the row selection event</span>
myDataTable.<span style="color: #660066;">subscribe</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;cellClickEvent&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> e <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #003366; font-weight: bold;">var</span> myCustomHtml <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Hello, this is my expanded content.&lt;br /&gt;:-)&lt;br /&gt;'</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// generate the string, could use an ajax call if you wanted.</span>
   YAHOO.<span style="color: #660066;">ymod</span>.<span style="color: #660066;">datatable</span>.<span style="color: #660066;">clickAndExpand</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> e<span style="color: #339933;">,</span> myCustomHtml <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// if you do use an ajax call, this function returns a reference to the newly created div that you can put the ajax results into.</span>
<span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Library Code:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">YAHOO.<span style="color: #003366; font-weight: bold;">namespace</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'YAHOO.ymod.datatable'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
YAHOO.<span style="color: #660066;">ymod</span>.<span style="color: #660066;">datatable</span>.<span style="color: #660066;">clickAndExpand</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> e<span style="color: #339933;">,</span> expandedHtml <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> selectedRows <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">getSelectedRows</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> selectedRows.<span style="color: #660066;">length</span> <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">hasClass</span><span style="color: #009900;">&#40;</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'ymod-expandedData'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span>.<span style="color: #660066;">previousSibling</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'expanded'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span>.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">removeChild</span><span style="color: #009900;">&#40;</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">hasClass</span><span style="color: #009900;">&#40;</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'ymod-expanded'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003366; font-weight: bold;">var</span> newRow <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'tr'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003366; font-weight: bold;">var</span> newCell <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'td'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003366; font-weight: bold;">var</span> newDiv <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'div'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span> newDiv<span style="color: #339933;">,</span> <span style="color: #3366CC;">'ymod-expandedDataContent'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> expandedHtml <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span> <span style="color: #009900;">&#41;</span> newDiv.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> expandedHtml<span style="color: #339933;">;</span>
			newCell.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span> newDiv <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			newCell.<span style="color: #660066;">colSpan</span> <span style="color: #339933;">=</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span>.<span style="color: #660066;">childNodes</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
			newRow.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span> newCell <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
			YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span> newRow<span style="color: #339933;">,</span> <span style="color: #3366CC;">'ymod-expandedData'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">hasClass</span><span style="color: #009900;">&#40;</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'yui-dt-odd'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span> newRow<span style="color: #339933;">,</span> <span style="color: #3366CC;">'yui-dt-odd'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">hasClass</span><span style="color: #009900;">&#40;</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'yui-dt-even'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span> newRow<span style="color: #339933;">,</span> <span style="color: #3366CC;">'yui-dt-even'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'ymod-expanded'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span>.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">insertBefore</span><span style="color: #009900;">&#40;</span> newRow<span style="color: #339933;">,</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span>.<span style="color: #660066;">nextSibling</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Event</span>.<span style="color: #660066;">addListener</span><span style="color: #009900;">&#40;</span> newRow<span style="color: #339933;">,</span> <span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> e <span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				YAHOO.<span style="color: #660066;">ymod</span>.<span style="color: #660066;">datatable</span>.<span style="color: #660066;">collapseRow</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">this</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Event</span>.<span style="color: #660066;">stopEvent</span><span style="color: #009900;">&#40;</span> e <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'yui-dt-selected'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Event</span>.<span style="color: #660066;">stopEvent</span><span style="color: #009900;">&#40;</span> e <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">return</span> newDiv<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
			selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span>.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">removeChild</span><span style="color: #009900;">&#40;</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span>.<span style="color: #660066;">nextSibling</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'ymod-expanded'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span> selectedRows<span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'yui-dt-selected'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Event</span>.<span style="color: #660066;">stopEvent</span><span style="color: #009900;">&#40;</span> e <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// pass in the expanded content, NOT the parent row.</span>
YAHOO.<span style="color: #660066;">ymod</span>.<span style="color: #660066;">datatable</span>.<span style="color: #660066;">collapseRow</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> row <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span> row.<span style="color: #660066;">previousSibling</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'ymod-expanded'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	YAHOO.<span style="color: #660066;">util</span>.<span style="color: #660066;">Dom</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span> row.<span style="color: #660066;">previousSibling</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'yui-dt-selected'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	row.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">removeChild</span><span style="color: #009900;">&#40;</span> row <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Customize the CSS, if desired.</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.yui-dt-table</span> tr<span style="color: #6666ff;">.ymod-expandedData</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#bdcede</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">cursor</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">pointer</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.yui-dt-table</span> tr<span style="color: #6666ff;">.ymod-expandedData</span> td <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">padding-right</span><span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">padding-bottom</span><span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">white-space</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">normal</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">overflow</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">visible</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.yui-dt-table</span> tr.ymod-<span style="color: #993333;">expanded</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#bdcede</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.yui-dt-table</span> tr.ymod-<span style="color: #993333;">expanded</span> td <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">border-bottom</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.yui-dt-table</span> div<span style="color: #6666ff;">.ymod-expandedDataContent</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#f4f4f4</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">inset</span> <span style="color: #cc00cc;">#aaa</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">2px</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">white-space</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">normal</span><span style="color: #00AA00;">;</span> zoom<span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">1</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">overflow</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">hidden</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>You might even want to put a little + and &#8211; into the first column of each row to give a visual cue that there is more information for display available on click.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/enlarging-your-yui-datatable-in-30-seconds-or-less/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Problems with YUI DataTable</title>
		<link>http://www.zachleat.com/web/problems-with-yui-datatable/</link>
		<comments>http://www.zachleat.com/web/problems-with-yui-datatable/#comments</comments>
		<pubDate>Wed, 04 Apr 2007 22:52:41 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[DataTable]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[Grid]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/04/04/problems-with-yui-datatable/</guid>
		<description><![CDATA[If you have read anything I&#8217;ve written before or know me at all, you know that my go-to JavaScript library is the one and only YUI. So obviously, when I was looking around for a Grid (or as YUI jargon goes, a DataTable), naturally I&#8217;m going to turn to YUI compatible components. First, I looked [...]]]></description>
			<content:encoded><![CDATA[<p>If you have read anything I&#8217;ve written before or know me at all, you know that my go-to JavaScript library is the one and only YUI.  So obviously, when I was looking around for a Grid (or as YUI jargon goes, a DataTable), naturally I&#8217;m going to turn to YUI compatible components.  First, I looked at Jack Slocum&#8217;s EXT, which has a nice looking Grid component that had a lot of features I wouldn&#8217;t need, but I didn&#8217;t really want to take a 0.5 MB hit for the limited feature set I was requiring.  Adding the YUI DataTable would only tack on approximately 70-75 KB of additional download.  So first, let me establish what I&#8217;m going for:</p>
<p><strong>Minimum Feature Set</strong>:</p>
<ul>
<li>Client-Side Sorting: I don&#8217;t want it to do an XMLHttpRequest to sort the data, I want it to be done all clientside.</li>
<li>Simple inline editing: Edit a field in the table right there on the table.  I hadn&#8217;t established what types of data I would need to edit yet.</li>
<li>Data Sources: load from a native JavaScript array or a XMLHttpRequest returning XML or JSON.</li>
<li>Data Type Sort Algorithms: at the very minimum different sorting algorithms for numeric columns and string columns.</li>
<li>Hierarchical Columns: group column headers together under a parent header.</li>
<li>Easily customizable: must be able to customize the look and feel of the grid easily using CSS and not by editing Javascript.</li>
<li>Header Freeze: If I have overflow on my table vertically causing a scroll bar, I want the table headers to remain shown at the top of the table while I scroll from top to bottom.</li>
<li>Custom Cell Rendering: I have the data I&#8217;m loading, but I want to change how it looks when it is rendered to the table.  Common for date formatting.</li>
</ul>
<p><strong>Luxury Feature Set</strong>:</p>
<ul>
<li>Resizeable Columns: change the width of a column by dragging on the column header&#8217;s right border.</li>
<li>Movable Columns: dragging a column will cause it to be moved on the table (TIBCO General Interface supports this).</li>
<li>Custom Sort Algorithm: write my own algorithm to specify how data is sorted, or provide a way to do multi-column sorting (sort within one column, ties are sorted by another column, and so on).</li>
<li>Dynamic Paging (don&#8217;t make me click numbered links, load the data automatically when I scroll) both on the client (dynamically insert only what I&#8217;m looking at and remove what I&#8217;ve scrolled past) and using the server (load more data through an XMLHttpRequest)</li>
<li>Column Freeze: if the table is going to scroll horizontally, allow the developer to freeze a column or multiple columns so that they are shown when scrolling from left to right.</li>
</ul>
<p><strong>Evaluation of Options</strong>: How does the YUI DataTable stack up?</p>
<p>Basic Items: Client-Side Sorting, Simple inline editing, Data Sources, Data Type Sort Algorithms (<em>stock types not yet implemented out of the box</em>), Hierarchical Columns, Header Freeze (<em>buggy</em>), Custom Cell Rendering, and is easily customizable with CSS.</p>
<p>Luxury Items: Resizeable Columns, Movable Columns (<em>not supported</em>), Custom Sort Algorithms are supported (you can right your own Data Type Sort Algorithms with this feature), Dynamic Paging (manually, not dynamic), Column Freeze (<em>not supported</em>)</p>
<p>Problems:</p>
<ul>
<li>Any sort of fixed width table is going to be problematic.  Putting a fixed width on the table causes the table headers to be misaligned with the associated table data.  It&#8217;s a mess.  The only viable option here is to let the table do it&#8217;s own width calculations.  You can&#8217;t even set the column widths manually using the {width} variable as suggested when using a fixed width table.</li>
<li>Data Type Sort Algorithms supposedly work from the column type, but this feature is documented in the code as being a TODO.  All columns are sorted by a string datatype, meaning that if your column is numeric and you had the following rows: { 3, 7, 40 }, the sort result would be { 3, 40, 7 }.</li>
<li>Header Freeze was problematic.  Implementing the {scrollable=true} feature as recommended by the documentation causes the table headers to be misaligned with the data in a fixed width table.</li>
<li>Paging uses the old school numbers method.  This wasn&#8217;t a deal breaker, since I classified this feature as a luxury item.</li>
</ul>
<p>Granted, the DataTable in it&#8217;s current form is a beta component, but that 0.5 MB ExtJS hit is looking pretty nice right now.</p>
<p><strong>Minor Update</strong>: to do a fixed width table that will overflow horizontally, this is the method you can use:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">div<span style="color: #cc00cc;">#dataTableId</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #808080; font-style: italic;">/* change this to whatever id you're using to hold the dataTable */</span>
	<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;">520px</span><span style="color: #00AA00;">;</span> <span style="color: #808080; font-style: italic;">/* put in your own fixed width */</span>
	overflow-x<span style="color: #00AA00;">:</span><span style="color: #993333;">auto</span><span style="color: #00AA00;">;</span>
	overflow-y<span style="color: #00AA00;">:</span><span style="color: #993333;">hidden</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.yui-dt-headtext</span><span style="color: #00AA00;">,</span> <span style="color: #6666ff;">.yui-dt-headcontainer</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">position</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">static</span><span style="color: #00AA00;">;</span> <span style="color: #808080; font-style: italic;">/* without this declaration, the headers weren't horizontally scrolling with the data in IE6 */</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/problems-with-yui-datatable/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Conservative Design Example: Hierarchical Options</title>
		<link>http://www.zachleat.com/web/conservative-design-example-hierarchical-options/</link>
		<comments>http://www.zachleat.com/web/conservative-design-example-hierarchical-options/#comments</comments>
		<pubDate>Fri, 23 Mar 2007 06:52:12 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Conservative Design]]></category>
		<category><![CDATA[Hierarchical Select]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/03/23/conservative-design-example-hierarchical-options/</guid>
		<description><![CDATA[Welcome, one and all, to the second installment of actual code examples for the Conservative Design series. The decision was made (by me) to rename the component in question from the original Hierarchical Select to Hierarchical Options, due to the fact that the hierarchy can consist of any multiple option component, and is not limited [...]]]></description>
			<content:encoded><![CDATA[<p>Welcome, one and all, to the second installment of actual code examples for the Conservative Design series.  The decision was made (by me) to rename the component in question from the original Hierarchical Select to Hierarchical Options, due to the fact that the hierarchy can consist of any multiple option component, and is not limited to just a select.  And to this face, this particular component was documented in the original post entitled <a href="http://www.zachleat.com/web/2007/02/22/conservative-design-hierarchical-select-boxes/">Conservative Design: Hierarchical Select Boxes</a>.</p>
<p><a href='http://www.zachleat.com/Projects/valdi/hierarchicalOptions.html' title='Hierarchical Options'><img src='http://www.zachleat.com/web/wp-content/uploads/2007/03/hierarchical.gif' alt='Hierarchical Options' /></a><br />
Click the image above to go to the example.</p>
<p>Notes on the example: The Tree structure is as follows:</p>
<ul>
<li>Primary
<ul>
<li>Secondary</p>
<ul>
<li>Tertiary</p>
<ul>
<li>Quaternary</p>
<ul>
<li>Quinary</li>
</ul>
</li>
</ul>
</li>
<li>2nd Tertiary (is a static element that doesn&#8217;t hide)</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>So without further adieu or out of place french, what do we have?  3 out of 4 requirements and 1 of 2 luxury items.</p>
<ul>
<li>Handles any number of select elements in a linear or tree (luxury item) like structure.</li>
<li>Child select elements are optional based on parent selection.  Can hide entire div element or display a message stating no options are available.</li>
<li>Compliant with the Reset button.</li>
<li>Right now only loads from standard HTML markup (not yet from JavaScript or JSON or an XMLHTTPRequest)</li>
<li>Only supports Select elements for now, in the future should be abstracted to support Checkbox Lists or any multiple option component.</li>
</ul>
<p><strong>Outstanding Bugs</strong>:</p>
<ul>
<li>Opera button doesn&#8217;t reset properly with Reset Button</li>
<li>Clicking off of the default and then back onto the default has the original selections downstream (but doesn&#8217;t propagate more than one level)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/conservative-design-example-hierarchical-options/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conservative Design Example: Multiple Option List</title>
		<link>http://www.zachleat.com/web/conservative-design-example-multiple-option-list/</link>
		<comments>http://www.zachleat.com/web/conservative-design-example-multiple-option-list/#comments</comments>
		<pubDate>Sat, 10 Mar 2007 22:39:40 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Conservative Design]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/03/10/conservative-design-example-multiple-option-list/</guid>
		<description><![CDATA[All of the posts in the Conservative Design series so far have been brainstorming of design patterns. But how about some real life examples, some actual code? Let&#8217;s dive in. The first example I decided to tackle was the Option List, specifically the variant that allows multiple options to be selected. Let me start out [...]]]></description>
			<content:encoded><![CDATA[<p>All of the posts in the Conservative Design series so far have been brainstorming of design patterns.  But how about some real life examples, some actual code?  Let&#8217;s dive in.</p>
<p>The first example I decided to tackle was the <a href="http://www.zachleat.com/web/2007/02/26/conservative-design-option-list/">Option List</a>, specifically the variant that allows multiple options to be selected.  Let me start out by saying that I didn&#8217;t abstract out the type of source element that you could put into this example, I only programmed the element for a &lt;select multiple&gt; element.  For the impatient, let&#8217;s just start with the result:</p>
<p><a href="http://www.zachleat.com/Projects/valdi/multipleSelectList.html"><img src='http://www.zachleat.com/web/wp-content/uploads/2007/03/optionlist_multiple_real.gif' alt='Multiple Option List Real Example' /></a><br />
Click the image to see the actual example.</p>
<p>This element was constructed using the YUI Library and Jack Slocum&#8217;s DomQuery selector class, as well as using the new form validation CSS and JavaScript code I&#8217;m currently developing entitled &#8216;<strong>Valdi</strong>&#8216;.</p>
<p>It includes 3 of the 4 of the minimum features required as set in the original specification.</p>
<p>Features:</p>
<ul>
<li><strong>Validation</strong>: there is no submit button, but if there were, it would validate if the form has been entry has a value.</li>
<li><strong>Quick Links</strong>: Select All, Select None, and Sort the Options</li>
<li><strong>Customizable Options</strong>: Allow the user to add their own options for selection.</li>
<li>Does <strong>not </strong>abstract option types (checkbox, etc)</li>
<li>Keyboard Support: CTRL+A inside of the select box selects all options, Delete or Backspace removes the selected options, Enter key inside Add input field automatically adds option to the select.</li>
<li>Can be <em>easily</em> transformed into a Single Option List by removing the multiple=&#8221;multiple&#8221; option in the html.</li>
<li>Sort will toggle between Ascending and Descending and maintain the selected options</li>
<li>When the number of options outweighs the select size, the number of options is displayed next to the Add button.  Try adding 5 or more options to the select list.</li>
</ul>
<p>Screenshots for the Lazy People:</p>
<p>Multiple Options are Added<br />
<img src='http://www.zachleat.com/web/wp-content/uploads/2007/03/optionlist_multiple_real1.gif' alt='Multiple Option List Real Example' /></p>
<p>Validation when an Option is not selected:<br />
<img src='http://www.zachleat.com/web/wp-content/uploads/2007/03/optionlist_multiple_real21.gif' alt='Multiple Option List Real Example' /></p>
<p>Success, they selected something and submitted:<br />
<img src='http://www.zachleat.com/web/wp-content/uploads/2007/03/optionlist_multiple_real31.gif' alt='Multiple Option List Real Example' /></p>
<p>Watch for another separate article about Valdi later on.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/conservative-design-example-multiple-option-list/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conservative Design: Command Line Interface</title>
		<link>http://www.zachleat.com/web/conservative-design-command-line-interface/</link>
		<comments>http://www.zachleat.com/web/conservative-design-command-line-interface/#comments</comments>
		<pubDate>Wed, 07 Mar 2007 06:52:05 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Command Line]]></category>
		<category><![CDATA[Conservative Design]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/03/07/conservative-design-command-line-interface/</guid>
		<description><![CDATA[This is another post in the series entitled Conservative Design Patterns for Form Elements. The argument has existed since the dawn of the Graphical User Interface (GUI). Which is better, keyboard-exclusive Command Line or mouse-intensive GUI&#8217;s? As more enterprise architectures are moving from terminals to web interfaces for their products, and as time is moving [...]]]></description>
			<content:encoded><![CDATA[<p>This is another post in the series entitled <a href="http://www.zachleat.com/web/2007/02/22/conservative-design-patterns-for-form-elements/">Conservative Design Patterns for Form Elements</a>.</p>
<p>The argument has existed since the dawn of the Graphical User Interface (GUI).  Which is better, keyboard-exclusive Command Line or mouse-intensive GUI&#8217;s?  As more enterprise architectures are moving from terminals to web interfaces for their products, and as time is moving forward with the everyman user desiring an interface that looks pretty and easy to use, we&#8217;re seeing a drastic reduction in the utilization of the keyboard.</p>
<p>But with the exception of form input, we&#8217;ve almost completely moved away from the keyboard as a means to execute functions and navigation.  I&#8217;m proposing that we bring back the power of the keyboard.  Obviously we can&#8217;t get rid of the GUI altogether, but instead complement it with a powerful command line.</p>
<p>This component could exist as a standalone command line interface component or as a supplement to any search bar your page may contain.  The basic premise of the Command Line Interface component is to provide a standardized method of navigating your website using nothing but the keyboard.  It could fulfill more complex operations, but the scope of this article will just cover command line rudimentary navigation.</p>
<p>Screen Printing: Fake Command Line Example<br />
<img src='http://www.zachleat.com/web/wp-content/uploads/2007/03/commandline.gif' alt='Command Line' /></p>
<p>Screen Printing: Fake Command Line Example of AutoComplete Capabilities<br />
<img src='http://www.zachleat.com/web/wp-content/uploads/2007/03/commandline_f.gif' alt='Command Line AutoComplete' /></p>
<p><strong>Minimum Feature Set</strong>: (<a href="http://jfulton.org/?page=Software&#038;file=gui.php">source</a>)</p>
<ul>
<li>Autocomplete: must be able to finish the current command being typed by presenting a list of available options to the user.  Must be compatible with keyboard navigation:
<ul>
<li>UP and DOWN arrows to select from list</li>
<li>TAB autocompletes to first option</li>
</ul>
</li>
<li>Markup Scanning for Applicable Links: scan the current dom for &lt;a&gt; tags with a href element that could be used in autocomplete.</li>
<li>Quick commands: markup options (custom attributes?) to allow the programmer to define commands in the html.  These are one to three character combinations that execute a link or event.</li>
<li>Standardized Command Set: standardized hot key to force focus to the command line.  Also, for navigation options that are standardized between every website, have a standard set of commands that will execute with the same behavior, regardless of navigation implementation (Home [H], Login [L], Register [R], Forgotten Password [FP], Contact Us Page [C], Privacy Policy [PRIV], Terms of Service [TOS])</li>
</ul>
<p><strong>Luxury Feature Set</strong>:</p>
<ul>
<li>Markup Scanning for Events: sometimes navigation is executed through event handling.  Scan the events assigned to nodes for any available options that could be executed in navigation.</li>
</ul>
<p><strong>Limitations</strong>:</p>
<ul>
<li>Limitations on any sort of mouse-required interface: drag and drop</li>
<li>Interaction with flash?</li>
</ul>
<p><strong>Idea Credits</strong>:</p>
<ul>
<li><a href="http://www.softpanorama.org/OFM/gui_vs_command_line.shtml">GUI vs Command line interface</a></li>
<li><a href="http://www.humanized.com/weblog/2007/02/24/your_grandmothers_command_line_the_command_line_co/">Command Line for the Common Man: The Command Line Comeback</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/conservative-design-command-line-interface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conservative Design: Option List</title>
		<link>http://www.zachleat.com/web/conservative-design-option-list/</link>
		<comments>http://www.zachleat.com/web/conservative-design-option-list/#comments</comments>
		<pubDate>Mon, 26 Feb 2007 06:50:50 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Conservative Design]]></category>
		<category><![CDATA[Design Patterns]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/02/26/conservative-design-option-list/</guid>
		<description><![CDATA[This is another post in the series entitled Conservative Design Patterns for Form Elements. Next we&#8217;ll look at a web component that is almost ubiquitous among user interfaces today, the Option List. The Option List can take any one of the following three forms. Multiple Selections: User can select any number of the options presented [...]]]></description>
			<content:encoded><![CDATA[<p>This is another post in the series entitled <a href="http://www.zachleat.com/web/2007/02/22/conservative-design-patterns-for-form-elements/">Conservative Design Patterns for Form Elements</a>.</p>
<p>Next we&#8217;ll look at a web component that is almost ubiquitous among user interfaces today, the Option List.  The Option List can take any one of the following three forms.</p>
<ol>
<li>Multiple Selections: User can select any number of the options presented to them.  Types: <strong>Checkbox Group</strong>, <strong>Multiple Select Element</strong></li>
<li>Single Selection: User can select none or one of the options available.  Types: <strong>Radio Group</strong>, <strong>Select Element</strong></li>
<li>User Input List: User types in the options that they want to use.  All inputs are marked as selected.  Types: <strong>Group of Textboxes</strong></li>
</ol>
<p>We&#8217;ll describe each of these variants separately.</p>
<p><strong>Multiple Selections</strong>:<br />
<img src='http://www.zachleat.com/web/wp-content/uploads/2007/02/optionlist_multiple1.gif' alt='Option List Multiple Selections' /><br />
<strong>Minimum Feature Set</strong>:</p>
<ul>
<li>Validation: The user can select at least one, an integer range of options, or any number of the options presented.</li>
<li>Quick Links: optional links to select all options, clear the options, and toggle the options to the opposite value of what they currently hold.</li>
<li>Customizable Values: optionally allow the user to add their own options (one, an integer range, or many) to the list.</li>
<li>Other Variants: Any Select+ Element, as described in the original post.</li>
</ul>
<p><strong>Single Selection</strong>:<br />
<img src='http://www.zachleat.com/web/wp-content/uploads/2007/02/optionlist_single1.gif' alt='Option List Single Selection' /></p>
<p><strong>Minimum Feature Set</strong>:</p>
<ul>
<li>Validation: The user can select at most one of the options presented.</li>
<li>Quick Link: optional link to clear the options</li>
<li>Customizable Value: optionally allow the user to add their own option (only one is required, since only one can be selected).</li>
<li>Other Variants: Any Select1 Element, as described in the original post.</li>
</ul>
<p><strong>User Input List</strong>:<br />
<img src='http://www.zachleat.com/web/wp-content/uploads/2007/02/optionlist_all4.gif' alt='Option List User Input' /></p>
<p><strong>Minimum Feature Set</strong>:</p>
<ul>
<li>Validation: The user must have at least one of the text fields with a value (doesn&#8217;t matter which one).  Or the user must have an integer range number of fields with values.</li>
<li>Quick Link: optional link next to an element to remove that element from the list (not clear it, remove it)</li>
<li>Customizable Values: optionally allow the user to add their own options (up to an integer limit).</li>
<li>Other Variants: Any List of InputX Elements, as described in the original post (could be passwords or textareas).</li>
</ul>
<p>The images above for all three component types show a textbox for the addition of another option, but this should also allow customization to allow any type of (Select+ or InputX) element for the addition of another option.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/conservative-design-option-list/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Conservative Design: Hierarchical Select</title>
		<link>http://www.zachleat.com/web/conservative-design-hierarchical-select-boxes/</link>
		<comments>http://www.zachleat.com/web/conservative-design-hierarchical-select-boxes/#comments</comments>
		<pubDate>Fri, 23 Feb 2007 03:31:04 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Conservative Design]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Hierarchical Select]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/02/22/conservative-design-hierarchical-select-boxes/</guid>
		<description><![CDATA[This is a post in a series entitled Conservative Design Patterns for Form Elements. For now, I&#8217;ll start off with an easy web component that a lot of you have probably already had some experience with. But, strangely enough, it is not included in any of the JavaScript libraries that are out there, that I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>This is a post in a series entitled <a href="http://www.zachleat.com/web/2007/02/22/conservative-design-patterns-for-form-elements/">Conservative Design Patterns for Form Elements</a>.</p>
<p>For now, I&#8217;ll start off with an easy web component that a lot of you have probably already had some experience with.  But, strangely enough, it is not included in any of the JavaScript libraries that are out there, that I&#8217;ve seen.  If you know of one, go ahead and post it in the comments.</p>
<p><strong>Hierarchical Select Boxes</strong> (sometimes called Dynamic Select Boxes if you&#8217;re doing a web search)</p>
<p>Behavior: 2 or more select boxes working in parallel, where selection of an option in a parent dynamically adjusts the options of the child.</p>
<p>Screenshot (Prior to any selection):<br />
<img src='http://www.zachleat.com/web/wp-content/uploads/2007/02/hierselects1.jpg' alt='Prior to any selection' /></p>
<p>Screenshot (After an option is chosen in the first select box):<br />
<img src='http://www.zachleat.com/web/wp-content/uploads/2007/02/hierselects2.jpg' alt='After a selection is made' /></p>
<p>Minimum Requirements for Acceptable Feature Set:</p>
<ul>
<li>Must be able to handle any (reasonable) number of select boxes in a linear structure: parent elements only have one child.</li>
<li>Child select elements can be optional depending on parent selection.  Maybe a continent doesn&#8217;t have any countries, so don&#8217;t display a child select element.  It would be nice to have a visual indicator showing whether or not a parent option had children (triangle, folder(?), arrow or other customizable icon).</li>
<li>Must have functionality that allows it to be reset with the form reset button, as <a href="http://www.mattkruse.com/javascript/dynamicoptionlist/">Matt Kruse has done (Example 3)</a>.</li>
<li>Load options in child select&#8217;s dynamically from multiple data sources (describe in <a href="http://www.bobbyvandersluis.com/articles/unobtrusivedynamicselect.php">raw HTML code</a>, local JS file, remote JSON object or XML file using an XMLHTTPRequest)</li>
</ul>
<p>Luxury Feature Set:</p>
<ul>
<li>Must be able to nest select elements in a tree structure: selecting an option in a parent element could modify 2+ child select elements.</li>
<li>Could be able to modify the options for any element that displays options (Select1 or Select+ as described in the <a href="/web/2007/02/22/conservative-design-patterns-for-form-elements/">Conservative Design Post</a>: Checkbox Group, Radio Group, Select Single or Multiple)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/conservative-design-hierarchical-select-boxes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Conservative Design Patterns for Form Elements</title>
		<link>http://www.zachleat.com/web/conservative-design-patterns-for-form-elements/</link>
		<comments>http://www.zachleat.com/web/conservative-design-patterns-for-form-elements/#comments</comments>
		<pubDate>Fri, 23 Feb 2007 03:26:29 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Conservative Design]]></category>
		<category><![CDATA[Design Patterns]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/02/22/conservative-design-patterns-for-form-elements/</guid>
		<description><![CDATA[Have you ever been to a web site that looks as though it has been built exclusively using pre-made bulky widgets cookie cuttered right onto the page? Lovely grid components, sweet over-featured WYSIWYG editors, maybe a Google or Yahoo map thrown in on the page for good measure. Conformist web sites using the conditioning forced [...]]]></description>
			<content:encoded><![CDATA[<p>Have you ever been to a web site that looks as though it has been built exclusively using pre-made bulky widgets cookie cuttered right onto the page?  Lovely grid components, sweet over-featured WYSIWYG editors, maybe a Google or Yahoo map thrown in on the page for good measure.  Conformist web sites using the conditioning forced upon them by time, executive, or work-ethic based constraints.   The widgets on these websites either seem too bulky, reinventing the wheel with avant-garde user interaction for a confusing user experience, or they are just too lightweight to justify using at all.</p>
<p>What I&#8217;m proposing is a standard set of Design Patterns for form input, as an extension to already existing HTML form elements.  By describing the best practices for certain use cases of input, we can form a set of building blocks that can be used to enhance existing forms, instead of replacing them with totally new ways of user interaction.</p>
<p>So keeping away from <a href="http://www.adaptivepath.com/publications/essays/archives/000385.php">the spirit of inventing names for things that are already being done</a>, I won&#8217;t be trivializing this idea with a catch phrase.  Instead I hope you will realize the value of <strong>BUILDING BLOCKS</strong> over <strong>cookie cutters</strong>.</p>
<p>These components be used to handle the tween cases of GUI development, where the interaction doesn&#8217;t warrant a full blown widget, but requires more than a standard HTML form element.  I would be excited to see work done at this level of GUI development inside of the JavaScript libraries that are out there instead of work on the overblown &#8220;Widget Set&#8221; that seems to be the buzz in the community.</p>
<p><strong>Spectrum of GUI Elements</strong></p>
<p>Raw HTML Inputs (Text, Password, Select&#8230;) -> Smidgets -> Full Blown Widgets (Editable Grid, Rich Text Editor)</p>
<p><strong>Legend</strong></p>
<ul>
<li>Toggle Option On or Off (Toggle)</li>
<li>Select 0-1 Options From a List (Select1)</li>
<li>Select 0+ Options From a List (Select+)</li>
<li>Input 0+ Characters into an Element (InputX)</li>
<li>Input is obfuscated to prevent from being read (Obfuscated)</li>
</ul>
<p>To describe what we want, let&#8217;s first see what we have.</p>
<p><strong>Existing HTML Elements</strong></p>
<ul>
<li>Buttons (clicking performs a data altering action or form submission action)
<ul>
<li>Submit</li>
<li>Reset</li>
<li>Push (without attached behavior)</li>
</ul>
</li>
<li>Checkbox (Toggle)</li>
<li>Checkbox Group (Select+)</li>
<li>Radio Group (Select1)</li>
<li>Select Single (Select1)</li>
<li>Select Multiple (Select+)</li>
<li>Text (InputX)</li>
<li>Textarea (<em>antiquated due to CSS styled word wrapping multi line Text input</em>) (InputX)</li>
<li>Password (InputX, Obfuscated)</li>
</ul>
<p>And because this is going to be a series, I&#8217;ll continue with my first case of a Conservative Design Form Element in a new post.</p>
<p>Let me just reiterate that I do hope you take the ideas for these GUI components and develop them in your favorite JavaScript library.  The purpose of this is to come up with a set of feature-based standards so that people don&#8217;t have to keep developing their own components over and over again.  Do you have an idea for a feature that you think should be included in the standard or luxury feature set of a component?  Post it in the comments of that component blog post and I&#8217;ll certainly modify the post with your suggestions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/conservative-design-patterns-for-form-elements/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Screen Printing, Fake Interfaces Part 1</title>
		<link>http://www.zachleat.com/web/screen-printing-a-dreaming-exercise/</link>
		<comments>http://www.zachleat.com/web/screen-printing-a-dreaming-exercise/#comments</comments>
		<pubDate>Tue, 20 Feb 2007 07:07:04 +0000</pubDate>
		<dc:creator>Zach Leatherman</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[Offline]]></category>

		<guid isPermaLink="false">http://www.zachleat.com/web/2007/02/20/screen-printing-a-dreaming-exercise/</guid>
		<description><![CDATA[Why not error messages that tell you when your internet has been disconnected? How about one that tells you when you&#8217;ve been logged out (maybe in another window) and allow you to reauthenticate to the server right there? I don&#8217;t believe there are any architecture problems with these two ideas.]]></description>
			<content:encoded><![CDATA[<p>Why not error messages that tell you when your internet has been disconnected?  How about one that tells you when you&#8217;ve been logged out (maybe in another window) and allow you to reauthenticate to the server right there?  I don&#8217;t believe there are any architecture problems with these two ideas.</p>
<p><a href='http://www.zachleat.com/web/wp-content/uploads/2007/02/image2.jpg' title='Error Messages'><img src='http://www.zachleat.com/web/wp-content/uploads/2007/02/image2.thumbnail.jpg' alt='Error Messages' /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zachleat.com/web/screen-printing-a-dreaming-exercise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

