<?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>Vancouver Web Consultants</title>
	<atom:link href="http://vancouverwebconsultants.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://vancouverwebconsultants.com</link>
	<description>Vancouver Online Marketing and Web Design Consulting</description>
	<lastBuildDate>Mon, 11 Jan 2010 01:46:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Fixing Safari Upload Hangs with Mootools</title>
		<link>http://vancouverwebconsultants.com/fixing-safari-upload-hangs-with-mootools/</link>
		<comments>http://vancouverwebconsultants.com/fixing-safari-upload-hangs-with-mootools/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 01:32:16 +0000</pubDate>
		<dc:creator>Nelson</dc:creator>
				<category><![CDATA[Mootools]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Web Browsers]]></category>
		<category><![CDATA[Safari]]></category>

		<guid isPermaLink="false">http://vancouverwebconsultants.com/?p=321</guid>
		<description><![CDATA[Fix Safari's upload "hang" issue.]]></description>
			<content:encoded><![CDATA[<p>Safari has a tendency to hang when uploading files, and it turns out there&#8217;s an easy fix. <span id="more-321"></span> Looking around for a solution, I found <a href="http://blog.airbladesoftware.com/2007/8/17/note-to-self-prevent-uploads-hanging-in-safari">this post</a> outlining a way to fix it that the author found on the <a href="http://basecamp.com">Basecamp</a>. It&#8217;s just a couple of lines of code, and here they are in Mootools syntax:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">$$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input[type=submit]'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>Browser.<span style="color: #660066;">Engine</span>.<span style="color: #660066;">webkit</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">new</span> Request<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>url<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;/ping/close.php&quot;</span><span style="color: #339933;">,</span> asynch<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">false</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>This version will fire for every WebKit browser, which now also includes Chrome, so choose whatever sniffing method you like, but this will make a call to a PHP script returning a &#8220;Connection: close&#8221; header just before sending the upload.</p>
<p>Here&#8217;s that simple PHP:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Connection: close&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Safari upload problem solved.</p>
]]></content:encoded>
			<wfw:commentRss>http://vancouverwebconsultants.com/fixing-safari-upload-hangs-with-mootools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Triggering File Downloads with jQuery</title>
		<link>http://vancouverwebconsultants.com/triggering-file-downloads-with-jquery/</link>
		<comments>http://vancouverwebconsultants.com/triggering-file-downloads-with-jquery/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 18:56:15 +0000</pubDate>
		<dc:creator>Nelson</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[File Downloads]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://vancouverwebconsultants.com/?p=311</guid>
		<description><![CDATA[Wondering how to export a table of data to Excel or a CSV file with jQuery?]]></description>
			<content:encoded><![CDATA[<p><img src="/img/water.png" alt="jQuery Download CSV" style="float: left; margin: 0 10px 5px 0" /></p>
<p>I previously posted <a href="http://vancouverwebconsultants.com/triggering-file-downloads-with-mootools/">this method for Mootools</a>, and now here it is for jQuery.</p>
<p>Clients often ask to have a sorted list exportable via a link to a CSV file that they can open in Excel or whatever spreadsheet software they use. I could find two jQuery plugins for exporting table data to Excel, but I wasn&#8217;t comfortable with their reliance on producing popups (that could easily be blocked), or sending data as a querystring to a javascript function that sorts and formats the CSV. Here is a simple, plugin free way of asynchronously generating a .csv file using jQuery and PHP.</p>
<p><span id="more-311"></span> </p>
<p>In my case I had a form with search fields that submits to a PHP search script, and returns data which is formatted into a table and displayed to the user. My method for then exporting this to Excel is to add a link on the page which when clicked, changes the action of the form to a different processing script which outputs the .csv, then resubmitting the form to this redirected URL. The hard work is done with PHP instead of Javascript.</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;span id=&quot;csv-link&quot; style=&quot;cursor: pointer&quot;&gt;&lt;strong&gt;Download as a CSV file&lt;/strong&gt;&lt;/span&gt;</pre></div></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">jQuery<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#csv-link&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		$<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#searchform&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'action'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'/export.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#searchform'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">submit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Now as long as your PHP file is configured to return the correct headers for the file type you would like downloaded, this should trigger a download. Here&#8217;s an example of some PHP to download a .csv file:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">/* Export.php: here you would call the search function that is used to query the database and return an array to generate a table, except we will loop over the results here and produce .csv lines instead */</span>
&nbsp;
<span style="color: #000088;">$filename</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'download.csv'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$out</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Heading One, Heading Two, etc'</span><span style="color: #339933;">.</span><span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//$search_result = result_of_your_search_function($_POST);</span>
&nbsp;
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$search_result</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$out</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$row</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">item_one</span><span style="color: #339933;">.</span><span style="color: #0000ff;">', '</span><span style="color: #339933;">.</span><span style="color: #000088;">$row</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">item_two</span><span style="color: #339933;">.</span><span style="color: #0000ff;">', etc'</span><span style="color: #339933;">.</span><span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Cache-Control: must-revalidate, post-check=0, pre-check=0&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Length: &quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$out</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-type: text/x-csv&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Disposition: attachment; filename=<span style="color: #006699; font-weight: bold;">$filename</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$out</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Your file will now automatically download.</p>
]]></content:encoded>
			<wfw:commentRss>http://vancouverwebconsultants.com/triggering-file-downloads-with-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft Extends IE6 Support to 2014</title>
		<link>http://vancouverwebconsultants.com/microsoft-extends-ie6-support-to-2014/</link>
		<comments>http://vancouverwebconsultants.com/microsoft-extends-ie6-support-to-2014/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 17:14:42 +0000</pubDate>
		<dc:creator>Nelson</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Web Browsers]]></category>
		<category><![CDATA[IE6 Support]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://vancouverwebconsultants.com/?p=307</guid>
		<description><![CDATA[Microsoft has decided to support IE6 into 2014.]]></description>
			<content:encoded><![CDATA[<p><a href="http://vancouverwebconsultants.com/is-ie6-dead-yet/">Is IE6 Dead Yet?</a> It was being circled by vultures until Microsoft recently announced support for the browser would continue into 2014, <a href="http://news.bbc.co.uk/2/hi/technology/8196242.stm" target="_blank">the BBC reports</a>. What does this mean for web developers and clients? <span id="more-307"></span> IE6 will fade away sooner than that, much the way Netscape 4 did only a couple of years after CSS pundits were pounding their fists over how important it was for developers to support it. Why did Netscape 4 eventually disappear? I think it was due in no small part to companies deciding it was below their baseline browser support limit, and users of the browser switched when they realized too much of the web was looking like a toddler&#8217;s crayon scratchings.</p>
<p>Why would Microsoft extend support for this antique browser as they push for people to upgrade to IE8? Could be a lot of things. Maybe one of them is trying to keep existing Windows users happy (including enterprise users) during a period where many are turning to other comparatively hassle-free operating systems. Whatever the reason, now is a good time for developers and clients to decide whether to continue our support for the browser, or to join the <a href="http://www.ie6nomore.com/" target="_blank">growing list</a> of organizations moving on.</p>
]]></content:encoded>
			<wfw:commentRss>http://vancouverwebconsultants.com/microsoft-extends-ie6-support-to-2014/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The 3D future of CSS?</title>
		<link>http://vancouverwebconsultants.com/the-3d-future-of-css/</link>
		<comments>http://vancouverwebconsultants.com/the-3d-future-of-css/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 19:59:20 +0000</pubDate>
		<dc:creator>Nelson</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Web Browsers]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[KHTML]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[Snow Stack]]></category>
		<category><![CDATA[WebKit]]></category>

		<guid isPermaLink="false">http://vancouverwebconsultants.com/?p=296</guid>
		<description><![CDATA[Eager to see 3D effects achievable in CSS alone? Check out "Snow Stack".]]></description>
			<content:encoded><![CDATA[<p><img src="/img/snow-stack.png" alt="Snow Stack demo of WebKit CSS 3D visual effects" /></p>
<p>Apple is well known for their innovative thinking in just about everything they do. Now they&#8217;re making a bid to add rich 3D effects to CSS (Cascading Style Sheets), potentially rivaling (or replacing?) Flash as the de-facto animation tool for websites.<span id="more-296"></span></p>
<p>Charles Ying has posted an <a href="http://www.satine.org/archives/2009/07/11/snow-stack-is-here/">interesting demo</a> of some stunning visual effects he calls &#8220;Snow Stack&#8221;, created solely with WebKit and Apple&#8217;s WebKit CSS 3D Transforms technology. See it for yourself, and maybe even download a <a href="http://nightly.webkit.org/">WebKit nightly build</a> and give it a try.</p>
<p><strong>Update:</strong> Charles Ying of <a href="http://satine.org">satine.org</a> and Peter Kasting of <a href="http://chromium.org">chromium.org</a>, were both kind enough to point out an error in this post which has been corrected, and have also offered a link to <a href="http://webkit.org/blog/386/3d-transforms/">WebKit&#8217;s official post</a> for more information. Thanks guys!
<p>Here are some other useful links from Wikipedia:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/KHTML">KHTML</a> &#8211; the Konqueror browser&#8217;s layout engine, from which Apple forked the WebKit project</li>
<li><a href="http://en.wikipedia.org/wiki/Webkit">WebKit</a> &#8211; for more information on the development of the core of <a href="http://www.apple.com/safari/">Safari</a>, and more recently, Google&#8217;s browser offering named &#8220;<a href="http://www.google.com/chrome">Chrome</a>,&#8221;  among others.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://vancouverwebconsultants.com/the-3d-future-of-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validating a URI with PHP</title>
		<link>http://vancouverwebconsultants.com/validating-a-uri-with-php/</link>
		<comments>http://vancouverwebconsultants.com/validating-a-uri-with-php/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 23:34:42 +0000</pubDate>
		<dc:creator>Nelson</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Validation]]></category>

		<guid isPermaLink="false">http://vancouverwebconsultants.com/?p=288</guid>
		<description><![CDATA[Simple URL validation by checking for the existence of a webpage.]]></description>
			<content:encoded><![CDATA[<p>If you find yourself needing to validate a URI, not just checking that it&#8217;s well formed with a regular expression like this:</p>
<p>/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i</p>
<p>&#8230;but actually verifying that the URI points to a functioning web page, the following code will do the trick.<span id="more-288"></span> It starts off feeding a well formed URL to PHP&#8217;s parse_url(), then uses cURL to follow any redirects (10 maximum) until it finds a 200 status. I&#8217;ve tried a number of different methods, but this one seems to work the best. I ran into problems where an OpenDNS wild card was causing all my bad URIs to return a status 200, so the code checks for the term &#8220;opendns&#8221; and returns false. Here&#8217;s the code:</p>
<pre class="brush: php;">
function validate_url($url) {
	if(empty($url)){ return false; }
	$url = preg_match(&quot;/http:\/\//&quot;, $url) ? $url : &quot;http://&quot;.$url;
	$parts = parse_url($url);
	$url = $parts['host'];

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, true);
	curl_setopt($ch, CURLOPT_NOBODY, true);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
	$data = curl_exec($ch);
	curl_close($ch);
	preg_match_all(&quot;/HTTP\/1\.[1|0]\s(\d{3})/&quot;,$data,$matches);
	$code = end($matches[1]);
	if(!$data) { return false; }
	if(stristr($data,'opendns')){ return false; }
	return $code==200 ? true : false;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://vancouverwebconsultants.com/validating-a-uri-with-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Does Server Location Matter to Search Engines?</title>
		<link>http://vancouverwebconsultants.com/server-location-search-engines/</link>
		<comments>http://vancouverwebconsultants.com/server-location-search-engines/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 16:44:46 +0000</pubDate>
		<dc:creator>Nelson</dc:creator>
				<category><![CDATA[Search Engines]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[Webmastery]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[SERPs]]></category>
		<category><![CDATA[Server Location]]></category>

		<guid isPermaLink="false">http://vancouverwebconsultants.com/?p=231</guid>
		<description><![CDATA[There are a lot of conflicting views out there, but logic and the words of one very important authority on the issue, answers the question: does server location matter to Search Engines?]]></description>
			<content:encoded><![CDATA[<p>I recently posted a question in a forum looking for web hosting companies in my community of Vancouver, Canada. I, like most people shopping for web hosting, was looking for good value for money with reliability, service and price, but there was one other key thing I was looking for<span id="more-231"></span>: proximity of the company to me, because I like the idea of dealing with a reputable company with a bricks-and-mortar presence here in Vancouver, and because I believe, not only because of what I had seen and read online, but also because it seems very logical (I don&#8217;t like the term &#8220;common sense,&#8221; but this really is), that a website based in a data centre in Vancouver (or Canada at least) will receive a relevance bump with certain search engines for searches relevant to Vancouver. I was surprised that all the responses claimed that server location was irrelevant. They claimed instead that the TLD (top level domain like .ca) is what search engines will use to determine relevance of a site to a certain geographic area.</p>
<p>There is no way to know with absolute certainty how all search engines are constituted. One of them however, Google, has posted indisputable evidence that for their search engine at least, server location is counted in the algorithm that determines relevance. Matt Cutts&#8217; (Google Software Engineer) has posted the answer to this question on his <a href="http://www.youtube.com/user/GoogleWebmasterHelp">Google Webmaster Central Channel</a> on YouTube. This video is posted below. <strong>Server location <em>is</em>, without question, relevant to placement in SERPs.</strong></p>
<h3>What impact does server location have on rankings?</h3>
<p>[youtube hXt23AXlJJU What impact does server location have on rankings?]</p>
<p><strong>Update:</strong> We have posted a list of <a href="http://vancouverwebconsultants.com/vancouver-web-hosting/">Vancouver Web Hosts</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://vancouverwebconsultants.com/server-location-search-engines/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Secure Javascript Form Validation with Mootools</title>
		<link>http://vancouverwebconsultants.com/secure-javascript-form-validation-with-mootools/</link>
		<comments>http://vancouverwebconsultants.com/secure-javascript-form-validation-with-mootools/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 15:33:08 +0000</pubDate>
		<dc:creator>Nelson</dc:creator>
				<category><![CDATA[Mootools]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Validation]]></category>

		<guid isPermaLink="false">http://vancouverwebconsultants.com/?p=206</guid>
		<description><![CDATA[Have you ever wanted to know how to securely validate a form using Javascript? The answer might surprise you...]]></description>
			<content:encoded><![CDATA[<p>Did I get you with the title? That&#8217;s right, it&#8217;s not possible to securely validate a form with Javascript. That is, you can&#8217;t prevent invalid data from being submitted to the server by using Javascript for validation. We&#8217;ve all seen Javascript-based form validation classes (and classes for Javascript libraries like Mootools, which is my favourite, so I&#8217;ll be making reference to it here), but it&#8217;s all too often not made clear enough to those who might use such classes that javascript validation alone provides no security against invalid data being sent to your back-end processing script and making it into your database.</p>
<p><span id="more-206"></span></p>
<p>Javascript is executed by the browser, not the server. It allows for all kinds of user-experience enhancements that would not be possible with server-side languages like PHP. In the context of form validation, javascript allows you to alert the user to an error in his or her input without sending all the data to the form, and presenting a list of errors to the user. This is not only a great thing in terms of convenience to the user, but it can also save you bandwidth in a significant way if you have a high-volume site. The problem with javascript validation is that it can be circumvented, which means that just as you should never trust user input without validation, you should never rely on client-side validation alone.</p>
<p>The logical approach to validation then is to validate all your content on the server before saving it to the database. What does this mean for you if you want to also have subtle validation messages presented to the user as they fill out the form, not only at the end? Why duplicate those efforts by writing two sets of functions, one for PHP and one for Javascript? Personally I prefer to use a single set of validation functions in PHP, and modify my back-end script slightly to call them not only on a full form submit, but on individual XHR requests as well. </p>
<p>This brief tutorial focuses on how you might structure your Javascript and PHP to create two layers of validation that rely on only one set of validation functions, allowing for the security of server-side validation with the convenience and beauty of client-side validation. Technically the validation is all happening on the back-end, we&#8217;re simply adding an attractive front-end interface to it, that our users will appreciate. We&#8217;re not attempting to provide complete code for form validation, instead we&#8217;re offering an approach for you to build on.</p>
<h3>Step 1: build our form, and PHP validation</h3>
<h4>HTML</h4>
<p>For the purpose of this demo, we use a very simple form with one text input.</p>
<pre class="brush: php;">
&lt;form action=&quot;&lt;? echo $_SERVER['PHP_SELF']; ?&gt;&quot; method=&quot;get&quot; id=&quot;myform&quot;&gt;
	Please tell us something you like:
	&lt;input type=&quot;text&quot; name=&quot;mytext&quot; id=&quot;mytext&quot; value=&quot;&lt;?=$form['mytext']?&gt;&quot; class=&quot;formElement &lt;? if(isset($message['mytext'])){ echo &quot;incorrect&quot;; }; ?&gt;&quot; /&gt;&lt;?PHP echo '&lt;span id=&quot;msg&quot;&gt;'.$message['mytext'].'&lt;/span&gt;'; ?&gt;
	&lt;input type=&quot;submit&quot; name=&quot;save&quot; id=&quot;save&quot; value=&quot;Submit&quot; /&gt;
&lt;/form&gt;
</pre>
<h4>CSS</h4>
<p>Two simple classes for the form element to indicate correct or incorrect status. This can be greatly beautified.</p>
<pre class="brush: css;">
&lt;style type=&quot;text/css&quot;&gt;
	.correct {
		background-color: #b3d483;
	}
	.incorrect {
		background-color: #c76760;
	}
&lt;/style&gt;
</pre>
<h4>PHP</h4>
<p>Very simple PHP to capture the form submit, and validate it. Since we&#8217;re using one field, this is extremely basic code. In our example, it sits at the top of the same file as the form.</p>
<pre class="brush: php;">
&lt;?php
//set a default: the form is not complete
$complete = false;

if(isset($_GET['save'])){
	$form = $_GET;
	$message = validate($form);
	if(!$message['error']){
		// if no error, process the form and present a thank you message
		// set &quot;complete&quot; flag to true;
		$complete = true;
	}
}

function validate($form){
	$message = array();
	$message['error'] = false;
	foreach($form as $key=&gt;$value){
		if($key==&quot;mytext&quot;){
			if(strtolower($value) != &quot;peas&quot;){ $message['error'] = true; $message[$key] = &quot;&amp;lt;&amp;lt; Please say \&quot;peas\&quot;&quot;; }
			elseif(empty($value)){ $message['error'] = true; $message[$key] = &quot;&amp;lt;&amp;lt; You forgot to tell us what you like!&quot;; }
		}
	}
	return $message;
}
?&gt;
</pre>
<p>This is pretty vanilla stuff. We have a form on our page that submits to itself, runs the value of the &#8220;mytext&#8221; field through a basic validation function, and either processes the input or displays an error. If we add more fields to this, we will obviously have to add to this code to validate each one, and show a list of errors (if any) to the user when the page refreshes.</p>
<p><a href="/demos/secure-javascript-form-validation-mootools-1.php" target="_blank">See a Demo of Step 1</a></p>
<p>Now that we have this foundation in place, we can add a little Javascript layer to run this validation on each field asynchronously when its value is changed (tab off the field, or click outside of it). Here we show each code block again, but notice the few extra lines in the HTML, PHP, and the new Javascript added.</p>
<h3>Step 2: add the Mootools (Javascript) Layer</h3>
<h4>Javascript</h4>
<p>This chunk loops through each element of class &#8220;formElement,&#8221; and adds a change event which triggers the asynchronous call to our PHP script. It then interprets the result of the validation and displays a message to the user, or none if there is no error.</p>
<pre class="brush: jscript;">
&lt;script type=&quot;text/javascript&quot; src=&quot;mootools-1.2.2-core.js&quot;&gt;&lt;/script&gt;
var Demo = {
	start: function(){
		$$('.formElement').each(function(el){
			el.addEvent('change',function(e) {
				e.stop();
				var msg = new Element('span').injectAfter(this);
				var request = new Request({
					url: 'demo.php',
					link: 'chain',
					method: 'get',
					data: {
						field: this.name,
						value: this.value,
						ajax: 1,
						save: 1
					},
					onSuccess: function(response) {
						var response = JSON.decode(response);
						if(response.error==false){
							$('msg').setStyle('visibility','hidden');
							el.setProperty('class', 'formElement correct' );
						}else{
							$('myform').setStyle('visibility','visible');
							$('msg').set('html',response.mytext);
							el.setProperty('class', 'formElement incorrect' );
						}
					}
				}).send();
			});
		});
	}
}

window.addEvent(&quot;domready&quot;, function(){
	Demo.start();
});
</pre>
<h4>HTML</h4>
<p>This is the same as the previous example, except that we add a hidden field called &#8220;ajax&#8221; (though this is a misnomer.. AJAX stands for &#8220;Asynchronous Javascript and XML&#8221;, which is almost right except for the XML part&#8230; our PHP script will return JSON instead. The &#8220;ajax&#8221; value tells php whether or not it&#8217;s receiving the input as an asynchronous individual field, or the whole form.</p>
<pre class="brush: php;">
&lt;form action=&quot;&lt;? echo $_SERVER['PHP_SELF']; ?&gt;&quot; method=&quot;get&quot; id=&quot;myform&quot;&gt;
	&lt;input type=&quot;hidden&quot; name=&quot;ajax&quot; id=&quot;ajax&quot; value=&quot;0&quot; /&gt;
	Please tell us something you like:
	&lt;input type=&quot;text&quot; name=&quot;mytext&quot; id=&quot;mytext&quot; value=&quot;&lt;?=$form['mytext']?&gt;&quot; class=&quot;formElement &lt;? if(isset($message['mytext'])){ echo &quot;incorrect&quot;; }; ?&gt;&quot; /&gt;&lt;?PHP echo '&lt;span id=&quot;msg&quot;&gt;'.$message['mytext'].'&lt;/span&gt;'; ?&gt;
	&lt;input type=&quot;submit&quot; name=&quot;save&quot; id=&quot;save&quot; value=&quot;Submit&quot; /&gt;
&lt;/form&gt;
</pre>
<h4>CSS</h4>
<p>This is the same as step 1</p>
<pre class="brush: css;">
&lt;style type=&quot;text/css&quot;&gt;
	.correct {
		background-color: #b3d483;
	}
	.incorrect {
		background-color: #c76760;
	}
&lt;/style&gt;
</pre>
<h4>PHP</h4>
<p>Here we have added a check for the value of &#8220;ajax&#8221; which tells the script how to process the input (if it&#8217;s the whole form, or one field passed asynchronously. All the script needs to do if ajax=1, is output a JSON array and then stop processing, so that it doesn&#8217;t also return the rest of the HTML on the page. You might choose to have your forms submit to a separate script, in which case killing the script at this point would be unneccessary. If ajax=1, the validate field now also reorganizes the submitted key and value into an array the same as a form submit would generate so that we don&#8217;t have to process the input differently. You don&#8217;t have to do this like this, of course.</p>
<pre class="brush: php;">
&lt;?PHP
$complete = false;

if(isset($_GET['save'])){
	$form = $_GET;
	$message = validate($form);
	if($form['ajax']==1){
		echo json_encode($message);
		die;
	}
	if(!$message['error']){
		// if no error, process the form and present a thank you message
		$complete = true;
	}
}

function validate($form){
	$message = array();
	$message['error'] = false;
	$form = $form['ajax']==1 ? array($form['field']=&gt;$form['value']) : $form;
	foreach($form as $key=&gt;$value){
		if($key==&quot;mytext&quot;){
			if(strtolower($value) != &quot;peas&quot;){ $message['error'] = true; $message[$key] = &quot;&amp;lt;&amp;lt; Please say \&quot;peas\&quot;&quot;; }
			elseif(empty($value)){ $message['error'] = true; $message[$key] = &quot;&amp;lt;&amp;lt; You forgot to tell us what you like!&quot;; }
		}
		//other fields we're validating
	}
	return $message;
}
?&gt;
</pre>
<p>And that&#8217;s it! With a very small amount of Mootools JS and the addition of 5 or 6 lines to the HTML and PHP, we have a smooth second layer on our validation that saves the user time and frustration if they are having trouble getting their input right.</p>
<p><a href="/demos/secure-javascript-form-validation-mootools-2.php" target="_blank">See a Demo of Step 2</a></p>
<p> Now you a trendy front-end without sacrificing security.</p>
]]></content:encoded>
			<wfw:commentRss>http://vancouverwebconsultants.com/secure-javascript-form-validation-with-mootools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Is IE6 Dead Yet?</title>
		<link>http://vancouverwebconsultants.com/is-ie6-dead-yet/</link>
		<comments>http://vancouverwebconsultants.com/is-ie6-dead-yet/#comments</comments>
		<pubDate>Wed, 13 May 2009 00:57:37 +0000</pubDate>
		<dc:creator>Nelson</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Web Browsers]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[IE6 Support]]></category>

		<guid isPermaLink="false">http://vancouverwebconsultants.com/?p=190</guid>
		<description><![CDATA[Is it time to send IE6 the way of Netscape 4? How do you decide whether or not to  support a browser that's on its way out?]]></description>
			<content:encoded><![CDATA[<p>Floating around forums I&#8217;ve noticed this question still being asked a lot: &#8220;Do I still have to support IE6?&#8221; and often the the answer you see is that it represents such and such percent of web users, and that&#8217;s too many to ignore. The truth is, the number of IE6 users varies greatly from site to site. Some of my sites still have as much as 20% IE6 users, and others less than 1%. So, on some I ignore IE6 altogether, and others I try to accommodate it as much as possible without going to extreme lengths, while with a few I&#8217;m fully shackled to it. Unfortunately there&#8217;s no getting around the fact that IE6 still exists. </p>
<p><span id="more-190"></span> </p>
<p>Most of the time it&#8217;s easy to support IE6. The questions I ask myself when deciding to what extent I&#8217;ll support IE6 include (in no particular order):</p>
<ul>
<li><strong><em>Can I afford to alienate this group of users?</em></strong> In other words, is this a large proportion of my user base? If my users are not particularly computer savvy or perhaps they don&#8217;t upgrade their computers very often, or wouldn&#8217;t know how to update their system software, chances are they&#8217;re running an old version of Windows and have no idea what they&#8217;re missing. Can I risk losing this group?</li>
<li><strong><em>Do I need to build my site in a way that will be costly or difficult to maintain for IE6? </em></strong> Sometimes it all comes down to cost. I&#8217;ve worked for companies that have drawn the browser support line above where the web design community&#8217;s consensus sat. Sometimes this was due to user statistics, sometimes the complexity of having to maintain this compatibility. <a href="http://facebook.com">Facebook</a> displays a warning to IE6 users that the site might not work properly for them and offers some links to help them upgrade/switch. I&#8217;ve seen the same on other sites. I think this is the right approach: it doesn&#8217;t turn the users away, but doesn&#8217;t bend too much to accommodate them, choosing instead to help them move toward an overall better experience.</li>
<li><strong><em>Should my profession lead, or follow?</em></strong> At what point does the cost, both monetary and in terms of progress, outweigh the benefit of supporting a technology? To draw what I think are valid comparisons: should we still drill for oil when the day comes that only a handful of internal combustion die-hards are buying gas? Should your neighbourhood shop still give out plastic bags when you&#8217;re one of the few who can&#8217;t get used to carrying around a reusable one? Should we resist change because a minority of the population can&#8217;t or won&#8217;t? I personally feel that when a web browser starts to stand in the way of the progress of our medium, we ought to help it fade away peacefully.</li>
<li><strong><em>Was the browser developed at the beginning of the Bush Era?</em></strong> Internet Explorer 6 was released on August 27, 2001. As of this writing that was <strong>almost 8 years ago</strong>. Let&#8217;s see.. in mid-2001 Google was a private company, Yahoo looked like <a href="http://web.archive.org/web/20010823154152/http://www.yahoo.com/">this</a>, 9/11 hadn&#8217;t happened yet, macromedia still existed, Flash was in version 5, and Barack Obama wasn&#8217;t even a US Senator. A lot has happened since then, including Internet Explorer 7 &#038; <a href="http://www.microsoft.com/windows/Internet-explorer/default.aspx">8</a>, <a href="http://www.apple.com/safari/">Safari</a>, <a href="http://www.mozilla.com/">Firefox</a>, and 4 major versions of <a href="http://www.opera.com/" target="_blank">Opera</a>. The Internet is a different place, and it needs to be seen as it&#8217;s meant to be seen today, not through the lens of 2001 web browser technology.</li>
<li><strong><em>Will not supporting this browser hurt my client&#8217;s business?</em></strong> This is the most important one I think, because at the end of the day our task is to help our clients express their message, and interact with their own clients and customers. If it&#8217;s mission critical to them that a certain browser be supported, then it is our job to make sure it is. Sometimes this requires a higher budget and some explanation of why that fancy feature they want is a no-go.</li>
</ul>
<p>Here are some current <a href="http://www.w3schools.com/browsers/browsers_stats.asp">browser stats from W3Schools.com</a>. They give some interesting information about browsers, operating systems and screen resolutions, collected from their own log files (so these are not general Internet stats).</p>
<p>So, make the decision for yourself. Keep your client&#8217;s objectives and interests in mind and if I missed some major considerations or you think I&#8217;m nuts, feel free to comment. Most of all, happy coding.</p>
<p>Update, July 14, 2009: It looks like some big names on the web, namely <a href="http://digg.com">Digg.com</a> and now <a href="http://youtube.com">YouTube.com</a> are publicizing plans to drop IE 6 support: <a href="http://www.techcrunch.com/2009/07/14/youtube-will-be-next-to-kiss-ie6-support-goodbye/">YouTube Will Be Next To Kiss IE6 Support Goodbye</a></p>
<p><strong>UPDATE:</strong> <a href="http://vancouverwebconsultants.com/microsoft-extends-ie6-support-to-2014/">Microsoft Extends IE6 Support to 2014</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vancouverwebconsultants.com/is-ie6-dead-yet/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Getting Time Zone from Latitude &amp; Longitude</title>
		<link>http://vancouverwebconsultants.com/getting-time-zone-from-latitude-longitude/</link>
		<comments>http://vancouverwebconsultants.com/getting-time-zone-from-latitude-longitude/#comments</comments>
		<pubDate>Sat, 02 May 2009 01:17:02 +0000</pubDate>
		<dc:creator>Nelson</dc:creator>
				<category><![CDATA[Mootools]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Geocoding]]></category>
		<category><![CDATA[GeoNames.Org Web Services]]></category>
		<category><![CDATA[Google Maps API]]></category>
		<category><![CDATA[latitude]]></category>
		<category><![CDATA[longitude]]></category>
		<category><![CDATA[Time Zones]]></category>
		<category><![CDATA[timezones]]></category>

		<guid isPermaLink="false">http://vancouverwebconsultants.com/?p=97</guid>
		<description><![CDATA[Time zones are more complicated than most people think. There are hundreds of time zones in the world, and almost as many times different countries observe daylight savings. You can ask them to choose from a list, or get it from their latitude and longitude using GeoNames.org's web service.]]></description>
			<content:encoded><![CDATA[<h3>The problem:</h3>
<p>I was recently tasked with building an application that relied heavily on accurate time zone conversions. I, like many people I soon found out, thought there were just a handful of timezones and the usual select list would suffice:</p>
<p><span id="more-97"></span> </p>
<select name="DropDownTimezone" id="DropDownTimezone">
   <option value="-12.0">(UTC -12:00) Eniwetok, Kwajalein</option><br />
   <option value="-11.0">(UTC -11:00) Midway Island, Samoa</option><br />
   <option value="-10.0">(UTC -10:00) Hawaii</option><br />
   <option value="-9.0">(UTC -9:00) Alaska</option><br />
   <option value="-8.0">(UTC -8:00) Pacific Time (US &amp;Canada)</option><br />
   <option value="-7.0">(UTC -7:00) Mountain Time (US &amp;Canada)</option><br />
   <option value="-6.0">(UTC -6:00) Central Time (US &amp;Canada), Mexico City</option><br />
   <option value="-5.0">(UTC -5:00) Eastern Time (US &amp;Canada), Bogota, Lima</option><br />
   <option value="-4.0">(UTC -4:00) Atlantic Time (Canada),Caracas, La Paz</option><br />
   <option value="-3.5">(UTC -3:30) Newfoundland</option><br />
   <option value="-3.0">(UTC -3:00) Brazil, Buenos Aires,Georgetown</option><br />
   <option value="-2.0">(UTC -2:00) Mid-Atlantic</option><br />
   <option value="-1.0">(UTC -1:00 hour) Azores, Cape VerdeIslands</option><br />
   <option value="0.0">(UTC) Western Europe Time, London, Lisbon,Casablanca</option><br />
   <option value="1.0">(UTC +1:00 hour) Brussels, Copenhagen,Madrid, Paris</option><br />
   <option value="2.0">(UTC +2:00) Kaliningrad, South Africa</option><br />
   <option value="3.0">(UTC +3:00) Baghdad, Riyadh, Moscow, St.Petersburg</option><br />
   <option value="3.5">(UTC +3:30) Tehran</option><br />
   <option value="4.0">(UTC +4:00) Abu Dhabi, Muscat, Baku,Tbilisi</option><br />
   <option value="4.5">(UTC +4:30) Kabul</option><br />
   <option value="5.0">(UTC +5:00) Ekaterinburg, Islamabad,Karachi, Tashkent</option><br />
   <option value="5.5">(UTC +5:30) Bombay, Calcutta, Madras, NewDelhi</option><br />
   <option value="5.75">(UTC +5:45) Kathmandu</option><br />
   <option value="6.0">(UTC +6:00) Almaty, Dhaka, Colombo</option><br />
   <option value="7.0">(UTC +7:00) Bangkok, Hanoi, Jakarta</option><br />
   <option value="8.0">(UTC +8:00) Beijing, Perth, Singapore,HongKong</option><br />
   <option value="9.0">(UTC +9:00) Tokyo, Seoul, Osaka, Sapporo,Yakutsk</option><br />
   <option value="9.5">(UTC +9:30) Adelaide, Darwin</option><br />
   <option value="10.0">(UTC +10:00) Eastern Australia, Guam,Vladivostok</option><br />
   <option value="11.0">(UTC +11:00) Magadan, Solomon Islands,New Caledonia</option><br />
   <option value="12.0">(UTC +12:00) Auckland, Wellington, Fiji, Kamchatka</option><br />
</select>
<p>The deeper I looked into the problem, the deeper it got: the list above only shows a few time offsets from UTC, but it doesn&#8217;t tell me, beyond a shadow of a doubt, exactly what time it is where the user is situated, nor can I rely on that time for calculations in the future. The fact is, there are a LOT of timezones in the world. Hundreds. If you have a linux server, you can see exactly how many there are by opening up /usr/share/zoneinfo/zone.tab , but here is the full list:</p>
<select name="timeZone"><option value="Africa/Abidjan">Africa/Abidjan</option><option value="Africa/Accra">Africa/Accra</option><option value="Africa/Addis_Ababa">Africa/Addis_Ababa</option><option value="Africa/Algiers">Africa/Algiers</option><option value="Africa/Asmara">Africa/Asmara</option><option value="Africa/Asmera">Africa/Asmera</option><option value="Africa/Bamako">Africa/Bamako</option><option value="Africa/Bangui">Africa/Bangui</option><option value="Africa/Banjul">Africa/Banjul</option><option value="Africa/Bissau">Africa/Bissau</option><option value="Africa/Blantyre">Africa/Blantyre</option><option value="Africa/Brazzaville">Africa/Brazzaville</option><option value="Africa/Bujumbura">Africa/Bujumbura</option><option value="Africa/Cairo">Africa/Cairo</option><option value="Africa/Casablanca">Africa/Casablanca</option><option value="Africa/Ceuta">Africa/Ceuta</option><option value="Africa/Conakry">Africa/Conakry</option><option value="Africa/Dakar">Africa/Dakar</option><option value="Africa/Dar_es_Salaam">Africa/Dar_es_Salaam</option><option value="Africa/Djibouti">Africa/Djibouti</option><option value="Africa/Douala">Africa/Douala</option><option value="Africa/El_Aaiun">Africa/El_Aaiun</option><option value="Africa/Freetown">Africa/Freetown</option><option value="Africa/Gaborone">Africa/Gaborone</option><option value="Africa/Harare">Africa/Harare</option><option value="Africa/Johannesburg">Africa/Johannesburg</option><option value="Africa/Kampala">Africa/Kampala</option><option value="Africa/Khartoum">Africa/Khartoum</option><option value="Africa/Kigali">Africa/Kigali</option><option value="Africa/Kinshasa">Africa/Kinshasa</option><option value="Africa/Lagos">Africa/Lagos</option><option value="Africa/Libreville">Africa/Libreville</option><option value="Africa/Lome">Africa/Lome</option><option value="Africa/Luanda">Africa/Luanda</option><option value="Africa/Lubumbashi">Africa/Lubumbashi</option><option value="Africa/Lusaka">Africa/Lusaka</option><option value="Africa/Malabo">Africa/Malabo</option><option value="Africa/Maputo">Africa/Maputo</option><option value="Africa/Maseru">Africa/Maseru</option><option value="Africa/Mbabane">Africa/Mbabane</option><option value="Africa/Mogadishu">Africa/Mogadishu</option><option value="Africa/Monrovia">Africa/Monrovia</option><option value="Africa/Nairobi">Africa/Nairobi</option><option value="Africa/Ndjamena">Africa/Ndjamena</option><option value="Africa/Niamey">Africa/Niamey</option><option value="Africa/Nouakchott">Africa/Nouakchott</option><option value="Africa/Ouagadougou">Africa/Ouagadougou</option><option value="Africa/Porto-Novo">Africa/Porto-Novo</option><option value="Africa/Sao_Tome">Africa/Sao_Tome</option><option value="Africa/Timbuktu">Africa/Timbuktu</option><option value="Africa/Tripoli">Africa/Tripoli</option><option value="Africa/Tunis">Africa/Tunis</option><option value="Africa/Windhoek">Africa/Windhoek</option><option value="America/Adak">America/Adak</option><option value="America/Anchorage">America/Anchorage</option><option value="America/Anguilla">America/Anguilla</option><option value="America/Antigua">America/Antigua</option><option value="America/Araguaina">America/Araguaina</option><option value="America/Argentina/Buenos_Aires">America/Argentina/Buenos_Aires</option><option value="America/Argentina/Catamarca">America/Argentina/Catamarca</option><option value="America/Argentina/ComodRivadavia">America/Argentina/ComodRivadavia</option><option value="America/Argentina/Cordoba">America/Argentina/Cordoba</option><option value="America/Argentina/Jujuy">America/Argentina/Jujuy</option><option value="America/Argentina/La_Rioja">America/Argentina/La_Rioja</option><option value="America/Argentina/Mendoza">America/Argentina/Mendoza</option><option value="America/Argentina/Rio_Gallegos">America/Argentina/Rio_Gallegos</option><option value="America/Argentina/Salta">America/Argentina/Salta</option><option value="America/Argentina/San_Juan">America/Argentina/San_Juan</option><option value="America/Argentina/San_Luis">America/Argentina/San_Luis</option><option value="America/Argentina/Tucuman">America/Argentina/Tucuman</option><option value="America/Argentina/Ushuaia">America/Argentina/Ushuaia</option><option value="America/Aruba">America/Aruba</option><option value="America/Asuncion">America/Asuncion</option><option value="America/Atikokan">America/Atikokan</option><option value="America/Atka">America/Atka</option><option value="America/Bahia">America/Bahia</option><option value="America/Barbados">America/Barbados</option><option value="America/Belem">America/Belem</option><option value="America/Belize">America/Belize</option><option value="America/Blanc-Sablon">America/Blanc-Sablon</option><option value="America/Boa_Vista">America/Boa_Vista</option><option value="America/Bogota">America/Bogota</option><option value="America/Boise">America/Boise</option><option value="America/Buenos_Aires">America/Buenos_Aires</option><option value="America/Cambridge_Bay">America/Cambridge_Bay</option><option value="America/Campo_Grande">America/Campo_Grande</option><option value="America/Cancun">America/Cancun</option><option value="America/Caracas">America/Caracas</option><option value="America/Catamarca">America/Catamarca</option><option value="America/Cayenne">America/Cayenne</option><option value="America/Cayman">America/Cayman</option><option value="America/Chicago">America/Chicago</option><option value="America/Chihuahua">America/Chihuahua</option><option value="America/Coral_Harbour">America/Coral_Harbour</option><option value="America/Cordoba">America/Cordoba</option><option value="America/Costa_Rica">America/Costa_Rica</option><option value="America/Cuiaba">America/Cuiaba</option><option value="America/Curacao">America/Curacao</option><option value="America/Danmarkshavn">America/Danmarkshavn</option><option value="America/Dawson">America/Dawson</option><option value="America/Dawson_Creek">America/Dawson_Creek</option><option value="America/Denver">America/Denver</option><option value="America/Detroit">America/Detroit</option><option value="America/Dominica">America/Dominica</option><option value="America/Edmonton">America/Edmonton</option><option value="America/Eirunepe">America/Eirunepe</option><option value="America/El_Salvador">America/El_Salvador</option><option value="America/Ensenada">America/Ensenada</option><option value="America/Fort_Wayne">America/Fort_Wayne</option><option value="America/Fortaleza">America/Fortaleza</option><option value="America/Glace_Bay">America/Glace_Bay</option><option value="America/Godthab">America/Godthab</option><option value="America/Goose_Bay">America/Goose_Bay</option><option value="America/Grand_Turk">America/Grand_Turk</option><option value="America/Grenada">America/Grenada</option><option value="America/Guadeloupe">America/Guadeloupe</option><option value="America/Guatemala">America/Guatemala</option><option value="America/Guayaquil">America/Guayaquil</option><option value="America/Guyana">America/Guyana</option><option value="America/Halifax">America/Halifax</option><option value="America/Havana">America/Havana</option><option value="America/Hermosillo">America/Hermosillo</option><option value="America/Indiana/Indianapolis">America/Indiana/Indianapolis</option><option value="America/Indiana/Knox">America/Indiana/Knox</option><option value="America/Indiana/Marengo">America/Indiana/Marengo</option><option value="America/Indiana/Petersburg">America/Indiana/Petersburg</option><option value="America/Indiana/Tell_City">America/Indiana/Tell_City</option><option value="America/Indiana/Vevay">America/Indiana/Vevay</option><option value="America/Indiana/Vincennes">America/Indiana/Vincennes</option><option value="America/Indiana/Winamac">America/Indiana/Winamac</option><option value="America/Indianapolis">America/Indianapolis</option><option value="America/Inuvik">America/Inuvik</option><option value="America/Iqaluit">America/Iqaluit</option><option value="America/Jamaica">America/Jamaica</option><option value="America/Jujuy">America/Jujuy</option><option value="America/Juneau">America/Juneau</option><option value="America/Kentucky/Louisville">America/Kentucky/Louisville</option><option value="America/Kentucky/Monticello">America/Kentucky/Monticello</option><option value="America/Knox_IN">America/Knox_IN</option><option value="America/La_Paz">America/La_Paz</option><option value="America/Lima">America/Lima</option><option value="America/Los_Angeles">America/Los_Angeles</option><option value="America/Louisville">America/Louisville</option><option value="America/Maceio">America/Maceio</option><option value="America/Managua">America/Managua</option><option value="America/Manaus">America/Manaus</option><option value="America/Marigot">America/Marigot</option><option value="America/Martinique">America/Martinique</option><option value="America/Mazatlan">America/Mazatlan</option><option value="America/Mendoza">America/Mendoza</option><option value="America/Menominee">America/Menominee</option><option value="America/Merida">America/Merida</option><option value="America/Mexico_City">America/Mexico_City</option><option value="America/Miquelon">America/Miquelon</option><option value="America/Moncton">America/Moncton</option><option value="America/Monterrey">America/Monterrey</option><option value="America/Montevideo">America/Montevideo</option><option value="America/Montreal">America/Montreal</option><option value="America/Montserrat">America/Montserrat</option><option value="America/Nassau">America/Nassau</option><option value="America/New_York">America/New_York</option><option value="America/Nipigon">America/Nipigon</option><option value="America/Nome">America/Nome</option><option value="America/Noronha">America/Noronha</option><option value="America/North_Dakota/Center">America/North_Dakota/Center</option><option value="America/North_Dakota/New_Salem">America/North_Dakota/New_Salem</option><option value="America/Panama">America/Panama</option><option value="America/Pangnirtung">America/Pangnirtung</option><option value="America/Paramaribo">America/Paramaribo</option><option value="America/Phoenix">America/Phoenix</option><option value="America/Port-au-Prince">America/Port-au-Prince</option><option value="America/Port_of_Spain">America/Port_of_Spain</option><option value="America/Porto_Acre">America/Porto_Acre</option><option value="America/Porto_Velho">America/Porto_Velho</option><option value="America/Puerto_Rico">America/Puerto_Rico</option><option value="America/Rainy_River">America/Rainy_River</option><option value="America/Rankin_Inlet">America/Rankin_Inlet</option><option value="America/Recife">America/Recife</option><option value="America/Regina">America/Regina</option><option value="America/Resolute">America/Resolute</option><option value="America/Rio_Branco">America/Rio_Branco</option><option value="America/Rosario">America/Rosario</option><option value="America/Santarem">America/Santarem</option><option value="America/Santiago">America/Santiago</option><option value="America/Santo_Domingo">America/Santo_Domingo</option><option value="America/Sao_Paulo">America/Sao_Paulo</option><option value="America/Scoresbysund">America/Scoresbysund</option><option value="America/Shiprock">America/Shiprock</option><option value="America/St_Barthelemy">America/St_Barthelemy</option><option value="America/St_Johns">America/St_Johns</option><option value="America/St_Kitts">America/St_Kitts</option><option value="America/St_Lucia">America/St_Lucia</option><option value="America/St_Thomas">America/St_Thomas</option><option value="America/St_Vincent">America/St_Vincent</option><option value="America/Swift_Current">America/Swift_Current</option><option value="America/Tegucigalpa">America/Tegucigalpa</option><option value="America/Thule">America/Thule</option><option value="America/Thunder_Bay">America/Thunder_Bay</option><option value="America/Tijuana">America/Tijuana</option><option value="America/Toronto">America/Toronto</option><option value="America/Tortola">America/Tortola</option><option value="America/Vancouver">America/Vancouver</option><option value="America/Virgin">America/Virgin</option><option value="America/Whitehorse">America/Whitehorse</option><option value="America/Winnipeg">America/Winnipeg</option><option value="America/Yakutat">America/Yakutat</option><option value="America/Yellowknife">America/Yellowknife</option><option value="Antarctica/Casey">Antarctica/Casey</option><option value="Antarctica/Davis">Antarctica/Davis</option><option value="Antarctica/DumontDUrville">Antarctica/DumontDUrville</option><option value="Antarctica/Mawson">Antarctica/Mawson</option><option value="Antarctica/McMurdo">Antarctica/McMurdo</option><option value="Antarctica/Palmer">Antarctica/Palmer</option><option value="Antarctica/Rothera">Antarctica/Rothera</option><option value="Antarctica/South_Pole">Antarctica/South_Pole</option><option value="Antarctica/Syowa">Antarctica/Syowa</option><option value="Antarctica/Vostok">Antarctica/Vostok</option><option value="Arctic/Longyearbyen">Arctic/Longyearbyen</option><option value="Asia/Aden">Asia/Aden</option><option value="Asia/Almaty">Asia/Almaty</option><option value="Asia/Amman">Asia/Amman</option><option value="Asia/Anadyr">Asia/Anadyr</option><option value="Asia/Aqtau">Asia/Aqtau</option><option value="Asia/Aqtobe">Asia/Aqtobe</option><option value="Asia/Ashgabat">Asia/Ashgabat</option><option value="Asia/Ashkhabad">Asia/Ashkhabad</option><option value="Asia/Baghdad">Asia/Baghdad</option><option value="Asia/Bahrain">Asia/Bahrain</option><option value="Asia/Baku">Asia/Baku</option><option value="Asia/Bangkok">Asia/Bangkok</option><option value="Asia/Beirut">Asia/Beirut</option><option value="Asia/Bishkek">Asia/Bishkek</option><option value="Asia/Brunei">Asia/Brunei</option><option value="Asia/Calcutta">Asia/Calcutta</option><option value="Asia/Choibalsan">Asia/Choibalsan</option><option value="Asia/Chongqing">Asia/Chongqing</option><option value="Asia/Chungking">Asia/Chungking</option><option value="Asia/Colombo">Asia/Colombo</option><option value="Asia/Dacca">Asia/Dacca</option><option value="Asia/Damascus">Asia/Damascus</option><option value="Asia/Dhaka">Asia/Dhaka</option><option value="Asia/Dili">Asia/Dili</option><option value="Asia/Dubai">Asia/Dubai</option><option value="Asia/Dushanbe">Asia/Dushanbe</option><option value="Asia/Gaza">Asia/Gaza</option><option value="Asia/Harbin">Asia/Harbin</option><option value="Asia/Ho_Chi_Minh">Asia/Ho_Chi_Minh</option><option value="Asia/Hong_Kong">Asia/Hong_Kong</option><option value="Asia/Hovd">Asia/Hovd</option><option value="Asia/Irkutsk">Asia/Irkutsk</option><option value="Asia/Istanbul">Asia/Istanbul</option><option value="Asia/Jakarta">Asia/Jakarta</option><option value="Asia/Jayapura">Asia/Jayapura</option><option value="Asia/Jerusalem">Asia/Jerusalem</option><option value="Asia/Kabul">Asia/Kabul</option><option value="Asia/Kamchatka">Asia/Kamchatka</option><option value="Asia/Karachi">Asia/Karachi</option><option value="Asia/Kashgar">Asia/Kashgar</option><option value="Asia/Kathmandu">Asia/Kathmandu</option><option value="Asia/Katmandu">Asia/Katmandu</option><option value="Asia/Kolkata">Asia/Kolkata</option><option value="Asia/Krasnoyarsk">Asia/Krasnoyarsk</option><option value="Asia/Kuala_Lumpur">Asia/Kuala_Lumpur</option><option value="Asia/Kuching">Asia/Kuching</option><option value="Asia/Kuwait">Asia/Kuwait</option><option value="Asia/Macao">Asia/Macao</option><option value="Asia/Macau">Asia/Macau</option><option value="Asia/Magadan">Asia/Magadan</option><option value="Asia/Makassar">Asia/Makassar</option><option value="Asia/Manila">Asia/Manila</option><option value="Asia/Muscat">Asia/Muscat</option><option value="Asia/Nicosia">Asia/Nicosia</option><option value="Asia/Novosibirsk">Asia/Novosibirsk</option><option value="Asia/Omsk">Asia/Omsk</option><option value="Asia/Oral">Asia/Oral</option><option value="Asia/Phnom_Penh">Asia/Phnom_Penh</option><option value="Asia/Pontianak">Asia/Pontianak</option><option value="Asia/Pyongyang">Asia/Pyongyang</option><option value="Asia/Qatar">Asia/Qatar</option><option value="Asia/Qyzylorda">Asia/Qyzylorda</option><option value="Asia/Rangoon">Asia/Rangoon</option><option value="Asia/Riyadh">Asia/Riyadh</option><option value="Asia/Saigon">Asia/Saigon</option><option value="Asia/Sakhalin">Asia/Sakhalin</option><option value="Asia/Samarkand">Asia/Samarkand</option><option value="Asia/Seoul">Asia/Seoul</option><option value="Asia/Shanghai">Asia/Shanghai</option><option value="Asia/Singapore">Asia/Singapore</option><option value="Asia/Taipei">Asia/Taipei</option><option value="Asia/Tashkent">Asia/Tashkent</option><option value="Asia/Tbilisi">Asia/Tbilisi</option><option value="Asia/Tehran">Asia/Tehran</option><option value="Asia/Tel_Aviv">Asia/Tel_Aviv</option><option value="Asia/Thimbu">Asia/Thimbu</option><option value="Asia/Thimphu">Asia/Thimphu</option><option value="Asia/Tokyo">Asia/Tokyo</option><option value="Asia/Ujung_Pandang">Asia/Ujung_Pandang</option><option value="Asia/Ulaanbaatar">Asia/Ulaanbaatar</option><option value="Asia/Ulan_Bator">Asia/Ulan_Bator</option><option value="Asia/Urumqi">Asia/Urumqi</option><option value="Asia/Vientiane">Asia/Vientiane</option><option value="Asia/Vladivostok">Asia/Vladivostok</option><option value="Asia/Yakutsk">Asia/Yakutsk</option><option value="Asia/Yekaterinburg">Asia/Yekaterinburg</option><option value="Asia/Yerevan">Asia/Yerevan</option><option value="Atlantic/Azores">Atlantic/Azores</option><option value="Atlantic/Bermuda">Atlantic/Bermuda</option><option value="Atlantic/Canary">Atlantic/Canary</option><option value="Atlantic/Cape_Verde">Atlantic/Cape_Verde</option><option value="Atlantic/Faeroe">Atlantic/Faeroe</option><option value="Atlantic/Faroe">Atlantic/Faroe</option><option value="Atlantic/Jan_Mayen">Atlantic/Jan_Mayen</option><option value="Atlantic/Madeira">Atlantic/Madeira</option><option value="Atlantic/Reykjavik">Atlantic/Reykjavik</option><option value="Atlantic/South_Georgia">Atlantic/South_Georgia</option><option value="Atlantic/St_Helena">Atlantic/St_Helena</option><option value="Atlantic/Stanley">Atlantic/Stanley</option><option value="Australia/ACT">Australia/ACT</option><option value="Australia/Adelaide">Australia/Adelaide</option><option value="Australia/Brisbane">Australia/Brisbane</option><option value="Australia/Broken_Hill">Australia/Broken_Hill</option><option value="Australia/Canberra">Australia/Canberra</option><option value="Australia/Currie">Australia/Currie</option><option value="Australia/Darwin">Australia/Darwin</option><option value="Australia/Eucla">Australia/Eucla</option><option value="Australia/Hobart">Australia/Hobart</option><option value="Australia/LHI">Australia/LHI</option><option value="Australia/Lindeman">Australia/Lindeman</option><option value="Australia/Lord_Howe">Australia/Lord_Howe</option><option value="Australia/Melbourne">Australia/Melbourne</option><option value="Australia/North">Australia/North</option><option value="Australia/NSW">Australia/NSW</option><option value="Australia/Perth">Australia/Perth</option><option value="Australia/Queensland">Australia/Queensland</option><option value="Australia/South">Australia/South</option><option value="Australia/Sydney">Australia/Sydney</option><option value="Australia/Tasmania">Australia/Tasmania</option><option value="Australia/Victoria">Australia/Victoria</option><option value="Australia/West">Australia/West</option><option value="Australia/Yancowinna">Australia/Yancowinna</option><option value="Brazil/Acre">Brazil/Acre</option><option value="Brazil/DeNoronha">Brazil/DeNoronha</option><option value="Brazil/East">Brazil/East</option><option value="Brazil/West">Brazil/West</option><option value="Canada/Atlantic">Canada/Atlantic</option><option value="Canada/Central">Canada/Central</option><option value="Canada/East-Saskatchewan">Canada/East-Saskatchewan</option><option value="Canada/Eastern">Canada/Eastern</option><option value="Canada/Mountain">Canada/Mountain</option><option value="Canada/Newfoundland">Canada/Newfoundland</option><option value="Canada/Pacific">Canada/Pacific</option><option value="Canada/Saskatchewan">Canada/Saskatchewan</option><option value="Canada/Yukon">Canada/Yukon</option><option value="CET">CET</option><option value="Chile/Continental">Chile/Continental</option><option value="Chile/EasterIsland">Chile/EasterIsland</option><option value="CST6CDT">CST6CDT</option><option value="Cuba">Cuba</option><option value="EET">EET</option><option value="Egypt">Egypt</option><option value="Eire">Eire</option><option value="EST">EST</option><option value="EST5EDT">EST5EDT</option><option value="Etc/GMT">Etc/GMT</option><option value="Etc/GMT+0">Etc/GMT+0</option><option value="Etc/GMT+1">Etc/GMT+1</option><option value="Etc/GMT+10">Etc/GMT+10</option><option value="Etc/GMT+11">Etc/GMT+11</option><option value="Etc/GMT+12">Etc/GMT+12</option><option value="Etc/GMT+2">Etc/GMT+2</option><option value="Etc/GMT+3">Etc/GMT+3</option><option value="Etc/GMT+4">Etc/GMT+4</option><option value="Etc/GMT+5">Etc/GMT+5</option><option value="Etc/GMT+6">Etc/GMT+6</option><option value="Etc/GMT+7">Etc/GMT+7</option><option value="Etc/GMT+8">Etc/GMT+8</option><option value="Etc/GMT+9">Etc/GMT+9</option><option value="Etc/GMT-0">Etc/GMT-0</option><option value="Etc/GMT-1">Etc/GMT-1</option><option value="Etc/GMT-10">Etc/GMT-10</option><option value="Etc/GMT-11">Etc/GMT-11</option><option value="Etc/GMT-12">Etc/GMT-12</option><option value="Etc/GMT-13">Etc/GMT-13</option><option value="Etc/GMT-14">Etc/GMT-14</option><option value="Etc/GMT-2">Etc/GMT-2</option><option value="Etc/GMT-3">Etc/GMT-3</option><option value="Etc/GMT-4">Etc/GMT-4</option><option value="Etc/GMT-5">Etc/GMT-5</option><option value="Etc/GMT-6">Etc/GMT-6</option><option value="Etc/GMT-7">Etc/GMT-7</option><option value="Etc/GMT-8">Etc/GMT-8</option><option value="Etc/GMT-9">Etc/GMT-9</option><option value="Etc/GMT0">Etc/GMT0</option><option value="Etc/Greenwich">Etc/Greenwich</option><option value="Etc/UCT">Etc/UCT</option><option value="Etc/Universal">Etc/Universal</option><option value="Etc/UTC">Etc/UTC</option><option value="Etc/Zulu">Etc/Zulu</option><option value="Europe/Amsterdam">Europe/Amsterdam</option><option value="Europe/Andorra">Europe/Andorra</option><option value="Europe/Athens">Europe/Athens</option><option value="Europe/Belfast">Europe/Belfast</option><option value="Europe/Belgrade">Europe/Belgrade</option><option value="Europe/Berlin">Europe/Berlin</option><option value="Europe/Bratislava">Europe/Bratislava</option><option value="Europe/Brussels">Europe/Brussels</option><option value="Europe/Bucharest">Europe/Bucharest</option><option value="Europe/Budapest">Europe/Budapest</option><option value="Europe/Chisinau">Europe/Chisinau</option><option value="Europe/Copenhagen">Europe/Copenhagen</option><option value="Europe/Dublin">Europe/Dublin</option><option value="Europe/Gibraltar">Europe/Gibraltar</option><option value="Europe/Guernsey">Europe/Guernsey</option><option value="Europe/Helsinki">Europe/Helsinki</option><option value="Europe/Isle_of_Man">Europe/Isle_of_Man</option><option value="Europe/Istanbul">Europe/Istanbul</option><option value="Europe/Jersey">Europe/Jersey</option><option value="Europe/Kaliningrad">Europe/Kaliningrad</option><option value="Europe/Kiev">Europe/Kiev</option><option value="Europe/Lisbon">Europe/Lisbon</option><option value="Europe/Ljubljana">Europe/Ljubljana</option><option value="Europe/London">Europe/London</option><option value="Europe/Luxembourg">Europe/Luxembourg</option><option value="Europe/Madrid">Europe/Madrid</option><option value="Europe/Malta">Europe/Malta</option><option value="Europe/Mariehamn">Europe/Mariehamn</option><option value="Europe/Minsk">Europe/Minsk</option><option value="Europe/Monaco">Europe/Monaco</option><option value="Europe/Moscow">Europe/Moscow</option><option value="Europe/Nicosia">Europe/Nicosia</option><option value="Europe/Oslo">Europe/Oslo</option><option value="Europe/Paris">Europe/Paris</option><option value="Europe/Podgorica">Europe/Podgorica</option><option value="Europe/Prague">Europe/Prague</option><option value="Europe/Riga">Europe/Riga</option><option value="Europe/Rome">Europe/Rome</option><option value="Europe/Samara">Europe/Samara</option><option value="Europe/San_Marino">Europe/San_Marino</option><option value="Europe/Sarajevo">Europe/Sarajevo</option><option value="Europe/Simferopol">Europe/Simferopol</option><option value="Europe/Skopje">Europe/Skopje</option><option value="Europe/Sofia">Europe/Sofia</option><option value="Europe/Stockholm">Europe/Stockholm</option><option value="Europe/Tallinn">Europe/Tallinn</option><option value="Europe/Tirane">Europe/Tirane</option><option value="Europe/Tiraspol">Europe/Tiraspol</option><option value="Europe/Uzhgorod">Europe/Uzhgorod</option><option value="Europe/Vaduz">Europe/Vaduz</option><option value="Europe/Vatican">Europe/Vatican</option><option value="Europe/Vienna">Europe/Vienna</option><option value="Europe/Vilnius">Europe/Vilnius</option><option value="Europe/Volgograd">Europe/Volgograd</option><option value="Europe/Warsaw">Europe/Warsaw</option><option value="Europe/Zagreb">Europe/Zagreb</option><option value="Europe/Zaporozhye">Europe/Zaporozhye</option><option value="Europe/Zurich">Europe/Zurich</option><option value="Factory">Factory</option><option value="GB">GB</option><option value="GB-Eire">GB-Eire</option><option value="GMT">GMT</option><option value="GMT+0">GMT+0</option><option value="GMT-0">GMT-0</option><option value="GMT0">GMT0</option><option value="Greenwich">Greenwich</option><option value="Hongkong">Hongkong</option><option value="HST">HST</option><option value="Iceland">Iceland</option><option value="Indian/Antananarivo">Indian/Antananarivo</option><option value="Indian/Chagos">Indian/Chagos</option><option value="Indian/Christmas">Indian/Christmas</option><option value="Indian/Cocos">Indian/Cocos</option><option value="Indian/Comoro">Indian/Comoro</option><option value="Indian/Kerguelen">Indian/Kerguelen</option><option value="Indian/Mahe">Indian/Mahe</option><option value="Indian/Maldives">Indian/Maldives</option><option value="Indian/Mauritius">Indian/Mauritius</option><option value="Indian/Mayotte">Indian/Mayotte</option><option value="Indian/Reunion">Indian/Reunion</option><option value="Iran">Iran</option><option value="Israel">Israel</option><option value="Jamaica">Jamaica</option><option value="Japan">Japan</option><option value="Kwajalein">Kwajalein</option><option value="Libya">Libya</option><option value="MET">MET</option><option value="Mexico/BajaNorte">Mexico/BajaNorte</option><option value="Mexico/BajaSur">Mexico/BajaSur</option><option value="Mexico/General">Mexico/General</option><option value="MST">MST</option><option value="MST7MDT">MST7MDT</option><option value="Navajo">Navajo</option><option value="NZ">NZ</option><option value="NZ-CHAT">NZ-CHAT</option><option value="Pacific/Apia">Pacific/Apia</option><option value="Pacific/Auckland">Pacific/Auckland</option><option value="Pacific/Chatham">Pacific/Chatham</option><option value="Pacific/Easter">Pacific/Easter</option><option value="Pacific/Efate">Pacific/Efate</option><option value="Pacific/Enderbury">Pacific/Enderbury</option><option value="Pacific/Fakaofo">Pacific/Fakaofo</option><option value="Pacific/Fiji">Pacific/Fiji</option><option value="Pacific/Funafuti">Pacific/Funafuti</option><option value="Pacific/Galapagos">Pacific/Galapagos</option><option value="Pacific/Gambier">Pacific/Gambier</option><option value="Pacific/Guadalcanal">Pacific/Guadalcanal</option><option value="Pacific/Guam">Pacific/Guam</option><option value="Pacific/Honolulu">Pacific/Honolulu</option><option value="Pacific/Johnston">Pacific/Johnston</option><option value="Pacific/Kiritimati">Pacific/Kiritimati</option><option value="Pacific/Kosrae">Pacific/Kosrae</option><option value="Pacific/Kwajalein">Pacific/Kwajalein</option><option value="Pacific/Majuro">Pacific/Majuro</option><option value="Pacific/Marquesas">Pacific/Marquesas</option><option value="Pacific/Midway">Pacific/Midway</option><option value="Pacific/Nauru">Pacific/Nauru</option><option value="Pacific/Niue">Pacific/Niue</option><option value="Pacific/Norfolk">Pacific/Norfolk</option><option value="Pacific/Noumea">Pacific/Noumea</option><option value="Pacific/Pago_Pago">Pacific/Pago_Pago</option><option value="Pacific/Palau">Pacific/Palau</option><option value="Pacific/Pitcairn">Pacific/Pitcairn</option><option value="Pacific/Ponape">Pacific/Ponape</option><option value="Pacific/Port_Moresby">Pacific/Port_Moresby</option><option value="Pacific/Rarotonga">Pacific/Rarotonga</option><option value="Pacific/Saipan">Pacific/Saipan</option><option value="Pacific/Samoa">Pacific/Samoa</option><option value="Pacific/Tahiti">Pacific/Tahiti</option><option value="Pacific/Tarawa">Pacific/Tarawa</option><option value="Pacific/Tongatapu">Pacific/Tongatapu</option><option value="Pacific/Truk">Pacific/Truk</option><option value="Pacific/Wake">Pacific/Wake</option><option value="Pacific/Wallis">Pacific/Wallis</option><option value="Pacific/Yap">Pacific/Yap</option><option value="Poland">Poland</option><option value="Portugal">Portugal</option><option value="PRC">PRC</option><option value="PST8PDT">PST8PDT</option><option value="ROC">ROC</option><option value="ROK">ROK</option><option value="Singapore">Singapore</option><option value="Turkey">Turkey</option><option value="UCT">UCT</option><option value="Universal">Universal</option><option value="US/Alaska">US/Alaska</option><option value="US/Aleutian">US/Aleutian</option><option value="US/Arizona">US/Arizona</option><option value="US/Central">US/Central</option><option value="US/East-Indiana">US/East-Indiana</option><option value="US/Eastern">US/Eastern</option><option value="US/Hawaii">US/Hawaii</option><option value="US/Indiana-Starke">US/Indiana-Starke</option><option value="US/Michigan">US/Michigan</option><option value="US/Mountain">US/Mountain</option><option value="US/Pacific">US/Pacific</option><option value="US/Pacific-New">US/Pacific-New</option><option value="US/Samoa">US/Samoa</option><option value="UTC">UTC</option><option value="W-SU">W-SU</option><option value="WET">WET</option><option value="Zulu">Zulu</option></select>
<p>So it looked like I was going to have to output hundreds of timezone options in order to have something accurate to pass to PHP&#8217;s <a href="http://us2.php.net/datetimezone" target="_blank">DateTimeZone class</a> and from there perform my calculations against the server time zone. DateTimeZone is insanely great because it offers so much information, including the offset from GMT (or UTC.. the distinction is negligible for this type of application) and whether or not that time zone is currently in daylight savings.</p>
<p>So, the problem was: do I list all the available time zones in the giant select list and hope the user knows which one they&#8217;re in? Some would argue that this drop down list is too long to be usable. This is valid because it&#8217;s a very long list, and might be confusing. I personally think the jury is still out on this though, because there are around 190 countries in the World on a given day, yet we still seem to find our own. The difference is that most of us know which country we&#8217;re in, but will we necessarily know our actual timezone? Users just might not know which one to choose. For example: Vancouver, BC is in time zone &#8220;America/Vancouver&#8221; whereas Vancouver, WA, just across the border is in time zone &#8220;America/Los_Angeles&#8221;. This could be a little confusing.</p>
<h3>The solutions:</h3>
<p>First I thought I could use something like <a href="http://www.ip2location.com/" target="_blank">IP2Location</a> data to pull the time zone for the user&#8217;s IP, but this would not be reliable for my particular application where the user was choosing a meeting time that was in the future. Where they are when setting the meeting and where they will be when in the meeting could be different, and to make matters worse, one of us could go into daylight savings between now and then. Strike it from the list.</p>
<p>I decided on the approach of using a combination of the <a href="http://code.google.com/apis/maps/">Google Maps API</a> and <a href="http://www.geonames.org/export/web-services.html">GeoNames.org</a> web service to get the user&#8217;s time zone based on the geographic location they enter into a text field, and the latitude / longitude returned by Google&#8217;s geocoding service.</p>
<h3>The basic steps:</h3>
<ol>
<li>Check that there&#8217;s input text</li>
<li>Send to google</li>
<li>Validate the result</li>
<li>Make call to php script for GeoNames</li>
<li>Validate the result</li>
<li>Format a string with the results that the user can confirm</li>
<li>Display results</li>
</ol>
<h3>The HTML:</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;input style=&quot;padding: 5px; border: 1px solid #333; font-weight: bold&quot; type=&quot;text&quot; name=&quot;address&quot; id=&quot;address&quot;  size=&quot;40&quot; maxsize=&quot;100&quot;  /&gt; &lt;a href=&quot;#&quot; id=&quot;lookup&quot;&gt;Look-up&lt;/a&gt;&lt;br /&gt;
&lt;span id=&quot;result&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;map&quot; style=&quot;width: 293px; height: 100px&quot;&gt;&lt;/div&gt;</pre></td></tr></table></div>

<h3>The Javascript:</h3>
<p>My example uses a little Mootools, so you if you base yours on this you will also have to include Mootools Core.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Demo <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
     start<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
          Demo.<span style="color: #660066;">lookup</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
     lookup<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
          $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'lookup'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
               e.<span style="color: #000066;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'result'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">set</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'html'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'&amp;nbsp;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               <span style="color: #003366; font-weight: bold;">var</span> address <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'address'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
               <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>address<span style="color: #339933;">==</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                    <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Please enter your location in the text field&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'address'</span><span style="color: #009900;">&#41;</span>.<span style="color: #000066;">focus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               <span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
                    map <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> GMap2<span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;map&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #003366; font-weight: bold;">var</span> geocoder<span style="color: #339933;">;</span>
                    geocoder <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> GClientGeocoder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    geocoder.<span style="color: #660066;">getLocations</span><span style="color: #009900;">&#40;</span>address<span style="color: #339933;">,</span> Demo.<span style="color: #660066;">addToMap</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               <span style="color: #009900;">&#125;</span>
          <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
&nbsp;
     <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
     addToMap<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>response<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
          map.<span style="color: #660066;">setCenter</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> GLatLng<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">47.040182144806664</span><span style="color: #339933;">,-</span><span style="color: #CC0000;">30.234375</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          map.<span style="color: #660066;">clearOverlays</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>response <span style="color: #339933;">||</span> response.<span style="color: #000066;">Status</span>.<span style="color: #660066;">code</span> <span style="color: #339933;">!=</span> <span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               reset_map<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #003366; font-weight: bold;">var</span> place <span style="color: #339933;">=</span> response.<span style="color: #660066;">Placemark</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
               point <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> GLatLng<span style="color: #009900;">&#40;</span>place.<span style="color: #660066;">Point</span>.<span style="color: #660066;">coordinates</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>place.<span style="color: #660066;">Point</span>.<span style="color: #660066;">coordinates</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               map.<span style="color: #660066;">checkResize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               map.<span style="color: #660066;">setCenter</span><span style="color: #009900;">&#40;</span>point<span style="color: #339933;">,</span> <span style="color: #CC0000;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               <span style="color: #003366; font-weight: bold;">var</span> marker <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> GMarker<span style="color: #009900;">&#40;</span>point<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               map.<span style="color: #660066;">addOverlay</span><span style="color: #009900;">&#40;</span>marker<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               <span style="color: #003366; font-weight: bold;">var</span> coords <span style="color: #339933;">=</span> place.<span style="color: #660066;">Point</span>.<span style="color: #660066;">coordinates</span><span style="color: #339933;">;</span>
               <span style="color: #003366; font-weight: bold;">var</span> tmp <span style="color: #339933;">=</span> String<span style="color: #009900;">&#40;</span>place.<span style="color: #660066;">Point</span>.<span style="color: #660066;">coordinates</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               <span style="color: #003366; font-weight: bold;">var</span> coords <span style="color: #339933;">=</span> tmp.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;,&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               <span style="color: #003366; font-weight: bold;">var</span> lat <span style="color: #339933;">=</span> coords<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
               <span style="color: #003366; font-weight: bold;">var</span> lng <span style="color: #339933;">=</span> coords<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
               <span style="color: #000066; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #006600; font-style: italic;">//eg paris</span>
                    <span style="color: #003366; font-weight: bold;">var</span> city <span style="color: #339933;">=</span> place.<span style="color: #660066;">AddressDetails</span>.<span style="color: #660066;">Country</span>.<span style="color: #660066;">AdministrativeArea</span>.<span style="color: #660066;">SubAdministrativeArea</span>.<span style="color: #660066;">Locality</span>.<span style="color: #660066;">LocalityName</span><span style="color: #339933;">;</span>
               <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>err<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span>
                         <span style="color: #006600; font-style: italic;">//eg vancouver</span>
                         <span style="color: #003366; font-weight: bold;">var</span> city <span style="color: #339933;">=</span> place.<span style="color: #660066;">AddressDetails</span>.<span style="color: #660066;">Country</span>.<span style="color: #660066;">AdministrativeArea</span>.<span style="color: #660066;">Locality</span>.<span style="color: #660066;">LocalityName</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>err<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                         <span style="color: #000066; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span>
                              <span style="color: #006600; font-style: italic;">//eg dubai</span>
                              <span style="color: #003366; font-weight: bold;">var</span> city <span style="color: #339933;">=</span> place.<span style="color: #660066;">AddressDetails</span>.<span style="color: #660066;">Country</span>.<span style="color: #660066;">Locality</span>.<span style="color: #660066;">LocalityName</span><span style="color: #339933;">;</span>
                         <span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>err<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                              <span style="color: #006600; font-style: italic;">//eg Monaco</span>
                              <span style="color: #003366; font-weight: bold;">var</span> city <span style="color: #339933;">=</span> place.<span style="color: #660066;">AddressDetails</span>.<span style="color: #660066;">Country</span>.<span style="color: #660066;">CountryName</span><span style="color: #339933;">;</span>
                         <span style="color: #009900;">&#125;</span>
                    <span style="color: #009900;">&#125;</span>
               <span style="color: #009900;">&#125;</span>
&nbsp;
               Demo.<span style="color: #660066;">getTimezone</span><span style="color: #009900;">&#40;</span>city<span style="color: #339933;">,</span>lat<span style="color: #339933;">,</span>lng<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #009900;">&#125;</span>
     <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
     getTimezone<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>city<span style="color: #339933;">,</span>lat<span style="color: #339933;">,</span>lng<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
          <span style="color: #003366; font-weight: bold;">new</span> Request<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
               url<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;index.php&quot;</span><span style="color: #339933;">,</span>
               data<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;lat=&quot;</span><span style="color: #339933;">+</span>lat<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;&amp;lng=&quot;</span><span style="color: #339933;">+</span>lng<span style="color: #339933;">,</span>
               onSuccess<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>response<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                    <span style="color: #003366; font-weight: bold;">var</span> responseArray <span style="color: #339933;">=</span> JSON.<span style="color: #660066;">decode</span><span style="color: #009900;">&#40;</span>response<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #003366; font-weight: bold;">var</span> timezone <span style="color: #339933;">=</span> responseArray.<span style="color: #660066;">timezone</span><span style="color: #339933;">;</span>
                    <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;You are located in &quot;</span><span style="color: #339933;">+</span>city<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;. &lt;br /&gt;Your timezone is &quot;</span><span style="color: #339933;">+</span>timezone<span style="color: #339933;">;</span>
                    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'result'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">set</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'html'</span><span style="color: #339933;">,</span>result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               <span style="color: #009900;">&#125;</span>
          <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>     
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
window.<span style="color: #660066;">addEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'load'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     Demo.<span style="color: #660066;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>The PHP (index.php):</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'lat'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     <span style="color: #000088;">$doc</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DOMDocument<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #000088;">$location</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://ws.geonames.org/timezone?lat=&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'lat'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&amp;lng='</span><span style="color: #339933;">.</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'lng'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
     <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$doc</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$location</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$timezones</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$doc</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;timezoneId&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #000088;">$coordinates</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'timezone'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$timezones</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">item</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nodeValue</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
     <span style="color: #b1b100;">echo</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$coordinates</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #990000;">die</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>&#8230;and that&#8217;s it! Now you have a real time zone for the user so you can use PHP&#8217;s <a href="http://us2.php.net/datetimezone">DateTimeZone class</a> to make reliable date and time calculations. This particular implementation isn&#8217;t fool proof.. you would have to have more checks and communication back to the user to make this more functional, but the concept is clear and it sure beats offering a select list of over 400 time zone options.</p>
<p><a href="/demos/getting-time-zone-from-latitude-longitude.php" target="_blank">See a Demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vancouverwebconsultants.com/getting-time-zone-from-latitude-longitude/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Triggering File Downloads with Mootools</title>
		<link>http://vancouverwebconsultants.com/triggering-file-downloads-with-mootools/</link>
		<comments>http://vancouverwebconsultants.com/triggering-file-downloads-with-mootools/#comments</comments>
		<pubDate>Fri, 01 May 2009 14:37:46 +0000</pubDate>
		<dc:creator>Nelson</dc:creator>
				<category><![CDATA[Mootools]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[File Downloads]]></category>

		<guid isPermaLink="false">http://vancouverwebconsultants.com/?p=88</guid>
		<description><![CDATA[Creating a javascript links that uses AJAX (or, more accurately, an asynchronous http request) to trigger a file download, usually results in disappointment. Headers returned by a PHP script called asynchronously do not trigger a download in the browser.
 
If you want to have a link to a file download that does not cause a [...]]]></description>
			<content:encoded><![CDATA[<p>Creating a javascript links that uses AJAX (or, more accurately, an asynchronous http request) to trigger a file download, usually results in disappointment. Headers returned by a PHP script called asynchronously do not trigger a download in the browser.</p>
<p><span id="more-88"></span> </p>
<p>If you want to have a link to a file download that does not cause a page refresh or opening a superfluous browser window in order to make a file download happen, it&#8217;s actually quite easy with only a few lines of JS. There&#8217;s no &#8220;AJAX&#8221; here, but it sure feels like it. The method relies on adding an invisible iFrame to the DOM, and simply loading the script triggering the download into that iFrame:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;p&gt;[&lt;a href=&quot;my-fictional-download-script.php&quot; id=&quot;download&quot; target=&quot;_blank&quot;&gt;download a file&lt;/a&gt;]&lt;/p&gt;</pre></div></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'download'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> myFrame <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Element<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'iframe'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
		src<span style="color: #339933;">:</span> <span style="color: #3366CC;">'about:blank'</span><span style="color: #339933;">,</span>
		id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'myFrame'</span><span style="color: #339933;">,</span>
		styles<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #3366CC;">'visibility'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'hidden'</span><span style="color: #339933;">,</span>
			<span style="color: #3366CC;">'display'</span><span style="color: #339933;">:</span>    <span style="color: #3366CC;">'none'</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">injectInside</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">body</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'download'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		e.<span style="color: #000066;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
		myFrame.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">href</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Now as long as your PHP file is configured to return the correct headers for the file type you would like downloaded, this should trigger a download. Here&#8217;s an example of some PHP to download a .csv file:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$filename</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'download.csv'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//this is where you would format your data, selecting and looping through rows from your database for example.</span>
<span style="color: #666666; font-style: italic;">//here we just output one line:</span>
<span style="color: #000088;">$out</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;this, is, a , csv<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Cache-Control: must-revalidate, post-check=0, pre-check=0&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Length: &quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$out</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-type: text/x-csv&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Disposition: attachment; filename=<span style="color: #006699; font-weight: bold;">$filename</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$out</span><span style="color: #339933;">;</span>
<span style="color: #990000;">exit</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://vancouverwebconsultants.com/triggering-file-downloads-with-mootools/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
