<?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>randys.org &#187; prototype</title>
	<atom:link href="http://www.randys.org/tag/prototype/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.randys.org</link>
	<description>Wasting your precious bandwidth since 1999</description>
	<lastBuildDate>Thu, 03 Jun 2010 02:43:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Prototype: It&#8217;s Not Just a JavaScript Library</title>
		<link>http://www.randys.org/2009/05/14/prototype-its-not-just-a-javascript-library/</link>
		<comments>http://www.randys.org/2009/05/14/prototype-its-not-just-a-javascript-library/#comments</comments>
		<pubDate>Fri, 15 May 2009 05:08:25 +0000</pubDate>
		<dc:creator>randy</dc:creator>
				<category><![CDATA[Code Chunks]]></category>
		<category><![CDATA[General Nerdery]]></category>
		<category><![CDATA[Home]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.randys.org/2009/05/14/prototype-its-not-just-a-javascript-library/</guid>
		<description><![CDATA[Used to be that writing front-end code (HTML, CSS, JavaScript) wasn&#8217;t terribly complex. The syntax of HTML and CSS isn&#8217;t all that difficult to get the hang of and JavaScript (back in the day) was just a tool to validate form fields and play funny tricks on poor unsuspecting visitors. These days, JavaScript has become [...]]]></description>
			<content:encoded><![CDATA[<p>Used to be that writing front-end code (HTML, CSS, JavaScript) wasn&#8217;t terribly complex. The syntax of HTML and CSS isn&#8217;t all that difficult to get the hang of and JavaScript (back in the day) was just a tool to validate form fields and play funny tricks on poor unsuspecting visitors. These days, JavaScript has become <em>the</em> language for front-end development and it&#8217;s not just for printing the &#8216;lastModifiedDate&#8217; of a document.</p>

<script src="http://static.randys.org/js/prototype-date.js" type="text/javascript"></script>

<p>Anyone who has kept up with the advancements of JavaScript knows the <a href="http://www.prototypejs.org/">Prototype</a> library. For those who don&#8217;t know, it&#8217;s a JavaScript library that wraps a whole bunch of functionality into easy to use (and remember) &#8220;shortcuts&#8221; for doing things like getting elements on a page, manipulating said elements, and dealing with data. It&#8217;s all written in <a href="http://www.json.org/">JSON</a> notation and allows you do things like:</p>

<pre><code>$('element-id').addClassName('active').show();
</code></pre>

<p>Instead of</p>

<pre><code>var element = document.getElementById('element-id');
    element.className = 'active';
    element.style.display = 'block';
</code></pre>

<p>Anyway, things like Prototype, <a href="http://jquery.com/">jQuery</a>, <a href="http://www.dojotoolkit.org/">Dojo</a>, and <a href="http://developer.yahoo.com/yui/">YUI</a> all provide some convenience to writing custom JavaScript applications. I haven&#8217;t dug super deep into any of the frameworks&#8217; source (mostly because the code has been somewhat obfuscated and &#8220;compressed&#8221; to save space), but I imagine that they all have one thing in common; they make use of the <a href="http://phrogz.net/JS/Classes/ExtendingJavaScriptObjectsAndClasses.html#prototype">prototype</a> property to extend both existing and custom built objects/classes in JavaScript.</p>

<h3>The prototype Property</h3>

<p>Even if you don&#8217;t make heavy use of one of the afforementioned framework/toolkits, using the <em>prototype</em> property to extend existing JavaScript objects and/or classes can be quite useful. Say you want an easy way to print out a date. Rather than createing a separate function, just extend the <code>Date</code> object itself.</p>

<pre><code>Date.prototype.months = new Array(
    {name: "January",   abbrev: "Jan", number: "01"},
    {name: "February",  abbrev: "Feb", number: "02"},
    {name: "March",     abbrev: "Mar", number: "03"},
    {name: "April",     abbrev: "Apr", number: "04"},
    {name: "May",       abbrev: "May", number: "05"},
    {name: "June",      abbrev: "Jun", number: "06"},
    {name: "July",      abbrev: "Jul", number: "07"},
    {name: "August",    abbrev: "Aug", number: "08"},
    {name: "September", abbrev: "Sep", number: "09"},
    {name: "October",   abbrev: "Oct", number: "10"},
    {name: "November",  abbrev: "Nov", number: "11"},
    {name: "December",  abbrev: "Dec", number: "12"}
);
Date.prototype.dow = new Array(
    {name: 'Sunday',    abbrev: 'Sun', number: "01"},
    {name: 'Monday',    abbrev: 'Mon', number: "02"},
    {name: 'Tuesday',   abbrev: 'Tue', number: "03"},
    {name: 'Wednesday', abbrev: 'Wed', number: "04"},
    {name: 'Thursday',  abbrev: 'Thu', number: "05"},
    {name: 'Friday',    abbrev: 'Fri', number: "06"},
    {name: 'Saturday',  abbrev: 'Sat', number: "07"}
);
Date.prototype.getShortDate = function() {
    return this.months[this.getMonth()].abbrev + ' ' + this.getDate() + ' ' + this.getFullYear();
};
Date.prototype.getLongDate = function() {
    return this.dow[this.getDay()].name + ', ' + this.months[this.getMonth()].name + ' ' + this.getDate() + ', ' + this.getFullYear();
};
Date.prototype.getValueDate = function() {
    var d = (this.getDate() &lt; 10) ? '0'+this.getDate():this.getDate();
    return this.getFullYear() + '/' + this.months[this.getMonth()].number + '/' + d;
};

var now = new Date();
document.write(now.getLongDate());
</code></pre>

<p>And you get something like this <script type="text/javascript">var now = new Date();document.write(now.getLongDate());</script>. Handy.</p>

<p>Now, there&#8217;s a couple of issues with the above script. One, the names aren&#8217;t localized and two, there&#8217;s probalby a more efficient way to formatting a date (much like the example on <a href="http://phrogz.net/JS/Classes/ExtendingJavaScriptObjectsAndClasses.html#example2">this page</a>). But, it works in all the browsers I tested (Chrome, Firefox, IE7, Safari [Mac]).</p>

<p>You can prototype most of the default objects in JavaScript. Say you have an application the has to validate a bunch of text fields. Prototype the <code>String</code> objects to add built in parsing methods for various fields.</p>

<pre><code>String.prototype.isValidEmail = function() { ... }
String.prototype.isValidPhone = function() { ... }
</code></pre>

<p>You get the idea.</p>

<p>The <code>prototype</code> property is a handy little tool. There maybe some limitations between browsers, but overall, it should help simplify your code and prevent repetitive and reduntant methods.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.randys.org/2009/05/14/prototype-its-not-just-a-javascript-library/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Scrobble This: last.fm recent tracks AJAX style</title>
		<link>http://www.randys.org/2007/01/24/scrobble-this-last-fm-recent-tracks-ajax-style/</link>
		<comments>http://www.randys.org/2007/01/24/scrobble-this-last-fm-recent-tracks-ajax-style/#comments</comments>
		<pubDate>Wed, 24 Jan 2007 19:40:00 +0000</pubDate>
		<dc:creator>randy</dc:creator>
				<category><![CDATA[Code Chunks]]></category>
		<category><![CDATA[General Nerdery]]></category>
		<category><![CDATA[Home]]></category>
		<category><![CDATA[How-To]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[last.fm]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.randys.org//2007/01/24/scrobble-this-last-fm-recent-tracks-ajax-style</guid>
		<description><![CDATA[So, I&#8217;ve been reading up a bit on prototype.js and its Ajax helpers. It&#8217;s an amazing tool and helped me write the bit of info at the top of the page. It&#8217;s pretty basic, but here&#8217;s the code that does most of the work: function lastfm() { new Ajax.Request('/as/recenttracks.xml', { method: 'get', onLoading: function() { [...]]]></description>
			<content:encoded><![CDATA[<p>So, I&#8217;ve been reading up a bit on <a href="http://prototypejs.org/">prototype.js</a> and its <a href="http://prototypejs.org/learn/introduction-to-ajax">Ajax</a> helpers. It&#8217;s an amazing tool and helped me write the bit of info at the top of the page. It&#8217;s pretty basic, but here&#8217;s the code that does most of the work:</p>

<p><pre><code>function lastfm()
{
    new Ajax.Request('/as/recenttracks.xml',
    {
        method: 'get',
        onLoading: function() {</p>

<pre><code>    },
    onLoaded: function(transport) {
        if (transport.overrideMimeType) {
            transport.overrideMimeType('application/xml');
        }
    },
    onSuccess: function(transport) {
        var response = transport.responseXML.documentElement;
        updateLastfm(response);
    },
    onFailure: failedLastfm()
});
</code></pre>

<p>}
</code></pre></p>

<p>The only issue I ran into was that I was originally using the RSS flavor of recent tracks, however it didn&#8217;t split up the artist and track information. It displays it as <code>&lt;title&gt;[artist] – [track]&lt;/title&gt;</code>. That en-dash in the middle was preventing me from using <code>title.split()</code> on the JavaScript side of things. Really weird.</p>

<p>Also, since I&#8217;m a complete newbie with <a href="http://www.ruby-lang.org/">Ruby</a>, I couldn&#8217;t figure out how (read: didn&#8217;t take the time to learn) to grab the content from a remote server and serve it up to the JavaScript. I&#8217;m sure it&#8217;s pretty simple&#8230; but I was at work and in a hurry. So, being that I know <a href="http://www.php.net/">PHP</a>, I just created a script to download the file and save it to the local disk and setup a cronjob.</p>

<p>Here&#8217;s the PHP script:</p>

<p><pre><code>class lastfm
{
    private $user;
    private $reports;
    private $basews;
    public $saveto;</p>

<pre><code>function __construct($user)
{
    $this-&amp;gt;user = $user;
    $this-&amp;gt;basews = 'http://ws.audioscrobbler.com/1.0/user/';
    $this-&amp;gt;reports = array(
        'recenttracks.xml',
        'weeklyartistchart.xml',
        'weeklytrackchart.xml',
        'topartists.xml'
    );
    $this-&amp;gt;saveto = '.';
}

public function go()
{
    for ($i = 0; $i &amp;lt; count($this-&amp;gt;reports); $i++)
    {
        try
        {
            $opts = array('http' =&amp;gt; array('method' =&amp;gt; 'GET', 'header' =&amp;gt; 'Content-type: text/plain; charset=utf-8'));
            $context = stream_context_create($opts);

            $fp = fopen($this-&amp;gt;saveto.DIRECTORY_SEPARATOR.$this-&amp;gt;reports[$i], 'w+');
            $stream = fopen($this-&amp;gt;basews.$this-&amp;gt;user.'/'.$this-&amp;gt;reports[$i], 'r', false, $context);
            $string = stream_get_contents($stream);
            fwrite($fp, $string);
            fclose($fp);
            fclose($stream);
            echo 'Saved ' . $this-&amp;gt;saveto.DIRECTORY_SEPARATOR.$this-&amp;gt;reports[$i] . "\n";
        }
        catch (Exception $e)
        {
            echo $e-&amp;gt;getMessage() . "\n";
        }
    }
}

public function setSaveto($path)
{
    if (is_dir($path))
    {
        if (ereg('\/$', $path))
        {
            $path = ereg_replace('\/$', '', $path);
        }
        $this-&amp;gt;saveto = $path;
    }
    else
    {
        $this-&amp;gt;createDir($path);
        $this-&amp;gt;setSaveto($path);
    }
}

private function createDir($path)
{
    if (!is_dir($path))
    {
        $res = `mkdir -p $path`;
    }
}
</code></pre>

<p>}
</code></pre></p>

<p>I&#8217;ll hit up the <a href="http://api.rubyonrails.org/">Rails API Docs</a> one of these days and write a simple Ruby script that does all the work of the PHP script. Even better would be to process the XML document using ruby that just returns a string of HTML and use <code>Ajax.PeriodicalUpdater($(e), ...)</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.randys.org/2007/01/24/scrobble-this-last-fm-recent-tracks-ajax-style/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
