<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>John Dyer</title>
    <description>Technology and web development in curly bracket languages {Javascript, C#, ActionScript}</description>
    <link>http://johndyer.name/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.6.1.0</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://johndyer.name/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>My name</dc:creator>
    <dc:title>John Dyer</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/johndyer" /><feedburner:info uri="johndyer" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><media:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</media:keywords><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">Technology</media:category><itunes:owner><itunes:email>johndyer@gmail.com</itunes:email></itunes:owner><itunes:explicit>no</itunes:explicit><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><itunes:subtitle>Technology and web development in ASP.NET, Flash, and JavaScript</itunes:subtitle><itunes:category text="Technology" /><item>
      <title>Simple Cross-Browser HTML5 video with a single H.264 file and fallback options</title>
      <description>&lt;p&gt;At first glance, the promise of HTML5 &amp;lt;video&amp;gt; seems awesome. Just a simple&lt;/p&gt;
&lt;pre&gt;&amp;lt;video src="myvideo.mp4" controls&amp;gt;&amp;lt;/video&amp;gt;&lt;/pre&gt;
&lt;p&gt;and you're done right? Not quite. In reality there are all kinds of browser inconsistence that make this impossible. Here's a run down of the problems:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Older browsers don't support &amp;lt;video&amp;gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;Only the most recent versions of the big five (Firefox, Chrome, Safari, IE, Opera) support &amp;lt;video&amp;gt;, so you have to have a fallback solution of some kind if you want to use &amp;lt;video&amp;gt; and still support your audience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Newer browsers don't support the same codecs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sadly, different browsers support different codecs. H.264 works in Chrome, Safari, and IE9, while Firefox and Opera only support Ogg/Vorbis. All the major browser vendors have pledged support for Google's recently released &lt;a href="http://webmproject.blogspot.com/"&gt;WebM&lt;/a&gt; format, but this will take some time for the browers and encoding software to catch up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Fallback HTML requires multiple video files&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The most common solution offered is to use nested HTML to allow browsers that don't support &amp;lt;video&amp;gt; to fallback to flash. One of the best of these is called &lt;a href="http://camendesign.com/code/video_for_everybody"&gt;Video for Everybody&lt;/a&gt; and looks something like this:&lt;/p&gt;
&lt;pre&gt;&amp;lt;video&amp;gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;source src="myfile.mp4"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;source src="myfile.ogg"&amp;gt;&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;object src="flashplayer.swf?file=myfile.mp4"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;embed&amp;nbsp;src="flashplayer.swf?file=myfile.mp4"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/object&amp;gt;&lt;br /&gt;&amp;lt;/video&amp;gt;&lt;/pre&gt;
&lt;p&gt;This works in all browsers, but it has a major problem: &lt;strong&gt;You must have two video files&lt;/strong&gt;. If you attempt to use only MP4, Firefox on Opera will fail. If you remove the &amp;lt;source src="myfile.ogg"&amp;gt;, &lt;strong&gt;Firefox and Opera will not fallback to the Flash &amp;lt;object&amp;gt;&lt;/strong&gt;. They will just display a big, blank, black box with an X. The same goes if you only use OGG on browsers that don't support OGG, or attempt to use WebM.&lt;/p&gt;
&lt;p&gt;The HTML fallback mechanism only works if the browser doesn't understand the &amp;lt;video&amp;gt; tag. It doesn't work if it doesn't understand the &amp;lt;source&amp;gt; file. So if you want to only use one file, then you must use JavaScript.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A Simple JavaScript Solution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since I don't want to maintain two versions of every video, I need a way to fallback to Flash for non-H.264 browsers. Here's my simple solution using jQuery.&lt;/p&gt;
&lt;pre&gt;&amp;lt;video id="my-video"&amp;gt;
   &amp;lt;source src="myfile.mp4" type="video/mp4"&amp;gt;
&amp;lt;/video&amp;gt;

&amp;lt;script&amp;gt;
(function() {
  var video = document.createElement("video");
  if ( typeof(video.canPlayType) == 'undefined' || // detect browsers with no &amp;lt;video&amp;gt; support
       video.canPlayType('video/mp4') == '') { // detect the ability to play H.264/MP4

       var video = $('#my-video');
       var videoUrl = video.find('source').attr('src');
       var flashUrl = '/flash/myplayer.swf';

       // create flash        
       var flash = '&amp;lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ' +
				'	codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" ' +
				'	width="' + video.width() + '" height="' + video.height() + '" id="fallbackplayer"&amp;gt;' +
				'		&amp;lt;param name="allowfullscreen" value="true" /&amp;gt; ' +
				'		&amp;lt;param name="movie" value="' + flashUrl + '?mediaUrl=' + videoUrl + '" /&amp;gt; ' +
				'		&amp;lt;embed id="dtsplayer" width="' + video.width() + '" height="' + video.height() + '" allowfullscreen="true" allowscriptaccess="always" ' +
				'			quality="high" name="fallbackplayer" ' +&lt;br /&gt;				'			src="' + flashUrl + '?mediaUrl=' + videoUrl + '" ' +
				'			type="application/x-shockwave-flash" /&amp;gt; ' +
				'&amp;lt;/object&amp;gt;';
        
        // insert flash and remove video
        video.before(flash);
        video.detach();
  }
})();
&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;The code is fairly simple. It just checks if the browser understands the &amp;lt;video&amp;gt; tag by checking for the "canPlayType" function, then it uses canPlayType to determine if the browser can play an H.264/MP4. If not, it inserts Flash as a fallback.&lt;/p&gt;
&lt;p&gt;Please note: This is a simplified script for example purposes only. It needs flash version detection, and it should be turned into a jQuery extension, but it should still be a nice guide for&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/3HIfjni6kdM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/3HIfjni6kdM/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Simple-Cross-Browser-H264-video-in-HTML5.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=7102eb9c-e1ed-4226-aefe-83ec89d024ad</guid>
      <pubDate>Sun, 06 Jun 2010 01:32:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=7102eb9c-e1ed-4226-aefe-83ec89d024ad</pingback:target>
      <slash:comments>36</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=7102eb9c-e1ed-4226-aefe-83ec89d024ad</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Simple-Cross-Browser-H264-video-in-HTML5.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=7102eb9c-e1ed-4226-aefe-83ec89d024ad</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=7102eb9c-e1ed-4226-aefe-83ec89d024ad</feedburner:origLink></item>
    <item>
      <title>Purple CMS - Now on Github</title>
      <description>&lt;p&gt;A few months ago, I put out a &lt;a href="http://johndyer.name/post/Purple-CMS-Super-Early-Alpha.aspx"&gt;preview of a ASP.NET 4.0 CMS&lt;/a&gt; called "Purple" (named for the official color of Dallas Theological Seminary).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I'm now pushing updates to Github, so if you're interested go grab a copy here&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;a href="http://github.com/johndyer/purple"&gt;http://github.com/johndyer/purple&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;About Purple&lt;/h3&gt;
&lt;p&gt;Purple is a CMS that uses .NET's URL Routing to quickly create a website using normal .NET tools like Masterpages and ASCX controls. It has versioning controls for every page and allows you to edit in page rather than through a backend editing area and stores everything in either XML or SQL for rapid development.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/JxIpXUj88Zk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/JxIpXUj88Zk/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Purple-CMS-Now-on-Github.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=46e6e7e7-6f8d-4f90-a653-64f233cc23ca</guid>
      <pubDate>Fri, 07 May 2010 16:50:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=46e6e7e7-6f8d-4f90-a653-64f233cc23ca</pingback:target>
      <slash:comments>29</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=46e6e7e7-6f8d-4f90-a653-64f233cc23ca</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Purple-CMS-Now-on-Github.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=46e6e7e7-6f8d-4f90-a653-64f233cc23ca</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=46e6e7e7-6f8d-4f90-a653-64f233cc23ca</feedburner:origLink></item>
    <item>
      <title>&lt;table&gt; to JSON</title>
      <description>&lt;p&gt;I am updating a tool that allows users to customize a large data table to their needs. It's sort of like a progressive insurance for seminaries in that it helps students compare information on about 30 US seminaries so they can make an informed decision about where to go.&lt;/p&gt;
&lt;p&gt;My initial approach when I built it 4-5 years ago was to embed JSON data in the HTML page and then use JavaScript to convert that JSON data into a table based on the user's choices.&lt;/p&gt;
&lt;p&gt;But there are a few problems with this approach.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The data is not accessible to screen readers.&lt;/li&gt;
&lt;li&gt;The data is not accessible to those without JavaScript&lt;/li&gt;
&lt;li&gt;Embedding a lot of JSON data in an HTML page isn't a very good idea. It should be a separate cached .js file, but I can't do
&lt;script src="http://johndyer.name/editors/tiny_mce3/themes/advanced/langs/en.js" type="text/javascript"&gt;&lt;/script&gt;
that since the data often changes and it still wouldn't address #1 and #2&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So I've decided in the new version to start with a large &amp;lt;table&amp;gt; and then turn that table into JSON data using the &amp;lt;thead&amp;gt; region as the JSON labels. Then I can take that data and customize it based on the user's choices. Interestingly the overall data size is a bit smaller since writing a &amp;lt;td&amp;gt; and &amp;lt;/td&amp;gt; for each peice of information is actually smaller than writing the header name and quotes over and over.&lt;/p&gt;
&lt;p&gt;Here's the simple table to JSON code. It assumes the first row is has header names and removes spaces and lower cases it.&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre&gt;function tableToJson(table) {
	var data = [];
	
	// first row needs to be headers
	var headers = [];
	for (var i=0; i&amp;lt;table.rows[0].cells.length; i++) {
		headers[i] = table.rows[0].cells[i].innerHTML.toLowerCase().replace(/ /gi,'');
	}
	
	// go through cells
	for (var i=1; i&amp;lt;table.rows.length; i++) {
		
		var tableRow = table.rows[i];
		var rowData = {};
		
		for (var j=0; j&amp;lt;tableRow.cells.length; j++) {
			
			rowData[ headers[j] ] = tableRow.cells[j].innerHTML;
		
		}
		
		data.push(rowData);
	}		
	
	return data;
}
&lt;/pre&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Below are links to the two pages for comparison. Please note that the site where the "new" page is is still a work in progress and won't be launched for a month or two.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Old:&amp;nbsp;&lt;a href="http://www.dts.edu/admissions/feesandexpenses/seminarycomparison/"&gt;http://www.dts.edu/admissions/feesandexpenses/seminarycomparison/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;New:&amp;nbsp;&lt;a href="http://new.dts.edu/resources/seminarycomparison"&gt;http://new.dts.edu/resources/seminarycompariso&lt;/a&gt;n/&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/4pyuHBojvOs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/4pyuHBojvOs/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/table-tag-to-json-data.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=8fa09a2f-5aaf-445e-831d-022a7b9addbc</guid>
      <pubDate>Wed, 05 May 2010 16:19:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=8fa09a2f-5aaf-445e-831d-022a7b9addbc</pingback:target>
      <slash:comments>17</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=8fa09a2f-5aaf-445e-831d-022a7b9addbc</trackback:ping>
      <wfw:comment>http://johndyer.name/post/table-tag-to-json-data.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=8fa09a2f-5aaf-445e-831d-022a7b9addbc</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=8fa09a2f-5aaf-445e-831d-022a7b9addbc</feedburner:origLink></item>
    <item>
      <title>HTML5 Video Player with Slides and Transcript</title>
      <description>&lt;p&gt;A few weeks ago I created an HTML5 version of DTS's online video player application. A few years ago, when Flash 9 enabled H.264 playback, we switched all of our video from the FLV format to MP4s encoded with the H.264 codec so that our videos could work on as many places as possible, especially Apple's iPod and iPhone.&lt;/p&gt;
&lt;p&gt;I didn't initially plan to work the the HTML5 &amp;lt;video&amp;gt; tag because of all the browser support and formatting issues, but with the advent of the iPad and IE9's support for H.264 it makes sense to start using it. I wish that Firefox would support H.264 as well or at least fall back helpfully, but until it does, we will only support Webkit and IE9.&lt;/p&gt;
&lt;h3&gt;The Player&lt;/h3&gt;
&lt;p&gt;The player begins in a landscape format with a small video frame and larger slides, but it can also switch to portrait mode and an alternate layout by clicking on the buttons in the lower right. On an iPad, it automatically sense the orientation and rotates accordingly.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://johndyer.name/image.axd?picture=2010%2f4%2fhtml5player-landscape.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Portrait Version&lt;/p&gt;
&lt;p&gt;&lt;img src="http://johndyer.name/image.axd?picture=2010%2f4%2fhtml5-player-portrait.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;The Code&lt;/h3&gt;
&lt;p&gt;To code the player, I build a generic &lt;strong&gt;MediaPlayer&lt;/strong&gt;&amp;nbsp;JavaScript object which&amp;nbsp;abstracts out several HTML5 JavaScript APi methods and events. Other than handling &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#mediaevents"&gt;HTML5 Media Events&lt;/a&gt;, the main thing it does is store and fire Time Cue events much like Flash's MediaPlayer API (see &lt;a href="http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;amp;file=00002981.html"&gt;addASCuePoint&lt;/a&gt;). This allows me to add events for syncing the transcript and slides and also handling the UI for controls.&amp;nbsp;On top of the core MediaPlayer object, I built a&amp;nbsp;&lt;span style="white-space: pre-wrap;"&gt;&lt;strong&gt;DtsController&lt;/strong&gt; which handles choosing a class and building the visual environment for slides and transcript. The timing code looks like this:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;player.addCuePoint('event-title', 66); player.addEventListener('cuepoint', function (e) {    console.log('fired', e.name, e.time); });&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;To keep it relatively lightweight, I didn't use a library like jQuery, but instead used HTML5's document.querySelector and some custom animation methods to achieve the scrolling and fading effects. I only wish it were as elegant as &lt;a href="http://github.com/madrobby/emile"&gt;Thomas Fuch's emile&lt;/a&gt; library.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Try it Out&lt;/h3&gt;
&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;If you're interested in the player or the code head to (using a WebKit browser like Safari or Chrome) &lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;strong&gt;&lt;a href="http://my.dts.edu/player-html5"&gt;http://my.dts.edu/player-html5&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Hopefully, the next preview of IE9 will enable the HTML5 &amp;lt;video&amp;gt; tag and let me clean it up for the final version of IE9. Once that happens, we'll abandon the Flash version of the player and go completely HTML5.&lt;/span&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/WpsHEnHVskY" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/WpsHEnHVskY/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/HTML5-Video-Player-with-Slides-and-Transcript.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=8e091c9e-11dc-4675-90a3-fea1e2ae5f67</guid>
      <pubDate>Mon, 26 Apr 2010 16:34:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=8e091c9e-11dc-4675-90a3-fea1e2ae5f67</pingback:target>
      <slash:comments>27</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=8e091c9e-11dc-4675-90a3-fea1e2ae5f67</trackback:ping>
      <wfw:comment>http://johndyer.name/post/HTML5-Video-Player-with-Slides-and-Transcript.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=8e091c9e-11dc-4675-90a3-fea1e2ae5f67</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=8e091c9e-11dc-4675-90a3-fea1e2ae5f67</feedburner:origLink></item>
    <item>
      <title>Purple CMS - Super Early Alpha (0.1)</title>
      <description>&lt;p&gt;A few years ago, I built a CMS for&amp;nbsp;&lt;a href="http://www.dts.edu/"&gt;Dallas Theological Seminary&lt;/a&gt;&amp;nbsp;that has served us pretty well. It has some features we really wanted, but to get them I had to hack up the ASP.NET 2.0 page life cycle to get it to work. With ASP.NET 4.0, a lot of what I did is much easier and can be done "normally" instead of with things that felt like hacks.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Project Requirements&lt;/h3&gt;
&lt;p&gt;Different projects require different kinds of CMS packages, but here were my requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Extensionless URLs (no .aspx on the end of URLs)&lt;/strong&gt;&amp;nbsp;- this was harder in ASP.NET 2.0, but in ASP.NET 4.0 especially on IIS7 this is much easier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Normal Masterpages&lt;/strong&gt;&amp;nbsp;- I don't want a special, proprietary template engine. I just want to use normal ASP.NET features so that people can work on the site without learning an new language and use Visual Studio if they want.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebForms and *.ascx Controls&lt;/strong&gt;&amp;nbsp;- I love using MVC on certain projects, but for a site with lots of pages (DTS has around 1000 pages), I need to be able to use simple *.ascx controls. We have lots of pages with various repeaters and forms to fill out and using MVC controllers for each it too much to maintain. Personally I like &amp;lt;script runat="server"&amp;gt; rather than codebehind or codebeside so we can keep a site agile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not require &amp;lt;form runat="server"&amp;gt;&lt;/strong&gt;&amp;nbsp;- A lot of pages with plain HTML or just a &amp;lt;asp:repeater&amp;gt; don't need viewstate, so there is no need to have ASP.NET form on every page. The CMS is smart enough to wrap content in &amp;lt;form runat="server"&amp;gt; if needed, but not otherwise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No takeover&amp;nbsp;&lt;/strong&gt;- The CMS can't take over the entire site and not allow other normal ASP.NET functionality like pages (*.aspx) and handlers (*.ashx).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;In page editing&lt;/strong&gt;&amp;nbsp;- This isn't really a requirement, but I like being able to edit a page in place rather than have to go to a separate admin area.&amp;nbsp;&lt;br /&gt;&lt;img style="border: 0px initial initial;" src="http://johndyer.name/image.axd?picture=2010%2f3%2fpurple-cms-edit-page.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Click "edit" and then you go to:&lt;br /&gt;&lt;br /&gt;&lt;img style="border: 0px initial initial;" src="http://johndyer.name/image.axd?picture=2010%2f3%2fpurple-cms-edit-mode.jpg" alt="" /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Page versioning&lt;/strong&gt;&amp;nbsp;- Of course we need to be able to rollback to a previous version. Nothing too complex, just a list of revisions with dates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XML or SQL&lt;/strong&gt;&amp;nbsp;- A nice CMS shouldn't have to use SQL for a 10 pages site. For now, XML is the default.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Permissions&lt;/strong&gt;&amp;nbsp;-&amp;nbsp;We don't need a complex workflow, but we need to be able to specify a role for super admin and a role for users who can be assigned edit access to special pages. It needs to work with ASP.NET Membership and Roles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redirects&lt;/strong&gt;&amp;nbsp;- A small feature, but we use a lot of vanity URLs in print advertisements that need to go somewhere else (www.dts.edu/thm -&amp;gt; www.dts.edu/admissions/degrees/thm)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complex URL handling&lt;/strong&gt;&amp;nbsp;- I also want to be able to create a page that has wildcard handling for all sub pages. For example, I want a page that lists a faculty (www.dts.edu/about/faculty) but can also handle and sub pages and show an individual faculty member (www.dts.edu/about/faculty/dbock). This also allows things like blogs or forums if someone wanted to make those.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Download Purple CMS 0.1&lt;/h3&gt;
&lt;p&gt;I've put up a very rough demo you can try out. The permissions, redirects, and "complex URL handling" are not yet finished in this build, but the main ability to use masterpages, controls, and edit pages with HTML is in the demo. It looks just like the default ASP.NET site and allows you to login and edit pages.&lt;/p&gt;
&lt;p&gt;To use it, you'll need Visual Studio .NET 2010 RC and .NET 4.0 RC. Just unzip the file, run the solution, and hit "Debug" or point your local IIS to the website folder and select "ASP.NET 4.0" it's Application Pool.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://johndyer.name/file.axd?file=2010%2f3%2fPurpleCMS.zip"&gt;Download Purple CMS 0.1 (995 KB)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me know what you think.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/Aaizyz-1Ya8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/Aaizyz-1Ya8/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Purple-CMS-Super-Early-Alpha.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=f844006a-f6ca-4f22-b9e1-5a45ae168ea8</guid>
      <pubDate>Wed, 03 Mar 2010 17:00:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=f844006a-f6ca-4f22-b9e1-5a45ae168ea8</pingback:target>
      <slash:comments>58</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=f844006a-f6ca-4f22-b9e1-5a45ae168ea8</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Purple-CMS-Super-Early-Alpha.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=f844006a-f6ca-4f22-b9e1-5a45ae168ea8</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=f844006a-f6ca-4f22-b9e1-5a45ae168ea8</feedburner:origLink></item>
    <item>
      <title>Experimenting with Web SQL databases</title>
      <description>&lt;p&gt;&amp;amp;&lt;/p&gt;
