<?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>Designing Interactive &#187; Code</title>
	<atom:link href="http://www.designinginteractive.com/category/code/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.designinginteractive.com</link>
	<description>Usable Web Applications with Web Standards</description>
	<lastBuildDate>Thu, 08 Jul 2010 15:15:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Dear HTML, CSS, and JavaScript: Flash is more flexible</title>
		<link>http://www.nateklaiber.com/blog/2010/02/09/dear-html-css-and-javascript-flash-is-more-flexible</link>
		<comments>http://www.designinginteractive.com/code/dear-html-css-and-javascript-flash-is-more-flexible/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 17:06:23 +0000</pubDate>
		<dc:creator>Nate Klaiber</dc:creator>
				<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://www.designinginteractive.com/?p=914</guid>
		<description><![CDATA[Nate Klaiber is spot on. I had this same conversation with Jason at ThunderTech a while ago. As much of a proponent I am for web standards, it&#8217;s not the technology that&#8217;s to blame. One of the key issues in this space is the lack of a good IDE for developing media rich websites without [...]


Related posts:<ol><li><a href='http://www.designinginteractive.com/design/why-flash-is-mostly-bad/' rel='bookmark' title='Permanent Link: Why Flash is Mostly Bad'>Why Flash is Mostly Bad</a></li>
<li><a href='http://www.designinginteractive.com/code/unobtrusive-javascript-controversy/' rel='bookmark' title='Permanent Link: Unobtrusive Javascript Controversy'>Unobtrusive Javascript Controversy</a></li>
<li><a href='http://www.designinginteractive.com/code/reasons-to-validate/' rel='bookmark' title='Permanent Link: Reasons to Validate'>Reasons to Validate</a></li>
<li><a href='http://www.designinginteractive.com/events/beginning-web-design-workshops/' rel='bookmark' title='Permanent Link: Beginning Web Design Workshops'>Beginning Web Design Workshops</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Nate Klaiber is spot on. I had this same conversation with Jason at <a href="http://www.thundertech.com/">ThunderTech</a> a while ago. As much of a proponent I am for web standards, it&#8217;s not the technology that&#8217;s to blame.</p>
<p>One of the key issues in this space is the lack of a good IDE for developing media rich websites without Flash. That&#8217;s what makes Flash so attractive to designers, the ease of creating these multimedia based websites. Dreamweaver doesn&#8217;t come close.</p>
<p>Over the last few years we&#8217;ve seen major Flash studios, like <a href="http://www.f-i.com">Fantasy-Interactive</a>, make the move to web standards.</p>
<p>Even though HTML/CSS/JS is far more semantic, more accessible and more flexible, we don&#8217;t possess the tools to build a really top-notch IDE.</p>
<p>The bigger question is&#8230; should we bother building such an IDE? I&#8217;m not so sure. It&#8217;s the transparency of the markup that makes HTML/CSS/JS so accessible. Abstracting that markup in an IDE would probably bring along the same issue&#8217;s that plagues Flash today.</p>




	<a rel="nofollow" class="thickbox" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F&amp;title=Dear%20HTML%2C%20CSS%2C%20and%20JavaScript%3A%20Flash%20is%20more%20flexible&amp;bodytext=Nate%20Klaiber%20is%20spot%20on.%20I%20had%20this%20same%20conversation%20with%20Jason%20at%20ThunderTech%20a%20while%20ago.%20As%20much%20of%20a%20proponent%20I%20am%20for%20web%20standards%2C%20it%27s%20not%20the%20technology%20that%27s%20to%20blame.%0D%0A%0D%0AOne%20of%20the%20key%20issues%20in%20this%20space%20is%20the%20lack%20of%20a%20good%20IDE%20for%20?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://delicious.com/post?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F&amp;title=Dear%20HTML%2C%20CSS%2C%20and%20JavaScript%3A%20Flash%20is%20more%20flexible&amp;notes=Nate%20Klaiber%20is%20spot%20on.%20I%20had%20this%20same%20conversation%20with%20Jason%20at%20ThunderTech%20a%20while%20ago.%20As%20much%20of%20a%20proponent%20I%20am%20for%20web%20standards%2C%20it%27s%20not%20the%20technology%20that%27s%20to%20blame.%0D%0A%0D%0AOne%20of%20the%20key%20issues%20in%20this%20space%20is%20the%20lack%20of%20a%20good%20IDE%20for%20?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F&amp;t=Dear%20HTML%2C%20CSS%2C%20and%20JavaScript%3A%20Flash%20is%20more%20flexible?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F&amp;title=Dear%20HTML%2C%20CSS%2C%20and%20JavaScript%3A%20Flash%20is%20more%20flexible&amp;annotation=Nate%20Klaiber%20is%20spot%20on.%20I%20had%20this%20same%20conversation%20with%20Jason%20at%20ThunderTech%20a%20while%20ago.%20As%20much%20of%20a%20proponent%20I%20am%20for%20web%20standards%2C%20it%27s%20not%20the%20technology%20that%27s%20to%20blame.%0D%0A%0D%0AOne%20of%20the%20key%20issues%20in%20this%20space%20is%20the%20lack%20of%20a%20good%20IDE%20for%20?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F&amp;title=Dear%20HTML%2C%20CSS%2C%20and%20JavaScript%3A%20Flash%20is%20more%20flexible?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://posterous.com/share?linkto=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F&amp;title=Dear%20HTML%2C%20CSS%2C%20and%20JavaScript%3A%20Flash%20is%20more%20flexible&amp;selection=Nate%20Klaiber%20is%20spot%20on.%20I%20had%20this%20same%20conversation%20with%20Jason%20at%20ThunderTech%20a%20while%20ago.%20As%20much%20of%20a%20proponent%20I%20am%20for%20web%20standards%2C%20it%27s%20not%20the%20technology%20that%27s%20to%20blame.%0D%0A%0D%0AOne%20of%20the%20key%20issues%20in%20this%20space%20is%20the%20lack%20of%20a%20good%20IDE%20for%20?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/posterous.png" title="Posterous" alt="Posterous" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F&amp;title=Dear%20HTML%2C%20CSS%2C%20and%20JavaScript%3A%20Flash%20is%20more%20flexible?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.designinginteractive.com/feed/?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.sphere.com/search?q=sphereit:http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F&amp;title=Dear%20HTML%2C%20CSS%2C%20and%20JavaScript%3A%20Flash%20is%20more%20flexible?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphere.png" title="SphereIt" alt="SphereIt" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F&amp;title=Dear%20HTML%2C%20CSS%2C%20and%20JavaScript%3A%20Flash%20is%20more%20flexible" title="StumbleUpon"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://technorati.com/faves?add=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.tumblr.com/share?v=3&amp;u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F&amp;t=Dear%20HTML%2C%20CSS%2C%20and%20JavaScript%3A%20Flash%20is%20more%20flexible&amp;s=Nate%20Klaiber%20is%20spot%20on.%20I%20had%20this%20same%20conversation%20with%20Jason%20at%20ThunderTech%20a%20while%20ago.%20As%20much%20of%20a%20proponent%20I%20am%20for%20web%20standards%2C%20it%27s%20not%20the%20technology%20that%27s%20to%20blame.%0D%0A%0D%0AOne%20of%20the%20key%20issues%20in%20this%20space%20is%20the%20lack%20of%20a%20good%20IDE%20for%20" title="Tumblr"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/tumblr.png" title="Tumblr" alt="Tumblr" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Dear%20HTML%2C%20CSS%2C%20and%20JavaScript%3A%20Flash%20is%20more%20flexible%20-%20http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fdear-html-css-and-javascript-flash-is-more-flexible%2F" title="Twitter"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://www.designinginteractive.com/design/why-flash-is-mostly-bad/' rel='bookmark' title='Permanent Link: Why Flash is Mostly Bad'>Why Flash is Mostly Bad</a></li>
<li><a href='http://www.designinginteractive.com/code/unobtrusive-javascript-controversy/' rel='bookmark' title='Permanent Link: Unobtrusive Javascript Controversy'>Unobtrusive Javascript Controversy</a></li>
<li><a href='http://www.designinginteractive.com/code/reasons-to-validate/' rel='bookmark' title='Permanent Link: Reasons to Validate'>Reasons to Validate</a></li>
<li><a href='http://www.designinginteractive.com/events/beginning-web-design-workshops/' rel='bookmark' title='Permanent Link: Beginning Web Design Workshops'>Beginning Web Design Workshops</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.designinginteractive.com/code/dear-html-css-and-javascript-flash-is-more-flexible/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to build a Gantt Chart with the Google Charts API</title>
		<link>http://www.designinginteractive.com/code/how-to-build-a-gantt-chart-with-the-google-charts-api/</link>
		<comments>http://www.designinginteractive.com/code/how-to-build-a-gantt-chart-with-the-google-charts-api/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 02:56:27 +0000</pubDate>
		<dc:creator>Dave Goerlich</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[charts]]></category>
		<category><![CDATA[gantt chart]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[timeline]]></category>

		<guid isPermaLink="false">http://www.designinginteractive.com/?p=192</guid>
		<description><![CDATA[The Google Charts API is an excellent way to add high quality charting to your web application.  We first started working with the API as part of the Simpli5 dashboard development, and were quite impressed with its functionality and ease of use.  Wrapper classes were developed and added to our Sandstone Application Framework to make [...]


Related posts:<ol><li><a href='http://www.designinginteractive.com/code/google-charting-frustrations/' rel='bookmark' title='Permanent Link: Google Charting Frustrations'>Google Charting Frustrations</a></li>
<li><a href='http://www.designinginteractive.com/code/google-charts-resolution/' rel='bookmark' title='Permanent Link: Google Chart&#8217;s Resolution'>Google Chart&#8217;s Resolution</a></li>
<li><a href='http://www.designinginteractive.com/design/google-penalizes-paid-links/' rel='bookmark' title='Permanent Link: Google Penalizes Paid Links'>Google Penalizes Paid Links</a></li>
<li><a href='http://www.designinginteractive.com/company/10-tips-to-better-google-wave-conversations/' rel='bookmark' title='Permanent Link: 10 Tips to Better Google Wave Conversations'>10 Tips to Better Google Wave Conversations</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>The Google Charts API is an excellent way to add high quality charting to your web application.  We first started working with the API as part of the <a href="http://www.simpli5.com">Simpli5</a> dashboard development, and were quite impressed with its functionality and ease of use.  Wrapper classes were developed and added to our Sandstone Application Framework to make the addition charts to Simpli5 and other applications as simple as possible.</p>
<p>An application we are developing for a client requires some graphic representation of progress along a timeline of multiple steps.  A <a href="http://en.wikipedia.org/wiki/Gantt">Gantt Chart</a> is the obvious best solution, but alas that is not a chart type available from the Google API.  However, a Gantt chart is really just a special type of bar chart, and bar charts are available in the API.  So the question was, how can we make the standard Google bar chart display as a Gantt?</p>
<p><a href="http://code.google.com/apis/chart/">The Google Charting API Developer’s Guide</a> does an excellent job documenting the “how” side of things, so to avoid repeating a lot of stuff from there, we’ll just focus on the “what” of building a Gantt chart with Google.</p>
<p><span id="more-192"></span></p>
<p><strong>Note:</strong> The sample graphs below are actual Google Chart API calls.  To see how the charts were created, have a look at the images source attribute.</p>
<h3>A simple bar chart</h3>
<p>As a starting point, let’s start with this sample bar chart from the Google Charting API documentation:</p>
<p><img src="http://chart.apis.google.com/chart?cht=bhs&amp;chs=200x125&amp;chd=s:ello&amp;chco=4d89f9" alt="" width="200" height="125" /></p>
<h3>Getting clever by stacking bars</h3>
<p>It’s already a horizontal bar chart, exactly what we need for our Gantt chart.  However, being a traditional bar chart, all of the bars start on the left axis.  For a simple Gantt chart, each successive bar needs to begin where the previous bar ends.  Google offers a “stacked bar” chart, where the bars for the second data series do begin right where the bars for the second series end.</p>
<p><img src="http://chart.apis.google.com/chart?cht=bvs&amp;chs=200x125&amp;chd=t:10,50,60,80,40|50,60,100,40,20&amp;chco=4d89f9,c6d9fd&amp;chbh=20" alt="" width="200" height="125" /></p>
<p>If we change the color of the first data series to white to match the background color, the second data series seems to “float” well above the x-axis.</p>
<p><img src="http://chart.apis.google.com/chart?cht=bvs&amp;chs=200x125&amp;chd=t:10,50,60,80,40|50,60,100,40,20&amp;chco=ffffff,4d89f9&amp;chbh=20" alt="" width="200" height="125" /></p>
<p>Flip it to a horizontal bar chart, and we get something that starts to look somewhat like a Gantt!</p>
<p><img src="http://chart.apis.google.com/chart?cht=bhs&amp;chs=200x125&amp;chd=t:10,50,60,80,40|50,60,100,40,20&amp;chco=ffffff,4d89f9&amp;chbh=20" alt="" width="200" height="125" /></p>
<h3>Building the Gantt Chart</h3>
<p>Now that we have a chart to work with, let’s lay out a sample project we want to chart.  Our project will have sequential 5 steps as shown below, an overall timeline of 14 days.</p>
<p><strong>Sample Project Steps<br />
</strong></p>
<ol>
<li>3 days</li>
<li>1 day</li>
<li>6 days</li>
<li>1 day</li>
<li>3 days</li>
</ol>
<p>To begin with, let’s build a simple horizontal bar chart showing the 5 steps.  We’ll include a 0-14 scale for the chart, and make it a workable size.  Our data parameter is: “3,1,6,1,3”</p>
<p><img src="http://chart.apis.google.com/chart?cht=bhs&amp;chs=600x200&amp;chd=t:3,1,6,1,3&amp;chds=0,14&amp;chco=4d89f9" alt="" width="600" height="200" /></p>
<p>To align the tasks start to finish, we need to build and supply a data series that we can represent with white bars.  The data for this series is quite easy to calculate – it’s simply the sum of all prior task days.  So for our example project we have:</p>
<ol>
<li>Step 1 – 0 days</li>
<li>3 days</li>
<li>4 days</li>
<li>10 days</li>
<li>11 days</li>
</ol>
<p>If we add this as the first data series to our chart, and set its color to white, we now have a very simple Gantt chart of our project.  Here, we pass the following data: “0,3,4,10,11|3,1,6,1,3”</p>
<p><img src="http://chart.apis.google.com/chart?cht=bhs&amp;chs=600x200&amp;chd=t:0,3,4,10,11|3,1,6,1,3&amp;chds=0,14&amp;chco=ffffff,4d89f9" alt="" width="600" height="200" /></p>
<h3>Visualizing Status</h3>
<p>This chart only shows the sequence and relative length of each step.  It doesn’t show the status of each step, and where we are along the timeline.  Let’s use the following colors to indicate each task’s status:</p>
<ul>
<li>Complete: <span style="color: #000000;"><strong>#000000</strong></span></li>
<li>In Process &amp; On Time: <span style="color: #00ff00;"><strong>#00ff00</strong></span></li>
<li>In Process &amp; Late: <span style="color: #ff0000;"><strong>#ff0000</strong></span></li>
<li>Upcoming: <span style="color: #0000ff;"><strong>#0000ff</strong></span></li>
<li>Other: <span style="color: #ff6600;"><strong>#ff6600</strong></span></li>
</ul>
<p>We’ll use the same logic we did to get the bars for each task to align start to finish, though now we’ll have 6 total data series, including the lead time drawn in white.  For our example, steps 1 and 2 are complete, and we are on time with step 3.  We will need to pass the following data series:</p>
<ul>
<li>Lead Time (in white) : 0,3,4,10,11</li>
<li><span style="color: #000000;"><strong>Complete</strong></span>: 3,1,0,0,0</li>
<li><span style="color: #00ff00;"><strong>In Process &amp; On Time</strong></span>: 0,0,6,0,0</li>
<li><span style="color: #ff0000;"><strong>In Process &amp; Late</strong></span>: 0,0,0,0,0</li>
<li><span style="color: #0000ff;"><strong>Upcoming</strong></span>: 0,0,0,1,3</li>
<li><span style="color: #ff6600;"><strong>Other</strong></span>: 0,0,0,0,0</li>
</ul>
<p>So our Gantt chart now starts to give us some more detailed information.  We’ll also add some data labels so a legend is painted.</p>
<p><img src="http://chart.apis.google.com/chart?cht=bhs&amp;chs=600x200&amp;chd=t:0,3,4,10,11|3,1,0,0,0|0,0,6,0,0|0,0,0,0,0|0,0,0,1,3|0,0,0,0,0&amp;chds=0,14&amp;chco=ffffff,000000,00ff00,ff0000,0000ff,ff6600&amp;chtt=Sample+Project&amp;chdl=|Complete|On+Time|Late|Upcoming|Other" alt="" width="600" height="200" /></p>
<p>Next we need to give the chart some axis labels.  The y-axis should give our step names, the across the x-axis, let’s show the dates of the timeline.  We’ll assume a start date of 12/4.</p>
<p><img src="http://chart.apis.google.com/chart?cht=bhs&amp;chs=600x200&amp;chd=t:0,3,4,10,11|3,1,0,0,0|0,0,6,0,0|0,0,0,0,0|0,0,0,1,3|0,0,0,0,0&amp;chds=0,14&amp;chco=ffffff,000000,00ff00,ff0000,0000ff,ff6600&amp;chtt=Sample+Project&amp;chdl=|Complete|On+Time|Late|Upcoming|Other&amp;chxt=x,y&amp;chxl=0:|12%2F04|12%2F05|12%2F06|12%2F07|12%2F08|12%2F09|12%2F10|12%2F11|12%2F12|12%2F13|12%2F14|12%2F15|12%2F16|12%2F17|12%2F18|1:|Step+5|Step+4|Step+3|Step+2|Step+1" alt="" width="600" height="200" /></p>
<h3>Adding Gridlines</h3>
<p>This is looking much better – though some vertical grid lines would give us better reference between the tasks and the dates.</p>
<p><img src="http://chart.apis.google.com/chart?cht=bhs&amp;chs=600x200&amp;chd=t:0,3,4,10,11|3,1,0,0,0|0,0,6,0,0|0,0,0,0,0|0,0,0,1,3|0,0,0,0,0&amp;chds=0,14&amp;chco=ffffff,000000,00ff00,ff0000,0000ff,ff6600&amp;chtt=Sample+Project&amp;chdl=|Complete|On+Time|Late|Upcoming|Other&amp;chxt=x,y&amp;chxl=0:|12%2F04|12%2F05|12%2F06|12%2F07|12%2F08|12%2F09|12%2F10|12%2F11|12%2F12|12%2F13|12%2F14|12%2F15|12%2F16|12%2F17|12%2F18|1:|Step+5|Step+4|Step+3|Step+2|Step+1&amp;chg=7.1,0" alt="" width="600" height="200" /></p>
<p>Not quite what we were after though &#8211; our white bars which once blended in so nicely with the white background are now blocking the grid lines!  Thankfully the Google API supports a transparency value on every color, so we’ll just make our lead time bars 100% transparent.</p>
<p><img src="http://chart.apis.google.com/chart?cht=bhs&amp;chs=600x200&amp;chd=t:0,3,4,10,11|3,1,0,0,0|0,0,6,0,0|0,0,0,0,0|0,0,0,1,3|0,0,0,0,0&amp;chds=0,14&amp;chco=ffffff00,000000,00ff00,ff0000,0000ff,ff6600&amp;chtt=Sample+Project&amp;chdl=|Complete|On+Time|Late|Upcoming|Other&amp;chxt=x,y&amp;chxl=0:|12%2F04|12%2F05|12%2F06|12%2F07|12%2F08|12%2F09|12%2F10|12%2F11|12%2F12|12%2F13|12%2F14|12%2F15|12%2F16|12%2F17|12%2F18|1:|Step+5|Step+4|Step+3|Step+2|Step+1&amp;chg=7.1,0" alt="" width="600" height="200" /></p>
<h3>Showing a Progress Indicator</h3>
<p>We can use the range marker functionality to indicate visually where we are across the timeline.  The width of the range marker is specified in a percent of the overall width of the graph.  For our project, each day is 7.1% of the chart (100% / 14 days).  Today being 12/8, we’ve used 4 days of the timeline, or 28.4% of the graph.  We supply a width for the range marker of 0.29 (rounded up from .284).</p>
<p><img src="http://chart.apis.google.com/chart?cht=bhs&amp;chs=600x200&amp;chd=t:0,3,4,10,11|3,1,0,0,0|0,0,6,0,0|0,0,0,0,0|0,0,0,1,3|0,0,0,0,0&amp;chds=0,14&amp;chco=ffffff00,000000,00ff00,ff0000,0000ff,ff6600&amp;chtt=Sample+Project&amp;chdl=|Complete|On+Time|Late|Upcoming|Other&amp;chxt=x,y&amp;chxl=0:|12%2F04|12%2F05|12%2F06|12%2F07|12%2F08|12%2F09|12%2F10|12%2F11|12%2F12|12%2F13|12%2F14|12%2F15|12%2F16|12%2F17|12%2F18|1:|Step+5|Step+4|Step+3|Step+2|Step+1&amp;chg=7.1,0&amp;chm=r,99ccff44,0,0,0.29" alt="" width="600" height="200" /></p>
<p>As a final example, let’s change and show step 3 as in process, but running late.  All we have to do is move its value from the On Time data series to the Late data series:</p>
<p><img src="http://chart.apis.google.com/chart?cht=bhs&amp;chs=600x200&amp;chd=t:0,3,4,10,11|3,1,0,0,0|0,0,0,0,0|0,0,6,0,0|0,0,0,1,3|0,0,0,0,0&amp;chds=0,14&amp;chco=ffffff00,000000,00ff00,ff0000,0000ff,ff6600&amp;chtt=Sample+Project&amp;chdl=|Complete|On+Time|Late|Upcoming|Other&amp;chxt=x,y&amp;chxl=0:|12%2F04|12%2F05|12%2F06|12%2F07|12%2F08|12%2F09|12%2F10|12%2F11|12%2F12|12%2F13|12%2F14|12%2F15|12%2F16|12%2F17|12%2F18|1:|Step+5|Step+4|Step+3|Step+2|Step+1&amp;chg=7.1,0&amp;chm=r,99ccff44,0,0,0.29" alt="" width="600" height="200" /></p>
<p>All of this could continue to be expanded to handle more complex projects, and to handle multiple concurrent tasks.  Additional axis labels could be added to visually categorize steps or to indicate milestones within a project.  For our client’s application, we included an additional x-axis label to identify the target completion date for a project, thus showing overall how far ahead or behind the project is currently running.</p>




	<a rel="nofollow" class="thickbox" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F&amp;title=How%20to%20build%20a%20Gantt%20Chart%20with%20the%20Google%20Charts%20API&amp;bodytext=The%20Google%20Charts%20API%20is%20an%20excellent%20way%20to%20add%20high%20quality%20charting%20to%20your%20web%20application.%C2%A0%20We%20first%20started%20working%20with%20the%20API%20as%20part%20of%20the%20Simpli5%20dashboard%20development%2C%20and%20were%20quite%20impressed%20with%20its%20functionality%20and%20ease%20of%20use.%C2%A0%20W?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://delicious.com/post?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F&amp;title=How%20to%20build%20a%20Gantt%20Chart%20with%20the%20Google%20Charts%20API&amp;notes=The%20Google%20Charts%20API%20is%20an%20excellent%20way%20to%20add%20high%20quality%20charting%20to%20your%20web%20application.%C2%A0%20We%20first%20started%20working%20with%20the%20API%20as%20part%20of%20the%20Simpli5%20dashboard%20development%2C%20and%20were%20quite%20impressed%20with%20its%20functionality%20and%20ease%20of%20use.%C2%A0%20W?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F&amp;t=How%20to%20build%20a%20Gantt%20Chart%20with%20the%20Google%20Charts%20API?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F&amp;title=How%20to%20build%20a%20Gantt%20Chart%20with%20the%20Google%20Charts%20API&amp;annotation=The%20Google%20Charts%20API%20is%20an%20excellent%20way%20to%20add%20high%20quality%20charting%20to%20your%20web%20application.%C2%A0%20We%20first%20started%20working%20with%20the%20API%20as%20part%20of%20the%20Simpli5%20dashboard%20development%2C%20and%20were%20quite%20impressed%20with%20its%20functionality%20and%20ease%20of%20use.%C2%A0%20W?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F&amp;title=How%20to%20build%20a%20Gantt%20Chart%20with%20the%20Google%20Charts%20API?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://posterous.com/share?linkto=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F&amp;title=How%20to%20build%20a%20Gantt%20Chart%20with%20the%20Google%20Charts%20API&amp;selection=The%20Google%20Charts%20API%20is%20an%20excellent%20way%20to%20add%20high%20quality%20charting%20to%20your%20web%20application.%C2%A0%20We%20first%20started%20working%20with%20the%20API%20as%20part%20of%20the%20Simpli5%20dashboard%20development%2C%20and%20were%20quite%20impressed%20with%20its%20functionality%20and%20ease%20of%20use.%C2%A0%20W?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/posterous.png" title="Posterous" alt="Posterous" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F&amp;title=How%20to%20build%20a%20Gantt%20Chart%20with%20the%20Google%20Charts%20API?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.designinginteractive.com/feed/?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.sphere.com/search?q=sphereit:http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F&amp;title=How%20to%20build%20a%20Gantt%20Chart%20with%20the%20Google%20Charts%20API?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphere.png" title="SphereIt" alt="SphereIt" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F&amp;title=How%20to%20build%20a%20Gantt%20Chart%20with%20the%20Google%20Charts%20API" title="StumbleUpon"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://technorati.com/faves?add=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.tumblr.com/share?v=3&amp;u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F&amp;t=How%20to%20build%20a%20Gantt%20Chart%20with%20the%20Google%20Charts%20API&amp;s=The%20Google%20Charts%20API%20is%20an%20excellent%20way%20to%20add%20high%20quality%20charting%20to%20your%20web%20application.%C2%A0%20We%20first%20started%20working%20with%20the%20API%20as%20part%20of%20the%20Simpli5%20dashboard%20development%2C%20and%20were%20quite%20impressed%20with%20its%20functionality%20and%20ease%20of%20use.%C2%A0%20W" title="Tumblr"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/tumblr.png" title="Tumblr" alt="Tumblr" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=How%20to%20build%20a%20Gantt%20Chart%20with%20the%20Google%20Charts%20API%20-%20http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fhow-to-build-a-gantt-chart-with-the-google-charts-api%2F" title="Twitter"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://www.designinginteractive.com/code/google-charting-frustrations/' rel='bookmark' title='Permanent Link: Google Charting Frustrations'>Google Charting Frustrations</a></li>
<li><a href='http://www.designinginteractive.com/code/google-charts-resolution/' rel='bookmark' title='Permanent Link: Google Chart&#8217;s Resolution'>Google Chart&#8217;s Resolution</a></li>
<li><a href='http://www.designinginteractive.com/design/google-penalizes-paid-links/' rel='bookmark' title='Permanent Link: Google Penalizes Paid Links'>Google Penalizes Paid Links</a></li>
<li><a href='http://www.designinginteractive.com/company/10-tips-to-better-google-wave-conversations/' rel='bookmark' title='Permanent Link: 10 Tips to Better Google Wave Conversations'>10 Tips to Better Google Wave Conversations</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.designinginteractive.com/code/how-to-build-a-gantt-chart-with-the-google-charts-api/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Fixing Disappearing Cursors in Firefox</title>
		<link>http://www.designinginteractive.com/code/fixing-disappearing-cursors-in-firefox/</link>
		<comments>http://www.designinginteractive.com/code/fixing-disappearing-cursors-in-firefox/#comments</comments>
		<pubDate>Thu, 01 May 2008 20:16:40 +0000</pubDate>
		<dc:creator>Josh Walsh</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[hack]]></category>

		<guid isPermaLink="false">http://www.designinginteractive.com/?p=112</guid>
		<description><![CDATA[The past few days I have been debugging the User Interface for Simpli5. Today I wrestled with a particularly frustrating issue in which cursors were completely vanishing from inputs in Firefox. While it did not affect the interaction of the input, I could still manipulate the text, it did cause quite an annoyance. Here is [...]


Related posts:<ol><li><a href='http://www.designinginteractive.com/design/ie8-trying-to-become-a-real-browser/' rel='bookmark' title='Permanent Link: IE8 &#8211; Trying to become a real browser?'>IE8 &#8211; Trying to become a real browser?</a></li>
<li><a href='http://www.designinginteractive.com/user-experience/usable-web-forms/' rel='bookmark' title='Permanent Link: Web Form Fundamentals'>Web Form Fundamentals</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>The past few days I have been debugging the User Interface for <a href="http://www.simpli5.com">Simpli5</a>.  Today I wrestled with a particularly frustrating issue in which <strong>cursors were completely vanishing from inputs in Firefox</strong>.  While it did not affect the interaction of the input, I could still manipulate the text, it did cause quite an annoyance.</p>
<p>Here is a quick example which demonstrates the problem:</p>
<pre lang="HTML">
<div id="Container" style="position:absolute; left: 0; top:0; width: 100%; height:100px; background: #900; overflow: scroll;">
	</div>
<div id="Dialog" style="position:absolute; top:10px; left: 10px; width: 300px; z-index: 1">
<input name="Username" type="text" />
	</div>
</pre>
<p>The problem is caused by the change in Firefox&#8217;s current rending frame.  Setting <strong>overflow:scroll</strong> on our #Container div causes Firefox to use that div as it&#8217;s current rending frame.  Thus, the cursor is being rendered on the #Container, not on the #Dialog div, which contains the input.  Effectively, the input is covering its own cursor.</p>
<p>The fix is a simple change in CSS inheritance.  Without setting an overflow setting on the #Dialog div, we are inheriting the overflow:scroll from #Container.  By setting the #Dialog div&#8217;s overflow setting back to it&#8217;s default <strong>overflow:auto</strong> we are changing Firefox&#8217;s rendering frame to the #Dialog div, thus bringing back our cursor.</p>
<p>Here is the fixed example:</p>
<pre lang="HTML">
<div id="Container" style="position:absolute; left: 0; top:0; width: 100%; height:100px; background: #900; overflow: scroll;">
	</div>
<div id="Dialog" style="position:absolute; top:10px; left: 10px; width: 300px; z-index: 1; overflow:auto;">
<input name="Username" type="text" />
	</div>
</pre>
<p>Thankfully, Mozilla has fixed this problem in Firefox 3.</p>




	<a rel="nofollow" class="thickbox" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F&amp;title=Fixing%20Disappearing%20Cursors%20in%20Firefox&amp;bodytext=The%20past%20few%20days%20I%20have%20been%20debugging%20the%20User%20Interface%20for%20Simpli5.%20%20Today%20I%20wrestled%20with%20a%20particularly%20frustrating%20issue%20in%20which%20cursors%20were%20completely%20vanishing%20from%20inputs%20in%20Firefox.%20%20While%20it%20did%20not%20affect%20the%20interaction%20of%20the%20input%2C%20?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://delicious.com/post?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F&amp;title=Fixing%20Disappearing%20Cursors%20in%20Firefox&amp;notes=The%20past%20few%20days%20I%20have%20been%20debugging%20the%20User%20Interface%20for%20Simpli5.%20%20Today%20I%20wrestled%20with%20a%20particularly%20frustrating%20issue%20in%20which%20cursors%20were%20completely%20vanishing%20from%20inputs%20in%20Firefox.%20%20While%20it%20did%20not%20affect%20the%20interaction%20of%20the%20input%2C%20?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F&amp;t=Fixing%20Disappearing%20Cursors%20in%20Firefox?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F&amp;title=Fixing%20Disappearing%20Cursors%20in%20Firefox&amp;annotation=The%20past%20few%20days%20I%20have%20been%20debugging%20the%20User%20Interface%20for%20Simpli5.%20%20Today%20I%20wrestled%20with%20a%20particularly%20frustrating%20issue%20in%20which%20cursors%20were%20completely%20vanishing%20from%20inputs%20in%20Firefox.%20%20While%20it%20did%20not%20affect%20the%20interaction%20of%20the%20input%2C%20?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F&amp;title=Fixing%20Disappearing%20Cursors%20in%20Firefox?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://posterous.com/share?linkto=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F&amp;title=Fixing%20Disappearing%20Cursors%20in%20Firefox&amp;selection=The%20past%20few%20days%20I%20have%20been%20debugging%20the%20User%20Interface%20for%20Simpli5.%20%20Today%20I%20wrestled%20with%20a%20particularly%20frustrating%20issue%20in%20which%20cursors%20were%20completely%20vanishing%20from%20inputs%20in%20Firefox.%20%20While%20it%20did%20not%20affect%20the%20interaction%20of%20the%20input%2C%20?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/posterous.png" title="Posterous" alt="Posterous" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F&amp;title=Fixing%20Disappearing%20Cursors%20in%20Firefox?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.designinginteractive.com/feed/?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.sphere.com/search?q=sphereit:http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F&amp;title=Fixing%20Disappearing%20Cursors%20in%20Firefox?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphere.png" title="SphereIt" alt="SphereIt" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F&amp;title=Fixing%20Disappearing%20Cursors%20in%20Firefox" title="StumbleUpon"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://technorati.com/faves?add=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.tumblr.com/share?v=3&amp;u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F&amp;t=Fixing%20Disappearing%20Cursors%20in%20Firefox&amp;s=The%20past%20few%20days%20I%20have%20been%20debugging%20the%20User%20Interface%20for%20Simpli5.%20%20Today%20I%20wrestled%20with%20a%20particularly%20frustrating%20issue%20in%20which%20cursors%20were%20completely%20vanishing%20from%20inputs%20in%20Firefox.%20%20While%20it%20did%20not%20affect%20the%20interaction%20of%20the%20input%2C%20" title="Tumblr"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/tumblr.png" title="Tumblr" alt="Tumblr" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Fixing%20Disappearing%20Cursors%20in%20Firefox%20-%20http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Ffixing-disappearing-cursors-in-firefox%2F" title="Twitter"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://www.designinginteractive.com/design/ie8-trying-to-become-a-real-browser/' rel='bookmark' title='Permanent Link: IE8 &#8211; Trying to become a real browser?'>IE8 &#8211; Trying to become a real browser?</a></li>
<li><a href='http://www.designinginteractive.com/user-experience/usable-web-forms/' rel='bookmark' title='Permanent Link: Web Form Fundamentals'>Web Form Fundamentals</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.designinginteractive.com/code/fixing-disappearing-cursors-in-firefox/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Google Chart&#8217;s Resolution</title>
		<link>http://www.designinginteractive.com/code/google-charts-resolution/</link>
		<comments>http://www.designinginteractive.com/code/google-charts-resolution/#comments</comments>
		<pubDate>Fri, 18 Apr 2008 17:08:19 +0000</pubDate>
		<dc:creator>Josh Walsh</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[charts]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://www.designinginteractive.com/?p=110</guid>
		<description><![CDATA[A few days ago I posted my frustrations with Google&#8217;s charting API security. While I still believe there are some issues that would plague banks, government and other institutions that have highly sensitive data, I have found a solution to our problem. Problem 1: Query Parameters The first issue we had was that the data [...]


Related posts:<ol><li><a href='http://www.designinginteractive.com/code/how-to-build-a-gantt-chart-with-the-google-charts-api/' rel='bookmark' title='Permanent Link: How to build a Gantt Chart with the Google Charts API'>How to build a Gantt Chart with the Google Charts API</a></li>
<li><a href='http://www.designinginteractive.com/code/google-charting-frustrations/' rel='bookmark' title='Permanent Link: Google Charting Frustrations'>Google Charting Frustrations</a></li>
<li><a href='http://www.designinginteractive.com/design/google-penalizes-paid-links/' rel='bookmark' title='Permanent Link: Google Penalizes Paid Links'>Google Penalizes Paid Links</a></li>
<li><a href='http://www.designinginteractive.com/company/10-tips-to-better-google-wave-conversations/' rel='bookmark' title='Permanent Link: 10 Tips to Better Google Wave Conversations'>10 Tips to Better Google Wave Conversations</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>A few days ago I posted <a href="http://www.designinginteractive.com/code/google-charting-frustrations/">my frustrations with Google&#8217;s charting API security</a>.   While I still believe there are some issues that would plague banks, government and other institutions that have highly sensitive data, I have found a solution to our problem.</p>
<p><span id="more-110"></span></p>
<h3>Problem 1: Query Parameters</h3>
<p>The first issue we had was that the data had to be passed through query parameters, or through a GET request.  Both of which are insecure.  The simple solution to this problem is to avoid passing sensitive data altogether.  While someone could potentially snipe the URL and read the sales trends line graph, the information is meaningless without knowing who the associated account is.</p>
<h3>Problem 2: SSL Connections</h3>
<p>Our applications all run on secured <abbr title="secure hypertext transfer protocol">https</abbr> environments.  This means I cannot securely link to the Google chart image directly, since they (rightfully) do not accept https connections.</p>
<p>The simple solution is to suck the data in through a server side language (PHP and Sandstone, in our case) and then output it within our own secured environment.</p>
<h3>Conclusion</h3>
<p>As my wife will tell you, I&#8217;m wrong about many things.  This last post was one instance.  As I investigated deeper into this problem it became evident that anyone with very sensitive data would not accept a hosted solution of any kind, so Google has made the right choice to err in favor of the simple interface for the people who will be using it.</p>




	<a rel="nofollow" class="thickbox" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F&amp;title=Google%20Chart%27s%20Resolution&amp;bodytext=A%20few%20days%20ago%20I%20posted%20my%20frustrations%20with%20Google%27s%20charting%20API%20security.%20%20%20While%20I%20still%20believe%20there%20are%20some%20issues%20that%20would%20plague%20banks%2C%20government%20and%20other%20institutions%20that%20have%20highly%20sensitive%20data%2C%20I%20have%20found%20a%20solution%20to%20our%20prob?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://delicious.com/post?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F&amp;title=Google%20Chart%27s%20Resolution&amp;notes=A%20few%20days%20ago%20I%20posted%20my%20frustrations%20with%20Google%27s%20charting%20API%20security.%20%20%20While%20I%20still%20believe%20there%20are%20some%20issues%20that%20would%20plague%20banks%2C%20government%20and%20other%20institutions%20that%20have%20highly%20sensitive%20data%2C%20I%20have%20found%20a%20solution%20to%20our%20prob?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F&amp;t=Google%20Chart%27s%20Resolution?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F&amp;title=Google%20Chart%27s%20Resolution&amp;annotation=A%20few%20days%20ago%20I%20posted%20my%20frustrations%20with%20Google%27s%20charting%20API%20security.%20%20%20While%20I%20still%20believe%20there%20are%20some%20issues%20that%20would%20plague%20banks%2C%20government%20and%20other%20institutions%20that%20have%20highly%20sensitive%20data%2C%20I%20have%20found%20a%20solution%20to%20our%20prob?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F&amp;title=Google%20Chart%27s%20Resolution?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://posterous.com/share?linkto=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F&amp;title=Google%20Chart%27s%20Resolution&amp;selection=A%20few%20days%20ago%20I%20posted%20my%20frustrations%20with%20Google%27s%20charting%20API%20security.%20%20%20While%20I%20still%20believe%20there%20are%20some%20issues%20that%20would%20plague%20banks%2C%20government%20and%20other%20institutions%20that%20have%20highly%20sensitive%20data%2C%20I%20have%20found%20a%20solution%20to%20our%20prob?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/posterous.png" title="Posterous" alt="Posterous" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F&amp;title=Google%20Chart%27s%20Resolution?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.designinginteractive.com/feed/?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.sphere.com/search?q=sphereit:http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F&amp;title=Google%20Chart%27s%20Resolution?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphere.png" title="SphereIt" alt="SphereIt" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F&amp;title=Google%20Chart%27s%20Resolution" title="StumbleUpon"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://technorati.com/faves?add=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.tumblr.com/share?v=3&amp;u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F&amp;t=Google%20Chart%27s%20Resolution&amp;s=A%20few%20days%20ago%20I%20posted%20my%20frustrations%20with%20Google%27s%20charting%20API%20security.%20%20%20While%20I%20still%20believe%20there%20are%20some%20issues%20that%20would%20plague%20banks%2C%20government%20and%20other%20institutions%20that%20have%20highly%20sensitive%20data%2C%20I%20have%20found%20a%20solution%20to%20our%20prob" title="Tumblr"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/tumblr.png" title="Tumblr" alt="Tumblr" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Google%20Chart%27s%20Resolution%20-%20http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charts-resolution%2F" title="Twitter"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://www.designinginteractive.com/code/how-to-build-a-gantt-chart-with-the-google-charts-api/' rel='bookmark' title='Permanent Link: How to build a Gantt Chart with the Google Charts API'>How to build a Gantt Chart with the Google Charts API</a></li>
<li><a href='http://www.designinginteractive.com/code/google-charting-frustrations/' rel='bookmark' title='Permanent Link: Google Charting Frustrations'>Google Charting Frustrations</a></li>
<li><a href='http://www.designinginteractive.com/design/google-penalizes-paid-links/' rel='bookmark' title='Permanent Link: Google Penalizes Paid Links'>Google Penalizes Paid Links</a></li>
<li><a href='http://www.designinginteractive.com/company/10-tips-to-better-google-wave-conversations/' rel='bookmark' title='Permanent Link: 10 Tips to Better Google Wave Conversations'>10 Tips to Better Google Wave Conversations</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.designinginteractive.com/code/google-charts-resolution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Charting Frustrations</title>
		<link>http://www.designinginteractive.com/code/google-charting-frustrations/</link>
		<comments>http://www.designinginteractive.com/code/google-charting-frustrations/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 19:17:37 +0000</pubDate>
		<dc:creator>Josh Walsh</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[charts]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://www.designinginteractive.com/?p=109</guid>
		<description><![CDATA[Last week Google released its Charting API which generates PNG based image graphs for your data. The data is passed to them through a URL and returns the image data. Placing this image tag in your HTML will generate the following graph. http://chart.apis.google.com/chart?cht=p3&#038;chd=t:60,40&#038;chs=250x100&#038;chl=Hello&#124;World Designed for Web Applications This API is most useful in web applications. [...]


Related posts:<ol><li><a href='http://www.designinginteractive.com/code/google-charts-resolution/' rel='bookmark' title='Permanent Link: Google Chart&#8217;s Resolution'>Google Chart&#8217;s Resolution</a></li>
<li><a href='http://www.designinginteractive.com/code/how-to-build-a-gantt-chart-with-the-google-charts-api/' rel='bookmark' title='Permanent Link: How to build a Gantt Chart with the Google Charts API'>How to build a Gantt Chart with the Google Charts API</a></li>
<li><a href='http://www.designinginteractive.com/company/10-tips-to-better-google-wave-conversations/' rel='bookmark' title='Permanent Link: 10 Tips to Better Google Wave Conversations'>10 Tips to Better Google Wave Conversations</a></li>
<li><a href='http://www.designinginteractive.com/design/google-penalizes-paid-links/' rel='bookmark' title='Permanent Link: Google Penalizes Paid Links'>Google Penalizes Paid Links</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Last week Google released its <a title="Google Charting API" href="http://code.google.com/apis/chart/">Charting API</a> which generates PNG based image graphs for your data.   The data is passed to them through a URL and returns the image data.</p>
<p>Placing this image tag in your <abbr title="HyperText Markup Language">HTML</abbr> will generate the following graph.</p>
<p><span id="more-109"></span></p>
<pre lang="html">http://chart.apis.google.com/chart?cht=p3&#038;chd=t:60,40&#038;chs=250x100&#038;chl=Hello|World</pre>
<p><img title="A pie chart created with the Google API" src="http://chart.apis.google.com/chart?cht=p3&#038;chd=t:60,40&#038;chs=250x100&#038;chl=Hello|World" alt="Google Pie Chart Example" /></p>
<h3>Designed for Web Applications</h3>
<p>This API is most useful in web applications.  It generates attractive graphs that work well for dashboards and reports.  However, it has a major drawback when it comes to security.  The data itself is passed through a URL and URL&#8217;s are not a secure method of transporting data.  Imagine if you logged into your online banking site and it passed your password along like this:</p>
<pre lang="HTML">http://www.your-bank.com/login.php?username=Joe&#038;password=Flounder</pre>
<p>This URL could be sniped and your password &#8220;Flounder&#8221; would be leaked.  Passing this through as an <abbr title="Secure HyperText Transfer Protocol">https</abbr> connection does not make a difference either.</p>
<h3>A problem worth fixing</h3>
<p>Admittedly, we are a little more pessimistic about data security than many of our competitors, but it is still a problem which should be fixed.  Google&#8217;s graph output is the prettiest of the available products that I&#8217;ve seen, both commercial and open-source, but isn&#8217;t a viable option because of it&#8217;s intrinsic security problems.</p>
<p>A possible solution would be to give me an API ID, which allows me to POST the encrypted data to their server and they send the binary data of the image back which I can output.  It&#8217;s a little bit more technical for the few of us who care about doing it securely, but I think it is worth Google&#8217;s time to do so.</p>
<p>If anyone knows of a quality 3rd party <abbr title="Object Oriented Programming">OOP</abbr> graphing library (preferably PHP based) I would love to hear it.  I&#8217;ve tried a number of them, including <a href="http://www.aditus.nu/jpgraph/">JPGraph</a>, and <a href="http://www.maani.us/charts/index.php">Jarir Maani&#8217;s SWF Charts</a>, but haven&#8217;t found anything with the output near as pretty as Google&#8217;s.  I&#8217;d prefer not to reinvent that wheel and write our own, unless absolutely necessary.</p>
<p>I would love to hear your suggestions.</p>




	<a rel="nofollow" class="thickbox" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F&amp;title=Google%20Charting%20Frustrations&amp;bodytext=Last%20week%20Google%20released%20its%20Charting%20API%20which%20generates%20PNG%20based%20image%20graphs%20for%20your%20data.%20%20%20The%20data%20is%20passed%20to%20them%20through%20a%20URL%20and%20returns%20the%20image%20data.%0D%0A%0D%0APlacing%20this%20image%20tag%20in%20your%20HTML%20will%20generate%20the%20following%20graph.%0D%0A%0D%0A%0D%0Ahtt?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://delicious.com/post?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F&amp;title=Google%20Charting%20Frustrations&amp;notes=Last%20week%20Google%20released%20its%20Charting%20API%20which%20generates%20PNG%20based%20image%20graphs%20for%20your%20data.%20%20%20The%20data%20is%20passed%20to%20them%20through%20a%20URL%20and%20returns%20the%20image%20data.%0D%0A%0D%0APlacing%20this%20image%20tag%20in%20your%20HTML%20will%20generate%20the%20following%20graph.%0D%0A%0D%0A%0D%0Ahtt?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F&amp;t=Google%20Charting%20Frustrations?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F&amp;title=Google%20Charting%20Frustrations&amp;annotation=Last%20week%20Google%20released%20its%20Charting%20API%20which%20generates%20PNG%20based%20image%20graphs%20for%20your%20data.%20%20%20The%20data%20is%20passed%20to%20them%20through%20a%20URL%20and%20returns%20the%20image%20data.%0D%0A%0D%0APlacing%20this%20image%20tag%20in%20your%20HTML%20will%20generate%20the%20following%20graph.%0D%0A%0D%0A%0D%0Ahtt?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F&amp;title=Google%20Charting%20Frustrations?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://posterous.com/share?linkto=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F&amp;title=Google%20Charting%20Frustrations&amp;selection=Last%20week%20Google%20released%20its%20Charting%20API%20which%20generates%20PNG%20based%20image%20graphs%20for%20your%20data.%20%20%20The%20data%20is%20passed%20to%20them%20through%20a%20URL%20and%20returns%20the%20image%20data.%0D%0A%0D%0APlacing%20this%20image%20tag%20in%20your%20HTML%20will%20generate%20the%20following%20graph.%0D%0A%0D%0A%0D%0Ahtt?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/posterous.png" title="Posterous" alt="Posterous" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F&amp;title=Google%20Charting%20Frustrations?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.designinginteractive.com/feed/?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.sphere.com/search?q=sphereit:http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F&amp;title=Google%20Charting%20Frustrations?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphere.png" title="SphereIt" alt="SphereIt" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F&amp;title=Google%20Charting%20Frustrations" title="StumbleUpon"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://technorati.com/faves?add=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.tumblr.com/share?v=3&amp;u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F&amp;t=Google%20Charting%20Frustrations&amp;s=Last%20week%20Google%20released%20its%20Charting%20API%20which%20generates%20PNG%20based%20image%20graphs%20for%20your%20data.%20%20%20The%20data%20is%20passed%20to%20them%20through%20a%20URL%20and%20returns%20the%20image%20data.%0D%0A%0D%0APlacing%20this%20image%20tag%20in%20your%20HTML%20will%20generate%20the%20following%20graph.%0D%0A%0D%0A%0D%0Ahtt" title="Tumblr"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/tumblr.png" title="Tumblr" alt="Tumblr" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Google%20Charting%20Frustrations%20-%20http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fgoogle-charting-frustrations%2F" title="Twitter"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://www.designinginteractive.com/code/google-charts-resolution/' rel='bookmark' title='Permanent Link: Google Chart&#8217;s Resolution'>Google Chart&#8217;s Resolution</a></li>
<li><a href='http://www.designinginteractive.com/code/how-to-build-a-gantt-chart-with-the-google-charts-api/' rel='bookmark' title='Permanent Link: How to build a Gantt Chart with the Google Charts API'>How to build a Gantt Chart with the Google Charts API</a></li>
<li><a href='http://www.designinginteractive.com/company/10-tips-to-better-google-wave-conversations/' rel='bookmark' title='Permanent Link: 10 Tips to Better Google Wave Conversations'>10 Tips to Better Google Wave Conversations</a></li>
<li><a href='http://www.designinginteractive.com/design/google-penalizes-paid-links/' rel='bookmark' title='Permanent Link: Google Penalizes Paid Links'>Google Penalizes Paid Links</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.designinginteractive.com/code/google-charting-frustrations/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bridging the Gap Between Compile Time and Run Time</title>
		<link>http://www.designinginteractive.com/code/bridging-the-gap-between-compile-time-and-run-time/</link>
		<comments>http://www.designinginteractive.com/code/bridging-the-gap-between-compile-time-and-run-time/#comments</comments>
		<pubDate>Fri, 26 Oct 2007 14:06:50 +0000</pubDate>
		<dc:creator>Dave Goerlich</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Sandstone]]></category>
		<category><![CDATA[System Architecture]]></category>

		<guid isPermaLink="false">http://www.designinginteractive.com/code/bridging-the-gap-between-compile-time-and-run-time/</guid>
		<description><![CDATA[As the lead systems architect here at Designing Interactive, I enjoy reviewing new code patterns to see if there are areas in our codebase in which they could be implemented. Recently I spent some time digging into Martin Fowler’s Active Record pattern. While a direct implementation of this exceptional code pattern doesn’t fit within our [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>As the lead systems architect here at Designing Interactive, I enjoy reviewing new code patterns to see if there are areas in our codebase in which they could be implemented.  Recently I spent some time digging into Martin Fowler’s <a href="http://www.martinfowler.com/eaaCatalog/activeRecord.html">Active Record</a> pattern.  While a direct implementation of this exceptional code pattern doesn’t fit within our Sandstone Application Framework, I was inspired to review how we have implemented our business entity classes to see if we could implement some of the more fundamental concepts of the Active Record code pattern.</p>
<p><span id="more-53"></span></p>
<h3>Our Standards</h3>
<p>When building enterprise level software with multi-developer teams, enforcing quality coding standards is critical.  Our standards cover everything from architecture, naming conventions, interfaces and database design to version control processes.</p>
<p>Our standards <strong>forbid</strong> the use of public fields as properties within classes:</p>
<pre name="code" class="PHP">public $FirstName;</pre>
<p>All class properties must be implemented through public getter and setter functions using a protected field for data storage:</p>
<pre name="code" class="PHP">protected $_firstName;

public function getFirstName()
{
    return $this-&gt;_firstName;
}

public function setFirstName($Value)
{
    $this-&gt;_firstName = $Value;
}</pre>
<p>While we can easily call these public functions as class methods:</p>
<pre name="code" class="PHP">echo $obj-&gt;getFirstName();</pre>
<p>In order for the above code to actually operate as a property:</p>
<pre name="code" class="PHP">echo $obj-&gt;FirstName;</pre>
<p>We must implement the magic getter and magic setter functions:</p>
<pre name="code" class="PHP">public function __get($Name)
{
    $getter='get'.$Name;

    if(method_exists($this,$getter))
    {
        $returnValue = $this-&gt;$getter();
    }
    else
    {
        throw new InvalidPropertyException(
            "No Readable Property: $Name",
            get_class($this),
            $Name);
    }

    return $returnValue;
}</pre>
<pre name="code" class="PHP">public function __set($Name, $Value)
{
    $setter='set'.$Name;

    if(method_exists($this,$setter))
    {
        $this-&gt;$setter($Value);
    }
    else if(method_exists($this,'get'.$Name))
    {
        throw new InvalidPropertyException(
            "Property $Name is read only!",
            get_class($this),
            $Name);
    }
    else
    {
        throw new InvalidPropertyException(
            "No Writeable Property: $Name",
            get_class($this),
            $Name);
    }
}</pre>
<p><strong>Obviously this shows that we have extended the Exception object to create an InvalidPropertyException within the Sandstone Application Framework.</strong></p>
<p>This structure supports read-only properties through simply implementing just the public getter function.  Also computed or combined properties are supported as well:</p>
<pre name="code" class="PHP">public function getFullName()
{
    $returnValue = $this-&gt;_firstName
            . " " . $this-&gt;_lastName;

    return $returnValue;
}</pre>
<h3>DRYing Up Our Entities</h3>
<p>Our standards for database design have allowed us to develop some more specific standards for how our business entity classes are developed.  In reviewing these classes, I was not surprised to find that the code for the class constructors and the methods for loading and saving data to the database all followed identical formats. In the case of the constructors, more often than not, the code was identical from class to class.</p>
<p>One of our biggest goals when refactoring code is the <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">DRY principle</a>.  Here I was faced with a significant amount of repeated code – how could this be corrected?  A standard solution to this type of scenario is to employ the <a href="http://www.refactoring.com/catalog/extractSuperclass.html">superclass extraction</a> refactoring method.  What was needed was an EntityBase class, from which all business entity classes could inherit.</p>
<p>Our EntityBase class centralized the common constructor functionality.  In order to centralize the basic plumbing of the Load and Save methods, we stepped back and took a more OO view of the fundamental parts of a class definition itself – specifically properties.  We realized that just as metadata in a database describes the structure and functionality of the data, we can identify “metaproperties” which describe the structure and functionality of the actual properties. Some of the metaproperties we identified were:</p>
<ul>
<li>Name</li>
<li>Data Type</li>
<li>Related Database Field Name</li>
<li>Read Only?</li>
<li>Required?</li>
<li>Value</li>
</ul>
<p>Our solution implemented an architecture where individual properties of a business entity class were represented as objects themselves.</p>
<h3>Class Properties as Objects?</h3>
<p>Under this new architecture, properties are no longer implemented as fields and functions, but are now defined through an array of PropertyClass objects. An overridden protected method in each EntityBase child (called from the EntityBase constructor) performs the setup of this array of properties.  This array is keyed by the property name for easy lookup.  In order to make this functional, we had to override our magic getter and magic setter functions in the EntityBase class:</p>
<pre name="code" class="PHP">public function __get($Name)
{
    if (array_key_exists(strtolower($Name),
        $this-&gt;_properties))
    {
        $targetProperty =
            $this-&gt;_properties[strtolower($Name)];
        $returnValue = $targetProperty-&gt;PropertyValue;
    }
    else
    {
        throw new InvalidPropertyException(
            "No Readable Property: $Name",
            get_class($this),
            $Name);
    }
}</pre>
<pre name="code" class="PHP">public function __set($Name, $Value)
{
if (array_key_exists(strtolower($Name),
    $this-&gt;_properties))
    {
        $targetProperty =
            $this-&gt;_properties[strtolower($Name)];

        if ($targetProperty-&gt;IsReadOnly == false)
        {
            $targetProperty-&gt;PropertyValue = $Value;
        }
        else
        {
            throw new InvalidPropertyException(
                "Property $Name is read only!",
                get_class($this),
                $Name);
        }
    }
    else
    {
        throw new InvalidPropertyException(
            "No Writeable Property: $Name",
            get_class($this),
            $Name);
    }
}</pre>
<p>Within our PropertyClass, the setPropertyValue($Value) function enforces rules set by the values of the other metaproperties.  For example, it enforces data type rules (i.e. cannot set a string value to a numeric property) and does not allow a required property to be set to null.</p>
<p>Support for computed or combined properties can be retained through a small addition to the magic getter:</p>
<pre name="code" class="PHP">public function __get($Name)
{
    $getter='get'.$Name;

    if(method_exists($this,$getter))
    {
        $returnValue = $this-&gt;$getter();
    }
    elseif (array_key_exists(strtolower($Name),
        $this-&gt;_properties))
    {
        $targetProperty =
            $this-&gt;_properties[strtolower($Name)];
        $returnValue = $targetProperty-&gt;PropertyValue;
    }
    else
    {
        throw new InvalidPropertyException(
            "No Readable Property: $Name",
            get_class($this),
            $Name);
    }
}</pre>
<h3>The Challenge</h3>
<p>This refactoring through superclass extraction has done an excellent job of DRYing up our business entity classes.  The new architecture allows our developers to create new business entity classes in a quarter of the time.  It has also allowed us to easily add functionality (such as tagging) to all business entity classes in a single step.</p>
<p>This new architecture did bring with it one significant challenge.  How do we implement scope-based security?  We still needed to manipulate the values of properties from within the class itself without having the public access rules enforced.  We might need to set a required property to null, or the ability to change the value of a read-only property.  Under traditional design, the compiler would handle this security validation and generate parse errors if some external source attempted to access the protected fields.  Now, the question I needed to answer was, “How can I tell at run time if the call is coming from this exact instance of the class or not?”  I realized the answer lies in the call stack!</p>
<p>I had worked with the <a href="http://us2.php.net/manual/en/function.debug-backtrace.php">debug_backtrace()</a> function previously while building a custom debug and error page for the Sandstone Application Framework.  According to the documentation, the “object” element of the returned array provided a reference to the calling object (if any).  That’s exactly what I needed to perform this scope check at run time.  I did find that in order for that object reference to be set, <a href="http://www.zend.com/products/zend_optimizer/?engine=google&amp;cmpg=optimizer&amp;k_id=zend_optimizer">Zend Optimizer 3.3.0</a> or higher is required.  Once the Zend Optimizer install on our server was updated, everything worked as advertised.</p>
<p>Our PropertyClass also exposes a Value property in addition to the PropertyValue.  Unlike the PropertyValue property which enforces all public access rules, the Value property provides that unrestricted modification of the actual value we require.</p>
<p>To implement this scope level security, we first added the following protected method to the EntityBase class:</p>
<pre name="code" class="PHP">final protected function IsInternalCall()
{
$callStack = debug_backtrace();

        //The call context we are interested in
    //will be index 2 in the array.
        // 0 = this function
        // 1 = internal function call to this test
        // 2 = context in question

    $context = $callStack[2];

    if ($context['object'] === $this)
    {
        $returnValue = true;
    }
    else
    {
        $returnValue = false;
    }

    return $returnValue;
}</pre>
<p>It’s important to note that on line 13 we are using the ===, to test if the object reference in the array is the same instance of the current object.</p>
<p>With this method in place, we made a few changes to the magic getter and magic setter implementations.  Our standard naming conventions state that all protected field names are prefixed with an underbar:</p>
<pre lang="PHP">$this-&gt;_firstName;</pre>
<p>Therefore we can use a leading underbar in the name as the indicator that the calling function is requesting local scope level access to the property.  All we have to do now when such access is requested, is validate this is an internal call:</p>
<pre name="code" class="PHP">public function __get($Name)
{
    $getter='get'.$Name;

    if(method_exists($this,$getter))
    {
        $returnValue = $this-&gt;$getter();
    }
    elseif (array_key_exists(strtolower($Name),
        $this-&gt;_properties))
    {
        $targetProperty =
            $this-&gt;_properties[strtolower($Name)];
        $returnValue = $targetProperty-&gt;PropertyValue;
    }
    elseif(substr($Name, 0, 1) == "_"
        &amp;&amp; $this-&gt;IsInternalCall())
    {
        //Only allow this for internal calls

        //Determine the associated property name
        $propertyName =
            strtolower(
                substr($Name, 1, strlen($Name) - 1));

        //Does it exist?
        if (array_key_exists($propertyName,
            $this-&gt;_properties))
        {
            //Return it's value
            $targetProperty =
                $this-&gt;_properties[$propertyName];
            $returnValue = $targetProperty-&gt;Value;
        }
        else
        {
            throw new InvalidPropertyException(
                "No Readable Property: $Name",
                get_class($this),
                $Name);
        }
    }
    else
    {
        throw new InvalidPropertyException(
            "No Readable Property: $Name",
            get_class($this),
            $Name);
    }

    return $returnValue;
}</pre>
<pre name="code" class="PHP">public function __set($Name, $Value)
{
    $setter='set'.$Name;

    if(method_exists($this,$setter))
    {
        $this-&gt;$setter($Value);
    }
    elseif (array_key_exists(strtolower($Name),
        $this-&gt;_properties))
    {
        $targetProperty =
            $this-&gt;_properties[strtolower($Name)];

        if ($targetProperty-&gt;IsReadOnly == false)
        {
            $targetProperty-&gt;PropertyValue = $Value;
        }
        else
        {
            throw new InvalidPropertyException(
                "Property $Name is read only!",
                get_class($this),
                $Name);
        }
    }
    elseif(substr($Name, 0, 1) == "_"
        &amp;&amp; $this-&gt;IsInternalCall())
    {
        //Only allow this for internal calls

        //Determine the associated property name
        $propertyName =
            strtolower(
                substr($Name, 1, strlen($Name) - 1));

        //Does it exist?
        if (array_key_exists($propertyName,
            $this-&gt;_properties))
        {
            //Set it's value
            $targetProperty =
                $this-&gt;_properties[$propertyName];

            $targetProperty-&gt;Value = $Value;
        }
        else
        {
            throw new InvalidPropertyException(
                "No Writeable Property: $Name",
                get_class($this),
                $Name);
        }
    }
    else
    {
        throw new InvalidPropertyException(
            "No Writeable Property: $Name",
            get_class($this),
            $Name);
    }
}</pre>
<p>This code implementation not only provides the scope level security we require, but does so while preserving the interface of a traditional protected field.  This reduced the time required to convert all previously existing business entity classes and maintains a standard naming convention across both business entity classes and other functional classes.</p>
<h3>Aftermath</h3>
<p>Since making this major change to the Sandstone Application Framework architecture, we have completed a custom application project for a client.  I am happy to report that this new structure, and a couple RAD tools built in-house specifically to support the new architecture, allowed us to build and deploy the application in record time.</p>




	<a rel="nofollow" class="thickbox" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F&amp;title=Bridging%20the%20Gap%20Between%20Compile%20Time%20and%20Run%20Time&amp;bodytext=As%20the%20lead%20systems%20architect%20here%20at%20Designing%20Interactive%2C%20I%20enjoy%20reviewing%20new%20code%20patterns%20to%20see%20if%20there%20are%20areas%20in%20our%20codebase%20in%20which%20they%20could%20be%20implemented.%20%20Recently%20I%20spent%20some%20time%20digging%20into%20Martin%20Fowler%E2%80%99s%20Active%20Record%20pa?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://delicious.com/post?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F&amp;title=Bridging%20the%20Gap%20Between%20Compile%20Time%20and%20Run%20Time&amp;notes=As%20the%20lead%20systems%20architect%20here%20at%20Designing%20Interactive%2C%20I%20enjoy%20reviewing%20new%20code%20patterns%20to%20see%20if%20there%20are%20areas%20in%20our%20codebase%20in%20which%20they%20could%20be%20implemented.%20%20Recently%20I%20spent%20some%20time%20digging%20into%20Martin%20Fowler%E2%80%99s%20Active%20Record%20pa?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F&amp;t=Bridging%20the%20Gap%20Between%20Compile%20Time%20and%20Run%20Time?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F&amp;title=Bridging%20the%20Gap%20Between%20Compile%20Time%20and%20Run%20Time&amp;annotation=As%20the%20lead%20systems%20architect%20here%20at%20Designing%20Interactive%2C%20I%20enjoy%20reviewing%20new%20code%20patterns%20to%20see%20if%20there%20are%20areas%20in%20our%20codebase%20in%20which%20they%20could%20be%20implemented.%20%20Recently%20I%20spent%20some%20time%20digging%20into%20Martin%20Fowler%E2%80%99s%20Active%20Record%20pa?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F&amp;title=Bridging%20the%20Gap%20Between%20Compile%20Time%20and%20Run%20Time?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://posterous.com/share?linkto=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F&amp;title=Bridging%20the%20Gap%20Between%20Compile%20Time%20and%20Run%20Time&amp;selection=As%20the%20lead%20systems%20architect%20here%20at%20Designing%20Interactive%2C%20I%20enjoy%20reviewing%20new%20code%20patterns%20to%20see%20if%20there%20are%20areas%20in%20our%20codebase%20in%20which%20they%20could%20be%20implemented.%20%20Recently%20I%20spent%20some%20time%20digging%20into%20Martin%20Fowler%E2%80%99s%20Active%20Record%20pa?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/posterous.png" title="Posterous" alt="Posterous" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F&amp;title=Bridging%20the%20Gap%20Between%20Compile%20Time%20and%20Run%20Time?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.designinginteractive.com/feed/?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.sphere.com/search?q=sphereit:http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F&amp;title=Bridging%20the%20Gap%20Between%20Compile%20Time%20and%20Run%20Time?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphere.png" title="SphereIt" alt="SphereIt" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F&amp;title=Bridging%20the%20Gap%20Between%20Compile%20Time%20and%20Run%20Time" title="StumbleUpon"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://technorati.com/faves?add=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.tumblr.com/share?v=3&amp;u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F&amp;t=Bridging%20the%20Gap%20Between%20Compile%20Time%20and%20Run%20Time&amp;s=As%20the%20lead%20systems%20architect%20here%20at%20Designing%20Interactive%2C%20I%20enjoy%20reviewing%20new%20code%20patterns%20to%20see%20if%20there%20are%20areas%20in%20our%20codebase%20in%20which%20they%20could%20be%20implemented.%20%20Recently%20I%20spent%20some%20time%20digging%20into%20Martin%20Fowler%E2%80%99s%20Active%20Record%20pa" title="Tumblr"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/tumblr.png" title="Tumblr" alt="Tumblr" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Bridging%20the%20Gap%20Between%20Compile%20Time%20and%20Run%20Time%20-%20http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Fbridging-the-gap-between-compile-time-and-run-time%2F" title="Twitter"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.designinginteractive.com/code/bridging-the-gap-between-compile-time-and-run-time/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Unobtrusive Javascript Controversy</title>
		<link>http://www.designinginteractive.com/code/unobtrusive-javascript-controversy/</link>
		<comments>http://www.designinginteractive.com/code/unobtrusive-javascript-controversy/#comments</comments>
		<pubDate>Sat, 20 Oct 2007 19:49:30 +0000</pubDate>
		<dc:creator>Josh Walsh</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.designinginteractive.com/code/unobtrusive-javascript-controversy/</guid>
		<description><![CDATA[As a professional and bleeding edge design firm we work hard to stay on top of new technology. We put careful thought into our coding practices and conventions. But what happens when a previous convention has room for improvement but the cost of change is prohibitive? We certainly don&#8217;t suggest partial implementation. If it&#8217;s worth [...]


Related posts:<ol><li><a href='http://www.designinginteractive.com/code/dear-html-css-and-javascript-flash-is-more-flexible/' rel='bookmark' title='Permanent Link: Dear HTML, CSS, and JavaScript: Flash is more flexible'>Dear HTML, CSS, and JavaScript: Flash is more flexible</a></li>
<li><a href='http://www.designinginteractive.com/company/goals-for-2009/' rel='bookmark' title='Permanent Link: Goals for 2009'>Goals for 2009</a></li>
<li><a href='http://www.designinginteractive.com/design/design-last-design/' rel='bookmark' title='Permanent Link: Design Last Design'>Design Last Design</a></li>
<li><a href='http://www.designinginteractive.com/agile/eliminating-waste-from-your-agile-process/' rel='bookmark' title='Permanent Link: Eliminating Waste from your Agile Process'>Eliminating Waste from your Agile Process</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>
	As a professional and bleeding edge design firm we work hard to stay on top of new technology.  We put careful thought into our coding practices and conventions.   But what happens when a previous convention has room for improvement but the cost of change is prohibitive?  We certainly don&rsquo;t suggest partial implementation.  If it&rsquo;s worth implementing, it&rsquo;s worth implementing fully.
</p>
<p>
	Our current controversy revolves around the topic of <a href="http://www.alistapart.com/articles/behavioralseparation">unobtrusive javascript</a>.   We (the staff at Designing Interactive) all agree on the benefits of unobtrusive javascript:
</p>
<p><span id="more-52"></span></p>
<ul>
<li>Automatic <a href="http://www.456bereastreet.com/archive/200608/malicious_javascript_yet_another_reason_for_graceful_degradation/">Graceful Degradation</a></li>
<li>Separation of behavior from content</li>
<li>Reusable code</li>
</ul>
<h3>Special Situations</h3>
<p>
	Our development environment is not like most.  Our server-side development framework, Sandstone, automates most of our html/css/javascript interactivity.  This renders the <strong>Reusable Code</strong> benefit much less important.   While our javascript code may be duplicated in the page source, it&rsquo;s still only one point of change for us developmentally.
</p>
<p>
	As our chief interface designer, I believe the separation of content, style and behavior is important.  In fact, we do a fantastic job of this already, but there is room for improvement.  We have always adopted external CSS files over inline styles, and our javascript functionality is defined in external javascript files.  Our javascript triggers are still inline, however.
</p>
<h3>The cost of not changing</h3>
<p>
	While our immediate code practices cause few problems, I do have concerns moving forward without change.
</p>
<ol>
<li>We lose some credibility in the high-end design arena by not following proven design trends.</li>
<li>While we currently support graceful degradation to browsers with javascript disabled, we currently cannot trap compatibility issues between javascript versions.</li>
<li>We limit our ability to make our page markup more lean and semantic.</li>
</ol>
<h3>Counter Arguments</h3>
<p>
	My counterparts make a few valid points against change.
</p>
<ol>
<li>There&rsquo;s no immediate functionality loss.</li>
<li>There&rsquo;s little, if anything, to gain in filesize and bandwidth issues.</li>
<li>Refactoring Sandstone is a lot of work for such a small immediate gain.</li>
</ol>
<h3>My Opinion</h3>
<p>
	I believe this is an important change to make in the long term.  While it&rsquo;s not high on our priority list, it is important if we want to continue to lead in the design industry.  We know our work is not only judged by the way it&rsquo;s rendered, but also in our source code.  That&rsquo;s the very reason our websites <a href="business/reasons-to-validate/">validate to strict guidelines</a>.
</p>
<p>
	Most importantly, if we don&rsquo;t take the step forward we run the risk of falling behind in the future.  Our business plan revolves around <strong>agility</strong> and the ability to change faster than our competition.  The risk of not implementing at all is a risk I don&rsquo;t believe we can afford to take.
</p>
<p>
	I&rsquo;d love to hear your comments on the issue.  Both from our readers and from my colleagues.</p>




	<a rel="nofollow" class="thickbox" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F&amp;title=Unobtrusive%20Javascript%20Controversy&amp;bodytext=%0D%0A%09As%20a%20professional%20and%20bleeding%20edge%20design%20firm%20we%20work%20hard%20to%20stay%20on%20top%20of%20new%20technology.%20%20We%20put%20careful%20thought%20into%20our%20coding%20practices%20and%20conventions.%20%20%20But%20what%20happens%20when%20a%20previous%20convention%20has%20room%20for%20improvement%20but%20the%20cost%20o?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://delicious.com/post?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F&amp;title=Unobtrusive%20Javascript%20Controversy&amp;notes=%0D%0A%09As%20a%20professional%20and%20bleeding%20edge%20design%20firm%20we%20work%20hard%20to%20stay%20on%20top%20of%20new%20technology.%20%20We%20put%20careful%20thought%20into%20our%20coding%20practices%20and%20conventions.%20%20%20But%20what%20happens%20when%20a%20previous%20convention%20has%20room%20for%20improvement%20but%20the%20cost%20o?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F&amp;t=Unobtrusive%20Javascript%20Controversy?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F&amp;title=Unobtrusive%20Javascript%20Controversy&amp;annotation=%0D%0A%09As%20a%20professional%20and%20bleeding%20edge%20design%20firm%20we%20work%20hard%20to%20stay%20on%20top%20of%20new%20technology.%20%20We%20put%20careful%20thought%20into%20our%20coding%20practices%20and%20conventions.%20%20%20But%20what%20happens%20when%20a%20previous%20convention%20has%20room%20for%20improvement%20but%20the%20cost%20o?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F&amp;title=Unobtrusive%20Javascript%20Controversy?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://posterous.com/share?linkto=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F&amp;title=Unobtrusive%20Javascript%20Controversy&amp;selection=%0D%0A%09As%20a%20professional%20and%20bleeding%20edge%20design%20firm%20we%20work%20hard%20to%20stay%20on%20top%20of%20new%20technology.%20%20We%20put%20careful%20thought%20into%20our%20coding%20practices%20and%20conventions.%20%20%20But%20what%20happens%20when%20a%20previous%20convention%20has%20room%20for%20improvement%20but%20the%20cost%20o?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/posterous.png" title="Posterous" alt="Posterous" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F&amp;title=Unobtrusive%20Javascript%20Controversy?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.designinginteractive.com/feed/?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.sphere.com/search?q=sphereit:http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F&amp;title=Unobtrusive%20Javascript%20Controversy?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphere.png" title="SphereIt" alt="SphereIt" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F&amp;title=Unobtrusive%20Javascript%20Controversy" title="StumbleUpon"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://technorati.com/faves?add=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.tumblr.com/share?v=3&amp;u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F&amp;t=Unobtrusive%20Javascript%20Controversy&amp;s=%0D%0A%09As%20a%20professional%20and%20bleeding%20edge%20design%20firm%20we%20work%20hard%20to%20stay%20on%20top%20of%20new%20technology.%20%20We%20put%20careful%20thought%20into%20our%20coding%20practices%20and%20conventions.%20%20%20But%20what%20happens%20when%20a%20previous%20convention%20has%20room%20for%20improvement%20but%20the%20cost%20o" title="Tumblr"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/tumblr.png" title="Tumblr" alt="Tumblr" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Unobtrusive%20Javascript%20Controversy%20-%20http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Funobtrusive-javascript-controversy%2F" title="Twitter"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://www.designinginteractive.com/code/dear-html-css-and-javascript-flash-is-more-flexible/' rel='bookmark' title='Permanent Link: Dear HTML, CSS, and JavaScript: Flash is more flexible'>Dear HTML, CSS, and JavaScript: Flash is more flexible</a></li>
<li><a href='http://www.designinginteractive.com/company/goals-for-2009/' rel='bookmark' title='Permanent Link: Goals for 2009'>Goals for 2009</a></li>
<li><a href='http://www.designinginteractive.com/design/design-last-design/' rel='bookmark' title='Permanent Link: Design Last Design'>Design Last Design</a></li>
<li><a href='http://www.designinginteractive.com/agile/eliminating-waste-from-your-agile-process/' rel='bookmark' title='Permanent Link: Eliminating Waste from your Agile Process'>Eliminating Waste from your Agile Process</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.designinginteractive.com/code/unobtrusive-javascript-controversy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Reasons to Validate</title>
		<link>http://www.designinginteractive.com/code/reasons-to-validate/</link>
		<comments>http://www.designinginteractive.com/code/reasons-to-validate/#comments</comments>
		<pubDate>Thu, 02 Aug 2007 03:35:37 +0000</pubDate>
		<dc:creator>Josh Walsh</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Web Standards]]></category>
		<category><![CDATA[XHTML]]></category>

		<guid isPermaLink="false">http://www.designinginteractive.com/2007/08/25/reasons-to-validate/</guid>
		<description><![CDATA[Validation is the process of ensuring that your web pages (XHTML, XML and CSS files) meet the standard set aside by the w3c, the organization responsible for these markup languages. Validation is similar to running your documents through a spell checker for errors, ensuring that the data sent to the web browsers is well formed [...]


Related posts:<ol><li><a href='http://www.designinginteractive.com/design/ie8-trying-to-become-a-real-browser/' rel='bookmark' title='Permanent Link: IE8 &#8211; Trying to become a real browser?'>IE8 &#8211; Trying to become a real browser?</a></li>
<li><a href='http://www.designinginteractive.com/user-experience/functional-favicons/' rel='bookmark' title='Permanent Link: Functional Favicons'>Functional Favicons</a></li>
<li><a href='http://www.designinginteractive.com/code/unobtrusive-javascript-controversy/' rel='bookmark' title='Permanent Link: Unobtrusive Javascript Controversy'>Unobtrusive Javascript Controversy</a></li>
<li><a href='http://www.designinginteractive.com/user-experience/forget-about-the-fold/' rel='bookmark' title='Permanent Link: Forget about the Fold'>Forget about the Fold</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>
	Validation is the process of ensuring that your web pages (<abbr title="Extensible HyperText Language">XHTML</abbr>, <abbr title="Extensible Markup Language">XML</abbr> and <abbr title="Cascading Style Sheets">CSS</abbr> files) meet the standard set aside by the w3c, the organization responsible for these markup languages.  Validation is similar to running your documents through a spell checker for errors, ensuring that the data sent to the web browsers is well formed and syntactically correct.
</p>
<p><span id="more-9"></span></p>
<h3>Why does it matter?</h3>
<p>
	Web browsers such as Internet Explorer and Mozilla Firefox are responsible for transforming the markup which describes your website into a graphical web page.  Writing code which conforms to the w3c&rsquo;s guidelines will ensure consistent rendering across browsers.  Invalid code, even though it may render correctly, is relying on error detection and correction by the browser.  In fact, it&rsquo;s very common for web browsers to render the same page differently, sometimes dramatically.
</p>
<p>
	It&rsquo;s also important to remember that all web browsers are not the same.  Internet Explorer and Mozilla Firefox are today&rsquo;s mainstream web browsers, but are rarely used by those with visual impairments.  Screen reading software, which translates computer content into audio, also reads the markup code.  Invalid markup is likely to be read incorrectly, leading to inaccessible websites for many disabled persons.
</p>
<h3>Content, not Presentation</h3>
<p>
	Despite it&rsquo;s reputation the past years, <abbr title="HyperText Markup Language">HTML</abbr> and <abbr title="Extensible HyperText Markup Language">XHTML</abbr> are used to describe content.  The markup language is designed for differentiating types of content (Headlines, paragraphs, lists, tables, etc&#8230;), but not for describing how the content should be displayed.  You should use <abbr title="HyperText Markup Language">HTML</abbr> to describe your content, and only your content.  Allow for presentational markup languages (like <abbr title="Cascading Style Sheets">CSS</abbr>) to describe how the content is presented.
</p>
<p>
	By keeping content, presentation and behavior independent from each other you also greatly simplify future maintenance tasks.  You can alter existing content and write new content without being burdened with how the content will be displayed and formatted.
</p>
<h3>It&rsquo;s the Law</h3>
<p>
	Accessibility is the law in many countries today.  You are legally obligated to ensure your websites content is accessible by all.
</p>
<h3>How To Validate</h3>
<p>
	Checking your website against the w3c&rsquo;s guidelines is easy.  Following the guidelines is not tremendously difficult, although it can require some patience.   The w3c has published a free tool for validation, and provides friendly descriptive errors when conditions are not met.  You can find this tool at <a href="http://validator.w3.org">their website</a>.</p>




	<a rel="nofollow" class="thickbox" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F&amp;title=Reasons%20to%20Validate&amp;bodytext=%0D%0A%09Validation%20is%20the%20process%20of%20ensuring%20that%20your%20web%20pages%20%28XHTML%2C%20XML%20and%20CSS%20files%29%20meet%20the%20standard%20set%20aside%20by%20the%20w3c%2C%20the%20organization%20responsible%20for%20these%20markup%20languages.%20%20Validation%20is%20similar%20to%20running%20your%20documents%20through%20a%20spell%20?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://delicious.com/post?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F&amp;title=Reasons%20to%20Validate&amp;notes=%0D%0A%09Validation%20is%20the%20process%20of%20ensuring%20that%20your%20web%20pages%20%28XHTML%2C%20XML%20and%20CSS%20files%29%20meet%20the%20standard%20set%20aside%20by%20the%20w3c%2C%20the%20organization%20responsible%20for%20these%20markup%20languages.%20%20Validation%20is%20similar%20to%20running%20your%20documents%20through%20a%20spell%20?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F&amp;t=Reasons%20to%20Validate?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F&amp;title=Reasons%20to%20Validate&amp;annotation=%0D%0A%09Validation%20is%20the%20process%20of%20ensuring%20that%20your%20web%20pages%20%28XHTML%2C%20XML%20and%20CSS%20files%29%20meet%20the%20standard%20set%20aside%20by%20the%20w3c%2C%20the%20organization%20responsible%20for%20these%20markup%20languages.%20%20Validation%20is%20similar%20to%20running%20your%20documents%20through%20a%20spell%20?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F&amp;title=Reasons%20to%20Validate?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://posterous.com/share?linkto=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F&amp;title=Reasons%20to%20Validate&amp;selection=%0D%0A%09Validation%20is%20the%20process%20of%20ensuring%20that%20your%20web%20pages%20%28XHTML%2C%20XML%20and%20CSS%20files%29%20meet%20the%20standard%20set%20aside%20by%20the%20w3c%2C%20the%20organization%20responsible%20for%20these%20markup%20languages.%20%20Validation%20is%20similar%20to%20running%20your%20documents%20through%20a%20spell%20?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/posterous.png" title="Posterous" alt="Posterous" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F&amp;title=Reasons%20to%20Validate?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.designinginteractive.com/feed/?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://www.sphere.com/search?q=sphereit:http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F&amp;title=Reasons%20to%20Validate?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/sphere.png" title="SphereIt" alt="SphereIt" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F&amp;title=Reasons%20to%20Validate" title="StumbleUpon"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/stumbleupon.png" title="StumbleUpon" alt="StumbleUpon" class="sociable-hovers" /></a>
	<a rel="nofollow" class="thickbox" href="http://technorati.com/faves?add=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F?TB_iframe=true&amp;height=500&amp;width=900"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/technorati.png" title="Technorati" alt="Technorati" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://www.tumblr.com/share?v=3&amp;u=http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F&amp;t=Reasons%20to%20Validate&amp;s=%0D%0A%09Validation%20is%20the%20process%20of%20ensuring%20that%20your%20web%20pages%20%28XHTML%2C%20XML%20and%20CSS%20files%29%20meet%20the%20standard%20set%20aside%20by%20the%20w3c%2C%20the%20organization%20responsible%20for%20these%20markup%20languages.%20%20Validation%20is%20similar%20to%20running%20your%20documents%20through%20a%20spell%20" title="Tumblr"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/tumblr.png" title="Tumblr" alt="Tumblr" class="sociable-hovers" /></a>
	<a rel="nofollow"  href="http://twitter.com/home?status=Reasons%20to%20Validate%20-%20http%3A%2F%2Fwww.designinginteractive.com%2Fcode%2Freasons-to-validate%2F" title="Twitter"><img src="http://www.designinginteractive.com/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://www.designinginteractive.com/design/ie8-trying-to-become-a-real-browser/' rel='bookmark' title='Permanent Link: IE8 &#8211; Trying to become a real browser?'>IE8 &#8211; Trying to become a real browser?</a></li>
<li><a href='http://www.designinginteractive.com/user-experience/functional-favicons/' rel='bookmark' title='Permanent Link: Functional Favicons'>Functional Favicons</a></li>
<li><a href='http://www.designinginteractive.com/code/unobtrusive-javascript-controversy/' rel='bookmark' title='Permanent Link: Unobtrusive Javascript Controversy'>Unobtrusive Javascript Controversy</a></li>
<li><a href='http://www.designinginteractive.com/user-experience/forget-about-the-fold/' rel='bookmark' title='Permanent Link: Forget about the Fold'>Forget about the Fold</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.designinginteractive.com/code/reasons-to-validate/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
