<?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>James Padolsey&#187; PHP category &#8211; James Padolsey</title>
	<atom:link href="http://james.padolsey.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://james.padolsey.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sat, 21 Aug 2010 04:38:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>&#8220;wordwrap&#8221; for JavaScript</title>
		<link>http://james.padolsey.com/javascript/wordwrap-for-javascript/</link>
		<comments>http://james.padolsey.com/javascript/wordwrap-for-javascript/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 08:17:01 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Strings]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=968</guid>
		<description><![CDATA[This function emulates PHP's <code>wordwrap</code>. It takes four arguments]]></description>
			<content:encoded><![CDATA[<p>This function emulates PHP&#8217;s <code><a href="http://us3.php.net/manual/en/function.wordwrap.php">wordwrap</a></code>. It takes four arguments:</p>

<ul>
    <li>The string to be wrapped.</li>
    <li>The column width (a number, default: 75)</li>
    <li>The character(s) to be inserted at every break. (default: &#8216;\n&#8217;)</li>
    <li>The cut: a Boolean value (false by default). See <a href="http://us3.php.net/manual/en/function.wordwrap.php">PHP docs</a> for more info.</li>
</ul>

<h2>The code</h2>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="kw2">function</span> wordwrap<span class="br0">&#40;</span> str<span class="sy0">,</span> width<span class="sy0">,</span> brk<span class="sy0">,</span> cut <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
    brk <span class="sy0">=</span> brk <span class="sy0">||</span> <span class="st0">'<span class="es0">\n</span>'</span><span class="sy0">;</span>
    width <span class="sy0">=</span> width <span class="sy0">||</span> <span class="nu0">75</span><span class="sy0">;</span>
    cut <span class="sy0">=</span> cut <span class="sy0">||</span> <span class="kw2">false</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>str<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> str<span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp;
    <span class="kw2">var</span> regex <span class="sy0">=</span> <span class="st0">'.{1,'</span> <span class="sy0">+</span>width<span class="sy0">+</span> <span class="st0">'}(<span class="es0">\\</span>s|$)'</span> <span class="sy0">+</span> <span class="br0">&#40;</span>cut <span class="sy0">?</span> <span class="st0">'|.{'</span> <span class="sy0">+</span>width<span class="sy0">+</span> <span class="st0">'}|.+$'</span> <span class="sy0">:</span> <span class="st0">'|<span class="es0">\\</span>S+?(<span class="es0">\\</span>s|$)'</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">return</span> str.<span class="me1">match</span><span class="br0">&#40;</span> RegExp<span class="br0">&#40;</span>regex<span class="sy0">,</span> <span class="st0">'g'</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>.<span class="me1">join</span><span class="br0">&#40;</span> brk <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span></pre></div></div>




<h2>Usage</h2>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">wordwrap<span class="br0">&#40;</span><span class="st0">'The quick brown fox jumped over the lazy dog.'</span><span class="sy0">,</span> <span class="nu0">20</span><span class="sy0">,</span> <span class="st0">'&lt;br/&gt;<span class="es0">\n</span>'</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>





<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">The quick brown fox &lt;br/&gt;
jumped over the lazy &lt;br/&gt;
dog.</pre></div></div>




<p>I know there are other solutions out there; the ones I saw seemed a bit slow though, not to mention unnecessarily complicated/bloated&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/javascript/wordwrap-for-javascript/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>&#8216;tweetFromFile&#8217; PHP Class</title>
		<link>http://james.padolsey.com/twitter/tweetfromfile-php-class/</link>
		<comments>http://james.padolsey.com/twitter/tweetfromfile-php-class/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 21:45:04 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[Class]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=612</guid>
		<description><![CDATA[This recently created PHP class is part of today's ongoing struggle of trying to create a Twitter 'drip' that will automatically update Twitter at pre-defined intervals with status updates specified in a text file]]></description>
			<content:encoded><![CDATA[<p>This recently created PHP class is part of today&#8217;s ongoing struggle of trying to create a Twitter &#8216;drip&#8217; that will automatically update Twitter at pre-defined intervals with status updates specified in a text file.</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span class="co1">// (C) Copyright JAMES PADOLSEY</span>
<span class="kw2">class</span> tweetFromFile <span class="br0">&#123;</span>
&nbsp;
    <span class="kw2">private</span> <span class="re0">$curlHandle</span><span class="sy0">;</span>
    <span class="kw2">private</span> <span class="re0">$updateFile</span><span class="sy0">;</span>
    <span class="kw2">private</span> <span class="re0">$archiveFile</span><span class="sy0">;</span>
&nbsp;
    <span class="kw2">private</span> <span class="kw2">function</span> getNewStatus<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="re0">$upcomingTweetsFile</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">files</span><span class="br0">&#91;</span><span class="st_h">'upcoming'</span><span class="br0">&#93;</span><span class="sy0">;</span>
        <span class="re0">$archivedTweetsFile</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">files</span><span class="br0">&#91;</span><span class="st_h">'archive'</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
        <span class="re0">$upcomingTweets_R</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="re0">$upcomingTweetsFile</span><span class="sy0">,</span> <span class="st0">&quot;r&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="co1">// Get upcoming Tweets:</span>
        <span class="re0">$contents</span> <span class="sy0">=</span> <span class="kw3">fread</span><span class="br0">&#40;</span><span class="re0">$upcomingTweets_R</span><span class="sy0">,</span> <span class="kw3">filesize</span><span class="br0">&#40;</span><span class="re0">$upcomingTweetsFile</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="re0">$splitContents</span> <span class="sy0">=</span> <span class="kw3">preg_split</span><span class="br0">&#40;</span><span class="st_h">'/\n/'</span><span class="sy0">,</span> <span class="re0">$contents</span><span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="co1">// ARCHIVE OLD POSTS:</span>
        <span class="re0">$archive</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="re0">$archivedTweetsFile</span><span class="sy0">,</span> <span class="st0">&quot;a&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$archive</span><span class="sy0">,</span> <span class="re0">$splitContents</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="co1">// Remove top line from upcoming:</span>
        <span class="re0">$upcomingTweets_W</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="re0">$upcomingTweetsFile</span><span class="sy0">,</span> <span class="st0">&quot;w&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$upcomingTweets_W</span><span class="sy0">,</span> <span class="re0">$splitContents</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="co1">// Clean up</span>
        <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$upcomingTweets_W</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$upcomingTweets_R</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$archive</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">return</span> <span class="re0">$splitContents</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw2">public</span> <span class="re0">$files</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'upcoming'</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span> <span class="st_h">'archive'</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$username</span><span class="sy0">,</span> <span class="re0">$password</span><span class="sy0">,</span> <span class="re0">$filename</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">curlHandle</span> <span class="sy0">=</span> curl_init<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">files</span><span class="br0">&#91;</span><span class="st_h">'upcoming'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$filename</span><span class="sy0">;</span>
        <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">files</span><span class="br0">&#91;</span><span class="st_h">'archive'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">'ARCHIVE_'</span> <span class="sy0">.</span> <span class="re0">$filename</span><span class="sy0">;</span>
&nbsp;
        <span class="co1">// Shortcut:</span>
        <span class="re0">$ch</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">curlHandle</span><span class="sy0">;</span>
&nbsp;
        curl_setopt<span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_URL<span class="sy0">,</span> <span class="st0">&quot;http://twitter.com/statuses/update.xml&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        curl_setopt<span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_CONNECTTIMEOUT<span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span>
        curl_setopt<span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_RETURNTRANSFER<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
        curl_setopt<span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_POST<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
        curl_setopt<span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_USERPWD<span class="sy0">,</span> <span class="st0">&quot;<span class="es4">$username</span>:<span class="es4">$password</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw2">public</span> <span class="kw2">function</span> __destruct<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        curl_close<span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">curlHandle</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw2">public</span> <span class="kw2">function</span> updateStatus<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="re0">$status</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getNewStatus</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        curl_setopt<span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">curlHandle</span><span class="sy0">,</span> CURLOPT_POSTFIELDS<span class="sy0">,</span> <span class="st0">&quot;status=<span class="es4">$status</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="re0">$result</span> <span class="sy0">=</span> curl_exec<span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">curlHandle</span><span class="br0">&#41;</span><span class="sy0">;</span>	
	<span class="re0">$resultArray</span> <span class="sy0">=</span> curl_getinfo<span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">curlHandle</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$resultArray</span><span class="br0">&#91;</span><span class="st_h">'http_code'</span><span class="br0">&#93;</span> <span class="sy0">==</span> <span class="nu0">200</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
&nbsp;
    <span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// ==================</span>
<span class="co1">// ===== USAGE ======</span>
<span class="co1">// ==================</span>
&nbsp;
<span class="re0">$tweet</span> <span class="sy0">=</span> <span class="kw2">new</span> tweetFromFile<span class="br0">&#40;</span><span class="st_h">'twitterUsername'</span><span class="sy0">,</span> <span class="st_h">'password'</span><span class="sy0">,</span> <span class="st_h">'textfile.txt'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$success</span> <span class="sy0">=</span> <span class="re0">$tweet</span><span class="sy0">-&gt;</span><span class="me1">updateStatus</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$success</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw3">echo</span> <span class="st_h">'Twitter updated!'</span><span class="sy0">;</span>
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
    <span class="kw3">echo</span> <span class="st_h">'Hmm, an error...'</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>




<p>The class will retrieve each new update from the specified text file. Each update needs to be on a new line; an example text file:</p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Blah blah blah, this is the first update...
And another update!
Third and last update!!! ARGH!</pre></div></div>




<p>The PHP class will remove each update from this file when it&#8217;s added to Twitter so all you need to do is keep adding to the bottom of the file&#8230;</p>

<p>This won&#8217;t do the dripping automatically. You&#8217;ll need to setup a &#8216;cron job&#8217; to request the script at selected intervals (e.g. every two hours). I&#8217;m rubbish at Apache and anything to do with the command line so I haven&#8217;t quite accomplished this part yet&#8230; maybe someone else wants to give it a go? <img src='http://james.padolsey.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/twitter/tweetfromfile-php-class/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Getting the real time in JavaScript</title>
		<link>http://james.padolsey.com/uncategorized/getting-the-real-time-in-javascript/</link>
		<comments>http://james.padolsey.com/uncategorized/getting-the-real-time-in-javascript/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 00:03:51 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Mootools]]></category>
		<category><![CDATA[Time]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=477</guid>
		<description><![CDATA[Getting the time in JavaScript is pretty simple. Using the <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Date">Date</a> constructor will give us the time as set on the user's computer, but what if we want the accurate time, or the time in a different timezone?]]></description>
			<content:encoded><![CDATA[<p>Getting the time in JavaScript is pretty simple. Using the <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Date">Date</a> constructor will give us the time as set on the user&#8217;s computer, but what if we want the accurate time, or the time in a different timezone?</p>

<p>Even with <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Date/getTimezoneOffset"><code>getTimezoneOffset()</code></a> you&#8217;re still relying on the client!</p>

<p>It turns out that the only way of getting a complete and accurate time from any timezone requires a little bit of server interaction. Luckily there are a few APIs out there that offer this service (actually, there&#8217;s only one; well I couldn&#8217;t find any others)! </p>

<p>Here we&#8217;re using the <a href="http://simonwillison.net/2008/Jun/21/jsontime/">&#8216;json-time&#8217; API developed by Simon Willson</a>:</p>


<h2>JSON-time</h2>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="kw2">function</span> getTime<span class="br0">&#40;</span>zone<span class="sy0">,</span> success<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw2">var</span> url <span class="sy0">=</span> <span class="st0">'http://json-time.appspot.com/time.json?tz='</span> <span class="sy0">+</span> zone<span class="sy0">,</span>
        ud <span class="sy0">=</span> <span class="st0">'json'</span> <span class="sy0">+</span> <span class="br0">&#40;</span><span class="sy0">+</span><span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    window<span class="br0">&#91;</span>ud<span class="br0">&#93;</span><span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span><span class="br0">&#123;</span>
        success <span class="sy0">&amp;&amp;</span> success<span class="br0">&#40;</span><span class="kw2">new</span> Date<span class="br0">&#40;</span>o.<span class="me1">datetime</span><span class="br0">&#41;</span><span class="sy0">,</span> o<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span><span class="sy0">;</span>
    document.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">'head'</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">appendChild</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
        <span class="kw2">var</span> s <span class="sy0">=</span> document.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'script'</span><span class="br0">&#41;</span><span class="sy0">;</span>
        s.<span class="me1">type</span> <span class="sy0">=</span> <span class="st0">'text/javascript'</span><span class="sy0">;</span>
        s.<span class="me1">src</span> <span class="sy0">=</span> url <span class="sy0">+</span> <span class="st0">'&amp;callback='</span> <span class="sy0">+</span> ud<span class="sy0">;</span>
        <span class="kw1">return</span> s<span class="sy0">;</span>
    <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>




<h2>Usage</h2>

<p>The first parameter of the callback function is the time (having been passed through the Date constructor), so you can use <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Date#Methods_2">Date methods</a> such as <code>getSeconds()</code> etc. The second parameter is the entire object returned from the JSON request.</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="co1">// Alert GMT:</span>
getTime<span class="br0">&#40;</span><span class="st0">'GMT'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>time<span class="br0">&#41;</span><span class="br0">&#123;</span>
    <span class="kw3">alert</span><span class="br0">&#40;</span>time<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Get London time, and format it:</span>
getTime<span class="br0">&#40;</span><span class="st0">'Europe/London'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>time<span class="br0">&#41;</span><span class="br0">&#123;</span>
    <span class="kw2">var</span> formatted <span class="sy0">=</span> time.<span class="me1">getHours</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">':'</span> 
                  <span class="sy0">+</span> time.<span class="me1">getMinutes</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">':'</span>
                  <span class="sy0">+</span> time.<span class="me1">getSeconds</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw3">alert</span><span class="br0">&#40;</span> <span class="st0">'The time in London is '</span> <span class="sy0">+</span> formatted <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p>For reference, here&#8217;s <a href="http://json-time.appspot.com/timezones.json">a list of all the available timezones</a> (to use one, remove the backslash).</p>

<h2>jQuery version</h2>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$.<span class="me1">getTime</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>zone<span class="sy0">,</span> success<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw2">var</span> url <span class="sy0">=</span> <span class="st0">'http://json-time.appspot.com/time.json?tz='</span>
            <span class="sy0">+</span> zone <span class="sy0">+</span> <span class="st0">'&amp;callback=?'</span><span class="sy0">;</span>
    $.<span class="me1">getJSON</span><span class="br0">&#40;</span>url<span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span><span class="br0">&#123;</span>
        success <span class="sy0">&amp;&amp;</span> success<span class="br0">&#40;</span><span class="kw2">new</span> Date<span class="br0">&#40;</span>o.<span class="me1">datetime</span><span class="br0">&#41;</span><span class="sy0">,</span> o<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Usage:</span>
$.<span class="me1">getTime</span><span class="br0">&#40;</span><span class="st0">'GMT'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>time<span class="br0">&#41;</span><span class="br0">&#123;</span>
    <span class="kw3">alert</span><span class="br0">&#40;</span>time<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<h2>MooTools version</h2>

<p>You&#8217;ll need to download the <a href="http://www.clientcide.com/docs/Request/JsonP">JsonP class</a>.</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="kw2">function</span> getTime<span class="br0">&#40;</span>zone<span class="sy0">,</span> success<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw2">var</span> url <span class="sy0">=</span> <span class="st0">'http://json-time.appspot.com/time.json'</span><span class="sy0">;</span>
    <span class="kw2">new</span> JsonP<span class="br0">&#40;</span>url<span class="sy0">,</span> <span class="br0">&#123;</span>
        data<span class="sy0">:</span> <span class="br0">&#123;</span> tz<span class="sy0">:</span> zone <span class="br0">&#125;</span><span class="sy0">,</span>
        onComplete<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span><span class="br0">&#123;</span>
            success <span class="sy0">&amp;&amp;</span> success<span class="br0">&#40;</span><span class="kw2">new</span> Date<span class="br0">&#40;</span>o.<span class="me1">datetime</span><span class="br0">&#41;</span><span class="sy0">,</span> o<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">request</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// Usage:</span>
getTime<span class="br0">&#40;</span><span class="st0">'GMT'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>time<span class="br0">&#41;</span><span class="br0">&#123;</span>
    <span class="kw3">alert</span><span class="br0">&#40;</span>time<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>




<p>Thank you <a href="http://simonwillison.net/">Simon Willison</a> for making this API; seriously, I searched around the entire internets just for one damn API and I almost lost hope!</p>]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/uncategorized/getting-the-real-time-in-javascript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Preloading images from a directory</title>
		<link>http://james.padolsey.com/javascript/preloading-images-from-a-directory/</link>
		<comments>http://james.padolsey.com/javascript/preloading-images-from-a-directory/#comments</comments>
		<pubDate>Wed, 07 Jan 2009 00:23:42 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Images]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[Preloading]]></category>

		<guid isPermaLink="false">http://james.padolsey.com/?p=374</guid>
		<description><![CDATA[Here's a very handy script which will scan through a directory of images, form an array of the contents of that directory and then return the array in JSON format to the client-side where the images will be preloaded into the user's cache. (Basically, it's a fancy preloader)]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a very handy script which will scan through a directory of images, form an array of the contents of that directory and then return the array in JSON format to the client-side where the images will be preloaded into the user&#8217;s cache.</p>

<p>There are two components to this: the PHP script and some simple JavaScript:</p>

<span id="more-374"></span>

<h2>The Code (PHP):</h2>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span class="coMULTI">/* PHP file, e.g. scanImageDirectory.json.php */</span>
&nbsp;
<span class="co1">// Check that a callback function has been specified:</span>
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'callback'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'directory'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw3">exit</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Use PHP5's scandir function to scan all</span>
<span class="co1">// of images directory:</span>
<span class="re0">$dirContents</span> <span class="sy0">=</span> scandir<span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'directory'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Define function to confirm each</span>
<span class="co1">// filename is a valid image name/extension:</span>
<span class="kw2">function</span> isImageFile<span class="br0">&#40;</span><span class="re0">$src</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw1">return</span> <span class="kw3">preg_match</span><span class="br0">&#40;</span><span class="st_h">'/^.+\.(gif|png|jpe?g|bmp|tif)$/i'</span><span class="sy0">,</span> <span class="re0">$src</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// Loop through directory files and add to</span>
<span class="co1">// $arrayContents on each iteration:</span>
<span class="re0">$arrayContents</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$dirContents</span> <span class="kw1">as</span> <span class="re0">$image</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw1">if</span> <span class="br0">&#40;</span>isImageFile<span class="br0">&#40;</span><span class="re0">$image</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="re0">$arrayContents</span> <span class="sy0">.=</span> <span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$arrayContents</span><span class="br0">&#41;</span> ? <span class="st_h">','</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="sy0">;</span>
        <span class="re0">$arrayContents</span> <span class="sy0">.=</span> <span class="st_h">'&quot;'</span> <span class="sy0">.</span> <span class="st_h">'images/'</span> <span class="sy0">.</span> <span class="re0">$image</span> <span class="sy0">.</span> <span class="st_h">'&quot;'</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// Prepate JSON(P) output</span>
<span class="re0">$output</span> <span class="sy0">=</span> <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'callback'</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="st_h">'({\'</span>images\<span class="st_h">':['</span> <span class="sy0">.</span> <span class="re0">$arrayContents</span> <span class="sy0">.</span> <span class="st_h">']});'</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Output the output:</span>
<span class="kw3">echo</span> <span class="re0">$output</span><span class="sy0">;</span></pre></div></div>




<p>The above PHP script will use PHP5&#8217;s <code><a href="http://uk3.php.net/scandir">scandir</a></code> to scan the &#8216;images&#8217; directory and it outputs a list of all images in JSON format. (so it can be used by our JavaScript). The JavaScript is below:</p>


<h2>The Code (JavaScript):</h2>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="coMULTI">/* JavaScript Component */</span>
&nbsp;
<span class="kw2">function</span> preloadImagesFromDirectory<span class="br0">&#40;</span>dir<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
    <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span>dir<span class="br0">&#41;</span> <span class="kw1">return</span><span class="sy0">;</span>
&nbsp;
    <span class="kw2">function</span> getJSON<span class="br0">&#40;</span>URL<span class="sy0">,</span>success<span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
        <span class="co1">// Create new function (within global namespace)</span>
        <span class="co1">// (With unique name):</span>
        <span class="kw2">var</span> uniqueID <span class="sy0">=</span> <span class="st0">'json'</span><span class="sy0">+</span><span class="br0">&#40;</span><span class="sy0">+</span><span class="br0">&#40;</span><span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            window<span class="br0">&#91;</span>uniqueID<span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><span class="br0">&#123;</span>
                success <span class="sy0">&amp;&amp;</span> success<span class="br0">&#40;</span>data<span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
        <span class="co1">// Append new SCRIPT element to DOM:</span>
        document.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">'body'</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">appendChild</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
            <span class="kw2">var</span> script <span class="sy0">=</span> document.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'script'</span><span class="br0">&#41;</span><span class="sy0">;</span>
            script.<span class="me1">type</span> <span class="sy0">=</span> <span class="st0">'text/javascript'</span><span class="sy0">;</span>
            script.<span class="me1">src</span> <span class="sy0">=</span> URL.<span class="me1">replace</span><span class="br0">&#40;</span><span class="st0">'callback=?'</span><span class="sy0">,</span><span class="st0">'callback='</span> <span class="sy0">+</span> uniqueID<span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw1">return</span> script<span class="sy0">;</span>
        <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw2">function</span> preload<span class="br0">&#40;</span>srcArray<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw2">var</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> srcArray.<span class="me1">length</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="br0">&#40;</span><span class="kw2">new</span> Image<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">src</span> <span class="sy0">=</span> srcArray<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co1">// Get that JSON data:</span>
    getJSON<span class="br0">&#40;</span><span class="st0">'scanImageDirectory.php?directory='</span> <span class="sy0">+</span> encodeURIComponent<span class="br0">&#40;</span>dir<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'&amp;callback=?'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><span class="br0">&#123;</span>
        <span class="kw1">return</span> data.<span class="me1">images</span> <span class="sy0">?</span> preload<span class="br0">&#40;</span> data.<span class="me1">images</span> <span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw2">false</span><span class="sy0">;</span>
    <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span></pre></div></div>




<p>The above JavaScript uses JSONP to load the PHP file into a SCRIPT element as if it were a JavaScript file itself, then the automatically generated function is fired which then executes the specified callback (&#8217;success&#8217;) function which is specified when calling <code>getJSON</code>. The callback then preloads the passed data (i.e. the array of images).</p>

<h2>Usage:</h2>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span class="co1">// We don't want to disturb anything so we'll wait</span>
<span class="co1">// until everything's done loading before preloading:</span>
window.<span class="kw3">onload</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
    preloadImagesFromDirectory<span class="br0">&#40;</span><span class="st0">'images/'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>




<h2>Security concerns:</h2>

<p>Since the directory to be scanned is specified in a query string it would be VERY easy for ANYONE to gain information on your file structure/nomenclature. The regular expression used to validate the image names on the server-side (the PHP script) will stop any files from being listed that do not end in gif, png, jpg, jpeg, bmp or tif. If you&#8217;re still concerned then simply specify the directory to be scanned from within the PHP script instead of having it passed through the query string.</p>]]></content:encoded>
			<wfw:commentRss>http://james.padolsey.com/javascript/preloading-images-from-a-directory/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