&lt;h3&gt;What is Web SQL?&lt;/h3&gt;
&lt;p&gt;Web SQL (&lt;a href="http://www.w3.org/TR/webdatabase/"&gt;http://www.w3.org/TR/webdatabase/&lt;/a&gt;) is proposed technology that allows a small SQL database to reside inside a browser. Instead of making AJAX calls back and forth from server to client whenever any information is needed, the data is stored locally in the browser so it can be quickly queried and used. Web SQL is&amp;nbsp;not technically part of HTML5, but it is part of a group of technology suggestions for the future of the web.&lt;/p&gt;
&lt;p&gt;Currently, Web SQL is only implemented in WebKit based browsers (Safari, Chrome, iPhone) and beta versions of Opera. Google Gears also had a local database implementation, but Google &lt;a href="http://gearsblog.blogspot.com/2010/02/hello-html5.html"&gt;Gears is being discontinued&lt;/a&gt; in favor of HTML5.&lt;/p&gt;
&lt;h3&gt;How Does Web SQL Work?&lt;/h3&gt;
&lt;p&gt;HTML5 Doctor has a &lt;a href="http://html5doctor.com/introducing-web-sql-databases/"&gt;great article on using Web SQL&lt;/a&gt;, so I'll only repeat a small code sample.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;// create/open database&lt;br /&gt;var db = openDatabase('mydb', '1.0', 'my first database', 2 * 1024 * 1024);&lt;br /&gt;&lt;br /&gt;// start transaction, create table, insert data&lt;br /&gt;db.transaction(function (tx) {&lt;br /&gt;
&lt;script src="http://johndyer.name/editors/tiny_mce3/themes/advanced/langs/en.js" type="text/javascript"&gt;&lt;/script&gt;
amp;nbsp;&amp;nbsp;tx.executeSql('CREATE TABLE IF NOT EXISTS foo (id unique, text)');&lt;br /&gt;&amp;nbsp;&amp;nbsp;tx.executeSql('INSERT INTO foo (id, text) VALUES (1, "synergies")');&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// query the data&lt;br /&gt;db.transaction(function (tx) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;tx.executeSql('SELECT * FROM foo', [], function (tx, results) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;var len = results.rows.length, i;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i = 0; i &amp;lt; len; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;alert(results.rows.item(i).text);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;});&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;A Giant Web SQL example&lt;/h3&gt;
&lt;p&gt;Web SQL is great for small amounts of data. The Webkit team has a sample which creates and stores notes (&lt;a href="http://webkit.org/demos/sticky-notes/index.html"&gt;http://webkit.org/demos/sticky-notes/index.html&lt;/a&gt;), while HTML5 doctor stores recent tweets (&lt;a href="http://html5demos.com/database"&gt;http://html5demos.com/database&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I wanted to load a lot more data to see what the performance would be, so I decided to load the entire Greek New Testament which is around 170,000 words along with its morphology information (part of speech, declension, etc.). It attempts to load entire books at a time and then allow you to pull up a chapter. You can also click on a word and see every time it is use in the Greek Bible.&amp;nbsp;Once the database is loaded, you can come back to the site at any time and never have to reload the database. It will always be there in your browser.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Try it out:&lt;/p&gt;
&lt;p style="font-size: 150%;"&gt;&lt;a href="http://biblewebapp.com/websql/"&gt;&lt;strong&gt;The Greek New Testament in Web SQL&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gotchas: &lt;/strong&gt;The database is a little over 5MB which breaks the limit in Google Chrome. Safari will ask you if you want to increase the storage, but it will also stop the loading processing while it waits for the user to respond. If you use Safari, you can click the "Toggle DB Admin" then click "Delete all" and then "Load all" to clear out and then reload the entire database.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/C__cnGKSaL0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/C__cnGKSaL0/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Experimenting-with-Web-SQL-databases.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=942562f1-1a9f-4917-b780-55028c5221ae</guid>
      <pubDate>Sat, 27 Feb 2010 17:05:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=942562f1-1a9f-4917-b780-55028c5221ae</pingback:target>
      <slash:comments>55</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=942562f1-1a9f-4917-b780-55028c5221ae</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Experimenting-with-Web-SQL-databases.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=942562f1-1a9f-4917-b780-55028c5221ae</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=942562f1-1a9f-4917-b780-55028c5221ae</feedburner:origLink></item>
    <item>
      <title>Optimizing CSS with Base64 Embedded Images (with Bonus Utility!)</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As I design a new site (&lt;a href="http://www.dts.edu/"&gt;current site&lt;/a&gt; | &lt;a href="http://www.dts.edu/dts7/"&gt;early demo of new site&lt;/a&gt;), I am working through what combination of technologies (CDN, sprites, caching, gzipping, etc.) we want to use to optimize it. One tool I&amp;rsquo;m looking at is embedding images in CSS with base64 strings. Instead of the browser needing to make several calls, one for the CSS file and then one for each image, base64 embedding means that all of the images are embedded within the CSS file itself.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s great for small images or images that only show up on :hover or mouseover and you don't want there to be any delay in the image appearing. Here&amp;rsquo;s what it looks like:&lt;/p&gt;
&lt;h3&gt;Normal CSS&lt;/h3&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;.myclass {&lt;br /&gt;    width: 45px;&lt;br /&gt;    background: transparent url(myimage.jpg) top left no-repeat;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;CSS with Base64 Embedded Image&lt;/h3&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;.myclass {&lt;br /&gt;    width: 45px;&lt;br /&gt;    background: transparent url(data:image/png;base64,LONG-STRING-OF-BASE64-TEXT) top left no-repeat;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Problems with Base64&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Works in all browsers except IE6 and IE7&lt;/strong&gt;. Solution: use a conditional comments to give IE6/7 a stylesheet that still references the images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Base64 is bigger than real images&lt;/strong&gt;: In my tests a base64 encoded string image is somewhere around 150% the size of a regular image. This means it&amp;rsquo;s unusable for large images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hard to manage&lt;/strong&gt;: If you change the image, you&amp;rsquo;ll need to reembed the base64 string. You also have to maitain a separate IE stylesheet.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;How to manage it&lt;/h3&gt;
&lt;p&gt;To help figure out which images were worth embedded and help
&lt;script src="http://johndyer.name/editors/tiny_mce3/themes/advanced/langs/en.js" type="text/javascript"&gt;&lt;/script&gt;
manage it, I developed a small utility that analyzes a CSS file and allows you to select which images you want to embed. You can also preselect them by adding a comment somewhere within your CSS declaration that says &lt;code&gt;/*embed*/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://johndyer.name/image.axd?picture=2010%2f1%2fCSSembedder.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;What It Does&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Finds all image URLs in your CSS file (note: no CSS3 multiples or borders)&lt;/li&gt;
&lt;li&gt;Shows the size difference between the image and the base64 string&lt;/li&gt;
&lt;li&gt;Shows the final size output size and the GZipped size for comparison to the original&lt;/li&gt;
&lt;li&gt;Removes comments and whitespace if you want&lt;/li&gt;
&lt;li&gt;Creates a new base64 stylesheet and a IE6/7 stylesheet with references to the original image&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Download&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a href="http://johndyer.name/file.axd?file=2010%2f1%2fCssImageEmbedder.zip"&gt;CssImageEmbedder.zip (9.55 kb)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Requires: .NET Framework (sorry! It was just faster than doing it in AIR)&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/n85beg_SItc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/n85beg_SItc/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Optimizing-CSS-with-Base64-Embedded-Images-with-Bonus-Utility.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=ad366e41-7b6b-4ff2-8178-0897d216e5ee</guid>
      <pubDate>Tue, 26 Jan 2010 18:42:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=ad366e41-7b6b-4ff2-8178-0897d216e5ee</pingback:target>
      <slash:comments>56</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=ad366e41-7b6b-4ff2-8178-0897d216e5ee</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Optimizing-CSS-with-Base64-Embedded-Images-with-Bonus-Utility.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=ad366e41-7b6b-4ff2-8178-0897d216e5ee</wfw:commentRss>
    <enclosure url="http://johndyer.name/file.axd?file=2010%2f1%2fCssImageEmbedder.zip" length="9778" type="application/octet-stream" /><media:content url="http://johndyer.name/file.axd?file=2010%2f1%2fCssImageEmbedder.zip" fileSize="9778" type="application/octet-stream" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> &amp;nbsp; As I design a new site (current site | early demo of new site), I am working through what combination of technologies (CDN, sprites, caching, gzipping, etc.) we want to use to optimize it. One tool I&amp;rsquo;m looking at is embedding images in CSS w</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> &amp;nbsp; As I design a new site (current site | early demo of new site), I am working through what combination of technologies (CDN, sprites, caching, gzipping, etc.) we want to use to optimize it. One tool I&amp;rsquo;m looking at is embedding images in CSS with base64 strings. Instead of the browser needing to make several calls, one for the CSS file and then one for each image, base64 embedding means that all of the images are embedded within the CSS file itself. It&amp;rsquo;s great for small images or images that only show up on :hover or mouseover and you don't want there to be any delay in the image appearing. Here&amp;rsquo;s what it looks like: Normal CSS .myclass { width: 45px; background: transparent url(myimage.jpg) top left no-repeat; } CSS with Base64 Embedded Image .myclass { width: 45px; background: transparent url(data:image/png;base64,LONG-STRING-OF-BASE64-TEXT) top left no-repeat; } Problems with Base64 Works in all browsers except IE6 and IE7. Solution: use a conditional comments to give IE6/7 a stylesheet that still references the images. Base64 is bigger than real images: In my tests a base64 encoded string image is somewhere around 150% the size of a regular image. This means it&amp;rsquo;s unusable for large images. Hard to manage: If you change the image, you&amp;rsquo;ll need to reembed the base64 string. You also have to maitain a separate IE stylesheet. How to manage it To help figure out which images were worth embedded and help manage it, I developed a small utility that analyzes a CSS file and allows you to select which images you want to embed. You can also preselect them by adding a comment somewhere within your CSS declaration that says /*embed*/ What It Does Finds all image URLs in your CSS file (note: no CSS3 multiples or borders) Shows the size difference between the image and the base64 string Shows the final size output size and the GZipped size for comparison to the original Removes comments and whitespace if you want Creates a new base64 stylesheet and a IE6/7 stylesheet with references to the original image Download Download CssImageEmbedder.zip (9.55 kb) Requires: .NET Framework (sorry! It was just faster than doing it in AIR) </itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=ad366e41-7b6b-4ff2-8178-0897d216e5ee</feedburner:origLink></item>
    <item>
      <title>Refactoring the JavaScript Color Picker - Step 1: Clean up the HTML and CSS</title>
      <description>&lt;p&gt;On of the most popular posts on this blog was a &lt;a href="http://johndyer.name/post/2007/09/PhotoShop-like-JavaScript-Color-Picker.aspx"&gt;color picker&lt;/a&gt; (&lt;a href="http://johndyer.name/lab/colorpicker/"&gt;demo&lt;/a&gt;) I created about 4 years ago and then released 2 years ago. It was based on the &lt;a href="http://prototypejs.com/"&gt;Prototype&lt;/a&gt; library which at the time was the only major mega-JavaScript library. Since then, others have ported the color picker to jQuery, MooTools, YUI, and other libraries, and it's popularity can be seen by searching for "&lt;a href="http://www.google.com/search?q=javascript+color+picker"&gt;javascript color picker&lt;/a&gt;" on Google.&lt;/p&gt;
&lt;h3&gt;The Original Color Picker (mimics Photoshop)&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://johndyer.name/lab/colorpicker/"&gt;&lt;img src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/JavaScriptPhotoShopColorPicker_8D6/CropperCapture%5B11%5D_1.png" alt="Color Picker Example" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Rebuilding Goals&lt;br /&gt;&lt;/h3&gt;
&lt;p&gt;If the original color picker was popular, it was because of it's functionality, not so much pretty code. So, I'd like to rebuild the color picker with a few goals in mind:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Be library independent - I'll have to add a little bit of extra code for things like event management, but this will allow it to work for everyone.&lt;/li&gt;
&lt;li&gt;Small and fast - The original JavaScript isn't too slow, but the color picker uses lots of separate images (27!). Originally, I hid these inside a &amp;lt;div&amp;gt; so that the browser would keep them cached, but I'd like to combine them into a few sprites to speed up the load time.&lt;/li&gt;
&lt;li&gt;Clean up the HTML/CSS - The original has a lot of inline styles and unnecessary complexity, making it ugly and unwieldy.&lt;/li&gt;
&lt;li&gt;Clean up the JavaScript - The original code separated out some functionality which makes it harder to figure out what's going on. I plan bring these together, so that I have one class for color conversion, one class for slider functionality, and one class for the color picker. The new code will also include code to function as a plugin to the major existing libraries (jQuery, Prototype, Mootools, YUI, etc.).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first big step is to clean up the HTML and CSS. To get a feel for the old HTML/CSS, check out the &lt;a href="http://johndyer.name/lab/colorpicker/"&gt;version 1 example&lt;/a&gt; page. Here's what I've come up with so far:&lt;/p&gt;
&lt;h3&gt;Color Picker CSS&lt;/h3&gt;
&lt;p&gt;.color-picker&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { border: 0; padding: 0; margin: 0; font-family: Tahoma; font-size: 12px;}&lt;br /&gt;.color-picker table, .color-picker td&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { border: 0; margin: 0; padding: 0; vertical-align: top;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;.color-picker label&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { margin: 4px 0; display: block;}&lt;br /&gt;.cp-container&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { position: relative; float: left; border: solid 1px #000; padding: 0px; }&lt;br /&gt;.cp-layer1, .cp-layer2, .cp-layer3, .cp-layer4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { display: block; position: absolute; top: 0px; left: 0px; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;.cp-map&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 256px; height: 256px; margin: 0px; }&lt;br /&gt;.cp-map div&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 256px; height: 256px; position: absolute; top: 0; left: 0; background: transparent url(maps.png) 0px 0px no-repeat;}&lt;br /&gt;.cp-bar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 20px; height: 256px; margin: 0px 9px;}&lt;br /&gt;.cp-bar div&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 20px; height: 256px; position: absolute; top: 0; left: 0; background: transparent url(bars.png) 0px 0px no-repeat;}&lt;br /&gt;.cp-preview&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 60px; height: 60px; padding: 0px; margin: 0px; border: solid 1px #000; }&lt;br /&gt;.cp-hsv, .cp-rgb&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 40px; }&lt;br /&gt;.cp-hex&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { width: 55px; }&lt;br /&gt;.cp-map-arrow&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { background: transparent url(map-arrow.gif) 0px 0px no-repeat; width: 40px; height: 9px; position: absolute;}&lt;br /&gt;.cp-bar-arrow&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { background: transparent url(bar-arrow.gif) 0px 0px no-repeat; width: 15px; height: 15px; position: absolute;}&lt;/p&gt;
&lt;h3&gt;Color Picker HTML&lt;/h3&gt;
&lt;p&gt;&amp;lt;div id="cp1" class="color-picker"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;table cellpadding="0"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-container cp-map"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-layer1"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-layer2"&amp;gt;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-container cp-bar"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-layer1"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-layer2"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-layer3"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-layer4"&amp;gt;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td valign="top"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;table&amp;gt;&amp;lt;tbody&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td colspan="3"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-preview"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type="radio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;H:&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input class="cp-hsv" type="text" /&amp;gt; &amp;amp;#176;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type="radio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;S:&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input class="cp-hsv" type="text" /&amp;gt; %&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type="radio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;B:&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input class="cp-hsv" type="text" /&amp;gt; %&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type="radio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;R:&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input class="cp-rgb" type="text" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type="radio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;G:&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input class="cp-rgb" type="text" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type="radio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;label&amp;gt;B:&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input class="cp-rgb" type="text" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;#&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td colspan="2"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input class="cp-hex" type="text" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-map-arrow"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="cp-slider-arrow"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;Cleanup Comments&lt;/h3&gt;
&lt;p&gt;To make it more readable, I've removed all the id attributes except for the single id on the containing div, taken out all inline styles, and moved the CSS to a separate file. I also changed the layers to &amp;lt;div&amp;gt; tags with background images instead of &amp;lt;img&amp;gt; tags. This may present some problems with IE6 opacity down the road, so I might need to change it back. I've also removed z-index values from the CSS to prevent problems with other JavaScript controls on the page. I was not careful with DOCTYPE in the past, but the new HTML and CSS should work in any DOCTYPE (I'll be using the HTML5 DOCTYPE in all the examples). Finally, the arrows are created using &amp;lt;div&amp;gt; that are inside the main block, which will make it easer to show and hide the entire color picker.&lt;/p&gt;
&lt;h3&gt;Bar Sprite&lt;br /&gt;&lt;/h3&gt;
&lt;p&gt;As a preview, I'm including the sprite for the value bar of the color picker. This combines 14 different bars into one 1.77KB file. Next time, we'll talk about memory consumption and sprites and see if the sprite usage is actually helpful.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://johndyer.name/file.axd?file=2009%2f11%2fbars.png" alt="new color bars sprite" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/5ykpKElEZJ4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/5ykpKElEZJ4/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/refactoring-the-javascript-color-picker-1-clean-up-the-html-and-css.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=3c1367a3-dffc-43c0-8c64-8071bb69f7a2</guid>
      <pubDate>Thu, 19 Nov 2009 20:03:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=3c1367a3-dffc-43c0-8c64-8071bb69f7a2</pingback:target>
      <slash:comments>27</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=3c1367a3-dffc-43c0-8c64-8071bb69f7a2</trackback:ping>
      <wfw:comment>http://johndyer.name/post/refactoring-the-javascript-color-picker-1-clean-up-the-html-and-css.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=3c1367a3-dffc-43c0-8c64-8071bb69f7a2</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=3c1367a3-dffc-43c0-8c64-8071bb69f7a2</feedburner:origLink></item>
    <item>
      <title>HTML5 (XHTML5) Validation Schema and Intellisense for Visual Studio 2008</title>
      <description>&lt;p&gt;I've been playing around with HTML5 (&lt;a href="http://www.smashingmagazine.com/2009/07/16/html5-and-the-future-of-the-web/"&gt;nice intro at Smashing Magazine&lt;/a&gt;) for a &lt;a href="http://biblewebapp.com/"&gt;side project&lt;/a&gt;, and I wanted Visual Studio 2008 to stop telling me the new elements were not valid. So I created a new Validation Schema for Visual Studio 2008 that implements much of the HTML5 spec. I found some hints on &lt;a href="http://blogs.msdn.com/mikhailarkhipov/archive/2006/02/01/522614.aspx"&gt;how to do this in Visual Studio 2005&lt;/a&gt; and went from there. Here's a pic of it in action giving you the attributes of of the new &amp;lt;source&amp;gt; tag under a new &amp;lt;video&amp;gt; tag:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://johndyer.name/image.axd?picture=2009%2f7%2fhtml5-vs2008.gif" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;Readme.txt&lt;br /&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;There is a lot of confusion about HTML, XHTML, and mime-types. I've chose to go with a stricter XML-like syntax of closed tags and quoted attributes, rather than the looser HTML, so I called it "XHTML 5" although that doesn't really make it offically XHTML 5 until you do the rest of the research, work, and fun.&lt;/li&gt;
&lt;li&gt;This is not a 100% perfect implementation. There are bound to be different interpretations of what's "correct" HTML5 and &lt;a href="http://www.webmonkey.com/blog/HTML_5_Won_t_Be_Ready_Until_2022DOT_Yes__2022DOT"&gt;you have until 2022 to get it right&lt;/a&gt;, so please don't worry about it too much.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What's Finished&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All the new elements in HTML5 have been added in the follow groupings          
&lt;ul&gt;
&lt;li&gt;structure: article, aside, footer, header, nav, section&lt;/li&gt;
&lt;li&gt;media: audio, video, source&lt;/li&gt;
&lt;li&gt;other: bb, canvas, command, datagrid, datalist, details, dialog, eventsource, figure, hgroup, keygen, mark, menu, meter, output, progress, time&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;When new elements have custom attributes (such as height and width for video, I've tried to add those)&lt;/li&gt;
&lt;li&gt;I've also changed a few things like not requiring the type attribute on script blocks and allowing meta tags to have a charset attribute&lt;/li&gt;
&lt;li&gt;I've begun adding HTML5 events (ondrag, onplay, etc.) but have not completed all of them&lt;/li&gt;
&lt;li&gt;I am not sure how to add HTML5 style data- attributes, so those won't validate yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How to Use it&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://johndyer.name/file.axd?file=xhtml5.xsd"&gt;&lt;strong&gt;Download XHTML Validation Schema for Visual Studio 2008&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Save it to C:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\schemas\html\&lt;/li&gt;
&lt;li&gt;Add the following to the Registry:&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Packages\{1B437D20-F8FE-11D2-A6AE-00104BCC7269}\Schemas\&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;Schema 23&lt;/strong&gt;&lt;/span&gt;]&lt;br /&gt;"Friendly Name"="XHTML 5"&lt;br /&gt;"URI"="&lt;a href="http://schemas.microsoft.com/intellisense/ie7"&gt;http://schemas.microsoft.com/intellisense/xhtml5&lt;/a&gt;"&lt;br /&gt;"File"="html\\xhtml5.xsd"&lt;br /&gt;&lt;br /&gt;Note that you might need to change "Schema 23" to something else if you already have other non-default schemas installed. You just need to use the next available number in the list.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I hope you find it helpful. Please let me know if you end up using it and feel free to suggest updates or corrections.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/tDdGuGjmM1I" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/tDdGuGjmM1I/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/HTML5-XHTML5-Validation-Schema-for-Visual-Studio-2008.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=f12bd758-0b8d-4ff1-abc7-6ee9e5fcc5bc</guid>
      <pubDate>Tue, 21 Jul 2009 20:46:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=f12bd758-0b8d-4ff1-abc7-6ee9e5fcc5bc</pingback:target>
      <slash:comments>80</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=f12bd758-0b8d-4ff1-abc7-6ee9e5fcc5bc</trackback:ping>
      <wfw:comment>http://johndyer.name/post/HTML5-XHTML5-Validation-Schema-for-Visual-Studio-2008.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=f12bd758-0b8d-4ff1-abc7-6ee9e5fcc5bc</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=f12bd758-0b8d-4ff1-abc7-6ee9e5fcc5bc</feedburner:origLink></item>
    <item>
      <title>MVC Edit View Template Upgrades</title>
      <description>&lt;p&gt;I’m building a new LMS using ASP.NET MVC and I am making heavy use of the &lt;a href="http://haacked.com/archive/2009/01/31/t4-templates-in-asp.net-mvc.aspx"&gt;View templates&lt;/a&gt; added in RC1. (see: &lt;a href="http://blogs.msdn.com/webdevtools/archive/2009/01/29/t4-templates-a-quick-start-guide-for-asp-net-mvc-developers.aspx"&gt;T4 Templates: A Quick-Start Guide for ASP.NET MVC Developers&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;I made a few changes to the default template to allow (1) table rows and cells instead of &amp;lt;p&amp;gt; tags, (2)add spaced to “ProperyName” so it looks like “Property Name”, and (3) use reflection to determine the &amp;lt;input&amp;gt; type generated by the Html helper. For all string Properties, a normal &amp;lt;input type=”text” /&amp;gt; is still generated, but for Int32, I am generating a &amp;lt;select&amp;gt; and for Booleans, a &amp;lt;input type=”checkbox” /&amp;gt; since these are the normal fields I use for forms.&lt;/p&gt;  &lt;p&gt;For an object that looks like this&lt;/p&gt;  &lt;pre class="prettyprint"&gt;&lt;blockquote&gt;public class Person {&lt;br /&gt;   public string FullName { get; set; }&lt;br /&gt;   public bool IsActive { get; set; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;/pre&gt;

&lt;p&gt;The default Edit View looks like this:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&amp;lt;p&amp;gt;&lt;br /&gt;    &amp;lt;label for=&amp;quot;FullName&amp;quot;&amp;gt;FullName:&amp;lt;/label&amp;gt;&lt;br /&gt;    &amp;lt;%= Html.TextBox(&amp;quot;FullName&amp;quot;) %&amp;gt;&lt;br /&gt;    &amp;lt;%= Html.ValidationMessage(&amp;quot;FullName&amp;quot;, &amp;quot;*&amp;quot;) %&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;    &amp;lt;label for=&amp;quot;CampusID&amp;quot;&amp;gt;IsActive:&amp;lt;/label&amp;gt;&lt;br /&gt;    &amp;lt;%= Html.TextBox(&amp;quot;IsActive&amp;quot;) %&amp;gt;&lt;br /&gt;    &amp;lt;%= Html.ValidationMessage(&amp;quot;IsActive&amp;quot;, &amp;quot;*&amp;quot;) %&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;/pre&gt;

&lt;p&gt;Here's what I wanted the Edit View to look like:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td class=&amp;quot;form-title&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;FullName&amp;quot;&amp;gt;&lt;strong&gt;Full Name&lt;/strong&gt;&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td class=&amp;quot;form-input&amp;quot;&amp;gt;&amp;lt;%= Html.TextBox(&amp;quot;FullName&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td class=&amp;quot;form-val&amp;quot;&amp;gt;&amp;lt;%= Html.ValidationMessage(&amp;quot;FullName&amp;quot;, &amp;quot;*&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td class=&amp;quot;form-title&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;Password&amp;quot;&amp;gt;Is Active&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td class=&amp;quot;form-input&amp;quot;&amp;gt;&amp;lt;%= Html.&lt;strong&gt;CheckBox&lt;/strong&gt;(&amp;quot;IsActive&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td class=&amp;quot;form-val&amp;quot;&amp;gt;&amp;lt;%= Html.ValidationMessage(&amp;quot;IsActive&amp;quot;, &amp;quot;*&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Here’s how I handled the different property types&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="2" width="442"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="132"&gt;&lt;strong&gt;Property Type&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="125"&gt;&lt;strong&gt;Html Helper&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="183"&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="132"&gt;String (and others)&lt;/td&gt;

      &lt;td valign="top" width="125"&gt;Html.TextBox&lt;/td&gt;

      &lt;td valign="top" width="183"&gt;&amp;lt;input type=&amp;quot;text&amp;quot; /&amp;gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="132"&gt;Boolean&lt;/td&gt;

      &lt;td valign="top" width="125"&gt;Html.CheckBox&lt;/td&gt;

      &lt;td valign="top" width="183"&gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; /&amp;gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="132"&gt;Int32&lt;/td&gt;

      &lt;td valign="top" width="125"&gt;Html.DropDownList&lt;/td&gt;

      &lt;td valign="top" width="183"&gt;&amp;lt;select&amp;gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;You can modify this easily in the code below to put whatever controls you want for each property type. To use the template, just create a folder in your project called CodeTemplates\AddView:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://johndyer.name/image.axd?picture=image.png" width="191" height="267" /&gt; &lt;/p&gt;

&lt;p&gt;Here is my are the parts of Edit.tt file that I updated:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&amp;lt;#
    &lt;br /&gt;if(!String.IsNullOrEmpty(mvcHost.ViewDataTypeGenericString)) {    &lt;br /&gt;    List&amp;lt;PropertyInfo&amp;gt; properties = new List&amp;lt;PropertyInfo&amp;gt;();
&lt;br /&gt;    FilterProperties(mvcHost.ViewDataType, properties);  &lt;br /&gt;#&amp;gt;    &lt;br /&gt;    &amp;lt;%= Html.ValidationSummary() %&amp;gt;     &amp;lt;% using (Html.BeginForm()) {%&amp;gt; &lt;p&gt;&lt;/p&gt;
&lt;br /&gt;        &amp;lt;table class=&amp;quot;form-admin&amp;quot;&amp;gt;    &lt;br /&gt;&amp;lt;#
&lt;br /&gt;    foreach(PropertyInfo pi in properties) {    &lt;br /&gt;#&amp;gt;
&lt;br /&gt;            &amp;lt;tr&amp;gt;    &lt;br /&gt;                &amp;lt;td class=&amp;quot;form-title&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;&amp;lt;#= pi.Name #&amp;gt;&amp;quot;&amp;gt;&amp;lt;#= FormatLabel(pi.Name) #&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;
&lt;br /&gt;                &amp;lt;td class=&amp;quot;form-input&amp;quot;&amp;gt;&amp;lt;%= Html.&amp;lt;#= GetInputType(pi) #&amp;gt;(&amp;quot;&amp;lt;#= pi.Name #&amp;gt;&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt;    &lt;br /&gt;                &amp;lt;td class=&amp;quot;form-val&amp;quot;&amp;gt;&amp;lt;%= Html.ValidationMessage(&amp;quot;&amp;lt;#= pi.Name #&amp;gt;&amp;quot;, &amp;quot;*&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt;
&lt;br /&gt;            &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;#    &lt;br /&gt;    }    &lt;br /&gt;#&amp;gt;  &lt;br /&gt;        &amp;lt;/table&amp;gt;  &lt;br /&gt;        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Save&amp;quot; /&amp;gt;    &lt;br /&gt;    &amp;lt;% } %&amp;gt; 
&lt;p&gt;&lt;/p&gt;&lt;br /&gt;    &amp;lt;div&amp;gt;   &lt;br /&gt;        &amp;lt;%=Html.ActionLink(&amp;quot;Back to List&amp;quot;, &amp;quot;Index&amp;quot;) %&amp;gt;    &lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;#+
    &lt;br /&gt;public string FormatLabel(string label) {    &lt;br /&gt;    return System.Text.RegularExpressions.Regex.Replace(label, &amp;quot;([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))&amp;quot;, &amp;quot;$1 &amp;quot;);
&lt;br /&gt;} &lt;p&gt;&lt;/p&gt;  &lt;br /&gt;public string GetInputType(PropertyInfo pi) {    &lt;br /&gt;    switch (pi.PropertyType.ToString()) {
    &lt;br /&gt;        case &amp;quot;System.Int32&amp;quot;:    &lt;br /&gt;        case &amp;quot;System.Int64&amp;quot;:    &lt;br /&gt;            return &amp;quot;DropDownList&amp;quot;;
    &lt;br /&gt;        case &amp;quot;System.Boolean&amp;quot;:    &lt;br /&gt;            return &amp;quot;CheckBox&amp;quot;;
    &lt;br /&gt;        case &amp;quot;System.String&amp;quot;:    &lt;br /&gt;        default:    &lt;br /&gt;            return &amp;quot;TextBox&amp;quot;;    &lt;br /&gt;    }    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void FilterProperties(Type type, List&amp;lt;PropertyInfo&amp;gt; properties) {     if(type != null) {    &lt;br /&gt;        PropertyInfo[] publicProperties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); 
  &lt;p&gt;&lt;/p&gt;&lt;br /&gt;        foreach (PropertyInfo pi in publicProperties)    &lt;br /&gt;        {    &lt;br /&gt;            if (IsBindableType(pi.PropertyType) &amp;amp;&amp;amp; pi.CanRead &amp;amp;&amp;amp; pi.CanWrite)    &lt;br /&gt;            {    &lt;br /&gt;                properties.Add(pi);    &lt;br /&gt;            }    &lt;br /&gt;        }    &lt;br /&gt;    }    &lt;br /&gt;} 
&lt;br /&gt;#&amp;gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Hope this is helpful to you!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/8u9E1qGndcI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/8u9E1qGndcI/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/MVC-Edit-View-Template-Upgrades.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=850950d3-72d6-47e2-885e-40cffbbb6d23</guid>
      <pubDate>Wed, 11 Mar 2009 22:11:23 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=850950d3-72d6-47e2-885e-40cffbbb6d23</pingback:target>
      <slash:comments>30</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=850950d3-72d6-47e2-885e-40cffbbb6d23</trackback:ping>
      <wfw:comment>http://johndyer.name/post/MVC-Edit-View-Template-Upgrades.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=850950d3-72d6-47e2-885e-40cffbbb6d23</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=850950d3-72d6-47e2-885e-40cffbbb6d23</feedburner:origLink></item>
    <item>
      <title>iTunesU Manager App Source Released</title>
      <description>&lt;p&gt;
A while back, I &lt;a href="http://johndyer.name/admin/pages/johndyer.name/post/2008/07/18/iTunesU-Site-Utility-in-C-(NET).aspx"&gt;created an iTunesU Manager application&lt;/a&gt; for &lt;a href="http://www.dts.edu/itunesu"&gt;DTS&amp;#39;s iTunesU site&lt;/a&gt;, and I finally got around to putting up the source code and executables. Below is a screenshot of the app and links to the Google code repository. The app requires .NET 2.0 (it&amp;#39;s written in C#) and an iTunesU administrative account. 
&lt;/p&gt;
&lt;img src="http://johndyer.name/image.axd?picture=itunesumanager.png" alt="iTunesU Manager" /&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://code.google.com/p/itunesumanager/"&gt;iTunesU Manager on Google Code&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://itunesumanager.googlecode.com/files/iTunesUManager-1-0.zip"&gt;Download iTunesU Manager 1.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/LlouFi9fA0I" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/LlouFi9fA0I/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/iTunesU-Manager-App-Source-Released.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=a0946430-50ae-4b1a-b4b7-45e961db15fe</guid>
      <pubDate>Fri, 20 Feb 2009 23:30:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=a0946430-50ae-4b1a-b4b7-45e961db15fe</pingback:target>
      <slash:comments>11</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=a0946430-50ae-4b1a-b4b7-45e961db15fe</trackback:ping>
      <wfw:comment>http://johndyer.name/post/iTunesU-Manager-App-Source-Released.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=a0946430-50ae-4b1a-b4b7-45e961db15fe</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=a0946430-50ae-4b1a-b4b7-45e961db15fe</feedburner:origLink></item>
    <item>
      <title>Nested Comments for BlogEngine.NET</title>
      <description>&lt;p&gt;There are some great changes coming for &lt;a href="http://www.dotnetblogengine.net/"&gt;BlogEngine.NET&lt;/a&gt; 1.5.0.0, and one of them is nested comments! I checked in the changes to &lt;a href="http://www.codeplex.com/blogengine"&gt;Codeplex&lt;/a&gt; just last night, and I’ve implemented them here as a demo while we hammer out the final details. &lt;/p&gt;  &lt;p&gt;Nested (or threaded) comments have been added to a lot of blog platforms lately (including WordPress 2.7), and it is a major feature of comment plugins like &lt;a href="http://www.disqus.com/"&gt;Disqus&lt;/a&gt; and &lt;a href="http://www.intensedebate.com/"&gt;Intense Debate&lt;/a&gt;. I personally think threaded comments make longer posts with lots of comments make a lot more sense. &lt;/p&gt;  &lt;p&gt;Here’s an example of how a the comments in a recent post of mine make a lot more sense after turning on nesting. Since I responded in bursts to comments, they were out of order, but with nesting you can see that my comment (in dark brown) are now contextually nested and make much more sense. (Note: To make this work, I had to go back and manually add the “parentid” attribute to my comments to make them nested.) &lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="550"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="275"&gt;         &lt;h3&gt;Before (not nested)&lt;/h3&gt;       &lt;/td&gt;        &lt;td valign="top" width="275"&gt;         &lt;h3&gt;After (nested)&lt;/h3&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="275"&gt;&lt;a href="http://johndyer.name/image.axd?picture=commments-flat-full.jpg"&gt;&lt;img title="Not nested" border="0" alt="Not nested" src="http://johndyer.name/image.axd?picture=comments-flat-thumb.jpg" width="150" /&gt;&lt;/a&gt; &lt;/td&gt;        &lt;td valign="top" width="275"&gt;&lt;a href="http://johndyer.name/image.axd?picture=commments-threaded-full.jpg"&gt;&lt;img title="Nested" border="0" alt="Not Nested" src="http://johndyer.name/image.axd?picture=comments-threaded-thumb.jpg" width="150" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;If you want to try it out, you can try it on this post or download the latest check-in from Codeplex. &lt;em&gt;Just be warned that this isn’t the final release&lt;/em&gt;. There may be some quirks in the JavaScript. &lt;/p&gt;  &lt;p&gt;To add nesting to your existing themes, you’ll need to add the following code (marked by HTML comments) from the Standard Theme: &lt;/p&gt;  &lt;pre class="prettyprint"&gt;&lt;p&gt;&amp;lt;div id=&amp;quot;id_&amp;lt;%=Comment.Id %&amp;gt;&amp;quot; class=&amp;quot;vcard comment&amp;lt;%= Post.Author.Equals(Comment.Author, StringComparison.OrdinalIgnoreCase) ? &amp;quot; self&amp;quot; : &amp;quot;&amp;quot; %&amp;gt;&amp;quot;&amp;gt;  &lt;br /&gt;  &amp;lt;p class=&amp;quot;date&amp;quot;&amp;gt;&amp;lt;%= Comment.DateCreated %&amp;gt; &amp;lt;a href=&amp;quot;#id_&amp;lt;%=Comment.Id %&amp;gt;&amp;quot;&amp;gt;#&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p class=&amp;quot;gravatar&amp;quot;&amp;gt;&amp;lt;%= Gravatar(80)%&amp;gt;&amp;lt;/p&amp;gt;  &lt;br /&gt;  &amp;lt;p class=&amp;quot;content&amp;quot;&amp;gt;&amp;lt;%= Text %&amp;gt;&amp;lt;/p&amp;gt;  &lt;br /&gt;  &amp;lt;p class=&amp;quot;author&amp;quot;&amp;gt;
    &amp;lt;%= Comment.Website != null ? &amp;quot;&amp;lt;a href=\&amp;quot;&amp;quot; + Comment.Website + &amp;quot;\&amp;quot; class=\&amp;quot;url fn\&amp;quot;&amp;gt;&amp;quot; + Comment.Author + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;lt;span class=\&amp;quot;fn\&amp;quot;&amp;gt;&amp;quot; +Comment.Author + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot; %&amp;gt;&lt;br /&gt;    &amp;lt;%= Flag %&amp;gt;&lt;br /&gt;    &amp;lt;%= ((BlogEngine.Core.BlogSettings.Instance.IsCommentNestingEnabled &amp;amp;&amp;amp; Comment.IsApproved) ? &amp;quot; | &amp;quot; : &amp;quot;&amp;quot;) %&amp;gt;&lt;br /&gt;    &amp;lt;%= ReplyToLink %&amp;gt; &amp;lt;!—- add this for reply to links –&amp;gt;&lt;br /&gt;    &amp;lt;%= AdminLinks %&amp;gt;&lt;br /&gt;  &amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;!—- Start: threading –&amp;gt;&lt;br /&gt;&amp;lt;div class=&amp;quot;comment-replies&amp;quot; id=&amp;quot;replies_&amp;lt;%=Comment.Id %&amp;gt;&amp;quot; &amp;lt;%= (Comment.Comments.Count == 0) ? &amp;quot; style=\&amp;quot;display:none;\&amp;quot;&amp;quot; : &amp;quot;&amp;quot; %&amp;gt;&amp;gt;&lt;br /&gt;  &amp;lt;asp:PlaceHolder ID=&amp;quot;phSubComments&amp;quot; runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;!—- End: threading –&amp;gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;Hope you like it, and let me know if you implement it on your site! &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/87nvkswb0tI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/87nvkswb0tI/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Nested-Comments-for-BlogEngineNET.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=eccff77c-3d24-47ca-96aa-af1c84738a3b</guid>
      <pubDate>Fri, 16 Jan 2009 21:03:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=eccff77c-3d24-47ca-96aa-af1c84738a3b</pingback:target>
      <slash:comments>153</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=eccff77c-3d24-47ca-96aa-af1c84738a3b</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Nested-Comments-for-BlogEngineNET.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=eccff77c-3d24-47ca-96aa-af1c84738a3b</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=eccff77c-3d24-47ca-96aa-af1c84738a3b</feedburner:origLink></item>
    <item>
      <title>Everyone&amp;rsquo;s Going &amp;ldquo;HD&amp;rdquo; (Sort of)</title>
      <description>&lt;p&gt;Last week, &lt;a href="http://www.techcrunch.com/2008/12/05/did-youtube-just-turn-on-hd-for-real/"&gt;YouTube made big news by introducing “HD” video&lt;/a&gt;, thought it’s unclear what YouTube’s definition of “HD” is. The video is certainly high&lt;strong&gt;&lt;em&gt;er&lt;/em&gt;&lt;/strong&gt; definition, but it’s certainly not 720p or 1080p which is technically what HD is supposed to be. It might be 480p which is what &lt;a href="http://www.hulu.com/"&gt;Hulu.com&lt;/a&gt; does for their high quality streams (and is also what the Wii ouputs).&lt;/p&gt;  &lt;p&gt;At DTS, we also recently revamped our videos to be “HD” (in the high&lt;strong&gt;&lt;em&gt;er&lt;/em&gt;&lt;/strong&gt; definition sense), moving to 480p in most cases.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;For &lt;a href="http://www.dts.edu/media/chapel/"&gt;chapels&lt;/a&gt; and &lt;a href="http://www.dts.edu/media/profiles/"&gt;profiles of students and alumni&lt;/a&gt;, we have moved from RMTP streamed 426x240 FLV videos to progressively downloaded 640x360 MP4 (H.264) videos using Amazon S3 (and soon, CloudFront) for video. &lt;/li&gt;    &lt;li&gt;For &lt;a href="http://www.dts.edu/onlineed/"&gt;online education&lt;/a&gt; we moved from 320x240 streamed FLVs to 640x480 MP4s also from Amazon (c.f. &lt;a href="http://johndyer.name/post/2008/06/02/Online-Education-Player-Design-Considerations.aspx"&gt;previous post on online education player design&lt;/a&gt;).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;We’ve also changed the player quite a bit. The old player had a lot of “chrome” around it and this new one is chromeless (ala Vimeo) and has the option to popout (similar to Hulu). Compare the old player below, with the new player showing two recent profiles, one of an alumnus and the other of a currents student who is also an NFL player.&lt;/p&gt;  &lt;h3&gt;Old player&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/EveryonesGoingHDSortof_AB19/image_2.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="350" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/EveryonesGoingHDSortof_AB19/image_thumb.png" width="492" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;New Embedded Player Samples&lt;/h3&gt;  &lt;p&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="640" height="360" id="dtsplayer"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="movie" value="http://media.dts.edu/embeddedplayer/?MediaItemID=7689a28b-ce17-4215-a0bc-eb7ebae1258f" /&gt;&lt;embed id="dtsplayer" width="640" height="360" allowfullscreen="true" allowscriptaccess="always" quality="high" name="dtsplayer" src="http://media.dts.edu/embeddedplayer/?MediaItemID=7689a28b-ce17-4215-a0bc-eb7ebae1258f" type="application/x-shockwave-flash" /&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="640" height="360" id="dtsplayer"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="movie" value="http://media.dts.edu/embeddedplayer/?MediaItemID=58ff0008-b980-4115-8efd-241b8099074e" /&gt;&lt;embed id="dtsplayer" width="640" height="360" allowfullscreen="true" allowscriptaccess="always" quality="high" name="dtsplayer" src="http://media.dts.edu/embeddedplayer/?MediaItemID=58ff0008-b980-4115-8efd-241b8099074e" type="application/x-shockwave-flash" /&gt;&lt;/object&gt;&lt;/p&gt;  &lt;h3&gt;Some Technical Information&lt;/h3&gt;  &lt;p&gt;This player needed to be able to play both MP4s for video and MP3s for audio. Unfortunately, Flash’s built-in video controls like PlayButton and Seekbar only work for video, and there is no way to use them for audio. I wrote a some wrapper classes that can handle both MP4/FLVs and MP3s and normalizes the event model so they can both be hooked to the same control UI. If we move back to streaming it should be easy to write another class for that and have it all “just work.”&lt;/p&gt;  &lt;p&gt;If anyone is interested in the source code, I’d be happy to publish it as an example of a Flash IDE AS3 video player that can also handle MP3s.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/LIwqVOfUmGk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/LIwqVOfUmGk/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/everyones-going-hd-sort-of.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=943816ab-3f87-4955-84bb-f66f1455fd44</guid>
      <pubDate>Mon, 08 Dec 2008 22:10:10 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=943816ab-3f87-4955-84bb-f66f1455fd44</pingback:target>
      <slash:comments>25</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=943816ab-3f87-4955-84bb-f66f1455fd44</trackback:ping>
      <wfw:comment>http://johndyer.name/post/everyones-going-hd-sort-of.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=943816ab-3f87-4955-84bb-f66f1455fd44</wfw:commentRss>
    <enclosure url="http://media.dts.edu/embeddedplayer/?MediaItemID=7689a28b-ce17-4215-a0bc-eb7ebae1258f" length="93613" type="application/x-shockwave-flash" /><media:content url="http://media.dts.edu/embeddedplayer/?MediaItemID=7689a28b-ce17-4215-a0bc-eb7ebae1258f" fileSize="93613" type="application/x-shockwave-flash" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Last week, YouTube made big news by introducing “HD” video, thought it’s unclear what YouTube’s definition of “HD” is. The video is certainly higher definition, but it’s certainly not 720p or 1080p which is technically what HD is supposed to be. It might</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> Last week, YouTube made big news by introducing “HD” video, thought it’s unclear what YouTube’s definition of “HD” is. The video is certainly higher definition, but it’s certainly not 720p or 1080p which is technically what HD is supposed to be. It might be 480p which is what Hulu.com does for their high quality streams (and is also what the Wii ouputs). At DTS, we also recently revamped our videos to be “HD” (in the higher definition sense), moving to 480p in most cases. For chapels and profiles of students and alumni, we have moved from RMTP streamed 426x240 FLV videos to progressively downloaded 640x360 MP4 (H.264) videos using Amazon S3 (and soon, CloudFront) for video. For online education we moved from 320x240 streamed FLVs to 640x480 MP4s also from Amazon (c.f. previous post on online education player design). We’ve also changed the player quite a bit. The old player had a lot of “chrome” around it and this new one is chromeless (ala Vimeo) and has the option to popout (similar to Hulu). Compare the old player below, with the new player showing two recent profiles, one of an alumnus and the other of a currents student who is also an NFL player. Old player New Embedded Player Samples Some Technical Information This player needed to be able to play both MP4s for video and MP3s for audio. Unfortunately, Flash’s built-in video controls like PlayButton and Seekbar only work for video, and there is no way to use them for audio. I wrote a some wrapper classes that can handle both MP4/FLVs and MP3s and normalizes the event model so they can both be hooked to the same control UI. If we move back to streaming it should be easy to write another class for that and have it all “just work.” If anyone is interested in the source code, I’d be happy to publish it as an example of a Flash IDE AS3 video player that can also handle MP3s.</itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=943816ab-3f87-4955-84bb-f66f1455fd44</feedburner:origLink></item>
    <item>
      <title>Technology Blog</title>
      <description>&lt;p&gt;I would like to keep this blog focused on technical developments and code samples, but a few recent posts have been showing I am growing in my interest for the philosophy behind technology. To keep the two interests separate, I’ve started a separate blog called&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://www.donteatthefruit.com"&gt;www.donteatthefruit.com&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It will be aimed at discussing the influence of technology on society and human relationships. Right now, I’m looking at Neil Postman’s “Five Things You Need to Know about Technological Change” as related to churches. &lt;/p&gt;  &lt;p&gt;Stay tuned to this blog for more technical developments!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/NT2SxC9ZQXc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/NT2SxC9ZQXc/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/dont-eat-the-fruit.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=73396d05-9d42-4e45-89f2-a7a6509b5adb</guid>
      <pubDate>Mon, 08 Dec 2008 21:56:29 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=73396d05-9d42-4e45-89f2-a7a6509b5adb</pingback:target>
      <slash:comments>11</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=73396d05-9d42-4e45-89f2-a7a6509b5adb</trackback:ping>
      <wfw:comment>http://johndyer.name/post/dont-eat-the-fruit.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=73396d05-9d42-4e45-89f2-a7a6509b5adb</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=73396d05-9d42-4e45-89f2-a7a6509b5adb</feedburner:origLink></item>
    <item>
      <title>PNG transparency in IE6 (without JavaScript)</title>
      <description>&lt;p&gt;As most of us know IE6 does not support PNGs with alpha transparency. We recently updated &lt;a href="http://www.dts.edu/"&gt;DTS’s site&lt;/a&gt; with some popups that have a drop shadow using PNG-24 images with alpha transparency. Here’s how it looks in IE6 compared to any modern browser (FF, IE7, Opera, Safari, Chrome, etc.). Notice the nasty blue border.&lt;/p&gt;  &lt;h3&gt;PNG-32 (problems in IE6)&lt;/h3&gt;  &lt;table cellspacing="0" cellpadding="2" width="600" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="300"&gt;         &lt;p align="center"&gt;IE6           &lt;br /&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_4.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="203" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_1.png" width="274" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="300"&gt;         &lt;p align="center"&gt;Correct Display           &lt;br /&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_6.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="209" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_2.png" width="267" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;I wish we could ignore IE6 users, but around 20% of our traffic still hasn’t upgraded, so we have to make it work for them. There are tons of &lt;a href="www.twinhelix.com/css/iepngfix/"&gt;JavaScript&lt;/a&gt; and &lt;a href="http://support.microsoft.com/kb/294714"&gt;CSS hacks&lt;/a&gt; out there to get IE6 to display PNGs with alpha transparency correctly, but we’re trying to avoid hacks whenever possible so as to not break things in the future. Also IE6’s filter technology can cause other problems. To fix this, I found a sweet “non-hack” solution on &lt;a href="http://www.sitepoint.com/blogs/2007/09/18/png8-the-clear-winner/"&gt;sitepoint which recommends using PNG-8 instead of PNG-24&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;To summarize the &lt;a href="http://en.wikipedia.org/wiki/Portable_Network_Graphics"&gt;article on PNG-8 and PNG-32&lt;/a&gt;.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="600" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="300"&gt;&lt;strong&gt;PNG-32&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="300"&gt;&lt;strong&gt;PNG-8&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="300"&gt;16.7 million colors (like a JPEG)&lt;/td&gt;        &lt;td valign="top" width="300"&gt;256 colors (like a GIF)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="300"&gt;alpha transparency, not just indexed (like GIF)&lt;/td&gt;        &lt;td valign="top" width="300"&gt;alpha transparency (just like PNG-32)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="300"&gt;doesn’t work in IE6&lt;/td&gt;        &lt;td valign="top" width="300"&gt;works in IE6 like a GIF (indexed transparency)&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;PNG-8 with alpha transparency (IE6 works, pretty much)&lt;/h3&gt;  &lt;p&gt;Here’s what the PNG8 looks like in IE6 on our site. Notice that the drop shadow is missing, but the transparency still remains.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="602" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="300"&gt;         &lt;p align="center"&gt;IE6           &lt;br /&gt;&amp;#160;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_8.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="198" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_3.png" width="280" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="300"&gt;         &lt;p align="center"&gt;Correct Display           &lt;br /&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_6.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="209" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_2.png" width="266" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Everything “works” for IE6 users even thought it’s a slightly downgraded experience since the shadow is missing. For us, this is preferable to using JavaScript or CSS hacks that could cause other problems with animation. Since this is a image that only needs 256 colors, the PNG-8 is the perfect solution that is win-win-win.&lt;/p&gt;  &lt;h3&gt;How to make Alpha PNG-8 Images&lt;/h3&gt;  &lt;p&gt;The problem with all of this is that there is only one program that can make this specific kind of PNG-8 – Adobe Fireworks. Photoshop can’t do it, and I’m not sure if any other graphics programs can either. Here’s a step by step for making the PNG-8&lt;/p&gt;  &lt;h4&gt;1. Open the PNG-32 (or photoshop file)&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_14.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="321" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_6.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;2. Change the Image Type to “PNG 8”&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_18.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="321" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_8.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;3. Change to “Alpha Transparency”, then click the “Rebuild” button &lt;/h4&gt;  &lt;p&gt;Now you will see the new color palette with alpha colors. IE6 will only display the solid colors, not the fully transparent (upper left) or semi-transparent (the three with inset clear boxes).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_20.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="321" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_9.png" width="504" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_12.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="321" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_5.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;4. Chose File-Export to save the PNG-8&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_10.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="316" alt="image" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/PNGtransparencyinIE6withoutJavaScript_E932/image_thumb_4.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And that’s it. It takes a little more time but has made our development easier and provides a more stable experience for users.&lt;/p&gt;  &lt;p&gt;Sources&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.sitepoint.com/blogs/2007/09/18/png8-the-clear-winner/"&gt;Sitepoint: PNG8 – The Clear Winner&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="www.sitepoint.com/blogs/2008/03/20/making-ie6-friendly-png8-images/"&gt;Sitepoint: Making ‘IE6-friendly’ PNG8 images&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/Rojy80187FQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/Rojy80187FQ/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/png-transparency-in-ie6-with-png8.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=6992ed09-1b72-498a-8f53-ba0323cb0ec3</guid>
      <pubDate>Wed, 03 Dec 2008 02:35:30 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=6992ed09-1b72-498a-8f53-ba0323cb0ec3</pingback:target>
      <slash:comments>55</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=6992ed09-1b72-498a-8f53-ba0323cb0ec3</trackback:ping>
      <wfw:comment>http://johndyer.name/post/png-transparency-in-ie6-with-png8.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=6992ed09-1b72-498a-8f53-ba0323cb0ec3</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=6992ed09-1b72-498a-8f53-ba0323cb0ec3</feedburner:origLink></item>
    <item>
      <title>Wii + Flash + Papervision3D + C# = Alumni World Map</title>
      <description>&lt;p&gt;The 2008 class gift for &lt;a href="http://www.dts.edu/"&gt;Dallas Seminary&lt;/a&gt; is supposed to be a large flat screen with a 3D world that shows where in the world DTS alumni are serving. The requirements were:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;The target OS is still unknown and I haven't done much native Windows or Mac 3D programming. This leads me to use Papervision in Flash which I know and is very easy to use.  &lt;li&gt;The data needs to be easily updatable. Rather than use a database, I built a flat file using a quick C# app that plots alumni by state and country and geocodes their location.  &lt;li&gt;At DTS, the Admissions and Alumni offices are nearby, so the application needs to be interesting to Admissions. Ever since my sweet wife got me a Nintendo Wii a few months ago, I've wanted an excuse to program with it. For this project I thought, What's more fun and interesting than controlling the globe with a Nintendo Wii controller?&lt;/li&gt;&lt;/ol&gt; &lt;h3&gt;Video Demo&lt;/h3&gt; &lt;p&gt;Here is a (low quality) video of an early version of the project that gives you an idea of what it's supposed to accomplish and look like. The first few seconds use mouse navigation, then it switches to WiiMote navigation.&lt;/p&gt; &lt;p&gt;&lt;div id="wiiflashworld_container" style="width:480px;height:380px;" class="flashVideo"&gt;
	
	&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
	   codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" 
	   width="480" height="380" id="wiiflashworld_obj" align="middle" flashvars="autostart=false&amp;file=http://johndyer.name/flashvideo/wiiflashworld.mp4&amp;image=http://johndyer.name/flashvideo/wiiflashworld.jpg"&gt;
	&lt;param name="allowScriptAccess" value="sameDomain" /&gt;
	&lt;param name="movie" value="http://johndyer.name/flashvideo/flvplayer.swf" /&gt;
	&lt;param name="quality" value="high" /&gt;
	&lt;param name="bgcolor" value="#ffffff" /&gt;
	&lt;embed src="http://johndyer.name/flashvideo/flvplayer.swf" quality="high" bgcolor="#ffffff" width="480" 
	   height="380" name="mymovie" align="middle" allowScriptAccess="sameDomain" 
	   flashvars="autostart=false&amp;file=http://johndyer.name/flashvideo/wiiflashworld.mp4&amp;image=http://johndyer.name/flashvideo/wiiflashworld.jpg"
	   type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" /&gt;
	&lt;/object&gt;						
							&lt;/div&gt;&lt;p&gt;&lt;a href="http://johndyer.name/flashvideo/wiiflashworld.mp4"&gt;wiiflashworld.mp4&lt;/a&gt;&lt;/p&gt;&lt;/p&gt; &lt;h3&gt;Live Demo&lt;/h3&gt; &lt;p&gt;To see a live demo, click the following image. If you want to control using a WiiMote, do the following. (1) connect your WiiMote to a PC via bluetooth. (2) Download the &lt;a href="http://wiiflash.googlecode.com/files/WiiFlash%20Package%200.4.2.zip"&gt;WiiFlash 0.4 package&lt;/a&gt; (3) run the included WiiFlash Server, (4) refresh the demo page page, (5) click the "Home" button the WiiMote to toggle controlling via mouse or WiiMote.&lt;/p&gt; &lt;p&gt;&lt;a href="http://johndyer.name/lab/pv3d/alumniglobe/"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="354" alt="Alumni World Globe" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/WiiFlashPapervision3DCAlumniWorldMap_D8D6/image_3.png" width="484" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Libraries Used&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://code.google.com/p/papervision3d/"&gt;Papervision3D&lt;/a&gt;  &lt;li&gt;&lt;a href="http://code.google.com/p/tweener/"&gt;Tweener&lt;/a&gt;  &lt;li&gt;&lt;a href="http://code.google.com/p/wiiflash/"&gt;WiiFlash&lt;/a&gt;  &lt;li&gt;Also thanks to &lt;a href="http://udon.nudoru.com/2008/02/26/wiiflash-tip-2-smoothing-out-the-edges/"&gt;this tip on WiiMote data&lt;/a&gt; and &lt;a href="http://www.adobe.com/newsletters/edge/june2008/articles/article2/"&gt;this tip on Papervision geocoding&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;All the tools for this project have been around for almost a year, so nothing is particularly cutting edge, but the mashup and purpose are pretty unique and really fun. Hopefully, playing with the WiiMote will be as fun as actually viewing the map, making the entire experience for prospective students really positive.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/sK-LpJyy4R0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/sK-LpJyy4R0/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Wii-2b-Flash-2b-Papervision3D-2b-C-3d-Alumni-World-Map.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=ef414118-eaae-4630-af24-25ce677ba463</guid>
      <pubDate>Tue, 16 Sep 2008 01:37:40 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=ef414118-eaae-4630-af24-25ce677ba463</pingback:target>
      <slash:comments>29</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=ef414118-eaae-4630-af24-25ce677ba463</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Wii-2b-Flash-2b-Papervision3D-2b-C-3d-Alumni-World-Map.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=ef414118-eaae-4630-af24-25ce677ba463</wfw:commentRss>
    <enclosure url="http://johndyer.name/flashvideo/flvplayer.swf" length="32164" type="application/x-shockwave-flash" /><media:content url="http://johndyer.name/flashvideo/flvplayer.swf" fileSize="32164" type="application/x-shockwave-flash" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> The 2008 class gift for Dallas Seminary is supposed to be a large flat screen with a 3D world that shows where in the world DTS alumni are serving. The requirements were: The target OS is still unknown and I haven't done much native Windows or Mac 3D pro</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> The 2008 class gift for Dallas Seminary is supposed to be a large flat screen with a 3D world that shows where in the world DTS alumni are serving. The requirements were: The target OS is still unknown and I haven't done much native Windows or Mac 3D programming. This leads me to use Papervision in Flash which I know and is very easy to use. The data needs to be easily updatable. Rather than use a database, I built a flat file using a quick C# app that plots alumni by state and country and geocodes their location. At DTS, the Admissions and Alumni offices are nearby, so the application needs to be interesting to Admissions. Ever since my sweet wife got me a Nintendo Wii a few months ago, I've wanted an excuse to program with it. For this project I thought, What's more fun and interesting than controlling the globe with a Nintendo Wii controller? Video Demo Here is a (low quality) video of an early version of the project that gives you an idea of what it's supposed to accomplish and look like. The first few seconds use mouse navigation, then it switches to WiiMote navigation. wiiflashworld.mp4 Live Demo To see a live demo, click the following image. If you want to control using a WiiMote, do the following. (1) connect your WiiMote to a PC via bluetooth. (2) Download the WiiFlash 0.4 package (3) run the included WiiFlash Server, (4) refresh the demo page page, (5) click the "Home" button the WiiMote to toggle controlling via mouse or WiiMote. &amp;nbsp; Libraries Used Papervision3D Tweener WiiFlash Also thanks to this tip on WiiMote data and this tip on Papervision geocoding All the tools for this project have been around for almost a year, so nothing is particularly cutting edge, but the mashup and purpose are pretty unique and really fun. Hopefully, playing with the WiiMote will be as fun as actually viewing the map, making the entire experience for prospective students really positive.</itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=ef414118-eaae-4630-af24-25ce677ba463</feedburner:origLink></item>
    <item>
      <title>Papervision3D Bookshelf</title>
      <description>&lt;p&gt;
I &lt;a href="http://blog.bestcommentaries.com/post/2008/08/19/Site-quot3bLaunchquot3b.aspx"&gt;recently completed&lt;/a&gt; a website that catalogs books and in the development I wanted to make something really new. The backend is all ASP.NET, implementing &lt;a href="http://www.urlrewriting.net"&gt;UrlRewriter.NET&lt;/a&gt; and &lt;a href="http://ajaxpro.info/"&gt;AJAX.NET&lt;/a&gt; libraries. The frontend uses several JavaScript libraries including &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt;, &lt;a href="http://script.aculo.us/"&gt;Scriptaculous&lt;/a&gt;, and &lt;a href="http://tetlaw.id.au/view/blog/table-sorting-with-prototype/"&gt;Tablesort&lt;/a&gt;.
&lt;/p&gt;
 
&lt;p&gt;
The one really unique feature of the site is the 3D bookshelf built using &lt;a href="http://www.papervision3d.org/"&gt;Papervision3D&lt;/a&gt;. Just yesterday it was featured in blog &lt;a href="http://dailypv3d.wordpress.com/2008/08/20/ot-commentaries/trackback/"&gt;Daily PV3D&lt;/a&gt; as Papervision showcase.
&lt;/p&gt;
 
&lt;p&gt;
You can check out the book shelf here:
&lt;/p&gt;
 
&lt;blockquote&gt;
	 
	&lt;p&gt;
	&lt;a href="http://www.bestcommentaries.com/category/proverbs/" title="http://www.bestcommentaries.com/category/proverbs/"&gt;http://www.bestcommentaries.com/category/proverbs/&lt;/a&gt;
	&lt;/p&gt;
&lt;/blockquote&gt;
 
&lt;h4&gt;Screenshots&lt;/h4&gt; 
&lt;p&gt;
Plain bookshelf:
&lt;/p&gt;
 
&lt;p&gt;
&lt;a href="http://www.bestcommentaries.com/category/proverbs/"&gt;&lt;img style="border: 0px none " src="http://johndyer.name/file.axd?file=WindowsLiveWriter/Papervision3DBookshelf_EF95/image_11.png" border="0" alt="image" width="550" height="105" /&gt;&lt;/a&gt; 
&lt;/p&gt;
 
&lt;p&gt;
Mouse over the third book from the left:
&lt;/p&gt;
 
&lt;p&gt;
&lt;a href="http://www.bestcommentaries.com/category/proverbs/"&gt;&lt;img style="border: 0px none " src="http://johndyer.name/file.axd?file=WindowsLiveWriter/Papervision3DBookshelf_EF95/image_12.png" border="0" alt="image" width="550" height="105" /&gt;&lt;/a&gt;&amp;nbsp; 
&lt;/p&gt;
 
&lt;p&gt;
Book clicked:
&lt;/p&gt;
 
&lt;p&gt;
&lt;a href="http://www.bestcommentaries.com/category/proverbs/"&gt;&lt;img style="border: 0px none " src="http://johndyer.name/file.axd?file=WindowsLiveWriter/Papervision3DBookshelf_EF95/image_13.png" border="0" alt="image" width="550" height="105" /&gt;&lt;/a&gt; 
&lt;/p&gt;
 
&lt;h4&gt;How it works&lt;/h4&gt; 
&lt;p&gt;
Using Papervision, it&amp;#39;s relatively easy to make a 6 sided polygon (cube) and then wrap images around it. I use the physical dimensions of the actual book to size the cube. Then, for the cover, I use an image of the book and wrap the last pixel around the side since I don&amp;#39;t have spin images. I tried using System.Drawing code to write the author&amp;#39;s name on the spine, but I could never get it to look just right, so I left it out. The only real catch was that I needed to place the shelf on a different Papervision scene to prevent clipping problems. The bookshelf also interacts with an HTML table down below via Flash&amp;#39;s JavaScript &lt;a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/external/ExternalInterface.html"&gt;ExternalInterface&lt;/a&gt;.
&lt;/p&gt;
 
&lt;p&gt;
Since developing this 3D bookshelf, I found one site that does &lt;a href="http://www.boek.net/"&gt;something somewhat similar&lt;/a&gt;, but they have the spine images which I can&amp;#39;t afford to find for 1000s of books. Also, I think that the JavaScript interaction on mine might give it an edge.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/XIpOJV8G2M4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/XIpOJV8G2M4/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Papervision3D-Bookshelf.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=220780a7-71c3-475d-b6ed-a4969bc2f14d</guid>
      <pubDate>Thu, 21 Aug 2008 03:02:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=220780a7-71c3-475d-b6ed-a4969bc2f14d</pingback:target>
      <slash:comments>31</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=220780a7-71c3-475d-b6ed-a4969bc2f14d</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Papervision3D-Bookshelf.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=220780a7-71c3-475d-b6ed-a4969bc2f14d</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=220780a7-71c3-475d-b6ed-a4969bc2f14d</feedburner:origLink></item>
    <item>
      <title>Podcast on Technology</title>
      <description>&lt;p&gt;A few weeks ago, I was invited to speak on a podcast with the best possible name of all time:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a href="http://www.pontificast.com"&gt;www.pontificast.com&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.pontificast.com/"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="60" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/PodcastonTechnology_E9BB/image_3.png" width="240" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Joey and Ryan (two smart, funny, creative guys) had me on for three episodes to discuss the effect of technology on people. I've been reading quite a few books and articles in this area lately, and concurrently such considerations have begun to move out of the academy and into the mainstream with articles such as &lt;a href="http://www.theatlantic.com/doc/200807/google"&gt;Nicholas Carr's article "Is Google Making Us Stupid?&lt;/a&gt;"&lt;/p&gt; &lt;p&gt;Here are links to the three episodes:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.pontificast.com/wp-trackback.php?p=7"&gt;The Medium is the Message&lt;/a&gt; (the effect of communication technologies on our thinking)  &lt;li&gt;&lt;a href="http://www.pontificast.com/wp-trackback.php?p=8"&gt;Technology's Effect on People&lt;/a&gt; (the speed of modern life takes its toll)  &lt;li&gt;&lt;a href="http://www.pontificast.com/wp-trackback.php?p=9"&gt;Technology and Relationships&lt;/a&gt; (the impact of facebook, twitter, and the rest)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Hope you enjoy!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/rZyMYQttYEY" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/rZyMYQttYEY/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Podcast-on-Technology.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=5c9291ba-3415-403a-baaf-40bd937e4cc1</guid>
      <pubDate>Tue, 19 Aug 2008 02:27:57 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=5c9291ba-3415-403a-baaf-40bd937e4cc1</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=5c9291ba-3415-403a-baaf-40bd937e4cc1</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Podcast-on-Technology.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=5c9291ba-3415-403a-baaf-40bd937e4cc1</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=5c9291ba-3415-403a-baaf-40bd937e4cc1</feedburner:origLink></item>
    <item>
      <title>Show Commenter's Latest Post: BlogEngine.NET Extension</title>
      <description>&lt;h4&gt;Background&lt;/h4&gt; &lt;p&gt;Over the past few weeks, I've seen a few WordPress blogs that pull in the last post from a commenter's website. I also saw a post from &lt;a href="http://blog.madskristensen.dk/"&gt;Mads&lt;/a&gt; about &lt;a href="http://blog.madskristensen.dk/post/Find-semantic-links-in-a-web-page.aspx"&gt;how to find semantic links on a webpage&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;So, I mashed his code together with some code from the BlogRoll control and created an extension that goes out and looks for RSS feeds at the commenter's website and then pulls in the latest post. [side note: I wish I could say, "a half hour later ... ", but it actually took me a while to get it to work...]&lt;/p&gt; &lt;p&gt;It all happens asynchronously, so if you comment on this post, it'll take a few seconds for it to show up. Then it will keep checking every so often for new posts.&lt;/p&gt; &lt;h4&gt;Example&lt;/h4&gt; &lt;p&gt;Last year, I posted a &lt;a href="http://johndyer.name/post/2007/09/26/PhotoShop-like-JavaScript-Color-Picker.aspx"&gt;JavaScript color picker&lt;/a&gt; and the post now has over 100 comments. Here's what it looks like with the extension running:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="569" alt="Comments with Recent Posts" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/ShowCommentersLatestPostBlo.NETExtension_F1CB/CropperCapture%5B62%5D_3.jpg" width="484" border="0"&gt; &lt;/p&gt; &lt;h4&gt;Download &amp;amp; Installation&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;Download &lt;a href="file.axd?file=BE-CommentersLastPost.zip"&gt;Commenter's Latest Post Extension&lt;/a&gt;  &lt;li&gt;The last post is wrapped in the following class so you can style it: &lt;br&gt;&lt;pre class="prettyprint"&gt;&amp;lt;span class="commenterslastpost"&amp;gt;&amp;lt;/span&amp;gt;&lt;/pre&gt;
&lt;li&gt;Sometimes the ResolveLinks extension interferes with this, so you might want to add the following code around the foreach loop:&lt;br&gt;&lt;pre class="prettypring"&gt;if (e.Body.IndexOf("href=\"" + match.Value + "\"") == -1) { ... }&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Add a comment to this post to see it in action...&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/h3_7oUIks6I" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/h3_7oUIks6I/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Show-Commenters-Latest-Post-BlogEngineNET-Extension.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=e1a45f16-9574-40c1-bc3e-afa72dcb7bec</guid>
      <pubDate>Wed, 23 Jul 2008 03:11:38 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=e1a45f16-9574-40c1-bc3e-afa72dcb7bec</pingback:target>
      <slash:comments>20</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=e1a45f16-9574-40c1-bc3e-afa72dcb7bec</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Show-Commenters-Latest-Post-BlogEngineNET-Extension.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=e1a45f16-9574-40c1-bc3e-afa72dcb7bec</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=e1a45f16-9574-40c1-bc3e-afa72dcb7bec</feedburner:origLink></item>
    <item>
      <title>iTunesU Site Utility in C# (.NET)</title>
      <description>&lt;p&gt;In the process of moving &lt;a href="http://www.dts.edu/"&gt;Dallas Seminary&lt;/a&gt;'s content to &lt;a href="http://www.apple.com/education/itunesu/"&gt;iTunesU&lt;/a&gt;, I created a very simple application to edit site details via the Web Service API. It currently has the following functions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Add/Edit/Delete Sections  &lt;li&gt;Add/Edit/Delete Courses  &lt;li&gt;Add/Edit/Delete Groups  &lt;li&gt;Upload/Edit/Delete Tracks &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;There are a lot of things it doesn't do, like let you edit themes or add images to courses, but it is really helping us get started. Here's a screenshot:&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="488" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/iTunesUSiteUtilityinC.NET_AD68/image7.png" width="484" border="0"&gt; &lt;/p&gt; &lt;p&gt;You just enter your shared secret and domain name, press "Load Site Tree" and then right click on the various items to add/edit/delete.&lt;/p&gt; &lt;p&gt;And here's what it looks like in iTunes.&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="396" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/iTunesUSiteUtilityinC.NET_AD68/image_6.png" width="484" border="0"&gt; &lt;/p&gt; &lt;h4&gt;Download &amp;amp; Installation&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="file.axd?file=iTunesUUtility-0-1.zip"&gt;Download iTunes U Utility 0.1&lt;/a&gt;  &lt;li&gt;Requirements - Microsoft .NET Framework 2.0; PC only &lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;Links&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.apple.com/support/itunes_u/"&gt;iTunesU Support Site&lt;/a&gt; - Here's where I started  &lt;li&gt;&lt;a href="http://itunesu-api-java.googlecode.com/"&gt;iTunesU Java Library&lt;/a&gt; - this is much more fully featured and documented than my code.  &lt;li&gt;&lt;a href="http://itunes.uic.edu/Woolamaloo.html"&gt;Woolamaloo&lt;/a&gt; - Rich Wolf's Mac tool which is much more fully featured than this tool. He also has a Windows app, but as far as I can tell it only lets you login. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;My source code is very rough, but it someone needs it, I'm happy to provide it. Also, our iTunes U site is not yet public, but it will be in a few weeks.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/ixNMNwwHMTU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/ixNMNwwHMTU/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/iTunesU-Site-Utility-in-C-(NET).aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=24e1d3ae-3bad-4359-9453-4a8df42c4e04</guid>
      <pubDate>Fri, 18 Jul 2008 22:24:21 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=24e1d3ae-3bad-4359-9453-4a8df42c4e04</pingback:target>
      <slash:comments>29</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=24e1d3ae-3bad-4359-9453-4a8df42c4e04</trackback:ping>
      <wfw:comment>http://johndyer.name/post/iTunesU-Site-Utility-in-C-(NET).aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=24e1d3ae-3bad-4359-9453-4a8df42c4e04</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=24e1d3ae-3bad-4359-9453-4a8df42c4e04</feedburner:origLink></item>
    <item>
      <title>Programming History</title>
      <description>&lt;p&gt;
From &lt;a href="http://nayyeri.net/blog/how-i-got-started-in-software-development/"&gt;Keyvan Nayyari&lt;/a&gt; and &lt;a href="http://www.jankoatwarpspeed.com/post/2008/07/11/How-I-Got-Started-in-Software-Development.aspx"&gt;Janko&lt;/a&gt; to &lt;a href="http://blog.madskristensen.dk/post/From-wine-to-web.aspx"&gt;Mads Kristensen&lt;/a&gt; and now to me comes a challenge to tell how I got into programming...
&lt;/p&gt;
  
&lt;h4&gt;How old were you when you started programming?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	I think I was around 14 or 15.
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;How did you get started in programming?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	My friend and I made text adventure games.
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;What was your first language?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	It was some form of BASIC.
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;What was the first real program you wrote?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	By &amp;quot;text adventure game&amp;quot;, I really mean lame spaghetti-coded ASCII choose your own adventure &amp;quot;games.&amp;quot; My friend had most of the funny ideas and I did most of the programming. He&amp;#39;s now in a crazy band in Austin, TX called &lt;a href="http://www.myspace.com/natchet"&gt;Natchet Taylor&lt;/a&gt;, and I work at a &lt;a href="http://www.dts.edu/"&gt;seminary&lt;/a&gt;!
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;What languages have you used since?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	ASP, PHP, C#, ActionScript, SQL, X/HTML, JavaScript, CSS, and all the rest...
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;What was your first professional programming gig?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	When I graduated from college, I took a job as a youth pastor. I needed extra cash, so I got a job as as ASP programmer for &lt;a href="http://www.texags.com/"&gt;http://www.texags.com/&lt;/a&gt;. At that point, all I had really done was build a personal webpage in college (with animated flaming gifs!), so I just learned everything on the job. It was great fun. In those days, I&amp;#39;d write everything for IE, and then fix it for Netscape. Funny how things change.
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;If you knew then what you know now, would you have started programming?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	Totally. There&amp;#39;s always good work, and it really frees me up to be anywhere. I&amp;#39;ve made it through an entire &lt;a href="http://www.dts.edu/thm"&gt;masters degree&lt;/a&gt; since I could work whenever and wherever, and still be involved with friends and in ministry.
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;h4&gt;What is the one thing you would tell new developers?&lt;/h4&gt;  
&lt;p&gt;
I&amp;#39;ll cheat and go with two:
&lt;/p&gt;
  
&lt;ol&gt;
	   
	&lt;li&gt;Always, always, always have a signed contract with everything spelled out in detail and a 25-50% payment before writing a single line of code. &lt;/li&gt;    
	&lt;li&gt;Release as much code as you can (to a blog or whatever). If your code is worth publishing, it means you probably did a good job, and would be something you won&amp;#39;t hate to go back and modify later. &lt;/li&gt; 
&lt;/ol&gt;
  
&lt;h4&gt;What&amp;rsquo;s the most fun you&amp;rsquo;ve ever had &amp;hellip; programming?&lt;/h4&gt;  
&lt;blockquote&gt;
	   
	&lt;p&gt;
	I would have to say programming &lt;a href="http://www.dts.edu/onlineed"&gt;online education stuff&lt;/a&gt; with foreign language support. I have no idea what any of it says, but it&amp;#39;s really fun to develop stuff that is used in a home in Dallas, a tent in the deserts of Iraq, in the Packers lockerroom, and in an underground church in China - and all of it not just to make a buck, but to make a difference in the world. That&amp;#39;s rock-star coding.
	&lt;/p&gt;
	 
&lt;/blockquote&gt;
  
&lt;p&gt;
Okay, I&amp;#39;m passing this on to &lt;a href="http://www.sonspring.com"&gt;Nathan Smith&lt;/a&gt;, &lt;a href="http://www.pixelightcreative.com/"&gt;Chris Merritt&lt;/a&gt;, and &lt;a href="http://human3rror.com"&gt;John Saddington&lt;/a&gt;. Have fun guys.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/jXxKacOdHjs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/jXxKacOdHjs/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Programming-History.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=ec11412c-8f61-4724-9541-bee9b0118a57</guid>
      <pubDate>Thu, 17 Jul 2008 22:48:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=ec11412c-8f61-4724-9541-bee9b0118a57</pingback:target>
      <slash:comments>9</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=ec11412c-8f61-4724-9541-bee9b0118a57</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Programming-History.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=ec11412c-8f61-4724-9541-bee9b0118a57</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=ec11412c-8f61-4724-9541-bee9b0118a57</feedburner:origLink></item>
    <item>
      <title>Online Education Player Design Considerations</title>
      <description>&lt;p&gt;
&lt;a href="http://www.dts.edu/"&gt;Dallas Seminary&lt;/a&gt; has been doing video-based online education for about 5 years now. One of the initial goals was to replicate the classroom teaching experience as much as possible by including the video and the professor&amp;#39;s illustrations (Powerpoint, Keynote, etc.). Beyond that, we also wanted to enhance the experience by adding things like a transcript and editing down the video to the most important segments.
&lt;/p&gt;
  
&lt;p&gt;
Our initial player was created by Yahoo!&amp;#39;s Broadcast.com division and it used HTML frames and Windows media. This limited us to Internet Explorer, but there was no other option at the time. Then Flash 7 came out with video support and I custom built the player below. Since then, video on the web has come a long way, and the introduction of H.264 support means that we only need one format for playing on the web and on the desktop.
&lt;/p&gt;
  
&lt;p&gt;
Here is the original design using 320x240 video and 480x360 slides:
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;&lt;a href="http://my.dts.edu/player/"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_5.png" border="0" alt="image" width="484" height="282" /&gt;&lt;/a&gt; &lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
Here are some changes we wanted to make:
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;&lt;strong&gt;Move from Flash 8 to 9&lt;/strong&gt; - use AS3 and enable fullscreen support &lt;/li&gt;    
	&lt;li&gt;&lt;strong&gt;Use H.264 video&lt;/strong&gt; - to simplify our workflow &lt;/li&gt;    
	&lt;li&gt;Increase the &lt;strong&gt;video size, quality&lt;/strong&gt;, and availability &lt;/li&gt;    
	&lt;li&gt;Some users found the auto-scrolling transcript distracting and we need another option for them &lt;/li&gt;    
	&lt;li&gt;Many classes don&amp;#39;t have slides, so we need to de-emphasize those, yet also provide a good slide navigation system. &lt;/li&gt;    
	&lt;li&gt;&lt;strong&gt;More narrow player &lt;/strong&gt;- the current design is about 850px which makes it hard to have many more windows open at the same time. &lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
Here are wireframe mockups of various design proposals
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;&lt;strong&gt;First player (2003) using Yahoo!&amp;#39;s Broadcast.com using HTML/Frames/WMV        &lt;br /&gt;
	&lt;/strong&gt;&lt;em&gt;Obviously, WMV is limited to really working in IE, and we were stuck with Yahoo!&amp;#39;s platform.&lt;/em&gt;       &lt;br /&gt;
	&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_4.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb.png" border="0" alt="image" width="404" height="354" /&gt;&lt;/a&gt;       &lt;br /&gt;
	&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/old_online_ed_Yahoo_Video_Skin_2.jpg"&gt;&lt;img style="border: 0px none " src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/old_online_ed_Yahoo_Video_Skin_thumb.jpg" border="0" alt="old_online_ed_Yahoo_Video_Skin" width="403" height="332" /&gt;&lt;/a&gt;       &lt;br /&gt;
	&lt;/li&gt;    
	&lt;li&gt;&lt;strong&gt;Flash player with 320x240 video        &lt;br /&gt;
	&lt;/strong&gt;&lt;em&gt;This player is wider since the slides are bigger, but the transcript is more narrow column which makes it easier to read.&lt;/em&gt;       &lt;br /&gt;
	&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_7.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb_1.png" border="0" alt="image" width="484" height="228" /&gt;&lt;/a&gt;&amp;nbsp; &lt;br /&gt;
	&lt;a href="http://my.dts.edu/player/"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_5.png" border="0" alt="image" width="484" height="282" /&gt;&lt;/a&gt;       &lt;br /&gt;
	&lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
New Designs
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;&lt;strong&gt;Swapped video and slides sizes, controls at the bottom &lt;/strong&gt;      &lt;br /&gt;
	&lt;em&gt;This swaps the video and slide sizes. It&amp;#39;s nice, but the transcript is far away and the slides are hard to read. The player is also still very wide.&lt;/em&gt;       &lt;br /&gt;
	&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_9.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb_2.png" border="0" alt="image" width="484" height="246" /&gt;&lt;/a&gt;       &lt;br /&gt;
	&lt;/li&gt;    
	&lt;li&gt;&lt;strong&gt;Larger video size, small slides on the side&lt;/strong&gt;       &lt;br /&gt;
	&lt;em&gt;To make the video even bigger, the transcript is now a single line like closed captioning on TV. Rather than give the slides their own dedicated space, the slides have a tray on the right and the full size slide appears over the video for a few seconds. The width is slightly smaller, but not much.&lt;/em&gt;       &lt;br /&gt;
	&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_13.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb_4.png" border="0" alt="image" width="484" height="302" /&gt;&lt;/a&gt;       &lt;br /&gt;
	&amp;nbsp; &lt;/li&gt;    
	&lt;li&gt;&lt;strong&gt;Coverflow Style Player        &lt;br /&gt;
	&lt;/strong&gt;&lt;em&gt;To make the player more narrow (for multi-tasking), we move the slides to the bottom and use the Apple CoverFlow to show a lot of them at once. This makes the player more narrow which is good, but also taller. To shorten it, we&amp;#39;ve moved all the controls on top of the video that appears/diasppears on mouse hover.        &lt;br /&gt;
	        &lt;br /&gt;
	&amp;nbsp;&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_21.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb_8.png" border="0" alt="image" width="484" height="352" /&gt;&lt;/a&gt;         &lt;br /&gt;
	        &lt;br /&gt;
	Here is a screenshot of a fairly common desktop size (1680x1050) with MS Word and a preview version of this player open. (note: I&amp;#39;ve made sure the controls are visible for the screenshot, but they are hidden normally)&amp;nbsp; &lt;br /&gt;
	&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_15.png"&gt;&lt;img style="border: 0px none " src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb_5.png" border="0" alt="image" width="484" height="304" /&gt;&lt;/a&gt;         &lt;br /&gt;
	&lt;a href="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_23.png"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_thumb_9.png" border="0" alt="image" width="484" height="304" /&gt;&lt;/a&gt; &lt;/em&gt;&lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
This seems effective, but there is a possible drawback in that the Coverflow might be somewhat distracting to some students (it can be turned off). Also, some may prefer the older style transcript with more than one line visible at once.
&lt;/p&gt;
  
&lt;p&gt;
Links to preview the players:
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;Old Player: &lt;a href="http://my.dts.edu/player/experiments/coverflow/"&gt;http://my.dts.edu/player/&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;Coverflow: &lt;a href="http://my.dts.edu/player2/"&gt;http://my.dts.edu/player2/&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
Another future goal is to build the player as an AIR application so that videos can be downloaded for offline use.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/lF0itbFydUc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/lF0itbFydUc/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Online-Education-Player-Design-Considerations.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=34389687-9b6d-4e0d-b209-5dd6e6b90428</guid>
      <pubDate>Mon, 02 Jun 2008 18:33:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=34389687-9b6d-4e0d-b209-5dd6e6b90428</pingback:target>
      <slash:comments>55</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=34389687-9b6d-4e0d-b209-5dd6e6b90428</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Online-Education-Player-Design-Considerations.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=34389687-9b6d-4e0d-b209-5dd6e6b90428</wfw:commentRss>
    <enclosure url="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_4.png" length="22621" type="application/octet-stream" /><media:content url="http://johndyer.name/file.axd?file=WindowsLiveWriter/OnlineEducationPlayerDesignConsideration_ABC4/image_4.png" fileSize="22621" type="application/octet-stream" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Dallas Seminary has been doing video-based online education for about 5 years now. One of the initial goals was to replicate the classroom teaching experience as much as possible by including the video and the professor&amp;#39;s illustrations (Powerpoint, K</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> Dallas Seminary has been doing video-based online education for about 5 years now. One of the initial goals was to replicate the classroom teaching experience as much as possible by including the video and the professor&amp;#39;s illustrations (Powerpoint, Keynote, etc.). Beyond that, we also wanted to enhance the experience by adding things like a transcript and editing down the video to the most important segments. Our initial player was created by Yahoo!&amp;#39;s Broadcast.com division and it used HTML frames and Windows media. This limited us to Internet Explorer, but there was no other option at the time. Then Flash 7 came out with video support and I custom built the player below. Since then, video on the web has come a long way, and the introduction of H.264 support means that we only need one format for playing on the web and on the desktop. Here is the original design using 320x240 video and 480x360 slides: Here are some changes we wanted to make: Move from Flash 8 to 9 - use AS3 and enable fullscreen support Use H.264 video - to simplify our workflow Increase the video size, quality, and availability Some users found the auto-scrolling transcript distracting and we need another option for them Many classes don&amp;#39;t have slides, so we need to de-emphasize those, yet also provide a good slide navigation system. More narrow player - the current design is about 850px which makes it hard to have many more windows open at the same time. Here are wireframe mockups of various design proposals First player (2003) using Yahoo!&amp;#39;s Broadcast.com using HTML/Frames/WMV Obviously, WMV is limited to really working in IE, and we were stuck with Yahoo!&amp;#39;s platform. Flash player with 320x240 video This player is wider since the slides are bigger, but the transcript is more narrow column which makes it easier to read. &amp;nbsp; New Designs Swapped video and slides sizes, controls at the bottom This swaps the video and slide sizes. It&amp;#39;s nice, but the transcript is far away and the slides are hard to read. The player is also still very wide. Larger video size, small slides on the side To make the video even bigger, the transcript is now a single line like closed captioning on TV. Rather than give the slides their own dedicated space, the slides have a tray on the right and the full size slide appears over the video for a few seconds. The width is slightly smaller, but not much. &amp;nbsp; Coverflow Style Player To make the player more narrow (for multi-tasking), we move the slides to the bottom and use the Apple CoverFlow to show a lot of them at once. This makes the player more narrow which is good, but also taller. To shorten it, we&amp;#39;ve moved all the controls on top of the video that appears/diasppears on mouse hover. &amp;nbsp; Here is a screenshot of a fairly common desktop size (1680x1050) with MS Word and a preview version of this player open. (note: I&amp;#39;ve made sure the controls are visible for the screenshot, but they are hidden normally)&amp;nbsp; This seems effective, but there is a possible drawback in that the Coverflow might be somewhat distracting to some students (it can be turned off). Also, some may prefer the older style transcript with more than one line visible at once. Links to preview the players: Old Player: http://my.dts.edu/player/ Coverflow: http://my.dts.edu/player2/ Another future goal is to build the player as an AIR application so that videos can be downloaded for offline use. </itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=34389687-9b6d-4e0d-b209-5dd6e6b90428</feedburner:origLink></item>
    <item>
      <title>ISBN Functions in C# (ISBN-10 to ISBN-13 Conversion)</title>
      <description>&lt;p&gt;While working with some book data, I needed to merge the old ISBN-10 and ISBN-13 data. Unfortunately, I couldn't find any C# code to do the conversion. Search for &amp;quot;ISBN C#&amp;quot; in Google only return book stores with C# books.&lt;/p&gt;  &lt;p&gt;So here is a little class that will convert and validate ISBNs. Here's how the code would look:&lt;/p&gt;  &lt;pre class="prettyprint"&gt;string isbn10 = &amp;quot;0830818030&amp;quot;; 
string isbn13 = ISBN.Convert10to13(isbn10); // returns &amp;quot;9780830818037&amp;quot;

string isbn = &amp;quot;083081803X&amp;quot;; // this one has a bad checksum (last digit) 
string correctIsbn = &amp;quot;&amp;quot;; 
if (!ISBN.IsValid(isbn, out correctIsbn)) { 
	isbn = corretnIsbn; // returns &amp;quot;0830818030&amp;quot;
}&lt;/pre&gt;

&lt;p&gt;An ISBN object can also be instantiated and used:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;IBSN myBook = new ISBN(&amp;quot;0-83081-803-0&amp;quot;); 
string isbn13 = myBook.ISBN13; // returns &amp;quot;9780830818037&amp;quot;
string isbn10 = myBook.ISBN10; // returns &amp;quot;0830818030&amp;quot; &lt;/pre&gt;

&lt;p&gt;Here is the class:&lt;/p&gt;

&lt;div &gt;
  &lt;pre class="prettyprint" style="overflow: auto; height: 500px"&gt;public class ISBN
    {

        public ISBN(string isbn)
        {
            SetIsbn(isbn);
        }

        private string _isbn10 = &amp;quot;&amp;quot;;
        private string _isbn13 = &amp;quot;&amp;quot;;

        public string ISBN10
        {
            get
            {
                return _isbn10;
            }
            set
            {                
                string corrected = &amp;quot;&amp;quot;;
               
                if (!IsValid(value, out corrected) &amp;amp;&amp;amp; corrected == &amp;quot;&amp;quot;)
                    throw new Exception(&amp;quot;invalid ISBN&amp;quot;);

                SetIsbn(corrected);
            }
        }

        public string ISBN13
        {
            get
            {
                return _isbn13;
            }
            set
            {
                string corrected = &amp;quot;&amp;quot;;

                if (!IsValid(value, out corrected) &amp;amp;&amp;amp; corrected == &amp;quot;&amp;quot;)
                    throw new Exception(&amp;quot;invalid ISBN&amp;quot;);

                SetIsbn(corrected);
            }
        }

        private void SetIsbn(string isbn)
        {
            isbn = CleanIsbn(isbn);

            if (isbn.Length == 10)
            {
                _isbn10 = isbn;
                _isbn13 = Convert10to13(isbn);
            }
            else if (isbn.Length == 13)
            {
                _isbn13 = isbn;
                _isbn10 = Convert13to10(isbn);
            }
        }

        private static string CleanIsbn(string isbn)
        {
            return isbn.Replace(&amp;quot;-&amp;quot;, &amp;quot;&amp;quot;).Replace(&amp;quot; &amp;quot;, &amp;quot;&amp;quot;);
        }


        public static string Convert10to13(string isbn)
        {
            return Convert10to13(isbn, true);
        }
        public static string Convert10to13(string isbn, bool throwError) {
            
            // remove - and space
            string isbn10 = CleanIsbn(isbn);

            if (isbn10.Length != 10 &amp;amp;&amp;amp; throwError)
                throw new Exception(&amp;quot;ISBN must be 10 characters long&amp;quot;);

            // 1) Drop the check digit (the last digit)
            isbn10 = isbn10.Substring(0, 9);

            // 2) Add the prefix '978' 
            string isbn13 = &amp;quot;978&amp;quot; + isbn10;

            // 3) Recalculate check digit 
            isbn13 = isbn13 + Isbn13Checksum(isbn13);

            return isbn13;
        }

        public static string Convert13to10(string isbn)
        {
            return Convert13to10(isbn, true);
        }

        public static string Convert13to10(string isbn, bool throwError)
        {

            // remove - and space
            string isbn13 = CleanIsbn(isbn);

            if (isbn13.Length != 13 &amp;amp;&amp;amp; throwError)
                throw new Exception(&amp;quot;ISBN must be 13 characters long&amp;quot;);

            // 1) Drop the check digit (the last digit) and prefix '978'
            string isbn10 = isbn13.Substring(3, 9);
     
            // 2) Recalculate your check digit using the modules 10 check digit routine.
            isbn10 = isbn10 + Isbn10Checksum(isbn10);

            return isbn10;
        }

        public static bool IsValid(string isbn)
        {
            string correctIsbn = &amp;quot;&amp;quot;;
            return IsValid(isbn, out correctIsbn);
        }

        public static bool IsValid(string isbn, out string correctISBN)
        {
            // remove - and space
            isbn = CleanIsbn(isbn);

            if (isbn.Length == 10) {
                return ValidateIsbn10(isbn, out correctISBN);
            }
            else if (isbn.Length == 13)
            {
                return ValidateIsbn13(isbn, out correctISBN);
            }
            else
            {
                correctISBN = &amp;quot;&amp;quot;;
                return false;
            }

        }

        private static string Isbn10Checksum(string isbn)
        {
            int sum = 0;
            for (int i = 0; i &amp;lt; 9; i++)
                 sum += (10-i) * Int32.Parse(isbn[i].ToString());
   
            float div = sum / 11;
            float rem = sum % 11;

            if (rem == 0)
                return &amp;quot;0&amp;quot;;
            else if (rem == 1)
                return &amp;quot;X&amp;quot;;
            else
                return (11 - rem).ToString();
        }

        private static string Isbn13Checksum(string isbn)
        {
            float sum = 0;
            for (int i = 0; i &amp;lt; 12; i++)
                sum += ((i % 2 == 0) ? 1 : 3) * Int32.Parse(isbn[i].ToString());

            float div = sum / 10;
            float rem = sum % 10;

            if (rem == 0)
                return &amp;quot;0&amp;quot;;
            else
                return (10 - rem).ToString();
        }


        private static bool ValidateIsbn10(string isbn, out string correctISBN)
        {
            correctISBN = isbn.Substring(0, 9) + Isbn10Checksum(isbn);

            return (correctISBN == isbn);
        }

        private static bool ValidateIsbn13(string isbn, out string correctISBN)
        {
            correctISBN = isbn.Substring(0, 12) + Isbn13Checksum(isbn);

            return (correctISBN == isbn);
        }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I initially wanted to also make a method that would add back in the correct dashes, but I found out that the make up is based on country and publisher codes assigned by the &lt;a href="http://www.isbn-international.org/"&gt;International ISBN Agency&lt;/a&gt; which regularly updates the list of codes making it pretty much impossible to permanantly functionalize.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/KEm5CalAoTE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/KEm5CalAoTE/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/ISBN-Functions-in-C-(ISBN-10-to-ISBN-13-Conversion).aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=9a33183f-9ede-43cd-bc7f-0d824698ce8f</guid>
      <pubDate>Fri, 16 May 2008 01:05:16 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=9a33183f-9ede-43cd-bc7f-0d824698ce8f</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=9a33183f-9ede-43cd-bc7f-0d824698ce8f</trackback:ping>
      <wfw:comment>http://johndyer.name/post/ISBN-Functions-in-C-(ISBN-10-to-ISBN-13-Conversion).aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=9a33183f-9ede-43cd-bc7f-0d824698ce8f</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=9a33183f-9ede-43cd-bc7f-0d824698ce8f</feedburner:origLink></item>
    <item>
      <title>The Best Way to Demo Websites for Clients</title>
      <description>&lt;p&gt;For the last few years, my web team has used a projector to collaborate on web projects. We use it for going through our weekly work items, demoing designs, doing training, and so on.&lt;/p&gt;  &lt;p&gt;Unfortunately, it was an old projector with a weak bulb so we always had to turn out the lights to use it. Even then it was hard to see because the contrast and color depth were poor, and the resolution was only 1024x768. So last year I budgeted to get a new projector to solve these problems.&lt;/p&gt;  &lt;p&gt;Instead of getting a new projector, I decided to get a LCD HDTV and use it as a monitor. I found a &lt;a href="http://www.samsclub.com/shopping/navigate.do?dest=5&amp;amp;item=386506&amp;amp;pCatg=5883"&gt;killer deal at Sam's Club&lt;/a&gt; on a &lt;a href="http://olevia.com/en-us/Products/2Series/265TFHDLCDHDTV.aspx"&gt;65&amp;quot; &lt;a href="http://olevia.com/en-us/Products/2Series/265TFHDLCDHDTV.aspx"&gt;Olevia&lt;/a&gt;.&lt;/a&gt; The screen isn't quote as nice as something like a Sony, but for what we are doing, it is absolutely amazing. The 1920x1080 resolution and super bright LCD screen is perfect for looking at web designs. In this pic, We have our task app on the right and a full size web page on the left. Even though the text is tiny it's readable from about 8' away:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/TheBestWaytoDemoWebsitesforClients_851F/IMG_3278_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="322" alt="IMG_3278" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/TheBestWaytoDemoWebsitesforClients_851F/IMG_3278_thumb.jpg" width="500" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/TheBestWaytoDemoWebsitesforClients_851F/IMG_3279_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="310" alt="IMG_3279" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/TheBestWaytoDemoWebsitesforClients_851F/IMG_3279_thumb.jpg" width="500" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I have an old PC running the display, and I'm using a few little utilities to make enhance presentations:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.entechtaiwan.com/util/ps.shtm"&gt;PowerStrip&lt;/a&gt; - Some PCs and Macs can't natively display 1920x1080 resolution. This little Windows app helps out and can usually enable even really old machines to do HD resolutions.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb897434.aspx"&gt;ZoomIt&lt;/a&gt; - this is a little app by the former SysInternals.com guys. It lets you zoom into a screen with the mouse scroll wheel and draw on the screen. This features are invaluable for mockups.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=75078"&gt;Zune Theme Modified&lt;/a&gt; - I also used a modified Zune theme, because I like how the dark colors make the UI fade into the background and focus attention on the design.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;On the fun side, we can occasionally use it for things other than web design. Since we're in a basement, we don't have a good way of getting an antenna to pipe in some HD goodness, but we can watch trailers in full 1080p goodness!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/TheBestWaytoDemoWebsitesforClients_851F/IMG_3281_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="316" alt="IMG_3281" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/TheBestWaytoDemoWebsitesforClients_851F/IMG_3281_thumb.jpg" width="500" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/AHHaEZ5kB4Y" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/AHHaEZ5kB4Y/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/The-Best-Way-to-Demo-Websites-for-Clients.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=8e6e3ccf-197b-44a7-9fe0-f8c62a752dbf</guid>
      <pubDate>Mon, 12 May 2008 19:29:10 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=8e6e3ccf-197b-44a7-9fe0-f8c62a752dbf</pingback:target>
      <slash:comments>14</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=8e6e3ccf-197b-44a7-9fe0-f8c62a752dbf</trackback:ping>
      <wfw:comment>http://johndyer.name/post/The-Best-Way-to-Demo-Websites-for-Clients.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=8e6e3ccf-197b-44a7-9fe0-f8c62a752dbf</wfw:commentRss>
    <enclosure url="http://go.microsoft.com/fwlink/?LinkID=75078" length="1722880" type="application/octet-stream" /><media:content url="http://go.microsoft.com/fwlink/?LinkID=75078" fileSize="1722880" type="application/octet-stream" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> For the last few years, my web team has used a projector to collaborate on web projects. We use it for going through our weekly work items, demoing designs, doing training, and so on. Unfortunately, it was an old projector with a weak bulb so we always h</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> For the last few years, my web team has used a projector to collaborate on web projects. We use it for going through our weekly work items, demoing designs, doing training, and so on. Unfortunately, it was an old projector with a weak bulb so we always had to turn out the lights to use it. Even then it was hard to see because the contrast and color depth were poor, and the resolution was only 1024x768. So last year I budgeted to get a new projector to solve these problems. Instead of getting a new projector, I decided to get a LCD HDTV and use it as a monitor. I found a killer deal at Sam's Club on a 65&amp;quot; Olevia. The screen isn't quote as nice as something like a Sony, but for what we are doing, it is absolutely amazing. The 1920x1080 resolution and super bright LCD screen is perfect for looking at web designs. In this pic, We have our task app on the right and a full size web page on the left. Even though the text is tiny it's readable from about 8' away: &amp;#160; I have an old PC running the display, and I'm using a few little utilities to make enhance presentations: PowerStrip - Some PCs and Macs can't natively display 1920x1080 resolution. This little Windows app helps out and can usually enable even really old machines to do HD resolutions. ZoomIt - this is a little app by the former SysInternals.com guys. It lets you zoom into a screen with the mouse scroll wheel and draw on the screen. This features are invaluable for mockups. Zune Theme Modified - I also used a modified Zune theme, because I like how the dark colors make the UI fade into the background and focus attention on the design. On the fun side, we can occasionally use it for things other than web design. Since we're in a basement, we don't have a good way of getting an antenna to pipe in some HD goodness, but we can watch trailers in full 1080p goodness! </itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=8e6e3ccf-197b-44a7-9fe0-f8c62a752dbf</feedburner:origLink></item>
    <item>
      <title>Web Marketing using Facebook Ads and Video for Dallas Seminary</title>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note: &lt;/strong&gt;This blog is usually fairly technical, dealing with ASP.NET, Flash, and JavaScript code samples, but this is a brief deviation into the broader world of the web as a technology platform for communicating an institution's message.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;For &lt;a href="http://www.dts.edu/"&gt;Dallas Theological Seminary&lt;/a&gt;, we've been experimenting with &amp;quot;branding&amp;quot; and reaching different audiences by producing some new videos and experimenting with &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;'s relatively new &lt;a href="http://www.facebook.com/ads/"&gt;targeted advertising&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;Marketing for Seminaries?&lt;/h4&gt;  &lt;p&gt;Advertising and marketing for churches and seminaries can be a tricky thing, because it seems rather sacrilegious to &amp;quot;market&amp;quot; something spiritual. We've all seen &lt;a href="http://www.bennyhinn.org"&gt;late night&lt;/a&gt; and &lt;a href="http://www.oprah.com/spiritself/ss_landing.jhtml"&gt;afternoon televangelists&lt;/a&gt; that make us cringe. But DTS isn't offering a &amp;quot;product&amp;quot; that someone buys; rather its mission is to train pastors, professors, and missionaries for a lifetime of service. If you call an admissions counselor and ask why you should go to DTS, you won't get a sales pitch. The admissions counselor will tell you that you should go to the school to which God is calling you. The admissions person will then mention some of DTS's strengths, but stay away from comparisons with other schools or &amp;quot;selling DTS.&amp;quot;&lt;/p&gt;  &lt;p&gt;Still, it is important for DTS to inform prospective students on what kind of school it is and what it's strengths are. Basic marketing ideas can help convey this, and naturally the web is a great place to start.&lt;/p&gt;  &lt;h4&gt;Context for the Advertisements&lt;/h4&gt;  &lt;p&gt;Any time you create an ad for a &amp;quot;company,&amp;quot; it is important to know the background of the business and the historical context in which the ad is situated. This history of seminaries and churches in America is key to understanding what ads will communicate to the seminary audience. &lt;a href="http://www.dts.edu/catalog"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 10px; border-right-width: 0px" height="350" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/FacebookAdsandVideoforDallasSeminary_A169/image_10.png" width="220" align="right" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;In the early 1900s, was a debate in the Christian church between &amp;quot;fundamentalists&amp;quot; (those who believe certain &lt;em&gt;truths&lt;/em&gt; are the most important thing about Christianity) and &amp;quot;liberals&amp;quot; (those who believe certain &lt;em&gt;actions&lt;/em&gt; are the most important thing about Christianity). In this debate, it seemed that the &amp;quot;liberals&amp;quot; forgot that Jesus asked Christians to &lt;em&gt;believe &lt;/em&gt;something (that he is the savior and the Son of God), while the the fundamentalists often forgot that Jesus asked Christians to &lt;em&gt;do&lt;/em&gt; something (love others).&lt;/p&gt;  &lt;p&gt;DTS was started in the 1920s during the fundamentalist movement. Unfortunately, many of the seminaries which started during this time period have a reputation of caring about teaching the Bible, but neglecting to meet real world needs. By the 60s and 70s, some Christians wanted to balance the emphases of both the liberals (loving) and fundamentalists (truth), and there they were called &amp;quot;evangelicals.&amp;quot; Today, this term has become politically decisive and has less positive connotations in many places, so the word &amp;quot;evangelical&amp;quot; communicates something different than it used it.&lt;/p&gt;  &lt;p&gt;Today's students who are considering seminary are more concerned than ever about balancing these two things and so DTS needs new ways to communicate that it wants to care about Christian beliefs &lt;em&gt;and &lt;/em&gt;Christian practices without making one too dominate. These students also don't read traditional Christian publications, so DTS needs to shift from print publications to Internet and from top down communication to allowing prospects to connect to real students.&lt;/p&gt;  &lt;h4&gt;A New Tagline&lt;/h4&gt;  &lt;p&gt;The older taglines for DTS have been things that primarily emphasize Biblical teaching such as &amp;quot;Standing Strong for the Truth&amp;quot; or &amp;quot;Training You Can Trust. Leaders You Can Follow.&amp;quot;&lt;/p&gt;  &lt;p&gt;We wanted something shorter and somewhat pithy that emphasized both aspects of truth and love. Here's what we came up with.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;Teach Truth. Love Well.&lt;/em&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Not too revolutionary, but hopefully it's clear and it communicates. Here's how Google sees it :)&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="77" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/FacebookAdsandVideoforDallasSeminary_A169/image_3.png" width="555" border="0" /&gt; &lt;/p&gt;  &lt;h4&gt;Facebook Page and Ads Summary&lt;/h4&gt;  &lt;p&gt;DTS has traditionally run ads on large Christian website like ChristianityToday.com and OnePlace.com. But to reach younger students, we moved over to Facebook.&lt;/p&gt;  &lt;p&gt;Also, in the past, a traditional DTS ad might have emphasized something like &amp;quot;Want to be a Pastor?&amp;quot;, but many of today's seminarians are going into non-traditional forms of ministry. DTS grads still have a very strong emphasis on teaching the Bible, but more students are doing this outside the traditional church pastor role. The first few ads we ran emphasize these other forms of ministry. We ran each one for around a week and paid per click with click-through rates of around 0.10%. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="190" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/FacebookAdsandVideoforDallasSeminary_A169/image6.png" width="145" border="0" /&gt; &lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="214" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/FacebookAdsandVideoforDallasSeminary_A169/image91.png" width="144" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Which one do you like more?&lt;/p&gt;  &lt;p&gt;The second ad turned out to be more successful (higher click-through rates). This is probably because the image is more appealing and &amp;quot;Dallas Seminary&amp;quot; doesn't show up until later in the text of the ad.&lt;/p&gt;  &lt;p&gt;In addition to advertisements, we also setup a &lt;a href="http://www.facebook.com/pages/Dallas-TX/Dallas-Theological-Seminary/17261545566?ref=ts"&gt;Facebook Page for DTS&lt;/a&gt;. Rather than aggressively market to students through physical mail or email blasts, this allows interested students to check out DTS and ask questions of current students and alumni before talking to an admissions counselor. On &lt;a href="http://goingtoseminary.com/selecting-a-seminary-interview-current-students/"&gt;the GoingToSeminary blog&lt;/a&gt;, there is a great post about connecting to a current student to get real answers. Below is an example of a prospect asking a question that a current student answered on Facebook. That person got a real answer from a real student without ever needing to visit the main seminary website.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="424" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/FacebookAdsandVideoforDallasSeminary_A169/image1.png" width="403" border="0" /&gt; &lt;/p&gt;  &lt;h4&gt;Connecting with Video&lt;/h4&gt;  &lt;p&gt;DTS's excellent AV team has also produced several videos that communicate the &amp;quot;Teach truth. Love Well.&amp;quot; message. These are sent to alumni and supporters via email every few months.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.dts.edu/media/play/?MediaItemID=7701b08a-0bae-4f99-8c4d-af5c73e4f503"&gt;Ben Stuart&lt;/a&gt;       &lt;br /&gt;&lt;/strong&gt;Ben leads a college ministry called BreakAway which is attended by about 5,000 Texas A&amp;amp;M (my alma mater) students. His story is classic DTS and emphasizes &amp;quot;Teach Truth&amp;quot;.&lt;/p&gt; &lt;object id="dtsplayer" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" height="340" width="485" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"&gt;&lt;param name="_cx" value="12832"&gt;&lt;param name="_cy" value="8996"&gt;&lt;param name="FlashVars" value=""&gt;&lt;param name="Movie" value="http://media.dts.edu/embeddedplayer/?MediaItemID=7701b08a-0bae-4f99-8c4d-af5c73e4f503"&gt;&lt;param name="Src" value="http://media.dts.edu/embeddedplayer/?MediaItemID=7701b08a-0bae-4f99-8c4d-af5c73e4f503"&gt;&lt;param name="WMode" value="Window"&gt;&lt;param name="Play" value="0"&gt;&lt;param name="Loop" value="-1"&gt;&lt;param name="Quality" value="High"&gt;&lt;param name="SAlign" value=""&gt;&lt;param name="Menu" value="-1"&gt;&lt;param name="Base" value=""&gt;&lt;param name="AllowScriptAccess" value=""&gt;&lt;param name="Scale" value="ShowAll"&gt;&lt;param name="DeviceFont" value="0"&gt;&lt;param name="EmbedMovie" value="0"&gt;&lt;param name="BGColor" value=""&gt;&lt;param name="SWRemote" value=""&gt;&lt;param name="MovieData" value=""&gt;&lt;param name="SeamlessTabbing" value="1"&gt;&lt;param name="Profile" value="0"&gt;&lt;param name="ProfileAddress" value=""&gt;&lt;param name="ProfilePort" value="0"&gt;&lt;param name="AllowNetworking" value="all"&gt;&lt;param name="AllowFullScreen" value="false"&gt;     &lt;embed id="dtsplayer" width="485" height="340" allowfullscreen="true" allowscriptaccess="always" quality="high" name="dtsplayer" src="http://media.dts.edu/embeddedplayer/?MediaItemID=7701b08a-0bae-4f99-8c4d-af5c73e4f503" type="application/x-shockwave-flash" /&gt;&lt;/object&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.dts.edu/media/play/?MediaItemID=e4856ced-5ac3-4e81-bb96-c836f008c068"&gt;Christ in North Africa&lt;/a&gt;&lt;/strong&gt;     &lt;br /&gt;Where Ben highlights &amp;quot;Teach Truth,&amp;quot; Christy highlights &amp;quot;Love Well.&amp;quot; She is an English teacher North Africa, but never &amp;quot;teaches&amp;quot; Christianity verbally; she does it by loving the girls in her classes. &lt;/p&gt; &lt;object id="dtsplayer" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" height="340" width="485" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"&gt;&lt;param name="_cx" value="12832"&gt;&lt;param name="_cy" value="8996"&gt;&lt;param name="FlashVars" value=""&gt;&lt;param name="Movie" value="http://media.dts.edu/embeddedplayer/?MediaItemID=e4856ced-5ac3-4e81-bb96-c836f008c068"&gt;&lt;param name="Src" value="http://media.dts.edu/embeddedplayer/?MediaItemID=e4856ced-5ac3-4e81-bb96-c836f008c068"&gt;&lt;param name="WMode" value="Window"&gt;&lt;param name="Play" value="0"&gt;&lt;param name="Loop" value="-1"&gt;&lt;param name="Quality" value="High"&gt;&lt;param name="SAlign" value=""&gt;&lt;param name="Menu" value="-1"&gt;&lt;param name="Base" value=""&gt;&lt;param name="AllowScriptAccess" value=""&gt;&lt;param name="Scale" value="ShowAll"&gt;&lt;param name="DeviceFont" value="0"&gt;&lt;param name="EmbedMovie" value="0"&gt;&lt;param name="BGColor" value=""&gt;&lt;param name="SWRemote" value=""&gt;&lt;param name="MovieData" value=""&gt;&lt;param name="SeamlessTabbing" value="1"&gt;&lt;param name="Profile" value="0"&gt;&lt;param name="ProfileAddress" value=""&gt;&lt;param name="ProfilePort" value="0"&gt;&lt;param name="AllowNetworking" value="all"&gt;&lt;param name="AllowFullScreen" value="false"&gt;     &lt;embed id="dtsplayer" width="485" height="340" allowfullscreen="true" allowscriptaccess="always" quality="high" name="dtsplayer" src="http://media.dts.edu/embeddedplayer/?MediaItemID=e4856ced-5ac3-4e81-bb96-c836f008c068" type="application/x-shockwave-flash" /&gt;&lt;/object&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.dts.edu/media/play/?MediaItemID=738d01bc-c6bc-4887-b810-ddab83e9cc18"&gt;William &amp;quot;Duce&amp;quot; Branch&lt;/a&gt;       &lt;br /&gt;&lt;/strong&gt;&amp;quot;Duce&amp;quot; Branch is a pastor who ministers to the hip hop generation through his music.This is a guy who took 120 hours of course work and still managed to keep his love for his culture. He really embraces both elements of &amp;quot;Teach Truth. Love Well.&amp;quot;&lt;/p&gt; &lt;object id="dtsplayer" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" height="340" width="485" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"&gt;&lt;param name="_cx" value="12832"&gt;&lt;param name="_cy" value="8996"&gt;&lt;param name="FlashVars" value=""&gt;&lt;param name="Movie" value="http://media.dts.edu/embeddedplayer/?MediaItemID=738d01bc-c6bc-4887-b810-ddab83e9cc18"&gt;&lt;param name="Src" value="http://media.dts.edu/embeddedplayer/?MediaItemID=738d01bc-c6bc-4887-b810-ddab83e9cc18"&gt;&lt;param name="WMode" value="Window"&gt;&lt;param name="Play" value="0"&gt;&lt;param name="Loop" value="-1"&gt;&lt;param name="Quality" value="High"&gt;&lt;param name="SAlign" value=""&gt;&lt;param name="Menu" value="-1"&gt;&lt;param name="Base" value=""&gt;&lt;param name="AllowScriptAccess" value=""&gt;&lt;param name="Scale" value="ShowAll"&gt;&lt;param name="DeviceFont" value="0"&gt;&lt;param name="EmbedMovie" value="0"&gt;&lt;param name="BGColor" value=""&gt;&lt;param name="SWRemote" value=""&gt;&lt;param name="MovieData" value=""&gt;&lt;param name="SeamlessTabbing" value="1"&gt;&lt;param name="Profile" value="0"&gt;&lt;param name="ProfileAddress" value=""&gt;&lt;param name="ProfilePort" value="0"&gt;&lt;param name="AllowNetworking" value="all"&gt;&lt;param name="AllowFullScreen" value="false"&gt;     &lt;embed id="dtsplayer" width="485" height="340" allowfullscreen="true" allowscriptaccess="always" quality="high" name="dtsplayer" src="http://media.dts.edu/embeddedplayer/?MediaItemID=738d01bc-c6bc-4887-b810-ddab83e9cc18" type="application/x-shockwave-flash" /&gt;&lt;/object&gt;  &lt;p&gt;This last video also has a great metaphor for communicating to different audiences where the president of the school is shown on an upper-middle-class HDTV while Duce is shown on various older TVs. They both are working for the same goal with the same message, but the context and transmission system changes to be audience appropriate. Good stuff. &lt;/p&gt;  &lt;p&gt;I hope this is a helpful summary of how DTS works and how the newer media forms can be used to communicate to changing audiences.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/d9t8py6Y6JM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/d9t8py6Y6JM/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Web-Marketing-using-Facebook-Ads-and-Video-for-Dallas-Seminary.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=8a811777-f72e-4372-8b7f-929e8addb9fa</guid>
      <pubDate>Tue, 06 May 2008 18:22:19 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=8a811777-f72e-4372-8b7f-929e8addb9fa</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=8a811777-f72e-4372-8b7f-929e8addb9fa</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Web-Marketing-using-Facebook-Ads-and-Video-for-Dallas-Seminary.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=8a811777-f72e-4372-8b7f-929e8addb9fa</wfw:commentRss>
    <enclosure url="http://media.dts.edu/embeddedplayer/?MediaItemID=7701b08a-0bae-4f99-8c4d-af5c73e4f503" length="93613" type="application/x-shockwave-flash" /><media:content url="http://media.dts.edu/embeddedplayer/?MediaItemID=7701b08a-0bae-4f99-8c4d-af5c73e4f503" fileSize="93613" type="application/x-shockwave-flash" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Note: This blog is usually fairly technical, dealing with ASP.NET, Flash, and JavaScript code samples, but this is a brief deviation into the broader world of the web as a technology platform for communicating an institution's message. For Dallas Theolog</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> Note: This blog is usually fairly technical, dealing with ASP.NET, Flash, and JavaScript code samples, but this is a brief deviation into the broader world of the web as a technology platform for communicating an institution's message. For Dallas Theological Seminary, we've been experimenting with &amp;quot;branding&amp;quot; and reaching different audiences by producing some new videos and experimenting with Facebook's relatively new targeted advertising. Marketing for Seminaries? Advertising and marketing for churches and seminaries can be a tricky thing, because it seems rather sacrilegious to &amp;quot;market&amp;quot; something spiritual. We've all seen late night and afternoon televangelists that make us cringe. But DTS isn't offering a &amp;quot;product&amp;quot; that someone buys; rather its mission is to train pastors, professors, and missionaries for a lifetime of service. If you call an admissions counselor and ask why you should go to DTS, you won't get a sales pitch. The admissions counselor will tell you that you should go to the school to which God is calling you. The admissions person will then mention some of DTS's strengths, but stay away from comparisons with other schools or &amp;quot;selling DTS.&amp;quot; Still, it is important for DTS to inform prospective students on what kind of school it is and what it's strengths are. Basic marketing ideas can help convey this, and naturally the web is a great place to start. Context for the Advertisements Any time you create an ad for a &amp;quot;company,&amp;quot; it is important to know the background of the business and the historical context in which the ad is situated. This history of seminaries and churches in America is key to understanding what ads will communicate to the seminary audience. &amp;#160; In the early 1900s, was a debate in the Christian church between &amp;quot;fundamentalists&amp;quot; (those who believe certain truths are the most important thing about Christianity) and &amp;quot;liberals&amp;quot; (those who believe certain actions are the most important thing about Christianity). In this debate, it seemed that the &amp;quot;liberals&amp;quot; forgot that Jesus asked Christians to believe something (that he is the savior and the Son of God), while the the fundamentalists often forgot that Jesus asked Christians to do something (love others). DTS was started in the 1920s during the fundamentalist movement. Unfortunately, many of the seminaries which started during this time period have a reputation of caring about teaching the Bible, but neglecting to meet real world needs. By the 60s and 70s, some Christians wanted to balance the emphases of both the liberals (loving) and fundamentalists (truth), and there they were called &amp;quot;evangelicals.&amp;quot; Today, this term has become politically decisive and has less positive connotations in many places, so the word &amp;quot;evangelical&amp;quot; communicates something different than it used it. Today's students who are considering seminary are more concerned than ever about balancing these two things and so DTS needs new ways to communicate that it wants to care about Christian beliefs and Christian practices without making one too dominate. These students also don't read traditional Christian publications, so DTS needs to shift from print publications to Internet and from top down communication to allowing prospects to connect to real students. A New Tagline The older taglines for DTS have been things that primarily emphasize Biblical teaching such as &amp;quot;Standing Strong for the Truth&amp;quot; or &amp;quot;Training You Can Trust. Leaders You Can Follow.&amp;quot; We wanted something shorter and somewhat pithy that emphasized both aspects of truth and love. Here's what we came up with. Teach Truth. Love Well. Not too revolutionary, but hopefully it's clear and it communicates. Here's how Google sees it :) Facebook Page and Ads Summary DTS has traditionally run ads on large Christian website like ChristianityToday.com and OnePlace.com. But to reach younger students, we moved over </itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=8a811777-f72e-4372-8b7f-929e8addb9fa</feedburner:origLink></item>
    <item>
      <title>Dynamic Text Replacement with JavaScript and C# ASP.NET</title>
      <description>&lt;h4&gt;What it Does&lt;/h4&gt;  &lt;p&gt;You write some basic markup and include a JavaScript file and some code which replaces normal text with a .NET generated image:&lt;/p&gt;  &lt;pre class="prettyprint"&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
h2 { color: #9E100F; size: 22px; }
&amp;lt;/style&amp;gt;

&amp;lt;!-- This says &amp;quot;Frequently asked questions in zh-TW --&amp;gt;&lt;br /&gt;&amp;lt;!-- If you just see boxes, you need to install Asian fonts on your machine --&amp;gt;
&amp;lt;h2&amp;gt;關於網上教育常見的問題&amp;lt;/h2&amp;gt;

&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;fontreplacer.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
FontReplacer.replace('h2','*', 'MyGreatFont');
&amp;lt;/script&amp;gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://johndyer.name/lab/fontwriter/"&gt;See the DEMO&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will take all h2 tags with any class (*) and replace them with and image rendered using 'MyGreatFont'. This font needs to be installed the c:\windows\fonts\ folder of your server or in the same folder as the .NET script which generates it. Initially the page will look like this (using the standard font for Chinese script on a PC which is 'MS Mincho'):&lt;/p&gt;

&lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="55" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image6.png" width="294" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;But after the replacement happens, it looks like this:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="55" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image3.png" width="294" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;With another less formal font, it could look like this:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="55" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image11.png" width="294" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;Of course, you can use any font installed on the server and it is not limited to Chinese text. Here is an example replacing the default Times New Roman text with Century Gothic:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="44" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image_19.png" width="340" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="44" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image_20.png" width="340" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;This may be useful in other scenarios for viewing Unicode text on a machine without Unicode fonts installed (Greek, Hebrew, Arabic, etc.).&lt;/p&gt;

&lt;p&gt;It can also produce anti-aliased PNGs for use on top of an image:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="61" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image_12.png" width="217" border="0" /&gt; &lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="61" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DynamicTextReplacementusingCASP.NET_D615/image_13.png" width="217" border="0" /&gt; &lt;/p&gt;

&lt;h4&gt;Why I did it&lt;/h4&gt;

&lt;p&gt;Recently, I needed to have the titles for a series of webpages be rendered in a specific Chinese font (see &lt;a href="http://www.dts.edu/chinese"&gt;http://www.dts.edu/chinese&lt;/a&gt; and click on &amp;quot;zh-TW&amp;quot; in the upper right) because the default doesn't look very official (according to my Chinese friends). I wanted to use &lt;a href="http://novemberborn.net/sifr3"&gt;sIFR&lt;/a&gt; which replaces the HTML text node with a Flash file that has the font embedded. The problem is that Chinese fonts are 3-8MB which means the user has to download a gigantic SWF. Also, there can be copyright problems with using sIFR.&lt;/p&gt;

&lt;p&gt;So I turned to .NET to generate images using the font. The basic technique was first published back in a 2004 A List Apart article titled &lt;a href="http://www.alistapart.com/articles/dynatext"&gt;Dynamic Text Replacement&lt;/a&gt;. ALA used JavaScript and PHP and, since then, there have been many permutations of the basic idea, some using &lt;a href="http://www.artypapers.com/csshelppile/pcdtr/"&gt;pure CSS&lt;/a&gt; instead of JavaScript. I haven't seen a good one for .NET, so I had to write my own. I don't like using CSS for some of the &lt;a href="http://www.quirksmode.org/dom/fir.html"&gt;reasons mentioned here&lt;/a&gt;, so I went with JavaScript for the replacement. This way users without images or JavaScript can still see the text. Users with images and JavaScript get a slightly nicer view.&lt;/p&gt;

&lt;h4&gt;How it Works&lt;/h4&gt;

&lt;p&gt;The JavaScript method looks at the HTML element(s) you send it and pulls out the text and font color. It then sends a request to ASP.NET to return an image which renders the text using your assigned font and colors. There are three ways to call it:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;// elements by tag and class
FontReplacer.replace(tag, class, fontName);
// elements by tag and class inside a given elmenent
FontReplacer.replaceIn(element, tag, class, fontName);
// replace array of elements
FontReplacer.replaceElements(elementArray, fontName);&lt;/pre&gt;

&lt;p&gt;This calls up a .NET script which writes the text to an image using the specified font. The C# code can generate a JPG or transparent PNG which happily sits on top of any background and looks very nice. (There is a flag in the JavaScript to to allow the PNG transparency). There are some tricks in .NET for generating a PNG with alpha channels and for saving a JPEG with a specified quality, so here's the full code for that part.&lt;/p&gt;

&lt;pre class="prettyprint"&gt;if (backColor == &amp;quot;transparent&amp;quot;)
{
	MemoryStream io = new MemoryStream();
	bitmap.Save(io, ImageFormat.Png);

	context.Response.ContentType = &amp;quot;image/png&amp;quot;;
	context.Response.BinaryWrite(io.GetBuffer());
}
else
{
	context.Response.ContentType = &amp;quot;image/jpg&amp;quot;;
	SaveAsJpeg(bitmap, context.Response.OutputStream, (long)100);
}
void SaveAsJpeg(Image inputImage, Stream stream, long quality)
{
	 // generate JPEG stuff
	 ImageCodecInfo codecEncoder = GetEncoder(&amp;quot;image/jpeg&amp;quot;);
	 EncoderParameters encoderParams = new EncoderParameters(1);
	 EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
	 encoderParams.Param[0] = qualityParam;
	 inputImage.Save(stream, codecEncoder, encoderParams);
}
ImageCodecInfo GetEncoder(string mimeType)
{
	ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
	foreach (ImageCodecInfo codec in codecs)
	{
		if (codec.MimeType == mimeType)
		{
			return codec;
		}
	}
	return null;

}&lt;/pre&gt;

&lt;p&gt;There are also flags in the JavaScript to force the returned image to be the same height and width as the element you are replacing. By default, the height is forced so that the page doesn't jerk at all, but you should be aware that browsers often report the font size inaccurately. Also, .NET's measurement of the size a given string will take up can include some padding depending on the font, so you may have to play with it for your scenario.&lt;/p&gt;

&lt;p&gt;Lastly, there are some important things to know about using fonts on the server.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;When you install a font on c:\windows\fonts\, IIS doesn't immediately know it's there. You'll need to run the &amp;quot;resetiis&amp;quot; command for IIS to pick up the new fonts. &lt;/li&gt;

  &lt;li&gt;If you're in a hosted environment and can't install fonts, you're still in luck. There is some code to load a *.TTF file in the fontwriter.ashx script. In this case, you'll need to specify the font file name ('gothic.ttf') rather than the installed font name ('Century Gothic'). &lt;/li&gt;

  &lt;li&gt;You might want to adjust the TextRenderingHint hint property at the top if you don't want anti-aliased rendering.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Download &amp;amp; Example&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://johndyer.name/lab/fontwriter/"&gt;Example page&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://johndyer.name/file.axd?file=fontwriter.zip"&gt;Download ASP.NET Dynamic Text Replacement&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/3LCWaO2wnX4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/3LCWaO2wnX4/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/dynamic-text-replacement-with-javascript-csharp-asp-net.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=2af92b21-9945-45c8-8031-35b4aa66cb76</guid>
      <pubDate>Wed, 23 Apr 2008 18:32:42 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=2af92b21-9945-45c8-8031-35b4aa66cb76</pingback:target>
      <slash:comments>32</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=2af92b21-9945-45c8-8031-35b4aa66cb76</trackback:ping>
      <wfw:comment>http://johndyer.name/post/dynamic-text-replacement-with-javascript-csharp-asp-net.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=2af92b21-9945-45c8-8031-35b4aa66cb76</wfw:commentRss>
    <enclosure url="http://johndyer.name/file.axd?file=fontwriter.zip" length="115742" type="application/octet-stream" /><media:content url="http://johndyer.name/file.axd?file=fontwriter.zip" fileSize="115742" type="application/octet-stream" /><itunes:explicit>no</itunes:explicit><itunes:subtitle>What it Does You write some basic markup and include a JavaScript file and some code which replaces normal text with a .NET generated image: &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt; h2 { color: #9E100F; size: 22px; } &amp;lt;/style&amp;gt; &amp;lt;!-- This says &amp;quot;</itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary>What it Does You write some basic markup and include a JavaScript file and some code which replaces normal text with a .NET generated image: &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt; h2 { color: #9E100F; size: 22px; } &amp;lt;/style&amp;gt; &amp;lt;!-- This says &amp;quot;Frequently asked questions in zh-TW --&amp;gt; &amp;lt;!-- If you just see boxes, you need to install Asian fonts on your machine --&amp;gt; &amp;lt;h2&amp;gt;關於網上教育常見的問題&amp;lt;/h2&amp;gt; &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;fontreplacer.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt; FontReplacer.replace('h2','*', 'MyGreatFont'); &amp;lt;/script&amp;gt; See the DEMO This will take all h2 tags with any class (*) and replace them with and image rendered using 'MyGreatFont'. This font needs to be installed the c:\windows\fonts\ folder of your server or in the same folder as the .NET script which generates it. Initially the page will look like this (using the standard font for Chinese script on a PC which is 'MS Mincho'): But after the replacement happens, it looks like this: With another less formal font, it could look like this: Of course, you can use any font installed on the server and it is not limited to Chinese text. Here is an example replacing the default Times New Roman text with Century Gothic: This may be useful in other scenarios for viewing Unicode text on a machine without Unicode fonts installed (Greek, Hebrew, Arabic, etc.). It can also produce anti-aliased PNGs for use on top of an image: Why I did it Recently, I needed to have the titles for a series of webpages be rendered in a specific Chinese font (see http://www.dts.edu/chinese and click on &amp;quot;zh-TW&amp;quot; in the upper right) because the default doesn't look very official (according to my Chinese friends). I wanted to use sIFR which replaces the HTML text node with a Flash file that has the font embedded. The problem is that Chinese fonts are 3-8MB which means the user has to download a gigantic SWF. Also, there can be copyright problems with using sIFR. So I turned to .NET to generate images using the font. The basic technique was first published back in a 2004 A List Apart article titled Dynamic Text Replacement. ALA used JavaScript and PHP and, since then, there have been many permutations of the basic idea, some using pure CSS instead of JavaScript. I haven't seen a good one for .NET, so I had to write my own. I don't like using CSS for some of the reasons mentioned here, so I went with JavaScript for the replacement. This way users without images or JavaScript can still see the text. Users with images and JavaScript get a slightly nicer view. How it Works The JavaScript method looks at the HTML element(s) you send it and pulls out the text and font color. It then sends a request to ASP.NET to return an image which renders the text using your assigned font and colors. There are three ways to call it: // elements by tag and class FontReplacer.replace(tag, class, fontName); // elements by tag and class inside a given elmenent FontReplacer.replaceIn(element, tag, class, fontName); // replace array of elements FontReplacer.replaceElements(elementArray, fontName); This calls up a .NET script which writes the text to an image using the specified font. The C# code can generate a JPG or transparent PNG which happily sits on top of any background and looks very nice. (There is a flag in the JavaScript to to allow the PNG transparency). There are some tricks in .NET for generating a PNG with alpha channels and for saving a JPEG with a specified quality, so here's the full code for that part. if (backColor == &amp;quot;transparent&amp;quot;) { MemoryStream io = new MemoryStream(); bitmap.Save(io, ImageFormat.Png); context.Response.ContentType = &amp;quot;image/png&amp;quot;; context.Response.BinaryWrite(io.GetBuffer()); } else { context.Response.ContentType = &amp;quot;image/jpg&amp;quot;; SaveAsJpeg(bitmap, context.Response.OutputStream, (long)100); } void SaveAsJpeg(Image inputImage, Stream stream, long quality) { // gener</itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=2af92b21-9945-45c8-8031-35b4aa66cb76</feedburner:origLink></item>
    <item>
      <title>var baby = john.Meiosis() + amber.Meiosis();</title>
      <description>&lt;p&gt;
Just a little genetics (my college major)  humor written in C# 3.0 syntax (with overloaded operators and an implicitely typed local var) to announce that we&amp;#39;re going to be parents later this fall! Check out the sweet spin moves below. I&amp;#39;m calling all-star running back...
&lt;/p&gt;
&lt;p&gt;
&lt;div id="offspring01_sonogram_container" style="width:480px;height:380px;" class="flashVideo"&gt;
	
	&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
	   codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" 
	   width="480" height="380" id="offspring01_sonogram_obj" align="middle" flashvars="autostart=false&amp;file=http://johndyer.name/flashvideo/offspring01_sonogram.flv&amp;image=http://johndyer.name/flashvideo/offspring01_sonogram.jpg"&gt;
	&lt;param name="allowScriptAccess" value="sameDomain" /&gt;
	&lt;param name="movie" value="http://johndyer.name/flashvideo/flvplayer.swf" /&gt;
	&lt;param name="quality" value="high" /&gt;
	&lt;param name="bgcolor" value="#ffffff" /&gt;
	&lt;embed src="http://johndyer.name/flashvideo/flvplayer.swf" quality="high" bgcolor="#ffffff" width="480" 
	   height="380" name="mymovie" align="middle" allowScriptAccess="sameDomain" 
	   flashvars="autostart=false&amp;file=http://johndyer.name/flashvideo/offspring01_sonogram.flv&amp;image=http://johndyer.name/flashvideo/offspring01_sonogram.jpg"
	   type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" /&gt;
	&lt;/object&gt;						
							&lt;/div&gt;&lt;p&gt;&lt;a href="http://johndyer.name/flashvideo/offspring01_sonogram.flv"&gt;offspring01_sonogram.flv&lt;/a&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;ldquo;&lt;span&gt;Behold, children are a gift of the LORD; The fruit of the womb is a reward.&amp;rdquo; Psalm 127:3&lt;/span&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/-pait6ZLcSc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/-pait6ZLcSc/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/var-baby-john-Meiosis-amber-Meiosis.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=f92ff5d2-a104-4d59-9bcc-6aafa7b84bda</guid>
      <pubDate>Thu, 17 Apr 2008 04:21:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=f92ff5d2-a104-4d59-9bcc-6aafa7b84bda</pingback:target>
      <slash:comments>14</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=f92ff5d2-a104-4d59-9bcc-6aafa7b84bda</trackback:ping>
      <wfw:comment>http://johndyer.name/post/var-baby-john-Meiosis-amber-Meiosis.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=f92ff5d2-a104-4d59-9bcc-6aafa7b84bda</wfw:commentRss>
    <enclosure url="http://johndyer.name/flashvideo/offspring01_sonogram.flv" length="6967045" type="video/x-flv" /><media:content url="http://johndyer.name/flashvideo/offspring01_sonogram.flv" fileSize="6967045" type="video/x-flv" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Just a little genetics (my college major) humor written in C# 3.0 syntax (with overloaded operators and an implicitely typed local var) to announce that we&amp;#39;re going to be parents later this fall! Check out the sweet spin moves below. I&amp;#39;m calling </itunes:subtitle><itunes:author>johndyer@gmail.com</itunes:author><itunes:summary> Just a little genetics (my college major) humor written in C# 3.0 syntax (with overloaded operators and an implicitely typed local var) to announce that we&amp;#39;re going to be parents later this fall! Check out the sweet spin moves below. I&amp;#39;m calling all-star running back... offspring01_sonogram.flv &amp;ldquo;Behold, children are a gift of the LORD; The fruit of the womb is a reward.&amp;rdquo; Psalm 127:3 &amp;nbsp; </itunes:summary><itunes:keywords>c,ASP,NET,Flash,Papervision,JavaScript,HTML,XHTML,3D,NET,AS3,ActionScript</itunes:keywords><feedburner:origLink>http://johndyer.name/post.aspx?id=f92ff5d2-a104-4d59-9bcc-6aafa7b84bda</feedburner:origLink></item>
    <item>
      <title>Dallas Seminary Mobile Site</title>
      <description>&lt;p&gt;Since &lt;a href="http://www.flashdevices.net/2008/03/microsoft-licenses-flash-lite-3-and.html"&gt;Microsoft&lt;/a&gt; and &lt;a href="http://www.flashdevices.net/2008/03/adobe-flash-player-coming-to-iphone.html"&gt;Apple&lt;/a&gt; finally decided to allow/license versions of &lt;a href="http://www.adobe.com/products/flashlite/"&gt;Flash Lite 3.0&lt;/a&gt; for their mobile devices (Windows Mobile and iPhone), I created an initial build of a mobile site for Dallas Seminary which will eventually use Flash Lite 3.0 for all the audio and video content.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Main site: &lt;a href="http://www.dts.edu"&gt;www.dts.edu&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Mobile site: &lt;a href="http://mobile.dts.edu"&gt;mobile.dts.edu&lt;/a&gt;&amp;#160; (view with &lt;a href="iphonetester.com/?url=http%3A%2F%2Fmobile.dts.edu"&gt;iPhone tester&lt;/a&gt;) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The goal was to make it look like an iPhone application using the list format, but have it work properly on other mobile devices by not specifically targeting the iPhone's screen size such as Windows Mobile and Blackberry. It's a bit more cramped on the smaller WM screen, but it works well.&lt;/p&gt;  &lt;p&gt;Here are a few screen shots:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="500" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="250"&gt;iPhone&lt;/td&gt;        &lt;td valign="top" width="250"&gt;Windows Mobile&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="250"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="485" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DallasSeminaryMobileSite_D1D7/image_3.png" width="324" border="0" /&gt; &lt;/td&gt;        &lt;td valign="top" width="250"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="324" alt="dts_wm_home" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DallasSeminaryMobileSite_D1D7/dts_wm_home_3.png" width="244" border="0" /&gt; &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="250"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="485" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DallasSeminaryMobileSite_D1D7/image_9.png" width="324" border="0" /&gt; &lt;/td&gt;        &lt;td valign="top" width="250"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="324" alt="dts_wm_media" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DallasSeminaryMobileSite_D1D7/dts_wm_media_3.png" width="244" border="0" /&gt; &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There is one gotcha on the iPhone that doesn't show up using Safari. The iPhone may try to startup zoomed out like it would need for a normal website. If your &amp;lt;div&amp;gt; tags are set to expand, the iPhone will stretch everything out and then zoom out.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="482" alt="image" src="http://johndyer.name/file.axd?file=WindowsLiveWriter/DallasSeminaryMobileSite_D1D7/image_10.png" width="324" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;To fix this add the following:&lt;/p&gt;  &lt;pre class="prettyprint"&gt;&amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;user-scalable=no,width=320,scale=1.0&amp;quot; /&amp;gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/HjLToIPny6Q" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/HjLToIPny6Q/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Dallas-Seminary-Mobile-Site.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=4f9e50fa-2d31-4898-a736-acba0022ee89</guid>
      <pubDate>Tue, 15 Apr 2008 00:56:10 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=4f9e50fa-2d31-4898-a736-acba0022ee89</pingback:target>
      <slash:comments>21</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=4f9e50fa-2d31-4898-a736-acba0022ee89</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Dallas-Seminary-Mobile-Site.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=4f9e50fa-2d31-4898-a736-acba0022ee89</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=4f9e50fa-2d31-4898-a736-acba0022ee89</feedburner:origLink></item>
    <item>
      <title>Totally Unobtrusive (and totally awesome) Upside Down Text</title>
      <description>&lt;p&gt;There is a huge need for upside down text on the web. With everyone &amp;quot;going mobile,&amp;quot; developers cannot simply rely on users having their screens oriented the same way all the time. I went through all of the possible options for creating upside down text and finally came up with a totally unobtrusive, Unicode enabled, completely web-changing piece of code (which is mostly from &lt;a href="http://www.sevenwires.com/play/UpsideDownLetters.html"&gt;someone else&lt;/a&gt; and using &lt;a href="http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/"&gt;this&lt;/a&gt; and &lt;a href="http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html"&gt;this&lt;/a&gt;).&lt;/p&gt;  &lt;h4&gt;Options for Upside Down Text&lt;/h4&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Images&lt;/strong&gt;&lt;em&gt; &lt;/em&gt;- The most obvious option for upside down text is to open up Photoshop, enter some text, and use Rotate Canvas.       &lt;br /&gt;&lt;em&gt;Pros:&lt;/em&gt; easy to do.       &lt;br /&gt;&lt;em&gt;Cons:&lt;/em&gt; must be done for every piece of text. Not every OS/browser in the world can display images. This is just unacceptable.       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;sIFR&lt;/strong&gt; - I know it's a little 2005 of me to say it, but a great use of Flash is to &lt;a href="http://www.mikeindustries.com/sifr"&gt;replace text&lt;/a&gt; and rotate it around.       &lt;br /&gt;&lt;em&gt;Pros: &lt;/em&gt;works for any HTML text element.       &lt;br /&gt;&lt;em&gt;Cons: &lt;/em&gt;requires Flash which has even less support than images. Also, requires extra coding.       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Canvas&lt;/strong&gt; - one day it might be possible to do more with &lt;a href="http://www.federated.com/~jim/canvastext/"&gt;text drawing on a canvas tag&lt;/a&gt;, but right now its not       &lt;br /&gt;&lt;em&gt;Pros: &lt;/em&gt;none, for now.       &lt;br /&gt;&lt;em&gt;Cons: &lt;/em&gt;doesn't exist.       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;JavaScript&lt;em&gt; &lt;/em&gt;&lt;/strong&gt;- Everyone knows JavaScript can do anything. See my experiments in &lt;a href="http://johndyer.name//post/2007/12/Stupid-JavaScript-Tricks-3D-Panorama.aspx"&gt;3D&lt;/a&gt; and &lt;a href="http://johndyer.name//post/2007/09/PhotoShop-like-JavaScript-Color-Picker.aspx"&gt;color&lt;/a&gt; and &lt;a href="http://www.overdrawn.net/mario/"&gt;this guy's port of Mario&lt;/a&gt;. Using &lt;a href="http://www.sevenwires.com/play/UpsideDownLetters.html"&gt;this great script&lt;/a&gt; its possible to simulate upside down characters using Unicode equivalents.      &lt;br /&gt;&lt;em&gt;Pros: &lt;/em&gt;is awesome.       &lt;br /&gt;&lt;em&gt;Cons: &lt;/em&gt;nothing at all. &lt;/li&gt; &lt;/ol&gt;  &lt;h4&gt;Usage &amp;amp;Implementation&lt;/h4&gt;  &lt;p&gt;Just give your HTML element a class called &amp;quot;upsidedowntext&amp;quot; and add the script in the header and you have pure greatness:&lt;/p&gt;  &lt;div class="indent" style="margin-left: 20px"&gt;   &lt;pre class="prettyprint"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;upsidedown.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;div class=&amp;quot;upsidedowntext&amp;quot;&amp;gt;I can be read in any orientation&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;I can be read in any orientation&amp;lt;/div&amp;gt;

&amp;lt;div class=&amp;quot;upsidedowntext&amp;quot;&amp;gt;This is Tom Cruise taking your picture&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;This is a boring Russian Mig&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;div class="indent" style="margin-left: 20px"&gt;
  &lt;div&gt;uoıʇɐʇuǝıɹo ʎuɐ uı pɐǝɹ ǝq uɐɔ ı&lt;/div&gt;

  &lt;div&gt;I can be read in any orientation&lt;/div&gt;

  &lt;br /&gt;

  &lt;div&gt;ǝɹnʇɔıd ɹnoʎ ƃuıʞɐʇ ǝsınɹɔ ɯoʇ sı sıɥʇ&lt;/div&gt;

  &lt;div&gt;This is a boring Russian Mig &lt;/div&gt;
&lt;/div&gt;

&lt;h4&gt;Demo and Download&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://johndyer.name/lab/upsidedowntext/"&gt;Upside down text in action&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  &lt;br /&gt;Note: this post was intended to be an light-hearted (late) April's fools poke at all the random stuff developers are doing with JavaScript, sometimes in the name of a standard or idea that really isn't really needed. Also, I think upside down text is funny.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/mXyNx0aA1WA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/mXyNx0aA1WA/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/Stupid-JavaScript-Tricks-Totally-Unobtrusive-Upside-Down-Text.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=9d57a900-b504-4c44-8cbe-e9f710c5cfce</guid>
      <pubDate>Fri, 11 Apr 2008 02:38:26 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=9d57a900-b504-4c44-8cbe-e9f710c5cfce</pingback:target>
      <slash:comments>42</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=9d57a900-b504-4c44-8cbe-e9f710c5cfce</trackback:ping>
      <wfw:comment>http://johndyer.name/post/Stupid-JavaScript-Tricks-Totally-Unobtrusive-Upside-Down-Text.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=9d57a900-b504-4c44-8cbe-e9f710c5cfce</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=9d57a900-b504-4c44-8cbe-e9f710c5cfce</feedburner:origLink></item>
    <item>
      <title>QTVR like Panoramas of Chichen Itza made in Flash with Papervision3D</title>
      <description>&lt;p&gt;
Last week, I visited Cancun with my in-laws and had a chance to see the ruins at &lt;a href="http://en.wikipedia.org/wiki/Chichen_Itza"&gt;Chichen Itza&lt;/a&gt;. I took a series of photos and made them into a panorama using &lt;a href="http://www.papervision3d.org/"&gt;Papervision3D&lt;/a&gt; (as done &lt;a href="http://labs.blitzagency.com/?p=388"&gt;here by BlitzAgency for NBC&amp;#39;s The Office&lt;/a&gt; and &lt;a href="http://flashpanoramas.com/blog/2007/05/23/add-some-life-to-panoramas/"&gt;here by a company selling a product called Flash Panoramas&lt;/a&gt;). I made a little script that can handle both spherical and cubic images to see how both would look. Here&amp;#39;s some previews of the two versions (The lines are there to show how the panorama is being constructed):
&lt;/p&gt;
  
&lt;table border="0" cellspacing="0" cellpadding="2" width="500"&gt;
	&lt;tbody&gt;
		     
		&lt;tr&gt;
			       
			&lt;td width="250" valign="top"&gt;&lt;strong&gt;Spherical&lt;/strong&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
			&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/QTVRlikePanoramasofChichenItzamadeinFlas_CD9D/CropperCapture%5B45%5D_2.jpg"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/QTVRlikePanoramasofChichenItzamadeinFlas_CD9D/CropperCapture%5B45%5D_thumb.jpg" border="0" alt="CropperCapture[45]" width="280" height="215" /&gt;&lt;/a&gt; &lt;/td&gt;        
			&lt;td width="250" valign="top"&gt;&lt;strong&gt;Cubic&lt;/strong&gt;&lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/CropperCapture[42][3].jpg"&gt;            &lt;br /&gt;
			&lt;/a&gt;&lt;a href="http://johndyer.name/image.axd?picture=WindowsLiveWriter/QTVRlikePanoramasofChichenItzamadeinFlas_CD9D/CropperCapture%5B42%5D_4.jpg"&gt;&lt;img style="border-width: 0px" src="http://johndyer.name/image.axd?picture=WindowsLiveWriter/QTVRlikePanoramasofChichenItzamadeinFlas_CD9D/CropperCapture%5B42%5D_thumb_1.jpg" border="0" alt="CropperCapture[42]" width="280" height="215" /&gt;&lt;/a&gt; &lt;/td&gt;     
		&lt;/tr&gt;
		   
	&lt;/tbody&gt;
&lt;/table&gt;
  
&lt;p&gt;
A cubsic panorama is composed of six images (top, bottom, left, right, front, back) while a spherical panorama is made using a single image which is stretched at the top and bottom (like a map of the world where Greenland and Antarctica are distorted). In general, it looks like the spherical version can generate the same level of detail with fewer polygons and thus more speed, but the cubic images can be a little smaller and are more easily edited.
&lt;/p&gt;
  
&lt;p&gt;
Each of these is composed from approximately 45-50 images. I took around 15 in a circle at the horizon, 15 looking up about 45 degrees, and 15 looking down 45 degrees. Unfortunately, I didn&amp;#39;t take enough pictures to complete the sky or the ground below, so you&amp;#39;ll see some black spots if you &amp;quot;look&amp;quot; up or down. I used &lt;a href="http://hugin.sourceforge.net/"&gt;Hugin&lt;/a&gt; to stitch the images together, and it did a pretty good job considering I didn&amp;#39;t have a tripod or wide angle lens to accurately take the pictures. (link: &lt;a href="http://rosaurophotography.com/html/technical.html"&gt;the best tutorial I have seen on image stitching&lt;/a&gt;)
&lt;/p&gt;
  
&lt;p&gt;
&lt;strong&gt;3D Panoramas&lt;/strong&gt;
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;Pyramid: &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/?image=pyramid"&gt;spherical&lt;/a&gt; | &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/?image=pyramid&amp;amp;mode=cube"&gt;cubic&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;Ball court: &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/?image=ballcourt"&gt;spherical&lt;/a&gt; | &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/?image=ballcourt&amp;amp;mode=cube"&gt;cubic&lt;/a&gt; &lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
&lt;strong&gt;Original Images&lt;/strong&gt;
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;Pyramid:      
	&lt;ul&gt;
		       
		&lt;li&gt;&lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid.jpg"&gt;sphere&lt;/a&gt; &lt;/li&gt;        
		&lt;li&gt;&lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid_0.jpg"&gt;front&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid_1.jpg"&gt;right&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid_2.jpg"&gt;back&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid_3.jpg"&gt;left&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid_4.jpg"&gt;top&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/pyramid_5.jpg"&gt;bottom&lt;/a&gt; &lt;/li&gt;     
	&lt;/ul&gt;
	   &lt;/li&gt;    
	&lt;li&gt;Ball Court      
	&lt;ul&gt;
		       
		&lt;li&gt;&lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt.jpg"&gt;sphere&lt;/a&gt; &lt;/li&gt;        
		&lt;li&gt;&lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt_0.jpg"&gt;front&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt_1.jpg"&gt;right&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt_2.jpg"&gt;back&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt_3.jpg"&gt;left&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt_4.jpg"&gt;top&lt;/a&gt;, &lt;a href="http://johndyer.name/lab/pv3d/panorama/chichenitza/images/ballcourt_5.jpg"&gt;bottom&lt;/a&gt; &lt;/li&gt;     
	&lt;/ul&gt;
	   &lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
The view page also has a list of commands (f=fullscreen) and links to the original files.
&lt;/p&gt;
  
&lt;p&gt;
&lt;strong&gt;Update: &lt;/strong&gt;I changed the navigation to be more like QTVR where you have to click to move, and there is an arrow cursor. Also, smoothing and precision are automatically applied when you stop moving.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johndyer/~4/1Gx3-6WEnoM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/johndyer/~3/1Gx3-6WEnoM/post.aspx</link>
      <author>johndyer@gmail.com</author>
      <comments>http://johndyer.name/post/QTVR-like-Panoramas-of-Chichen-Itza-made-in-Flash-with-Papervision.aspx#comment</comments>
      <guid isPermaLink="false">http://johndyer.name/post.aspx?id=fddd2cd2-321d-4d96-822e-53da580255dc</guid>
      <pubDate>Mon, 17 Mar 2008 00:38:00 +0300</pubDate>
      <dc:publisher>John Dyer</dc:publisher>
      <pingback:server>http://johndyer.name/pingback.axd</pingback:server>
      <pingback:target>http://johndyer.name/post.aspx?id=fddd2cd2-321d-4d96-822e-53da580255dc</pingback:target>
      <slash:comments>28</slash:comments>
      <trackback:ping>http://johndyer.name/trackback.axd?id=fddd2cd2-321d-4d96-822e-53da580255dc</trackback:ping>
      <wfw:comment>http://johndyer.name/post/QTVR-like-Panoramas-of-Chichen-Itza-made-in-Flash-with-Papervision.aspx#comment</wfw:comment>
      <wfw:commentRss>http://johndyer.name/syndication.axd?post=fddd2cd2-321d-4d96-822e-53da580255dc</wfw:commentRss>
    <feedburner:origLink>http://johndyer.name/post.aspx?id=fddd2cd2-321d-4d96-822e-53da580255dc</feedburner:origLink></item>
  <media:rating>nonadult</media:rating><media:description type="plain">Technology and web development in ASP.NET, Flash, and JavaScript</media:description></channel>
</rss>
