<?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>Nicolas Schudel &#187; Javascript</title>
	<atom:link href="http://nicolasschudel.name/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://nicolasschudel.name</link>
	<description>Balancing Design and Development in Online Media</description>
	<lastBuildDate>Sun, 09 May 2010 08:42:26 +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>Linking a Site’s Search Function to the Browser’s Search Bar</title>
		<link>http://nicolasschudel.name/linking-search/</link>
		<comments>http://nicolasschudel.name/linking-search/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 18:56:02 +0000</pubDate>
		<dc:creator>Nicolas</dc:creator>
				<category><![CDATA[Branding]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Search]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://nicolasschudel.name/?p=180</guid>
		<description><![CDATA[<p>The search bar has become a common feature in modern web browsers. Equally common, are search forms embedded into web sites. I talk about a format named OpenSearch and show how it can be used to link site- and browser search functionality.</p>]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.mozilla.com/en-US/firefox/search.html">search bar</a> has become a common feature in modern browsers since it was <a href="http://en.wikipedia.org/wiki/Browser_wars#The_second_browser_war">introduced by Firefox in 2004</a>. Users have gotten so used to finding the search bar in the upper right hand corner of the window, that many sites<a href="http://www.uie.com/brainsparks/2006/03/22/does-search-need-to-be-in-the-upper-right/"> adapted their layout to place their own local search in the same area</a>.</p>

<p>A lesser known feature of browsers, such as Firefox 2 or Internet Explorer 7, is that users can add search functionality to the browser’s search bar directly from within a page. The data structure containing the search information has (so far) been agreed upon as <a href="http://www.opensearch.org/">OpenSearch</a>. Since the format is open, any browser software can implement this functionality.</p>

<div class="column half left">
<div id="attachment_192" class="wp-caption alignnone" style="width: 314px"><img src="http://nicolasschudel.name/fileadmin/articles/2009/11/firefox3_searchbar.jpg" alt="The Firefox search bar with a linked OpenSearch example on the bottom." title="Firefox 3 Search Bar" width="304" height="216" class="size-full wp-image-192" /><p class="wp-caption-text">The Firefox search bar with a linked OpenSearch example on the bottom.</p></div>
</div>
<div class="column half right">
<div id="attachment_193" class="wp-caption alignnone" style="width: 314px"><img src="http://nicolasschudel.name/fileadmin/articles/2009/11/ie8_searchbar.jpg" alt="The Internet Explorer search bar listing the OpenSearch example." title="Internet Explorer 8 Search Bar" width="304" height="216" class="size-full wp-image-193" /><p class="wp-caption-text">The Internet Explorer search bar listing an OpenSearch example.</p></div>
</div>
<h2>When to use OpenSearch</h2>
<p>OpenSearch makes sense on any site that provides search functionality. When active, Firefox and Internet Explorer include an option to add the site’s search in the search bar. </p>
<img src="http://nicolasschudel.name/fileadmin/articles/2009/11/add_search_bar_link.jpg" alt="A link indicating that the site’s search can be added to the browser search bar" title="Search Bar Link" width="244" height="208" class="alignleft size-full wp-image-189" />

<p>In my opinion, adding a notice or a link on the page to enable the search functionality is overkill for most sites. I personally wouldn’t use it for my own weblog. On the other hand, an online store with thousands of products could greatly benefit from this feature as a brand touchpoint; And informing the user about this functionality would be worthwhile. Once a user adds a site to their browsers search bar, it is a constant reminder of the site’s existence. Every time a user activates the search bar drop-down menu, that site will be there.<br /></p>

<h2>Implementation</h2>
<p>Versions of Firefox before 2.0 had a different way for adding search to the search bar. It was similar, but included a different XML structure. The data was saved in files ending with “.src”. I decided not to add this method anymore, since it is specific to a small user base (who still uses FF 1.0?).</p>

<p>Only two things need to be done to add OpenSearch:</p>

<ol>
	<li>Create an XML-File containing data about the search engine;</li>
	<li>Link to the XML-File in the head of the site’s HTML.</li>
</ol>

<p>The XML, for example, would be structured as follows; Simply adapt the URLs for your site. To get the correct search URL, perform a search on your site, copy the URL and replace your search term with “{searchTerms}”.</p>
<pre class="brush: xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
&lt;OpenSearchDescription xmlns=&quot;http://a9.com/-/spec/opensearch/1.1/&quot;&gt;
	&lt;ShortName&gt;OpenSearch Example Name&lt;/ShortName&gt;
	&lt;Description&gt;OpenSearch Example Description&lt;/Description&gt;
	&lt;InputEncoding&gt;UTF-8&lt;/InputEncoding&gt;
	&lt;Image height=&quot;16&quot; width=&quot;16&quot; type=&quot;image/x-icon&quot;&gt;http://yoursite/favicon.ico&lt;/Image&gt;
	&lt;Url type=&quot;text/html&quot; template=&quot;http://yoursite/?s={searchTerms}&quot; /&gt;
&lt;/OpenSearchDescription&gt;</pre>
<p>This file could then be saved as “search.xml” to the root folder of the site and linked to by placing the following code in the HTML header:</p>
<pre class="brush: xml">&lt;link rel=&quot;search&quot; type=&quot;application/opensearchdescription+xml&quot; title=&quot;OpenSearch Example Title&quot; href=&quot;/search.xml&quot;&gt;</pre>
<h2>Including an OpenSearch Link to the Page</h2>
Optionally, the search plugin can be installed via a link using Javascript. Both Firefox and Internet Explorer use this:
<pre class="brush: jscript">window.external.AddSearchProvider(&quot;search.xml&quot;);</pre>
<p>An unobtrusive way to add the link, is to first check if the browser supports the AddSearchProvider function before adding it. Further details can be found on <a href="https://developer.mozilla.org/En/Adding_search_engines_from_web_pages#Browser_search_engine_capability_detection">Mozilla’s developer site</a>.</p>
<pre class="brush: xml">&lt;p id=&quot;add-opensearch&quot;&gt;OpenSearch not supported&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	if (window.external &amp;&amp; (&quot;AddSearchProvider&quot; in window.external)) {
		document.getElementById(&quot;add-opensearch&quot;).innerHTML = '&lt;a href=&quot;#&quot; onclick=&quot;window.external.AddSearchProvider(\'/search.xml\')&quot;&gt;Add this site’s search to your browsers search bar.&lt;/a&gt;';
	}
&lt;/script&gt;</pre>
<h2>Possible Future Browser Features</h2>
<p>I have a hunch that the usability of web-browsing in general, would be enhanced if the browser could detect OpenSearch and enable it temporarily in its search bar. The use case could be: </p>

<p><em>A user visits a site and the browser toggles the search bar to the site’s search. Instead of looking for a search form in the page, the user enters the query via the browser. Upon leaving the site the search bar switches to the new site’s search functionality, or defaults to the preferred search engine.</em></p>

<p>The search bar could be highlighted with another color to indicate that it’s linked to the current site.</p>

<p>For this feature to be useful, OpenSearch would have to become more commonly adopted. But I think sites would follow quickly once a browser vendor starts pushing the feature.</p>

<h2>Conclusion</h2>
<p>In my opinion, the creators of OpenSearch got it right. The specification is clear and it blends in perfectly with the existing technologies, HTML and Javascript. Plus, it is quick and easy to implement. I could recommend any web content management system with search functionality to enable this feature as standard.</p>

<p>I would also recommend adding a <a href="http://en.wikipedia.org/wiki/Favicon">favicon</a> to the OpenSearch XML, so the site stands out more in the browser’s search bar.</p>

<p><strong><a href="/fileadmin/opensearch_example.zip">Download the Code</a></strong></p>]]></content:encoded>
			<wfw:commentRss>http://nicolasschudel.name/linking-search/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Making Sign-Up Forms That Much Easier</title>
		<link>http://nicolasschudel.name/making-sign-up-forms-that-much-easier/</link>
		<comments>http://nicolasschudel.name/making-sign-up-forms-that-much-easier/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 13:23:22 +0000</pubDate>
		<dc:creator>Nicolas</dc:creator>
				<category><![CDATA[E-commerce]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Forms]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://nicolasschudel.name/?p=23</guid>
		<description><![CDATA[<p>Having to create an account is a barrier for new users to join a site and should, therefore, be kept as easy as possible. I propose a user interface improvement that pre-fills the user’s city based on the entered postal code. In addition, I describe the programming process using PHP, MySQL and AJAX.</p>]]></description>
			<content:encoded><![CDATA[<img src="http://nicolasschudel.name/fileadmin/articles//2008/02/signup-forms.png" alt="Signup Forms" title="Signup Forms" width="180" height="180" class="alignleft size-full wp-image-334" />
<p>
I watched a <a href="http://www.youtube.com/watch?v=J00ehBG0VNg">useful presentation about form design</a> by Ryan Singer a while back and he makes a point that user input should be kept to the bare minimum when signing up. An article by Luke Wroblewski titled <a href="http://www.alistapart.com/articles/signupforms">Sign Up Forms Must Die</a> seconds the notion.
</p>
<p>
However, sometimes it is required for the user to do the leg-work and fill in lots information. Like registering at an online store for instance. Gotta at least know where to send the purchased goods! For users that don't have auto-fill plugins such as the <a href="http://toolbar.google.com/)">Google Toolbar</a>, Javascript can help filling in the necessary information - not just validating the user input. It would, for instance, make web forms simpler for users if their city would be filled in automatically upon entering their postcode. I timed myself typing my city of residence as quickly as possible and it took me about 3 seconds. So, all in theory of course, the improvement would skim roughly that much time off filling in a form. It's not a lot, but the users level of tolerance towards HTML forms isn't much either.
</p>
<p>
I'm now going to talk about how I “auto-fill” the city information based on the entered postcode in a HTML form using PHP, MySql and Javascript.
</p>
<h2>Setting Up the Database</h2>
<p>
First I needed to get the postcode information from somewhere. For Switzerland I found <a href="https://match.postmail.ch/">the data</a> via the Swiss Post.
</p>
<p>
Then I needed to get it into the database somehow. To do this I imported the downloaded text file (it is tab delimited) into Excel and then exported it again as a <abbr title="comma-separated values file format">CSV</abbr> file. I only imported the columns I needed which are the ones containing the Town name and the postcode.
</p>
<p>
Next I put on my white programming gloves and wrote a quick PHP script that connects to the database and runs two <abbr title="Structured Query Language">SQL</abbr> statements to import the <abbr title="comma-separated values file format">CSV</abbr> file. Change the variables to fit your setup and be sure to have the <abbr title="comma-separated values file format">CSV</abbr> file in the same folder when you run the following example.
</p>
<pre class="brush: php">
$link = mysql_connect('localhost', 'root', 'root') or die('Could not connect: ' . mysql_error());

mysql_query(&amp;amp;quot;CREATE DATABASE IF NOT EXISTS test
DEFAULT CHARACTER SET latin1 
COLLATE latin1_swedish_ci;&amp;amp;quot;
);

mysql_select_db('test') or die('Cannot select database');

mysql_query( &amp;amp;quot;CREATE TABLE postcodes (
code SMALLINT(4) NOT NULL ,
city VARCHAR(27) NOT NULL ,
PRIMARY KEY (code)
) ENGINE = MYISAM CHARACTER SET latin1 COLLATE latin1_swedish_ci&amp;amp;quot;
);

mysql_query( &amp;amp;quot;LOAD DATA LOCAL INFILE 'postcodes.csv'
INTO TABLE postcodes
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
(code, city);&amp;amp;quot;
);

if(mysql_error()) echo mysql_error();
else echo &amp;amp;quot;Done!&amp;amp;quot;;

mysql_close($link);
</pre>
<p>
Special characters where also an issue with importing and exporting so be sure to check the city names in the database. I used the windows text format for importing.
</p>
<h2>Creating a Web Service</h2>
<p>
We now need some server side code to provide us with the data from the database. I am using the insanely cool <abbr title="JavaScript Object Notation">JSON</abbr> gateway included with <a href="http://www.amfphp.org/">AMFPHP</a> to provide the client with data. So with AMFPHP set up I could just write a simple PosteCodeFinder class and plop it into the AMFPHP's services folder. Otherwise a simple way to get the correct name would be a PHP script like this:
</p>
<pre class="brush: php">
mysql_connect('localhost', 'root', 'root') or die('Could not connect: ' . mysql_error());
mysql_select_db('zencart_shop') or die('Cannot select database');

if (isset($_GET['code']) &amp;amp;amp;&amp;amp;amp; is_numeric($_GET['code'])) $code= $_GET['code'];
else die ('Only numbers please! The URL should look something like: postcodefinder.php?code=1000');

$query = &amp;amp;quot;SELECT city FROM postcodes WHERE code =&amp;amp;quot; . $code . &amp;amp;quot; LIMIT 0 , 1 &amp;amp;quot;;

header(&amp;amp;quot;Content-Type: text/javascript; charset=utf-8&amp;amp;quot;);
echo json_encode(utf8_encode(mysql_result(mysql_query($query), &amp;amp;quot;city&amp;amp;quot;)));
</pre>
<p>
The code connects to the database, checks the input to be numeric, retrieves the city name and spits it out as <abbr title="JavaScript Object Notation">JSON</abbr>.
</p>
<p>
I had to use utf8_encode() inside the json_encode() function because it would otherwise mess up my character encoding. "Genéve", for instance, would be truncated to "Gen". It was reported as <a href="http://bugs.php.net/bug.php?id=43941">PHP bug #43941</a>.
</p>
<h2>The Client-Side Code</h2>
<p>
On to the Javascript! I am using the Prototype library here to make programming AJAX bearable.
</p>
<pre class="brush: jscript">
FormController = {
	previousResponse: &quot;&quot;,
	
	postcodeHandler:function(el) {
		var code = parseInt(el.value);
		if (code &gt;= 1000 &amp;&amp; code &lt;= 9999 &amp;&amp; $F('country') == 204) 
	  	new Ajax.Request(
			&quot;json.php/PostCodeFinder.find/&quot; + code, 
			{
	  		method: &quot;get&quot;,
	  		onSuccess: FormController.updatePostCode.bindAsEventListener(this)
	  		}
		);
	},
	
	updatePostCode:function(transport) {
		var jsonObj = eval(&quot;(&quot; + transport.responseText + &quot;)&quot;);
		if (jsonObj != undefined &amp;&amp; ($F('city') == &quot;&quot; || $F('city') == previousResponse)) {
	   	$('city').value = jsonObj;
			this.previousResponse = jsonObj;
	   }
	}
}

Event.observe(
	window,
	'load',
	function() {
		new Form.Element.Observer('postcode', 1, FormController.postcodeHandler.bindAsEventListener(this));
	}
)
</pre>
<p>
<a href="/fileadmin/postcodefinder.zip">Download all the code here.</a>
</p>
<h2>Conclusions</h2>
<h3>Usability Gain</h3>
<p>
Considering the amount of time it took me to implement, I can only recommend the postcode optimization as a final improvement to a form.   Other factors, as mentioned in Singer's video for instance, should be considered first to get the most bang for the buck.
</p>
<h3>Character Encoding</h3>
<p>
Most of my time was not spent with programming the scripts but with playing with the character encoding. Having UTF-8 all the way through form the original text file, to the database, to the PHP script, to the client side Javascript and finally the HTML document itself was easier said than done. I found a <a href="http://www.kerstner.at/downloads/utf8_webapplications_v0.2.pdf">PDF on the UTF-8 development practices</a> by Matthias Kerstener, that helped out with some of the issues. Still, character encoding issues makes me not want to be a web developer any more.
</p>]]></content:encoded>
			<wfw:commentRss>http://nicolasschudel.name/making-sign-up-forms-that-much-easier/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
