<?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; javascript</title>
	<atom:link href="http://www.randys.org/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.randys.org</link>
	<description>wasting your precious bandwidth since 1998</description>
	<lastBuildDate>Wed, 16 Nov 2011 23:40:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</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/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=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 &#8230; <a href="http://www.randys.org/2009/05/14/prototype-its-not-just-a-javascript-library/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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>
<p><script src="http://static.randys.org/js/prototype-date.js" type="text/javascript"></script></p>
<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>
<div style=" text-align: center;  margin: 8px; ">
				<script type="text/javascript">
				google_ad_client = "pub-6476605957445525";
				google_ad_width = 468;
				google_ad_height = 60;
				google_ad_format = "468x60_as";
				google_ad_type = "text_image";
				google_ad_channel = "8409641020";
				google_color_border = "#C7C7C7";
				google_color_bg = "#FFFFFF";
				google_color_link = "#777777";
				google_color_text = "#777777";
				google_color_url = "#3333CC";
				google_ui_features = "rc:0";
				</script>
				<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
			</div><!-- PHP 5.x -->]]></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/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=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 &#8230; <a href="http://www.randys.org/2007/01/24/scrobble-this-last-fm-recent-tracks-ajax-style/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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>
<pre><code>function lastfm()
{
    new Ajax.Request('/as/recenttracks.xml',
    {
        method: 'get',
        onLoading: function() {

        },
        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>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>
<pre><code>class lastfm
{
    private $user;
    private $reports;
    private $basews;
    public $saveto;

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

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

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

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

    private function createDir($path)
    {
        if (!is_dir($path))
        {
            $res = `mkdir -p $path`;
        }
    }
}
</code></pre>
<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>
<!-- PHP 5.x -->]]></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>

