<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Nettuts+</title>
	
	<link>http://net.tutsplus.com</link>
	<description>Web Development &amp; Design Tutorials</description>
	<lastBuildDate>Sat, 14 Nov 2009 00:20:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<image><link>http://nettuts.com</link><url>http://envato.s3.amazonaws.com/rss_images/nettuts.jpg</url><title>NETTUTS</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/nettuts" type="application/rss+xml" /><feedburner:emailServiceId>nettuts</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Review of jQuery Enlightenment – and Free Copies!</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/p4ZD9_XnMyw/</link>
		<comments>http://net.tutsplus.com/articles/reviews/review-of-jquery-enlightenment-and-free-copies/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 00:14:56 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[book review]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jquery enlightenment]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=7620</guid>
		<description><![CDATA[<img src="http://nettuts.s3.amazonaws.com/488_enlighten/200x200.png" alt="Review of jQuery Enlightenment" />]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://jqueryenlightenment.com/">jQuery Enlightenment</a>, by Cody Lindley, is a breath of fresh air when it comes to e-books. It&#8217;s written by a jQuery team member, each code snippet includes a link to <a href="http://jsbin.com/">JSBin</a> for live previewing, and &#8211; most importantly &#8211; there&#8217;s no fluff. Ultimately, this means that you&#8217;ll learn faster, and more thoroughly.
</p>
<p><span id="more-7620"></span></p>
<div class="tutorial_image">
   <img src="http://nettuts.s3.amazonaws.com/488_enlighten/bookcover.png" alt="jQuery Enlightenment" />
</div>
<p>
To prove how much I enjoyed reading this book: I received my review copy on a Wednesday, and finished it the next day. As I&#8217;m sure many of you are aware, tech books and front to back reads very rarely go well together. This is a testament to the &#8220;no fluff&#8221; aspect I referenced earlier. Over the course of a dozen chapters, Cody will teach you everything you need to know.
</p>
<h3>At a Glance</h3>
<ul>
<li> Chapter 1 &#8211; Core jQuery
</li>
<li> Chapter 2 &#8211; Selecting
</li>
<li> Chapter 3 &#8211; Traversing
</li>
<li> Chapter 4 &#8211; Manipulation
</li>
<li> Chapter 5 &#8211; HTML Forms
</li>
<li> Chapter 6 &#8211; Events
</li>
<li> Chapter 7 &#8211; jQuery and the web browser
</li>
<li> Chapter 8 &#8211; Plugins
</li>
<li> Chapter 9 &#8211; Performance best practices
</li>
<li> Chapter 10 &#8211; Effects
</li>
<li> Chapter 11- AJAX
</li>
<li> Chaper 12 &#8211; Miscellaneous concepts </li>
</ul>
<h3>Who this Book is for?</h3>
<p>
While most books on jQuery are primarily focused on introducing the library to new users, jQuery Enlightenment instead assumes you&#8217;re at an intermediate level hoping to <strong>learn the more advanced tips and techniques</strong>. As such, I especially enjoyed the read more than I would have if it was just another crash course style book. Assuming that you&#8217;re a regular Nettuts+ reader, it&#8217;s more than probable that you have at least a basic understand of jQuery. If so, it&#8217;s time to take your skills to the next level; <a href="http://jqueryenlightenment.com/">jQuery Enlightenment</a> will take you there.
</p>
<p><strong>Though perhaps the most convincing reason to check out Cody&#8217;s new book is because he&#8217;s an official member of the jQuery team. </strong></p>
<h3>JSBin Snippets</h3>
<div class="tutorial_image">
<a href="http://jqueryenlightenment.com/"><br />
   <img src="http://nettuts.s3.amazonaws.com/488_enlighten/insidebook.png" alt="Sample" style="width: 600px;" /><br />
</a>
</div>
<p>
Throughout the book, Cody supplies every single code snippet with a respective live preview from <a href="http://jsbin.com/">JSBin</a>. This may not sound like much; however, it&#8217;s incredibly helpful when you can simply click on a link, and immediately be transported to a page which allows you to &#8220;toy&#8221; with the code. I can&#8217;t tell you how vital this is &#8211; and, frankly, it&#8217;s shocking that more web development e-books haven&#8217;t taken advantage of this yet.
</p>
<h3>About the Author</h3>
<p><strong>Cody Lindley</strong> is a Christian, husband, son, father, brother, outdoor enthusiast, and <a href="http://codylindley.com/" id="azjf" title="client-side engineer">client-side engineer</a>. Since 1997 he has been passionate about HTML, CSS, <a href="http://javascriptant.com/" id="v2yj" title="JavaScript">JavaScript</a>, Flash, Interaction Design, Interface Design, and HCI. He is most well known in the jQuery community for the creation of <a href="http://jquery.com/demo/thickbox/" id="mk9p" title="Thickbox">Thickbox</a>, a modal/dialog solution. In 2008 he officially joined the jQuery team as an evangelist. His current focus has been on client-side optimization techniques as well as speaking and <a href="http://oreilly.com/catalog/9780596159771/" id="apmx" title="writing about jQuery">writing about jQuery</a>. As of late he is employeed by <a href="http://www.ning.com">Ning.com</a></p>
<h3>Free Copies!</h3>
<p>
Cody has been generous enough to offer a handful of copies to our readers! To enter, simply leave a comment, and check back on Monday (Tuesday for some of you) to see if you&#8217;re a winner! Otherwise, if you&#8217;d like to purchase the ebook and immediately read it, you can <a href="http://jqueryenlightenment.com/">buy it here.</a>
</p>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>

<p><a href="http://feedads.g.doubleclick.net/~a/bB3eZ-WZ3dXRD6oV0Q7yq7yDJN4/0/da"><img src="http://feedads.g.doubleclick.net/~a/bB3eZ-WZ3dXRD6oV0Q7yq7yDJN4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/bB3eZ-WZ3dXRD6oV0Q7yq7yDJN4/1/da"><img src="http://feedads.g.doubleclick.net/~a/bB3eZ-WZ3dXRD6oV0Q7yq7yDJN4/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/nettuts?a=p4ZD9_XnMyw:8BvrLktep14:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=p4ZD9_XnMyw:8BvrLktep14:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/nettuts?i=p4ZD9_XnMyw:8BvrLktep14:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=p4ZD9_XnMyw:8BvrLktep14:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/nettuts?i=p4ZD9_XnMyw:8BvrLktep14:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=p4ZD9_XnMyw:8BvrLktep14:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/nettuts?i=p4ZD9_XnMyw:8BvrLktep14:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=p4ZD9_XnMyw:8BvrLktep14:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/nettuts/~4/p4ZD9_XnMyw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/articles/reviews/review-of-jquery-enlightenment-and-free-copies/feed/</wfw:commentRss>
		<slash:comments>875</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/articles/reviews/review-of-jquery-enlightenment-and-free-copies/</feedburner:origLink></item>
		<item>
		<title>Easy Website Updates with PageLime</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/zIaNI5xyE7k/</link>
		<comments>http://net.tutsplus.com/videos/screencasts/easy-editing-for-your-clients-with-pagelime/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 02:10:53 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[Screencasts]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[pagelime]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[themeforest]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=7691</guid>
		<description><![CDATA[<img src="http://nettuts.s3.amazonaws.com/492_pagelime/200x200.jpg" alt="Easy Editing for your Clients with PageLime" />]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://www.pagelime.com">PageLime</a> makes the process of editing static websites laughably easy. There are times when a full CMS like WordPress is far too complicated when only simple edits are required &#8211; not to mention the fact that a static template must first be modified accordingly to work with WordPress. Wouldn&#8217;t it be easier if your current static website could instantly be integrated with a service, without requiring hours of conversion time? This is where PageLime comes in.
</p>
<p>In today&#8217;s <strong>video tutorial</strong>, we&#8217;ll go through the process of purchasing a site template on <a href="http://themeforest.net">ThemeForest</a>, and then integrating that specific template with PageLime, resulting in a website which is super easy to update&#8230;even for your mom.</p>
<p><span id="more-7691"></span></p>
<div class="tutorial_image">
<a href="http://www.pagelime.com"><br />
   <img src="http://nettuts.s3.amazonaws.com/492_pagelime/pagelime-site.jpg" alt="PageLime" /><br />
</a>
</div>
<blockquote>
<p>
<a href="http://www.pagelime.com">PageLime</a> is a remote Content Management System that allows you to update the content, images, and documents on your web site without installing any software.
</p>
</blockquote>
<h3>The Screencast</h3>
<div class="tutorial_image">
<embed src="http://blip.tv/play/gcMVga7XAwA%2Em4v" type="application/x-shockwave-flash" width="600" height="450" allowscriptaccess="always" allowfullscreen="true"></embed>
</div>
<h3>Other Viewing Options</h3>
<ul>
<li><a href="http://blip.tv/file/2842042?filename=NETTUTS-EasyEditingForYourClientsWithPageLime191.mp4"> Hi-Quality MP4</a></li>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?i=60856588&#038;id=291173544">iTunes Version / Download</a></li>
</ul>
<h3>What&#8217;s in Store for PageLime? </h3>
<p><em>In the CEO&#8217;s own words&#8230;</em></p>
<ul>
<li> <strong>Repeating Regions</strong> &#8211; You/Your clients will be able to have regions that you define as repeatable. This will let you dynamically create new buttons in navigation, blog like article additions, etc. This is in testing now, and will roll out across all sites in the next week!
    </li>
<li> <strong>Multipage Dynamic Content</strong> &#8211; You will be able to define areas that show up on other places in the website. So when you update them, they update in other places.
    </li>
<li> <strong>Blog</strong> &#8211; Drop in simple PageLime managed blog.
    </li>
<li> <strong>Client Invoicing</strong> &#8211; We&#8217;re building an invoicing feature from withing PageLime that will let you manage your PageLime clients with auto recurring invoices that link to your PageLime account. This basically allows you to setup a subscription model for you clients, and pass the cost of PageLime directly to them. OR charge them more, and make money off of PageLime! This will be a feature in the Business Account Level.
</li>
<li> <strong>iPhone App</strong> &#8211; Manage websites from an iPhone application. This is already designed, just need to go about building it soon. I can send you screenshots if you would like.
    </li>
<li> <strong>eCommerce</strong> &#8211; Either a partnership with another team, or build one ourselves that can be dropped in, like the blog.
</li>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>

<p><a href="http://feedads.g.doubleclick.net/~a/onYUVQLx2kBYc_dfafSkh-QhzJk/0/da"><img src="http://feedads.g.doubleclick.net/~a/onYUVQLx2kBYc_dfafSkh-QhzJk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/onYUVQLx2kBYc_dfafSkh-QhzJk/1/da"><img src="http://feedads.g.doubleclick.net/~a/onYUVQLx2kBYc_dfafSkh-QhzJk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/nettuts?a=zIaNI5xyE7k:QbGw-ymnBQw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=zIaNI5xyE7k:QbGw-ymnBQw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/nettuts?i=zIaNI5xyE7k:QbGw-ymnBQw:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=zIaNI5xyE7k:QbGw-ymnBQw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/nettuts?i=zIaNI5xyE7k:QbGw-ymnBQw:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=zIaNI5xyE7k:QbGw-ymnBQw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/nettuts?i=zIaNI5xyE7k:QbGw-ymnBQw:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=zIaNI5xyE7k:QbGw-ymnBQw:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/nettuts/~4/zIaNI5xyE7k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/videos/screencasts/easy-editing-for-your-clients-with-pagelime/feed/</wfw:commentRss>
		<slash:comments>66</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/videos/screencasts/easy-editing-for-your-clients-with-pagelime/</feedburner:origLink></item>
		<item>
		<title>How to Create a Photo Gallery using the Flickr API</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/5UQDOCHtAJo/</link>
		<comments>http://net.tutsplus.com/tutorials/php/how-to-create-a-photo-gallery-using-the-flickr-api/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 18:22:34 +0000</pubDate>
		<dc:creator>Paul Burgess</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[gallery]]></category>
		<category><![CDATA[photo gallery]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=7708</guid>
		<description><![CDATA[<img src="http://nettuts.s3.amazonaws.com/491_flickr/200x200.jpg" alt="How to Create a Photo Gallery using the Flickr API " />]]></description>
			<content:encoded><![CDATA[<p>Flickr is, without doubt, the biggest and best photography website on the internet. There are lots of widgets, badges and plugins which allow you to display your latest Flickr photos on your website, but we&#8217;ll take it a step further by tapping straight into Flickr and integrating your photostream into your website, giving you a photo gallery that is a breeze to update.
</p>
<p><span id="more-7708"></span></p>
<div class="tutorial_image">
<a href="http://nettuts.s3.amazonaws.com/491_flickr/Flickr_API-sample files.zip"><img src="http://nettuts.com/wp-content/themes/nettuts/site_images/button_src_nm.jpg"></a><br />
<a href="http://nettuts-fd.iampaulburgess.co.uk/"><img src="http://nettuts.com/wp-content/themes/nettuts/site_images/button_demo_nm.jpg"></a>
</div>
<p>We&#8217;ll be creating <a title="this photo gallery" href="http://nettuts-fd.iampaulburgess.co.uk">this photo gallery</a> using the Flickr API and <a title="phpFlickr" href="http://phpflickr.com/">phpFlickr</a> . If the letters &#8216;A,P &amp; I&#8217; are enough to strike fear into your  heart, don&#8217;t worry, we will take it slow and give full code examples  that you can copy.</p>
<div class="tutorial_image">
   <img src="http://nettuts.s3.amazonaws.com/491_flickr/finalproject.jpg" alt="Final Project" />
</div>
<p>Flickr have also recently launched <a href="http://www.flickr.com/services/">The App Garden</a>, which is a showcase of tools, toys and sites which use the Flickr API to offer something useful or fun. Once you get to grips with using the API, you can let your imagination conjure up a new way to use it and submit your app. </p>
<p>
  For this tutorial I am presuming that you already have a Flickr account, and access to a server that runs PHP and PEAR.</p>
<h3>The Outline</h3>
<ul>
<li> Get a Flickr API key </li>
<li> Download the phpFlickr files </li>
<li> Build a gallery page to display our thumbnails (with pagination)</li>
<li> Make a photo page to show our photos (with previous and next navigation)</li>
</ul>
<h3>Step 1 &#8211; Get a Flickr API key</h3>
<p>
Your API key is your own unique series of numbers and letters which grant you access to Flickr&#8217;s services. Go here:  http://www.flickr.com/services/apps/create/apply/
</p>
<p>
Here you must decide if you are going to use Flickr for commercial or non-commercial purposes. Flickr provide good explanations as to which  you should choose, chances are you&#8217;ll need a non-commercial API key,  which is what I am choosing for this demo.</p>
<p>
Follow the steps and fill in all your details.</p>
<p> You should then be presented with your unique key which will appear as a series of random numbers and letters like so:</p>
<div class="tutorial_image"><img src="http://nettuts.s3.amazonaws.com/491_flickr/api-key.png" alt="API key example" width="546" height="222"></div>
<p>You&#8217;ll also see a number called &#8216;Secret;&#8217; ignore that for now. For this exercise  we only need the key; make a note of it as we&#8217;ll need it soon.</p>
<p>If you use the API to build a cool tool or site later on, you might want to submit and feature whatever you build in the Flickr App Garden. You can click on &#8216;Edit app details&#8217; to fill in the info.</p>
<blockquote><p>Pay particular attention to the tips and advice  given in the <a href="http://www.flickr.com/services/api/tos/">API Terms of Use</a> and the <a href="http://www.flickr.com/guidelines.gne">Community Guidelines</a>, if you abuse it, you&#8217;ll lose it.</p>
</blockquote>
<p>
  Now on to the exciting stuff&#8230; </p>
<h3>Step 2 &#8211; Download phpFlickr&nbsp; </h3>
<p>
  <a title="phpFlickr" href="http://phpflickr.com/" id="kguo">phpFlickr</a> is a project by <a href="http://www.dancoulter.com/">Dan Coulter</a>. It is a class written in PHP which acts as a wrapper for Flickr&#8217;s API. The files process the data provided by Flickr and return arrays in PHP, which we use to display our photos</p>
<p>
We need to download the files that we will later include in our webpage, and will do all the complicated work for us. Visit <a title="phpflickr.com" href="http://phpflickr.com/" id="y5sq">phpflickr.com</a> or skip straight to <a title="The download page at Google Code" href="http://code.google.com/p/phpflickr/downloads/list">the download page at Google Code.</a> In this demo, we&#8217;ll be using the zip file:   	phpFlickr-2.3.1 (zip)
</p>
<div class="tutorial_image">
<img src="http://nettuts.s3.amazonaws.com/491_flickr/download-link.png" alt="Download link" width="444" height="265" />
</div>
<p>
  Download and unzip it. For this tutorial, we only need the PEAR folder and the phpFlickr.php file. Upload the files to your web directory</p>
<h3>Step 3 &#8211; Basic Setup and Simple Configuration &nbsp; </h3>
<p>
  Now  we have all we need to connect with Flickr and retrieve our photos. We&#8217;ll make two pages: one to show our thumbnails and one to show the photo. All of the code will be available as complete pages at the end of the tutorial. </p>
<p>
  These code examples are all working on the basis that your files are on the root of your server &#8211; or all in the same folder. Before anything else, we need to create a cache folder in order for phpFlickr  to work properly. Create a folder called &#8216;cache&#8217; in your web directory  and give it writable permissions (CHMOD 777). </p>
<p>
  Now we&#8217;ll build a page that displays our thumbnails and has some simple paging. In the example gallery, this is index.php &#8211; and <a title="looks like this" href="http://nettuts-fd.iampaulburgess.co.uk/" id="mhb6">looks like this</a>.</p>
<p>
Before we go any further, we need to set two main variables in the config.php file.</p>
<p>Open config.php. You&#8217;ll see it&#8217;s just asking for two things: your API key and your Flickr username. </p>
<p>First, enter your API key &#8211; the long random set of numbers and letters you were given earlier on by Flickr. Keep your info inside the quote marks. </p>
<pre name="code" class="php">// insert your API key
$key=&quot;ENTER YOUR FLICKR API KEY HERE&quot;;</pre>
<p>Now for your Flickr username; this is  not your Yahoo sign-in username or your Flickr screename &#8211; but the  username you use for Flickr itself. To double check, sign in to Flickr and look at the top of the page where it says &#8216;Signed in as&#8230;&#8217; &#8211; that is your username. So let&#8217;s declare our username as a variable:</p>
<pre name="code" class="php">// enter your Flickr username
$username=&quot;YOUR FLICKR USERNAME HERE&quot;;</pre>
<p>Save the changes to config.php and upload &#8211; you shouldn&#8217;t need that file again. </p>
<h3>Step 4 &#8211; Building the Thumbnails Page</h3>
<div class="tutorial_image">
   <img src="http://nettuts.s3.amazonaws.com/491_flickr/finalproject.jpg" alt="Final Project" />
</div>
<p>On to the page itself. Here&#8217;s a breakdown of what we are doing at the top of the page, which cues up everything ready for the action: </p>
<p>
  We are going to include some Previous and Next links with a small  bit of code further down the page. The thumbnails we are going to show  depend on what page we are on, so we run a simple if  statement which will grab our page number. If there&#8217;s a &#8216;fpage&#8217; query in  the url, use that. If not, we are on page one.</p>
<pre name="code" class="php">&lt;?php
  // get page number from the url - if there isn't one - we're on page 1
  $page = isset($_GET['page']) ? $_GET['page'] : 1;
  </pre>
<p>  Next we include the core phpFlickr file that has everything we need in it communicate with Flickr.</p>
<pre name="code" class="php">// inclue the core file
  require_once('phpFlickr.php');
  </pre>
<p>
  Now we fire up a new class from the phpFlickr file using our API key that we got earlier.</p>
<pre name="code" class="php">
// Fire up the main phpFlickr class
$f = new phpFlickr($key);
  </pre>
<p>
phpFlickr uses caching to speed the  process up. There are options of using a database technique but for  this tutorial we will use the simpler cache folder option. We need  a folder called &#8216;cache&#8217; that is writable, meaning that the system has  access to it and can alter its contents. To do this set the folders&#8217;  permissions to 777 via your FTP program. Then we add this line to enable it: </p>
<pre name="code" class="php">$f-&gt;enableCache("fs", "cache");
  </pre>
<p>
  We call the people_findByUsername method which returns an array:</p>
<pre name="code" class="php">$result = $f-&gt;people_findByUsername($username);
  </pre>
<p>
  From that array, we also need your unique user id (your Flickr id that look  like this: 11221312@N00, declared here as $nsid) which we get like so:</p>
<pre name="code" class="php">// grab our unique user id from the $result array
  $nsid = $result["id"];
  </pre>
<p>
Next, we call the people_getPublicPhotos method, which again returns an array that we will call $photos. In  this line, we are also passing through our id which we got in the line  above ($nsid). NULL refers to the &#8216;extras&#8217; option which we&#8217;re not  concerned with right now. We are also stating the number of thumbnails  we want to display (21), and are passing through the page to  start on ($page) which relates back to the $page variable from the top of  the page:</p>
<pre name="code" class="php"> $photos = $f-&gt;people_getPublicPhotos($nsid, NULL, NULL, 21, $page);
  </pre>
<p>
  The last bit we need to set the page up is a little bit of info we need for the paging to work. We  access the $photos array we created above, and pull out the the total  number of pages, plus the total amount of photos in our photostream:</p>
<pre name="code" class="php">$pages = $photos[photos][pages]; // returns total number of pages
  $total = $photos[photos][total]; // returns how many photos there are in total
  ?&gt;
  </pre>
<p>
  Notice we&#8217;re closing the php section off here with the ?&gt; Now we have all we need to get the first 21 thumbnails from our Flickr photostream and display them. We&#8217;ll carry on with the page now, adding some html, using PHP to show the images, and include some simple paging links. So let&#8217;s start by writing some basic html. </p>
<pre name="code" class="php"> &lt;!DOCTYPE html  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;
&lt;title&gt;Nettuts Flickr Gallery Demo&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;

&lt;h1&gt;My photo gallery&lt;/h1&gt;
&lt;div id="thumbs"&gt;
  </pre>
<p>
  Nothing out of the ordinary here; just setting up the html and starting an area for the thumbnails. The next step is to fill our div called &#8216;thumbs&#8217; with our thumbnails like so:</p>
<div class="tutorial_image"><img src="http://nettuts.s3.amazonaws.com/491_flickr/thumbnails-example.jpg" alt="Thumbnails example" width="601" height="224"></div>
<p>
Note we&#8217;re opening php again with &lt;?php:</p>
<p>
We&#8217;ll  use a foreach loop to run through the $photos array and to get to the  photo element ($photo), which holds the info we need for the thumbnails.<br />
See the comments in the code for an explanation of what&#8217;s going on: </p>
<pre name="code" class="php">
&lt;?php
// loop through each photo
&nbsp;foreach ($photos['photos']['photo'] as $photo) {
&nbsp;&nbsp;
// print out a link to the photo page, attaching the id of the photo
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "&lt;a href=\"photo.php?id=$photo[id]\" title=\"View $photo[title]\"&gt;";
&nbsp;&nbsp;&nbsp;
// This next line uses buildPhotoURL to construct the location of our image, and we want the 'Square' size
// It also gives the image an alt attribute of the photo's title
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; echo "&lt;img src=\"" . $f-&gt;buildPhotoURL($photo, "Square") .  "\" width=\"75\" height=\"75\" alt=\"$photo[title]\" /&gt;";

// close link&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "&lt;/a&gt;";

// end loop
}
?&gt;

&lt;/div&gt;&lt;!-- close thumbs div --&gt;
</pre>
<p>
</strong>We&#8217;re almost done with the main page.  Chances are, you have more than 21 photos in your Photostream; so we&#8217;ll need to add some paging with some Previous and Next links so we can  move to the next 21 thumbnails. The links look like this:</p>
<div class="tutorial_image"><img src="http://nettuts.s3.amazonaws.com/491_flickr/pagination-example.png" alt="Pagination example" width="252" height="117"></div>
<p>
&nbsp;This  code relies on the line we had at the top calling the $page  variable. When our code calls in the photos from Flickr, it also uses  the $page variable to know where to start &#8211; look back at the line where  we called &#8216;people_getPublicPhotos&#8217; and you&#8217;ll see that we passed in the $page  variable there as well. That value is the backbone of this little paging  arrangement. We&#8217;ll open a paragraph with the id of &#8216;nav&#8217;, open up the PHP tags, and define our &#8216;back&#8217; and &#8216;next&#8217; variables:</p>
<pre name="code" class="php">&lt;p id="nav"&gt;
&lt;?php
// Some simple paging code to add Prev/Next to scroll through the thumbnails
$back = $page - 1;
$next = $page + 1;
</pre>
<p>
Next we handle the actual &#8216;Previous&#8217;  and &#8216;Next&#8217; links by checking that we&#8217;re not on the first or last page,  the close off php and close the &#8216;p&#8217; tag. </p>
<pre name="code" class="php">// if it's not the first page
if($page &gt; 1) {
echo "&lt;a href='?page=$back'&gt;&amp;laquo; &lt;strong&gt;Prev&lt;/strong&gt;&lt;/a&gt;";
}
// if not last page
if($page != $pages) {
echo "&lt;a href='?page=$next'&gt;&lt;strong&gt;Next&lt;/strong&gt; &amp;raquo;&lt;/a&gt;";}
?&gt;
&lt;/p&gt;
</pre>
<p>
Now we refer back to some values we had at the beginning to display a little more about where we are in the gallery:</p>
<pre name="code" class="php">
&lt;?php
// a quick bit of info about where we are in the gallery
echo"&lt;p&gt;Page $page of $pages&lt;/p&gt;";
echo"&lt;p&gt;$total photos in the gallery&lt;/p&gt;";
?&gt;
</pre>
<p>
And to abide by Flickr&#8217;s terms and finish the page off, we&#8217;ll add:</p>
<pre name="code" class="php">
&lt;p&gt;This product uses the Flickr API but is not endorsed or certified by Flickr.&lt;/p&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>
That&#8217;s everything we need to produce a page that displays the latest 21 photos as thumbnails with a simple Prev / Next navigation.  Just like <a href="http://nettuts-fd.iampaulburgess.co.uk" title="the homepage on the demo">the homepage on the demo</a>. Next up: the page that displays our photo. </p>
<h3>Step 5 &#8211; Build a Page to Display Single Photos</h3>
<div class="tutorial_image">
   <img src="http://nettuts.s3.amazonaws.com/491_flickr/singlePage.jpg" alt="Single Page" />
</div>
<p>
Now that we have our thumbnails, we need a page to show the full image  when one is clicked on. Here is the code for photo.php, which the  thumbnails link. We start this page similarly to the index page, but instead  of the page number, we want the id of the photo which has been passed  in the url from our thumbnail page:
</p>
<pre name="code" class="php">&lt;?php

// Get id of photo
$id = isset($_GET['id']) ? $_GET['id'] : NULL;

//include the core file
require_once('phpFlickr.php');

// Fire up the main phpFlickr class
$f = new phpFlickr($key);

// cache folder again, permissions set to 777
$f-&gt;enableCache("fs", "cache");
</pre>
<p>
Now we need to gather some info from  Flickr about the photo such as the photo&#8217;s id number, its dimensions,  where it sits in relation to other photos (context) and the url of the  image. </p>
<pre name="code" class="php">// access the getInfo method, passing in the photo's id
$photo = $f-&gt;photos_getInfo("$id", $secret = NULL);

// pass the photo's id to the getSizes method to get the dimensions of our image
$photosize = $f-&gt;photos_getSizes("$id", $secret = NULL);

// we want the dimensions of the medium size which we get from the $photosize array in the previous line
$size = $photosize[3];

// again passing the photo's id through we get the context, which tells us which photos are before and after the current id
$context = $f-&gt;photos_getContext("$id");

//  the buildPhotoURL method does pretty much what you'd expect - build the  photo URL, we pass in $photo and the size we require to return the  image URL e.g.  http://farm4.static.flickr.com/3108/3175330082_0bf4b22e47.jpg
$photoUrl = $f-&gt;buildPhotoURL($photo, "Medium");

// This tells us who the owner of the photo is.
// This is an important part to include as we want our gallery to show  only our photos and not pull in other users' photos - more of an  explanation about this in the notes at the end
$owner = $photo["owner"]["username"];

// We only want the photo if it belongs to us - so if our username  is the same as the owner of the photo... we'll write out the page and  show it
// more info on this at the end of the tutorial
if($username == $owner){
?&gt;
</pre>
<p>
Now we are primed for the rest of the page with the juicy bits. </p>
<pre name="code" class="php">
&lt;!DOCTYPE html  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;
&lt;!-- Let's get in there straight away and get the photo's title --&gt;
&lt;title&gt;
&lt;?php
// We access the $photo array and grab the title of the photo to use as the document title
echo $photo[title]
&nbsp;?&gt;
&lt;/title&gt;
&lt;link href="styles.css" rel="stylesheet" type="text/css"&gt;
&lt;/head&gt;

&lt;body&gt;

&lt;h1&gt;Photo gallery&lt;/h1&gt;

&lt;div id="photo"&gt;
&lt;?php
// The photo's title once again
echo"&lt;h2&gt;$photo[title]&lt;/h2&gt;";

// The photo itself, you'll recognise $photoUrl from above where we  built the photo's url, we are also accessing the $size array that we  prepared earlier to get the width and height
// and the title once again
// We'll also make it link to the version on Flickr for good measure
echo"&lt;a href=\"http://flickr.com/photos/$username/$photo[id]/\" title=\"View $photo[title] on Flickr \"&gt;";
echo"&lt;img src=\"$photoUrl\" width=\"$size[width]\" height=\"$size[height]\" alt=\"$photo[title]\" /&gt;";
echo"&lt;/a&gt;";

// The photo's description
echo"&lt;p&gt;$photo[description]&lt;/p&gt;";
?&gt;
&lt;/div&gt;&lt;!-- end photo --&gt;
</pre>
<p>
Now we have our photo&#8230; and we are almost done. This last bit may look a bit tricky but don&#8217;t be put off by it. It has to do with the photo&#8217;s context, as in, which photo comes next in  the stream and which one was previous to it. Just like you see on  people&#8217;s Flickr galleries. The reason there seems a lot of code is because for this to work best,  we have to check to see if there is a photo before or after the current  photo. If there isn&#8217;t, we don&#8217;t want a link, instead we insert normal  text and a dummy image (noimg.png).
</p>
<pre name="code" class="php">
&lt;div id="context"&gt;
&lt;?php
// if there is a previous photo...
if($context['prevphoto']['id']){echo"&lt;a  href=\"?id=".$context['prevphoto']['id']."\" title=\"Prev:  ".$context['prevphoto']['title']."\"&gt;&lt;img  src=\"".$context['prevphoto']['thumb']."\" width=\"75\" height=\"75\"  /&gt;&lt;/a&gt;";

} else {
// if not - show the blank filler image
echo"&lt;img src=\"noimg.png\" width=\"75\" height=\"75\" alt=\"No photo\" /&gt;";
};

// if there is a next photo...
if($context['nextphoto']['id']){echo "&lt;a  href=\"?id=".$context['nextphoto']['id']."\" title=\"Next:  ".$context['nextphoto']['title']."\"&gt;&lt;img  src=\"".$context['nextphoto']['thumb']."\" width=\"75\" height=\"75\"  /&gt;&lt;/a&gt;";
} else {
// if not - show the blank filler image
echo"&lt;img src=\"noimg.png\" width=\"75\" height=\"75\" alt=\"No photo\" /&gt;";
};

echo"&lt;/div&gt;";

echo"&lt;p&gt;";
// if there is a previous link, write a link - if not, just the text
if($context['prevphoto']['id']){echo"&lt;a  href=\"?id=".$context['prevphoto']['id']."\" title=\"Prev:  ".$context['prevphoto']['title']."\"&gt;&amp;laquo; Prev&lt;/a&gt;";}  else {echo"&amp;laquo; Prev";};
echo" | ";
// if there is a next link, write a link - if not, just the text
if($context['nextphoto']['id']){echo"&lt;a  href=\"?id=".$context['nextphoto']['id']."\" title=\"Next:  ".$context['nextphoto']['title']."\"&gt;Next  &amp;raquo;&lt;/a&gt;";}else {echo"Next &amp;raquo;";};
echo"&lt;/p&gt;";
?&gt;

&lt;/div&gt;&lt;!-- end context --&gt;
</pre>
<p>
And to finish the page off, we&#8217;ll include a link back to the main gallery, a bit of text for Flickr and close off the html.</p>
<pre name="code" class="php">&lt;p&gt;&amp;laquo; &lt;a href="/"&gt;Main gallery&lt;/a&gt;&lt;/p&gt;

&lt;!-- To abide by Flickr's terms - you must include this text --&gt;
&lt;p&gt;This product uses the Flickr API but is not endorsed or certified by Flickr.&lt;/p&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Hold up! One more thing&#8230; we finish the if  statement from just before the html began&#8230; again, see the notes at  the end about why we do this.</p>
<pre name="code" class="php">
&lt;?php
} // end if for owner
?&gt;
</pre>
<p>
And there you have it. A photo gallery for your website, powered by your Flickr account. <a title="Take a look at the demo page" href="http://nettuts-fd.iampaulburgess.co.uk" id="yn2.">Take a look at the demo page</a> to review how it looks with a bit of extra markup and styling added. This  is a very basic implementation of the Flickr API; it just scratches the  surface of what you can do, but it does provides a nice photo gallery  for your site/blog which you can easily update and maintain via Flickr. </p>
<h3>NOTES &amp; EXTRAS</h3>
<ul>
<li>
<p>In this tutorial we are retrieving a user&#8217;s public photos. Within photo.php, we  reference $owner in this tutorial. At this point we are ensuring that  the photo displayed belongs to the owner of the photograph. If we leave  this out, your photo page can pull in any user&#8217;s public photo, and that  is obviously not what we want. This goes back to the advice Flickr provides in <a href="http://www.flickr.com/guidelines.gne">their guidelines</a>.
</p>
<p><em><br />
    You should use the  API to access your own images only or those which you have  permission to use. If you display someone else&#8217;s pictures, you should mention the name of image owner and name of the image. Flickr also say &quot;&#8230;pages on other web sites that display content hosted on flickr.com must  provide a link from each photo or video back to its page on Flickr.&#8221;</em></p>
</li>
<li>
<p>There  are other ways to display your photos using the search method in the  API, but it is a bit more complicated and requires you to provide  authentication &#8211; in other words, use the API to log in and let Flickr  know it really is you &#8211; more info on that can be found <a href="http://phpflickr.com/docs/flickr-authentication/">here.</a>
</p>
</li>
<li> This demo is a very simple example of what you can do with the Flickr  API. You can take it much further and in fact do pretty much everything  Flickr does: get photo sets, show tags and comments, display private  photos, even upload images. Take a look at the API documentation here:  http://www.flickr.com/services/api/ You can cross check the methods  against the phpFlickr.php file.</li>
<li>
    Just  as we called in our photos using $photos =  $f-&gt;people_getPublicPhotos($nsid, NULL, 21, $page); you can do the  same with a set. For example, $photos =  $f-&gt;photosets_getPhotos(&#8221;$set&#8221;, $extras, $privacyfilter, 21, $page);  is a way to get 21 photos per page from a set, where $set = the set id  (something like 72157594488289220), then using foreach  ($photos['photo'] as $photo) {&#8230; to get the images etc.
  </li>
<li>
<p>If  you need to see which part of the array you need, you can use print_r()  to list out the array and see how to find to the value you need.  Surround it with &lt;pre&gt; tags to make the output legible.</p>
</li>
<li>The  file paths in this demo all work on the assumption that everything is  in the same folder (or all on the root) &#8211; feel free to move stuff about  but be sure to change the paths
</li>
<li>Huge thanks to <a href="http://www.dancoulter.com/">Dan Coulter</a> for wrting the excellent <a href="http://phpflickr.com/">phpFlickr</a>. Be sure to take a look around the phpFlickr documentation:  <a href="http://phpflickr.com/docs/">http://phpflickr.com/docs/</a> for more tips and advice on taking things  further
</li>
</ul>
<p><strong>Have fun, and show us what you come up with!</strong></p>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>

<p><a href="http://feedads.g.doubleclick.net/~a/1w7Ux7RToDxKaQniepgoA8hGmUo/0/da"><img src="http://feedads.g.doubleclick.net/~a/1w7Ux7RToDxKaQniepgoA8hGmUo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/1w7Ux7RToDxKaQniepgoA8hGmUo/1/da"><img src="http://feedads.g.doubleclick.net/~a/1w7Ux7RToDxKaQniepgoA8hGmUo/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/nettuts?a=5UQDOCHtAJo:5Aq_zztlEE0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=5UQDOCHtAJo:5Aq_zztlEE0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/nettuts?i=5UQDOCHtAJo:5Aq_zztlEE0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=5UQDOCHtAJo:5Aq_zztlEE0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/nettuts?i=5UQDOCHtAJo:5Aq_zztlEE0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=5UQDOCHtAJo:5Aq_zztlEE0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/nettuts?i=5UQDOCHtAJo:5Aq_zztlEE0:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=5UQDOCHtAJo:5Aq_zztlEE0:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/nettuts/~4/5UQDOCHtAJo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/php/how-to-create-a-photo-gallery-using-the-flickr-api/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/php/how-to-create-a-photo-gallery-using-the-flickr-api/</feedburner:origLink></item>
		<item>
		<title>Build a Beautiful Carousel with JavaScript from Scratch: New Plus Tutorial</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/Onjg8-4Pj4c/</link>
		<comments>http://net.tutsplus.com/tutorials/plus-tutorials-2/build-a-beautiful-carousel-with-javascript-from-scratch-new-plus-tutorial/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 20:20:26 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Plus]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=7686</guid>
		<description><![CDATA[<img src="http://nettutsplus.s3.amazonaws.com/39_carousel/200x200.jpg" alt="Build a Beautiful Carousel with JavaScript from Scratch: New Plus Tutorial" />]]></description>
			<content:encoded><![CDATA[<p>
In today&#8217;s PLUS video tutorial, Pablo is going to show you how to create a Flash-like carousel&#8230;without using Flash! By implementing some clever JavaScript techniques, you&#8217;ll learn how to create this beautiful effect. As you&#8217;ll find, it&#8217;s not quite as complicated as you might imagine. It simply requires a solid grasp of Geometry. <a href="http://net.tutsplus.com/about/join-plus/">Join today!</a>
</p>
<p><span id="more-7686"></span></p>
<div class="tutorial_image">
<a href="http://net.tutsplus.com/about/join-plus/"><br />
   <img src="http://nettutsplus.s3.amazonaws.com/39_carousel/im2.jpg" alt="Example" /><br />
</a>
</div>
<div class="tutorial_image">
<a href="http://net.tutsplus.com/about/join-plus/"><br />
   <img src="http://nettutsplus.s3.amazonaws.com/39_carousel/im3.jpg" alt="Example" /><br />
</a>
</div>
<div class="tutorial_image">
<a href="http://net.tutsplus.com/about/join-plus/"><br />
   <img src="http://nettutsplus.s3.amazonaws.com/39_carousel/im6.jpg" alt="Example" /><br />
</a>
</div>
<h3>Join Tuts Plus</h3>
<div class="tutorial_image"><img src="http://miscfiles.s3.amazonaws.com/banners/nettuts_468x60.jpg" border=0 alt="NETTUTS+ Screencasts and Bonus Tutorials" width=468 height=60></div>
<p>
For those unfamiliar, the family of TUTS sites runs a premium membership service called <a href="http://www.tutsplus.com">&#8220;TUTSPLUS&#8221;</a>. For $9 per month, you gain access to exclusive premium tutorials, screencasts, and freebies from <a href="http://net.tutsplus.com">Nettuts+</a>, <a href="psd.tutsplus.com">Psdtuts+</a>, <a href="ae.tutsplus.com">Aetuts+</a>, <a href="audio.tutsplus.com">Audiotuts+</a>, and <a href="vector.tutsplus.com">Vectortuts+!</a> For the price of a pizza, you&#8217;ll learn from some of the best minds in the business. <a href="http://net.tutsplus.com/about/join-plus/">Join today!</a> </p>
<ul class="webroundup">
<li>Subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for more daily web development tuts and articles.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>

<p><a href="http://feedads.g.doubleclick.net/~a/GIZtO4H8TCS_uqnU6QCllnDS9oo/0/da"><img src="http://feedads.g.doubleclick.net/~a/GIZtO4H8TCS_uqnU6QCllnDS9oo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/GIZtO4H8TCS_uqnU6QCllnDS9oo/1/da"><img src="http://feedads.g.doubleclick.net/~a/GIZtO4H8TCS_uqnU6QCllnDS9oo/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/nettuts?a=Onjg8-4Pj4c:28TO_C7LuMM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=Onjg8-4Pj4c:28TO_C7LuMM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/nettuts?i=Onjg8-4Pj4c:28TO_C7LuMM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=Onjg8-4Pj4c:28TO_C7LuMM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/nettuts?i=Onjg8-4Pj4c:28TO_C7LuMM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=Onjg8-4Pj4c:28TO_C7LuMM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/nettuts?i=Onjg8-4Pj4c:28TO_C7LuMM:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=Onjg8-4Pj4c:28TO_C7LuMM:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/nettuts/~4/Onjg8-4Pj4c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/plus-tutorials-2/build-a-beautiful-carousel-with-javascript-from-scratch-new-plus-tutorial/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/plus-tutorials-2/build-a-beautiful-carousel-with-javascript-from-scratch-new-plus-tutorial/</feedburner:origLink></item>
		<item>
		<title>The Basics of Object-Oriented JavaScript</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/3BteVwljtmU/</link>
		<comments>http://net.tutsplus.com/tutorials/javascript-ajax/the-basics-of-object-oriented-javascript/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 14:10:24 +0000</pubDate>
		<dc:creator>Leigh Kaszick</dc:creator>
				<category><![CDATA[JavaScript & AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[objects]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=7670</guid>
		<description><![CDATA[<img src="http://nettuts.s3.amazonaws.com/490_json/200x200.jpg" alt="The Basics of Object-Oriented JavaScript" />]]></description>
			<content:encoded><![CDATA[<p>Over recent years, JavaScript has increasingly gained popularity, partly due to libraries that are developed to make JavaScript apps/effects easier to create for those who may not have fully grasped the core language yet. </p>
<p>While in the past it was a common argument that JavaScript was a basic language and was very &#8217;slap dash&#8217; with no real foundation; this is no longer the case, especially with the introduction of high scale web applications and &#8216;adaptations&#8217; such as JSON (JavaScript Object Notation). </p>
<p><span id="more-7670"></span></p>
<p>JavaScript can have all that an Object-Orientated language has to offer, albeit with some extra effort outside of the scope of this article. </p>
<h3>Let&#8217;s Create an Object</h3>
<pre name="code" class="javascript">
    function myObject(){

    };
</pre>
<p>Congratulations, you just created an object. There are two ways to<br />
create a JavaScript object: they are &#8216;Constructor functions&#8217; and<br />
&#8216;Literal notation&#8217;. The one above is a Constructor function,<br />
I&#8217;ll explain what the difference is shortly, but before I do, here<br />
is what an Object definition looks like using literal notation.</p>
<pre name="code" class="javascript">
    var myObject = {

    };
</pre>
<p>Literal is a preferred option for name spacing so that your JavaScript<br />
code doesn&#8217;t interfere (or vice versa) with other scripts running on the<br />
page and also if you are using this object as a single object and not requiring<br />
more than one instance of the object, whereas Constructor function type<br />
notation is preferred if you need to do some initial work before the object<br />
is created or require multiple instances  of the object where each instance<br />
can be changed during the lifetime of the script. Let&#8217;s continue to build<br />
on both our objects simultaneously so we can observe what the differences are.</p>
<h3>Defining Methods and Properties</h3>
<h4>Constructor version:</h4>
<pre name="code" class="javascript">
    function myObject(){
        this.iAm = 'an object';
        this.whatAmI = function(){
            alert('I am ' + this.iAm);
        };
    };
</pre>
<h4>Literal version:</h4>
<pre name="code" class="javascript">
    var myObject = {
        iAm : 'an object',
        whatAmI : function(){
            alert('I am ' + this.iAm);
        }
    }
</pre>
<p>For each of the objects we have created a property &#8216;iAm&#8217; which contains a<br />
string value that is used in our objects method &#8216;whatAmI&#8217; which alerts a message. </p>
<blockquote>
<p>
Properties are variables created inside an object and methods are functions created inside an object.
</p>
</blockquote>
<p>Now is probably as good a time as any to explain how to use properties and<br />
methods (although you would already have done so if you are familiar with a library).</p>
<p>To use a property first you type what object it belongs to &#8211; so in this case it&#8217;s myObject &#8211;<br />
and then to reference its internal properties, you put a full stop and then the name of the<br />
property so it will eventually look like myObject.iAm (this will return &#8216;an object&#8217;).</p>
<p>For methods, it is the same except to execute the method, as with any function, you must<br />
put parenthesis after it; otherwise you will just be returning a reference to the function<br />
and not what the function actually returns. So it will look like myObject.whatAmI()<br />
(this will alert &#8216;I am an object&#8217;).</p>
<h4>Now for the differences:</h4>
<ul>
<li>The constructor object has its properties and methods defined with the<br />
    keyword &#8216;this&#8217; in front of it, whereas the literal version does not.</li>
<li>In the constructor object the properties/methods have their &#8216;values&#8217;<br />
    defined after an equal sign &#8216;=&#8217; whereas in the literal version, they are<br />
    defined after a colon &#8216;:&#8217;.</li>
<li>The constructor function can have (optional) semi-colons &#8216;;&#8217; at the<br />
    end of each property/method declaration whereas in the literal version<br />
    if you have more than one property or method, they MUST be separated with<br />
    a comma &#8216;,&#8217;, and they CANNOT have semi-colons after them, otherwise JavaScript will return an error.</li>
</ul>
<p>There is also a difference between the way these two types of object declarations are used.</p>
<p>To use a literally notated object, you simply use it by referencing its variable name,<br />
so wherever it is required you call it by typing;</p>
<pre name="code" class="javascript">
    myObject.whatAmI();
</pre>
<p>With constructor functions you need to instantiate (create a new instance of)<br />
the object first; you do this by typing;</p>
<pre name="code" class="javascript">
    var myNewObject = new myObject();
    myNewObject.whatAmI();
</pre>
<h3>Using a Constructor Function.</h3>
<p>Let&#8217;s use our previous constructor function and build upon it so it performs some basic<br />
(but dynamic) operations when we instantiate it.</p>
<pre name="code" class="javascript">
    function myObject(){
        this.iAm = 'an object';
        this.whatAmI = function(){
            alert('I am ' + this.iAm);
        };
    };
</pre>
<p>Just like any JavaScript function, we can use arguments with our constructor function;</p>
<pre name="code" class="javascript">
function myObject(what){
	this.iAm = what;
	this.whatAmI = function(language){
		alert('I am ' + this.iAm + ' of the ' + language + ' language');
	};
};
</pre>
<p>Now let&#8217;s instantiate our object and call its whatAmI method, filling in the required<br />
fields as we do so.</p>
<pre name="code" class="javascript">
    var myNewObject = new myObject('an object');
    myNewObject.whatAmI('JavaScript');
</pre>
<p>This will alert &#8216;I am an object of the JavaScript language.&#8217;</p>
<h3>To Instantiate or not to Instantiate</h3>
<p>I mentioned earlier about the differences between Object Constructors and Object Literals and that<br />
when a change is made to an Object Literal it affects that object across the entire script, whereas when<br />
a Constructor function is instantiated and then a change is made to that instance, it won&#8217;t affect any<br />
other instances of that object. Let&#8217;s try an example;</p>
<p>First we will create an Object literal;</p>
<pre name="code" class="javascript">
	var myObjectLiteral = {
    	myProperty : 'this is a property'
    }

    //alert current myProperty
    alert(myObjectLiteral.myProperty); //this will alert 'this is a property'

    //change myProperty
    myObjectLiteral.myProperty = 'this is a new property';

    //alert current myProperty
    alert(myObjectLiteral.myProperty); //this will alert 'this is a new property', as expected
</pre>
<p>Even if you create a new variable and point it towards the object, it will have the same effect.</p>
<pre name="code" class="javascript">
	var myObjectLiteral = {
    	myProperty : 'this is a property'
    }

    //alert current myProperty
    alert(myObjectLiteral.myProperty); //this will alert 'this is a property'

    //define new variable with object as value
    var sameObject = myObjectLiteral;

    //change myProperty
    myObjectLiteral.myProperty = 'this is a new property';

    //alert current myProperty
    alert(sameObject.myProperty); //this will still alert 'this is a new property'
</pre>
<p>Now let&#8217;s try a similar exercise with a Constructor function.</p>
<pre name="code" class="javascript">
	//this is one other way of creating a Constructor function
	var myObjectConstructor = function(){
    	this.myProperty = 'this is a property'
    }

    //instantiate our Constructor
    var constructorOne = new myObjectConstructor();

    //instantiate a second instance of our Constructor
    var constructorTwo = new myObjectConstructor();

    //alert current myProperty of constructorOne instance
    alert(constructorOne.myProperty); //this will alert 'this is a property'

     //alert current myProperty of constructorTwo instance
    alert(constructorTwo.myProperty); //this will alert 'this is a property'
</pre>
<p>So as expected, both return the correct value, but let&#8217;s change the myProperty for one of the instances.</p>
<pre name="code" class="javascript">
	//this is one other way of creating a Constructor function
	var myObjectConstructor = function(){
    	this.myProperty = 'this is a property'
    }

    //instantiate our Constructor
    var constructorOne = new myObjectConstructor();

    //change myProperty of the first instance
    constructorOne.myProperty = 'this is a new property';

    //instantiate a second instance of our Constructor
    var constructorTwo = new myObjectConstructor();

    //alert current myProperty of constructorOne instance
    alert(constructorOne.myProperty); //this will alert 'this is a new property'

     //alert current myProperty of constructorTwo instance
    alert(constructorTwo.myProperty); //this will still alert 'this is a property'
</pre>
<p>As you can see from this example, even though we changed the property of constructorOne<br />
it didn&#8217;t affect myObjectConstructor and therefore didn&#8217;t affect constructorTwo. Even if<br />
constructorTwo was instantiated before we changed the myProperty property of constructorOne,<br />
it would still not affect the myProperty property of constructorTwo as it is a completely different<br />
instance of the object within JavaScript&#8217;s memory.</p>
<p>So which one should you use? Well it depends on the situation, if you only need one object of its kind for<br />
your script (as you will see in our example at the end of this article), then use an object literal, but if you need several instances of an object, where each instance<br />
is independent of the other and can have different properties or methods depending on the way it&#8217;s constructed, then use a constructor function.</p>
<h3>This and That</h3>
<p>While explaining constructor functions, there were a lot of &#8216;this&#8217; keywords being thrown around<br />
and I figure what better time to talk about scope!</p>
<p>Now you might be asking &#8216;what is this scope you speak of&#8217;?&#8217; Scope in JavaScript is function/object based, so that means if you&#8217;re outside<br />
of a function, you can&#8217;t use a variable that is defined inside a function (unless you use a closure).</p>
<p>There is however a scope chain, which means that a function inside another function can access a<br />
variable defined in its parent function. Let&#8217;s take a look at some example code.</p>
<pre name="code" class="javascript">
&lt;script type="text/javascript"&gt;

var var1 = 'this is global and is available to everyone';

function function1(){

	var var2 = 'this is only available inside function1 and function2';	

	function function2(){

		var var3 = 'this is only available inside function2';

	}		

}

&lt;/script&gt;
</pre>
<p>As you can see in this example, <strong>var1</strong> is defined in the global object<br />
and is available to all functions and object, <strong>var2</strong> is defined inside function1<br />
and is available to function1 and function2, but if you try to reference it from the global object<br />
it will give you the error &#8216;var2 is undefined&#8217;, <strong>var3</strong> is only accessible to function2.</p>
<p>So what does &#8216;this&#8217; reference? Well in a browser, &#8216;this&#8217; references the window object, so technically<br />
the window is our global object. If we&#8217;re inside an object, &#8216;this&#8217; will refer to the object itself however<br />
if you&#8217;re inside a function, this will still refer to the window object and likewise if you&#8217;re inside a method<br />
that is within an object, &#8216;this&#8217; will refer to the object.</p>
<p>Due to our scope chain, if we&#8217;re inside a sub-object (an object inside an object), &#8216;this&#8217; will refer to<br />
the sub-object and not the parent object.</p>
<p>As a side note, it&#8217;s also worth adding that when using functions like setInterval, setTimeout and eval,<br />
when you execute a function or method via one of these, &#8216;this&#8217; refers to the window object as these are methods of window, so<br />
setInterval() and window.setInterval() are the same.</p>
<p>Ok now that we have that out of the way, let&#8217;s do a real world example and create a<br />
form validation object!</p>
<h3>Real world Usage: A Form Validation Object</h3>
<p>First I must introduce you to the addEvent function which we will create and is a<br />
combination of ECMAScript&#8217;s (Firefox, Safari, etc.. ) addEventListener() function and<br />
Microsoft ActiveX Script&#8217;s attachEvent() function.</p>
<pre name="code" class="javascript">
    function addEvent(to, type, fn){
        if(document.addEventListener){
            to.addEventListener(type, fn, false);
        } else if(document.attachEvent){
            to.attachEvent('on'+type, fn);
        } else {
            to['on'+type] = fn;
        }
    };
</pre>
<p>This creates a new function with three arguments, <strong>to</strong> being the DOM object we are attaching<br />
the event to, <strong>type</strong> being the type of event and <strong>fn</strong> being the function run when<br />
the event is triggered. It first checks whether addEventListener is supported, if so it will use that, if not it will check<br />
for attachEvent and if all else fails you are probably using IE5 or something equally obsolete so<br />
we will add the event directly onto its event property (note: the third option will overwrite any<br />
existing function that may have been attached to the event property while the first two will add<br />
it as an additional function to its event property).</p>
<p>Now let&#8217;s set up our document so it is similar to what you might see when you develop jQuery stuff.</p>
<p>In jQuery you would have;</p>
<pre name="code" class="javascript">
    $(document).ready(function(){
        //all our code that runs after the page is ready goes here
    });
</pre>
<p>Using our addEvent function we have;</p>
<pre name="code" class="javascript">
    addEvent(window, 'load', function(){
		//all our code that runs after the page is ready goes here
	});
</pre>
<p>Now for our Form object.</p>
<pre name="code" class="javascript">
var Form = {

	validClass : 'valid',

	fname : {
		minLength : 1,
		maxLength : 15,
		fieldName : 'First Name'
	},

	lname : {
		minLength : 1,
		maxLength : 25,
		fieldName : 'Last Name'
	},

	validateLength : function(formEl, type){
		if(formEl.value.length > type.maxLength || formEl.value.length < type.minLength ){
			formEl.className = formEl.className.replace(' '+Form.validClass, '');
			return false;
		} else {
			if(formEl.className.indexOf(' '+Form.validClass) == -1)
			formEl.className += ' '+Form.validClass;
			return true;
		}
	},

	validateEmail : function(formEl){
		var regEx = /^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/;
		var emailTest = regEx.test(formEl.value);
		if (emailTest) {
			if(formEl.className.indexOf(' '+Form.validClass) == -1)
			formEl.className += ' '+Form.validClass;
			return true;
		} else {
			formEl.className = formEl.className.replace(' '+Form.validClass, '');
			return false;
		}
	},		

	getSubmit : function(formID){
		var inputs = document.getElementById(formID).getElementsByTagName('input');
		for(var i = 0; i < inputs.length; i++){
			if(inputs[i].type == 'submit'){
				return inputs[i];
			}
		}
		return false;
	}			

};
</pre>
<p>So this is quite basic but can easily be expanded upon.</p>
<p>To break this down first we create a new property which is just the string name of our 'valid' css class<br />
that when applied to the form field, adds valid effects such as a green border. We also define our two sub-objects, <strong>fname</strong> and <strong>lname</strong>,<br />
so we can define their own properties that can be used by methods elsewhere, these properties are <strong>minLength</strong><br />
 which is the minimum amount of characters these fields can have, <strong>maxLength</strong> which is the max characters<br />
 the field can have and <strong>fieldName</strong> which doesn't actually get used, but could be grabbed for<br />
 things like identifying the field with a user friendly string in an error message (eg. 'First Name field is required.').</p>
<p>Next we create a validateLength method that accepts two arguments: <strong>formEl</strong> the DOM element to validate<br />
and the <strong>type</strong> which refers to one of the sub-object to use (i.e. fname or lname).<br />
This function checks whether the length of the field is between the minLength and maxLength range, if it's not<br />
then we remove our valid class (if it exists) from the element and return false, otherwise if it is then we add the valid class and return true.</p>
<p>Then we have a validateEmail method which accepts a DOM element as an arguement, we then test this DOM elements value against an<br />
email type regular expression; again if it passes we add our class and return true and vice versa.</p>
<p>Finally we have a getSubmit method. This method is given the id of the form and then loops through all input elements inside the specified form<br />
to find which one has a type of submit (type="submit"). The reason for this method is to return the submit button so we can<br />
disable it until the form is ready to submit.</p>
<p>Let's put this validator object to work on a real form. First we need our HTML.</p>
<pre name="code" class="javascript">
    &lt;body&gt;

    &lt;form id="ourForm"&gt;
        &lt;label&gt;First Name&lt;/label&gt;&lt;input type="text" /&gt;&lt;br /&gt;
        &lt;label&gt;Last Name&lt;/label&gt;&lt;input type="text" /&gt;&lt;br /&gt;
        &lt;label&gt;Email&lt;/label&gt;&lt;input type="text" /&gt;&lt;br /&gt;
        &lt;input type="submit" value="submit" /&gt;
    &lt;/form&gt;

    &lt;/body&gt;
</pre>
<p>Now let's access these input objects using JavaScript and validate them when the form submits.</p>
<pre name="code" class="javascript">
addEvent(window, 'load', function(){

	var ourForm = document.getElementById('ourForm');
	var submit_button = Form.getSubmit('ourForm');
	submit_button.disabled = 'disabled';

	function checkForm(){
		var inputs = ourForm.getElementsByTagName('input');
		if(Form.validateLength(inputs[0], Form.fname)){
			if(Form.validateLength(inputs[1], Form.lname)){
				if(Form.validateEmail(inputs[2])){ 					 

						submit_button.disabled = false;
						return true;

				}
			}
		}

		submit_button.disabled = 'disabled';
		return false;

	};

	checkForm();
	addEvent(ourForm, 'keyup', checkForm);
	addEvent(ourForm, 'submit', checkForm);

});
</pre>
<p>Let's break down this code.</p>
<p>We wrap our code in the addEvent function so when the window is loaded this script runs.<br />
Firstly we grab our form using its ID and put it in a variable named <strong>ourForm</strong>, then we grab<br />
our submit button (using our Form objects getSubmit method) and put it in a variable named <strong>submit_button</strong>,<br />
and then set the submit buttons disabled attribute to 'disabled'.</p>
<p>Next we define a checkForm function. This stores all the inputs inside the form field as an array and we attach it to a<br />
variable named.. you guessed it.. <strong>inputs</strong>!<br />
Then it defines some nested if statements which test each of the fields inside the inputs array against our Form methods.<br />
This is the reason we returned true or false in our methods, so if it returns true, we pass that if statement and continue onto the next,<br />
but if it returns false, we exit the if statements.</p>
<p>Following our function definition, we execute the checkForm function when the page initially loads and also attach the function to a keyup event<br />
and a submit event.</p>
<p>You might be asking, why attach to submit if we disabled the submit button. Well if you are focused on an input field and hit the enter key, it will<br />
attempt to submit the form and we need to test for this, hence the reason our checkForm function returns true (submits the form) or false (doesn't submit form).</p>
<h3>Conclusion</h3>
<p>So we learned how to define the different object types within JavaScript and create properties and methods within them. We also learned a nifty addEvent function and got to use our object in a basic real world example.</p>
<p>This concludes the basics of JavaScript Object Orientation. Hopefully, this may start you on your way to building your own JavaScript library! If you liked this article and are interested in other JavaScript related topics, post them in the comments as I'd be happy to continue writing them. Thanks for reading.</p>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>

<p><a href="http://feedads.g.doubleclick.net/~a/phPpAVTNykPlLzqFvCyVCNQUlkY/0/da"><img src="http://feedads.g.doubleclick.net/~a/phPpAVTNykPlLzqFvCyVCNQUlkY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/phPpAVTNykPlLzqFvCyVCNQUlkY/1/da"><img src="http://feedads.g.doubleclick.net/~a/phPpAVTNykPlLzqFvCyVCNQUlkY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/nettuts?a=3BteVwljtmU:3tOHAKH3Wk8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=3BteVwljtmU:3tOHAKH3Wk8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/nettuts?i=3BteVwljtmU:3tOHAKH3Wk8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=3BteVwljtmU:3tOHAKH3Wk8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/nettuts?i=3BteVwljtmU:3tOHAKH3Wk8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=3BteVwljtmU:3tOHAKH3Wk8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/nettuts?i=3BteVwljtmU:3tOHAKH3Wk8:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=3BteVwljtmU:3tOHAKH3Wk8:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/nettuts/~4/3BteVwljtmU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/javascript-ajax/the-basics-of-object-oriented-javascript/feed/</wfw:commentRss>
		<slash:comments>40</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/javascript-ajax/the-basics-of-object-oriented-javascript/</feedburner:origLink></item>
		<item>
		<title>7AMP – Creating a Development Environment</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/e-vqrjYqKW0/</link>
		<comments>http://net.tutsplus.com/tutorials/php/7amp-creating-a-development-environment/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 16:51:09 +0000</pubDate>
		<dc:creator>Dan Wellman</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[7amp]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=7660</guid>
		<description><![CDATA[<img src="http://nettuts.s3.amazonaws.com/489_7amp/7amp.png" alt="Windows 7, Apache, Mysql and PHP" />]]></description>
			<content:encoded><![CDATA[<p>Running a local development web server is one of the best ways of learning AJAX; reading up on it is one thing, but being able to pass the raw data back and forth between a browser and  a server is really the <strong>only</strong> way to truly understand what is happening at a fundamental level. To create the dynamic and interactive apps and sites that we&#8217;ve come to know and love, you <strong>need</strong> a development server.</p>
<p>On Windows systems we really have only a few decent options available; we can use Microsoft&#8217;s Internet Information Services (IIS), which is usually bundled with Ultimate or Business versions of Windows, or we can use Apache, the extremely popular open-source alternative. Remember when Microsoft enjoyed a 90% market share of the browser market? Apache is the MS of the web server world and at some points in its illustrious history has enjoyed almost total domination in its respective field.</p>
<p><span id="more-7660"></span></p>
<p>IIS is generally quite easy to configure as it uses a graphical interface and is fairly intuitive, however IIS is geared towards development with the .net framework; .net is a proprietary language and generally you need something like Visual Studio to succeed in building web applications with it. Visual Studio does not come cheap (although free express versions are available and if you&#8217;re really hardcore you could use notepad to write the code) and many people prefer the open-source alternative PHP.</p>
<p>Similarly, MSSql is a perfectly adequate database solution made by Microsoft, but like its other offerings, is also a proprietary technology. Mysql is free, open-source, and very, very popular. It&#8217;s easy to use, robust and scalable and that&#8217;s why many developers prefer it. To create development environment we really want to spend as little as possible so really our choices here are clear &#8211; Apache as the platform, PHP as the server-side language, and Mysql as the storage technology. But getting all these technologies talking to each other is not quite as straight-forward as running a few installers.</p>
<h2>Getting Started</h2>
<p>First of all, we need to download the installers for Apache and Mysql and the files required to run PHP. The installers can be found at the following locations:</p>
<ul>
<li>http://httpd.apache.org/download.cgi</li>
<li>http://dev.mysql.com/downloads/mysql/5.1.html#downloads</li>
</ul>
<p>On the above pages choose the appropriate MSI packages for your platform (e.g. x64 or x32) and requirements (you may as well choose the full SSL version of Apache). With PHP however, we don&#8217;t want the installer, we want the zip file that contains all of the PHP files as there is more in this package than you get with the standard installer. It can be found at the following URL:</p>
<ul>
<li>http://uk2.php.net/get/php-5.2.11-Win32.zip/from/a/mirror</li>
</ul>
<p>There are two different zip files for Windows on the PHP site, make sure you <strong>do not</strong> get the one with NTS (non thread-safe) in the name as this will not work with Apache (which is thread-safe). Before running the installers or unpacking the zip file we just need to do a couple of minor system tasks; we should stop any instant messenger applications temporarily as they can interfere with the Apache installation, and we should disable Windows User Account Control (UAC) as it interferes with the Mysql configuration utility. To disable UAC visit the User Accounts application in the Control Panel:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp1.png" alt="User Accounts"></div>
<p>In the applet set the slider to the bottom setting:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp2.png" alt="UAC"></div>
<p>Click the OK button and confirm the very last UAC notification you should ever receive (w00t!), then restart your machine as directed.</p>
<h3>Installing Apache</h3>
<p>The first thing we need to install is the Apache web server which serves web pages to browsers following HTTP requests, and forms the foundation of our development environment. Run the installer, click the <strong>next</strong> button to get started and accept the license terms.  Click <strong>next</strong> again and you should then see the following screen:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp3.png" alt="Apache Installer 1"></div>
<p>Complete the dialog as shown above and click <strong>next</strong> again; on the following screen choose the <strong>Typical</strong> option:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp4.png" alt="Apache Installer 2"></div>
<p>We can now just keep clicking <strong>next</strong> until the installation occurs. Once finished you should see the Apache icon in the notification area; it should have a green play symbol to indicate that it is running:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp5.png" alt="Apache Icon"></div>
<p>As a consequence of Apache running successfully, we should be able to open a browser, type <strong>http://localhost</strong> in the address bar and see the following message:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp6.png" alt="It works!"></div>
<h2>Configuring Apache</h2>
<p>The web page we&#8217;re seeing is being served from Apache&#8217;s default content-serving directory which is probably located somewhere like this:</p>
<pre name="code" class="php">C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs</pre>
<p>That&#8217;s fine, but it will be a bit of a chore having to dig that deep when we want to add or remove files. We can easily configure Apache to server content from a folder that is closer to hand; create a new directory on your <strong>C</strong> drive and call it <strong>apachesite.</strong></p>
<p>In the Start menu group for Apache there is an option to <strong>Edit the Apache httpd.conf Configuration File</strong>, choose this and a text file will be opened. This is Apache&#8217;s main configuration file; unlike IIS, Apache does not have a GUI for configuration, instead we must edit this text file to make changes to the server. Scroll down to the <strong>Main Server Configuratio</strong>n section, which begins on line 144. On line 177 there should be the <strong>DocumentRoot</strong>  directive, which will be pointing at the directory mentioned above. Change this line so that it points to the directory we created on the <strong>C</strong> drive:</p>
<pre name="code" class="php">DocumentRoot "C:/apachesite"</pre>
<p>Just below this directive are several <strong>Directory</strong> directives; you&#8217;ll need to set the second one so that it points to the same path as the <strong>DocumentRoot</strong>:</p>
<pre name="code" class="php">&lt;Directory "C:/apachesite"></pre>
<p>Save the file and restart Apache which you can do by left-clicking the icon in the notification area and choosing <strong>Apache2.2 &#8594; Restart</strong>. To veryify that it works create a new HTML file called <strong>index.html</strong> in the new directory and request <strong>localhost</strong> from the browser again:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp7.png" alt="It still works!"></div>
<h2>Installing PHP</h2>
<p>Next we can install PHP so that Apache can run PHP files when necessary; create another new directory on the <strong>C</strong> drive and call it <strong>php</strong>, then open the PHP zip that we downloaded and drag the entire contents into the <strong>php</strong> folder. That&#8217;s all we need to do as far as &#8216;installation&#8217; is concerned; all we need to do now is configure Apache to use it.</p>
<h2>Configuring Apache to use PHP</h2>
<p>Edit the <strong>httpd.conf</strong> file again; after all of the <strong>AddModule</strong> directives near start of the file add the following new code:</p>
<pre name="code" class="php">####### PHP Config ###########
LoadModule php5_module "C:/php/php5apache2_2.dll"
AddType application/x-httpd-php .php
PHPIniDir "C:/php"
##############################</pre>
<p>Save the file, but don&#8217;t worry about restarting Apache yet as we need to make a couple more changes and restart the computer anyway.</p>
<h2>Configuring PHP</h2>
<p>Like Apache, PHP relies on file-based configuration; in the <strong>C:\php</strong> folder rename the file called <strong>php.ini-recommended</strong> to <strong>php.ini</strong>. Now we need to add a <strong>Class Variable</strong> to Windows so that it knows where the PHP files reside. You&#8217;ll need to go back to the <strong>Control Panel</strong> and open the <strong>System</strong> applet. On the <strong>Advanced</strong> tab, near the bottom of the dialog is a button called <strong>Environment Variables</strong> &#8211; click this button and a new dialog will open:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp8.png" alt="Environment Variables"></div>
<p>The new dialog is divided into 2 sections; in the bottom section select the line that has <strong>Path</strong> as the <strong>Variable</strong> name (you&#8217;ll need to scroll down a bit) and then click the <strong>Edit</strong> button below the second section to open the editor:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp9.png" alt="Edit"></div>
<p>Go to the end of the <strong>Variable value</strong> line and add the following text to the exsting value:</p>
<pre name="code" class="php">;C:\php\;</pre>
<p>This will map to the <strong>php</strong> folder we created on the <strong>C</strong> drive and which we unpacked the PHP files from the zip file into. It is <strong>very</strong> important that you <em>don&#8217;t remove any of the existing text</em> in the <strong>value</strong> (or other programs on your machine, or your entire machine, may stop working) and that you enter the new text exactly as it appears above. Once this is done click <strong>OK</strong> on the three dialog boxes and restart your computer.</p>
<p>Once your computer has restarted, the Apache icon should still have the green play symbol on it and PHP should be configured successfully. To test it create a page in your text editor and add the following code to it:</p>
<pre name="code" class="php">&lt;?php phpinfo() ?></pre>
<p>Save the new file as <strong>phpinfo.php</strong> in the <strong>C:\apachesit</strong>e folder and then request the page by typing the following address in the browser&#8217;s address bar:</p>
<pre name="code" class="php">http://localhost/phpinfo.php</pre>
<p>Your browser should display the PHP information page:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp10.png" alt="PHP Info"></div>
<p>Success! Now we just need to install Mysql and everything is ready.</p>
<h2>Installing Mysql</h2>
<p>Run the Mysql installer that we downloaded and keep clicking <strong>Next</strong> until you get to the configuration wizard:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp11.png" alt="Mysql Installer 1"></div>
<p>Uncheck the <strong>Register</strong> box and then click the <strong>Finish</strong> button.  Click <strong>next</strong> again and then on the following screen choose the default <strong>Detailed Configuration</strong> option:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp12.png" alt="Mysql Installer 2"></div>
<p>On the next screen choose the <strong>Developer Machine</strong> option:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp13.png" alt="Mysql Installer 3"></div>
<p>After clicking <strong>Next</strong> on the above screen choose the default option again on the following screen:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp14.png" alt="Mysql Installer 4"></div>
<p>Go with the defaults that are selected on the next screen too:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp15.png" alt="Mysql Installer 5"></div>
<p>And again, just go with the default option on the next page:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp16.png" alt="Mysql Installer 6"></div>
<p>The next screen has both options checked, just keep them checked and move along:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp17.png" alt="Mysql Installer 7"></div>
<p>Don&#8217;t worry about checking the <strong>Firewall Exception</strong> box, whether this is required will vary depending on your system and firewall so you can do this in a minute manually if need be. Provided you just want the standard Latin character set you can again just choose the default and click <strong>next</strong>:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp18.png" alt="Mysql Installer 8"></div>
<p>On the next screen keep the defaults, but also check the box to add the executions path to the <strong>Windows Path variable</strong> (we did this manually when configuring PHP):</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp19.png" alt="Mysql Installer 9"></div>
<p>Enter a new password for the <strong>Root</strong> account and then click <strong>Next</strong> again:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp20.png" alt="Mysql Installer 9"></div>
<p>On the final screen click the <strong>Execute</strong> button and the configuration changes will be applied:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp21.png" alt="Mysql Installer 10"></div>
<p>Once the wizard has completed you should see confirmation:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp22.png" alt="Mysql Installer 11"></div>
<p>At this point you should restart your computer again. You aren&#8217;t prompted to but Windows is fickle and the installation may not run correctly if you don&#8217;t do it. So ensure you do.</p>
<h2>Testing Mysql</h2>
<p>Ok, so you&#8217;re back after doing the reboot right? Good. Let&#8217;s just check Mysql is running correctly. In the start menu there should be a <strong>Mysql Command Line Client</strong> application, choose this and enter the password you set when running the Mysql configuration wizard. You should see the following screen:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp23.png" alt="Mysql CLI"></div>
<p>Enter the following command at the prompt:</p>
<pre name="code" class="php">show databases;</pre>
<p>The databases in use should be shown; a <strong>test</strong> database is installed by default:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp24.png" alt="Databases"></div>
<p>Type the command</p>
<pre name="code" class="php">use test;</pre>
<p>The <strong>test</strong> database will be selected:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp25.png" alt="Select Database"></div>
<p>Let&#8217;s create a basic table; type the following command:</p>
<pre name="code" class="php">create table users(name varchar(20), age int);</pre>
<p>This will create a new table called <strong>users</strong> and add two columns to it, one to hold name data consisting of up to 20 variable characters (alphanumeric) and the second to hold age data as an integer. Hit enter and you should get the <strong>Query OK</strong> message to confirm the table was created:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp26.png" alt="Create Table"></div>
<p>To populate the table with some dummy data use the following command:</p>
<pre name="code" class="php">insert into users values('Dan', 31);</pre>
<p>You should get the success message again after you hit enter:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp27.png" alt="Populate Table"></div>
<p>As a final test we can check that the data has been inserted into the table corectly using the <strong>select</strong> command:</p>
<pre name="code" class="php">select * from users;</pre>
<p>Which should show the table and the data we inserted:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp28.png" alt="Table"></div>
<h2>Configuring PHP to talk to Mysql</h2>
<p>All we need to do now is configure PHP to talk to Mysql; earlier on we renamed a file to <strong>php.ini</strong> in the <strong>C:\php folder</strong>, open this file now in a text editor. First of all, scroll down to the <strong>Paths and Directories</strong> section and find the <strong>extension_dir</strong> directive on line 536; change it so that it appears as follows:</p>
<pre name="code" class="php">extension_dir = "./ext"</pre>
<p>Then scroll down to the <strong>Dynamic Extensions</strong> section which begins on line 628. In the <strong>Windows extensions</strong> section remove the semi-colon from in front of the following lines:</p>
<ul>
<li>extension=php_mysql.dll</li>
<li>extension=php_mysqli.dll</li>
</ul>
<p>That&#8217;s all we need to do; save the file and once again restart your machine. After restarting you can check for Mysql support in the <strong>phpinfo.php</strong> page again:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp29.png" alt="PHP Mysql success"></div>
<p>This is pretty much a guarantee of success, but really we should create one more PHP file so that we can test that we can read the data from our database; in a text editor create the following file:</p>
<pre name="code" class="php">&lt;?php

  $user = 'root';
  $password = your_password_here;
  $database = 'test';
  $server = 'localhost';

  $connect = mysql_connect($server, $user, $password);
  $select = mysql_select_db($database, $connect);

  $query = mysql_query('select * from users');
  $data = mysql_fetch_assoc($query);

  echo 'Hi ' .$data['name']. ' you are ' .$data['age'];

  mysql_close($connect);

?></pre>
<p>Save this as <strong>phpmysql.php</strong> in the <strong>C:\apachesite</strong> and request it using your browser; you should see the following message:</p>
<div class="tutorial_image"><img style="max-width: 600px;" src="http://nettuts.s3.amazonaws.com/489_7amp/7amp30.png" alt="Complete"></div>
<p>If this doesn&#8217;t work, try putting your firewall into training mode and seeing if you get a notification asking whether to allow the application when you run the page.</p>
<h2>Summary</h2>
<p>We have now truly succeeded and have the perfect development environment for creating dynamic AJAX-powered pages. Sure, there may be various programs that we can run which will do some or all of the configuration for us, but which may or may not work on the latest version of Windows, but where is the fun in that?! Getting Apache, Mysql and PHP configured manually is an achievement and it gives us the opportunity to learn more about the platforms we&#8217;re using when creating modern web applications.</p>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>

<p><a href="http://feedads.g.doubleclick.net/~a/-amc5yHjWZ2jZe7KVPCZOgUNHGg/0/da"><img src="http://feedads.g.doubleclick.net/~a/-amc5yHjWZ2jZe7KVPCZOgUNHGg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/-amc5yHjWZ2jZe7KVPCZOgUNHGg/1/da"><img src="http://feedads.g.doubleclick.net/~a/-amc5yHjWZ2jZe7KVPCZOgUNHGg/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/nettuts?a=e-vqrjYqKW0:WoWOyRvQDIM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=e-vqrjYqKW0:WoWOyRvQDIM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/nettuts?i=e-vqrjYqKW0:WoWOyRvQDIM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=e-vqrjYqKW0:WoWOyRvQDIM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/nettuts?i=e-vqrjYqKW0:WoWOyRvQDIM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=e-vqrjYqKW0:WoWOyRvQDIM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/nettuts?i=e-vqrjYqKW0:WoWOyRvQDIM:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=e-vqrjYqKW0:WoWOyRvQDIM:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/nettuts/~4/e-vqrjYqKW0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/php/7amp-creating-a-development-environment/feed/</wfw:commentRss>
		<slash:comments>86</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/php/7amp-creating-a-development-environment/</feedburner:origLink></item>
		<item>
		<title>17 Hours of JavaScript from the Masters</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/E4aK2mXHzGo/</link>
		<comments>http://net.tutsplus.com/articles/web-roundups/17-hours-of-javascript-from-the-masters/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 12:00:38 +0000</pubDate>
		<dc:creator>Andrew Burgess</dc:creator>
				<category><![CDATA[Web Roundups]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[john resig]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=7615</guid>
		<description><![CDATA[<img src="http://nettuts.s3.amazonaws.com/487_jsVideos/200.jpg" alt="17 Hours of JavaScript from the Masters" />]]></description>
			<content:encoded><![CDATA[<p>Douglas Crockford. John Resig. Peter-Paul Koch. Nicolas C. Zakas. If you recognize these names, you probably know what they all have in common: they&#8217;re amazingly talented  JavaScript Developers. Today, you&#8217;ll hear from all of them, in this roundup of JavaScript presentations. Be ready to stretch your brain!</p>
<p><span id="more-7615"></span></p>
<h3>1: Javascript: The Good Parts</h3>
<ul>
<li>Length: 1 hour, 3 minutes</li>
<li>Speaker: Douglas Crockford</li>
<li><a href="http://www.crockford.com/codecamp/goodparts.ppt">Slides (powerpoint)</a></li>
</ul>
<p>Is JavaScript a hopeless mess, or a robust and flexible standard? In this presentation, Douglas Crockford, the world&#8217;s foremost authroity on JavaScript, will try and convince you that the language is worth your time. This is a great video, and everyone coming to JavaScript for the first time should watch it! You might also want to check out <a href='http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742/ref=sr_1_1'>Crockford&#8217;s book by the same title</a>. (<a href='http://video.yahoo.com/watch/630959/2974197'>Here&#8217;s another instance of the same talk.</a>)</p>
<div class="tutorial_image">
<object height='385' width='480'><param name='movie' value='http://www.youtube.com/v/hQVTIJBZook&#038;hl=en&#038;fs=1&#038;rel=0' /><param name='allowFullScreen' value='true' /><param name='allowscriptaccess' value='always' /><embed src='http://www.youtube.com/v/hQVTIJBZook&#038;hl=en&#038;fs=1&#038;rel=0' type='application/x-shockwave-flash' allowfullscreen='true' allowscriptaccess='always' height='385' width='480' /><br />
</object>
</div>
<h3>2: The JavaScript Programming Language</h3>
<ul>
<li>Length: 1 hour, 51 minutes</li>
<li>Speaker: Douglas Crockford</li>
<li><a href="http://yuiblog.com/assets/crockford/javascript.zip">Slides (zip)</a></li>
</ul>
<p>This is the first session in Crockford&#8217;s JavaScript Trilogy. In this talk, he&#8217;ll walk you through many of the features in JavaScript, as well as discuss the language itself and some JS programming styles. Here&#8217;s another great watch for newcomers!</p>
<div class="tutorial_image"><object width="512" height="322"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" VALUE="always" /><param name="bgcolor" value="#000000" /><param name="flashVars" value="id=1710507&#038;vid=111593&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w327/111593_320_240.jpeg&#038;embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=1710507&#038;vid=111593&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w327/111593_320_240.jpeg&#038;embed=1" ></embed></object></div>
<div class="tutorial_image"><object width="512" height="322"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" VALUE="always" /><param name="bgcolor" value="#000000" /><param name="flashVars" value="id=1710553&#038;vid=111594&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w326/111594_320_240.jpeg&#038;embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=1710553&#038;vid=111594&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w326/111594_320_240.jpeg&#038;embed=1" ></embed></object></div>
<div class="tutorial_image"><object width="512" height="322"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" VALUE="always" /><param name="bgcolor" value="#000000" /><param name="flashVars" value="id=1710607&#038;vid=111595&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w326/111595_320_240.jpeg&#038;embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=1710607&#038;vid=111595&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w326/111595_320_240.jpeg&#038;embed=1" ></embed></object></div>
<div class="tutorial_image"><object width="512" height="322"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" VALUE="always" /><param name="bgcolor" value="#000000" /><param name="flashVars" value="id=1710658&#038;vid=111596&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w326/111596_320_240.jpeg&#038;embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=1710658&#038;vid=111596&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w326/111596_320_240.jpeg&#038;embed=1" ></embed></object></div>
<h3>3: An Inconvenient API: The Theory of the DOM</h3>
<ul>
<li>Length: 1 hour, 18 minutes</li>
<li>Speaker : Douglas Crockford</li>
<li><a href="http://yuiblog.com/assets/crockford/theory.zip">Slides (zip)</a></li>
</ul>
<p>While this video isn&#8217;t focused on JavaScript, it&#8217;s the second part of Douglas Crockford&#8217;s JavaScript Trilogy. You&#8217;ll hear about the browser, why it is the way it is, and a few of the key concepts behind it. Of course, it&#8217;s all very relevant to JavaScript Developers.</p>
<div class="tutorial_image"><object width="512" height="322"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" VALUE="always" /><param name="bgcolor" value="#000000" /><param name="flashVars" value="id=992708&#038;vid=111582&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w326/111582_320_240.jpeg&#038;embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=992708&#038;vid=111582&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w326/111582_320_240.jpeg&#038;embed=1" ></embed></object></div>
<div class="tutorial_image"><object width="512" height="322"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" VALUE="always" /><param name="bgcolor" value="#000000" /><param name="flashVars" value="id=996002&#038;vid=111583&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w327/111583_100_70.jpeg%3Fx%3D158%26y%3D111%26sig%3DG2f65fsDiJybzRbHkElMzw--&#038;embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=996002&#038;vid=111583&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w327/111583_100_70.jpeg%3Fx%3D158%26y%3D111%26sig%3DG2f65fsDiJybzRbHkElMzw--&#038;embed=1" ></embed></object></div>
<div class="tutorial_image"><object width="512" height="322"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" VALUE="always" /><param name="bgcolor" value="#000000" /><param name="flashVars" value="id=996008&#038;vid=111584&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w326/111584_320_240.jpeg&#038;embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=996008&#038;vid=111584&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w326/111584_320_240.jpeg&#038;embed=1" ></embed></object></div>
<h3>4: Advanced JavaScript</h3>
<ul>
<li>Length: 1 hour, 7 minutes</li>
<li>Speaker: Douglas Crockford</li>
<li><a href="http://yuiblog.com/assets/crockford/advancedjavascript.zip">Slides (zip)</a></li>
</ul>
<p>This is the final installment to Crockford&#8217;s trilogy. Moving up to advanced concepts, this video will introduce you to topics such as inheritance, debugging, and efficiency.</p>
<div class="tutorial_image"><object width="512" height="322"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" VALUE="always" /><param name="bgcolor" value="#000000" /><param name="flashVars" value="id=1027823&#038;vid=111585&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w327/111585_320_240.jpeg&#038;embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=1027823&#038;vid=111585&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w327/111585_320_240.jpeg&#038;embed=1" ></embed></object></div>
<div class="tutorial_image"><object width="512" height="322"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" VALUE="always" /><param name="bgcolor" value="#000000" /><param name="flashVars" value="id=1027832&#038;vid=111586&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w327/111586_320_240.jpeg&#038;embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=1027832&#038;vid=111586&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w327/111586_320_240.jpeg&#038;embed=1" ></embed></object></div>
<div class="tutorial_image"><object width="512" height="322"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" VALUE="always" /><param name="bgcolor" value="#000000" /><param name="flashVars" value="id=1027854&#038;vid=111587&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w327/111587_100_70.jpeg%3Fx%3D158%26y%3D111%26sig%3DWCEKic7NXxyzthKrgFK47Q--&#038;embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=1027854&#038;vid=111587&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/i/us/sch/cn/v/v0/w327/111587_100_70.jpeg%3Fx%3D158%26y%3D111%26sig%3DWCEKic7NXxyzthKrgFK47Q--&#038;embed=1" ></embed></object></div>
<h3>5: Games, Performance, TestSwarm</h3>
<ul>
<li>Length: 1 hour, 11 minutes</li>
<li>Speaker: John Resig</li>
<li><a href="http://www.slideshare.net/jeresig/performance-games-and-distributed-testing-in-javascript">Slides (slideshare)</a></li>
</ul>
<p>John Resig, the creator of jQuery, knows what he&#8217;s talking about. In this presentation, which he gave at JSConf 2009, he talked about measuring performance in JavaScript (including an intro to the pros and cons of benchmarking), as well as JavaScript games and distributed testing.</p>
<div class="tutorial_image">
	<object width="600" height="330"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5284172&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5284172&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="330"></embed></object>
</div>
<div class="tutorial_image">
<object width="600" height="330"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5289775&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5289775&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="330"></embed></object>
</div>
<h3>6: Speed Up Your JavaScript</h3>
<ul>
<li>Length: 56 minutes</li>
<li>Speaker: Nicholas C. Zakas</li>
<li><a href="http://www.slideshare.net/nzakas/speed-up-your-javascript">Slides (slideshare)</a></li>
</ul>
<p>Nicolas Zakas is the author of &#8220;Professional JavaScript for Developers&#8221; and co-author of &#8220;Professional Ajax.&#8221; This talk is all about performance, and you&#8217;ll hear the low down in the areas of scope, data access, loops, and the DOM.</p>
<div class="tutorial_image">
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/mHtdZgou0qU&#038;hl=en&#038;fs=1&#038;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/mHtdZgou0qU&#038;hl=en&#038;fs=1&#038;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>
</div>
<h3>7: Best Practices in JavaScript Library Design (or Building a JavaScript Library)</h3>
<ul>
<li>Length: 1 hour, 1 minute</li>
<li>Speaker: John Resig</li>
<li><a href="http://www.slideshare.net/jeresig/building-a-javascript-library">Slides (slideshare)</a></li>
</ul>
<p>Ever wanted to build your own JavaScript Library? John Resig talks about the princples of doing so in this Google Tech Talk. He covers the whole spectrum from designing a good API to maintaining the library, with implementing, debugging, and testing (just to name a few!) in the middle.</p>
<div class="tutorial_image">
	<embed id='VideoPlayback' src='http://video.google.com/googleplayer.swf?docid=-474821803269194441&#038;hl=en&#038;fs=true' style='width:400px;height:326px' allowFullScreen='true' allowScriptAccess='alway's type='application/x-shockwave-flash'></embed></div>
<h3>8: Drop-In JavaScript Performance (or Perfomance Improvements in Browsers)</h3>
<ul>
<li>Length: 1 hour, 2 minutes</li>
<li>Speaker: John Resig</li>
<li><a href="http://www.slideshare.net/jeresig/performance-improvements-in-browsers">Slides (slideshare)</a></li>
</ul>
<p>In this video, John Resig goes through some of the latest and greatest in the world of JavaScript and DOM performance. Although this type of talk goes out of data somewhat quickly (the browser speed stats are pretty stale), there&#8217;s still a lot to look forward to here! </p>
<div class="tutorial_image">
	<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/bsad6dr8Kzo&#038;hl=en&#038;fs=1&#038;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/bsad6dr8Kzo&#038;hl=en&#038;fs=1&#038;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>
</div>
<h3>9: JavaScript Events</h3>
<ul>
<li>Length: 55 Minutes</li>
<li>Speaker: Peter-Paul Koch</li>
<li><a href="http://quirksmode.org/presentations/sf09/yahoo.pdf">Slides (pdf)</a></li>
</ul>
<p>Peter-Paul Koch is a professional front-end engineer from the Netherlands. He&#8217;s done an enormous ammount of CSS and JavaScipt browser testing and has <a href="http://quirksmode.org/compatibility.html">published the charts</a> on his website, Quirksmode. This talk is a JavaScript Events Theory Class given at Yahoo!.</p>
<div class="tutorial_image"><object width="512" height="322"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" VALUE="always" /><param name="bgcolor" value="#000000" /><param name="flashVars" value="id=13163203&#038;vid=4943143&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/p/i/bcst/videosearch/8540/84355927.jpeg&#038;embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.46" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=13163203&#038;vid=4943143&#038;lang=en-us&#038;intl=us&#038;thumbUrl=http%3A//l.yimg.com/a/p/i/bcst/videosearch/8540/84355927.jpeg&#038;embed=1" ></embed></object></div>
<h3>10: Scalable JavaScript Application Architecture</h3>
<ul>
<li>Length: 52 minutes</li>
<li>Speaker: Nicolas C. Zakas</li>
<li><a href="http://www.slideshare.net/nzakas/scalable-javascript-application-architecture">Slides (slideshare)</a></li>
</ul>
<p>This is a great theory presentation; Nicolas Zakas talks about JavaScript architecture. You&#8217;ll learn how to separate modules on a page, how to get them to interact with other modules that they don&#8217;t know exist, and more JS goodness.</p>
<div class="tutorial_image"><object width="576" height="324"><param name="movie" value="http://d.yimg.com/m/up/ypp/default/player.swf"></param><param name="flashVars" value="vid=15614367&#038;"></param><param name="allowfullscreen" value="true"></param><param name="wmode" value="transparent"></param><embed width="576" height="324" allowFullScreen="true" src="http://d.yimg.com/m/up/ypp/default/player.swf" type="application/x-shockwave-flash" flashvars="vid=15614367&#038;"></embed></object></div>
<h3>11: ECMA Harmony and the Future of JavaScript</h3>
<ul>
<li>Length: 1 hour, 6 minutes</li>
<li>Speaker: Brendon Eich</li>
</ul>
<p>You may not have heard of Brendon Eich before, but he&#8217;s the man who started it all: the creator of JavaScript. In this talk, he goes into a bit of language history, as well as talking about what&#8217;s coming in the ECMAScript 5 proposal.</p>
<div class="tutorial_image">
<object width="576" height="324"><param name="movie" value="http://d.yimg.com/m/up/ypp/default/player.swf"></param><param name="flashVars" value="vid=16429147&#038;"></param><param name="allowfullscreen" value="true"></param><param name="wmode" value="transparent"></param><embed width="576" height="324" allowFullScreen="true" src="http://d.yimg.com/m/up/ypp/default/player.swf" type="application/x-shockwave-flash" flashvars="vid=16429147&#038;"></embed></object>
</div>
<h3>12: The State and Future of JavaScript</h3>
<ul>
<li>Length: 55 minutes</li>
<li>Speaker: Douglas Crockford</li>
<li><a href="http://www.yuiblog.com/assets/crockford-yuiconf2009-stateandfuture.ppt">Slides (powerpoint)</a></li>
</ul>
<p>JavaScript hasn&#8217;t changed in almost a decade; so what&#8217;s going on? In this talk, Douglas Crockford explains some of JavaScript&#8217;s history, the battles fought in the past years, and what the standard could look like in the (relatively) near future. Yes, this is quite similar to Brendan&#8217;s talk (which was actually given the evening before), but this one has that Crockford theoretical slant to it. </p>
<div class="tutorial_image"><object width="576" height="324"><param name="movie" value="http://cosmos.bcst.yahoo.com/up/ypp/default/player.swf"></param><param name="flashVars" value="vid=16429131&#038;"></param><param name="allowfullscreen" value="true"></param><param name="wmode" value="transparent"></param><embed width="576" height="324" allowFullScreen="true" src="http://cosmos.bcst.yahoo.com/up/ypp/default/player.swf" type="application/x-shockwave-flash" flashvars="vid=16429131&#038;"></embed></object></div>
<h3>Others</h3>
<p>There are many videos and presentations out there that aren&#8217;t just about JavaScript, but certainly involve it. Check these out:</p>
<h4><a href="http://developer.yahoo.com/yui/theater/video.php?v=crockford-json">The JSON Saga</a></h4>
<ul>
<li>Length: 49 minutes</li>
<li>Speaker: Douglas Crockford</li>
<li><a href="http://yuiblog.com/assets/crockford-json.zip">Slides</a></li>
</ul>
<h4><a href="http://developer.yahoo.com/yui/theater/video.php?v=isaac-ssjs">Server-Side JavaScript</a></h4>
<ul>
<li>Length: 23 minutes</li>
<li>Speakers: Isaac Schlueter and Matt Hackett</li>
</ul>
<h4><a href="http://video.yahoo.com/watch/410472/2391234">Advanced JavaScript with Libraries</a>, and <a href="http://video.yahoo.com/watch/412541/2395771">part 2</a></h4>
<ul>
<li>Length: 56 minutes</li>
<li>Speaker: John Resig</li>
</ul>
<h4><a href="http://webdirections.org/podcasts/WD07/WDN-08-Douglas-Crockford.mp3">Ajax Security (mp3 link)</a></h4>
<ul>
<li>Length: 51 minutes</li>
<li>Speaker: Douglas Crockford</li>
<li><a href="http://www.slideshare.net/douglascrockford/ajax-security-255587">Slides (slideshare)</a> and <a href="http://javascript.crockford.com/security.ppt">(powerpoint)</a></li>
</ul>
<h4><a href="http://video.yahoo.com/watch/4403981/11812238">The DOM is a Mess</a></h4>
<ul>
<li>Length: 1 hour, 12 minutes</li>
<li>Speaker: John Resig</li>
<li><a href="http://www.slideshare.net/jeresig/the-dom-is-a-mess-yahoo">Slides (slideshare)</a></li>
</ul>
<h3>That&#8217;s It!</h3>
<p>Well, that&#8217;s all I&#8217;ve got for you today, but I&#8217;ve probably missed your favourite; share it in the comments!</p>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>

<p><a href="http://feedads.g.doubleclick.net/~a/AFv_9SnJhe8qqdHyF9TNX-NKn3k/0/da"><img src="http://feedads.g.doubleclick.net/~a/AFv_9SnJhe8qqdHyF9TNX-NKn3k/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/AFv_9SnJhe8qqdHyF9TNX-NKn3k/1/da"><img src="http://feedads.g.doubleclick.net/~a/AFv_9SnJhe8qqdHyF9TNX-NKn3k/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/nettuts?a=E4aK2mXHzGo:Je_mx9Fn3pc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=E4aK2mXHzGo:Je_mx9Fn3pc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/nettuts?i=E4aK2mXHzGo:Je_mx9Fn3pc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=E4aK2mXHzGo:Je_mx9Fn3pc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/nettuts?i=E4aK2mXHzGo:Je_mx9Fn3pc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=E4aK2mXHzGo:Je_mx9Fn3pc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/nettuts?i=E4aK2mXHzGo:Je_mx9Fn3pc:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=E4aK2mXHzGo:Je_mx9Fn3pc:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/nettuts/~4/E4aK2mXHzGo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/articles/web-roundups/17-hours-of-javascript-from-the-masters/feed/</wfw:commentRss>
		<slash:comments>55</slash:comments>
<enclosure url="http://webdirections.org/podcasts/WD07/WDN-08-Douglas-Crockford.mp3" length="24723120" type="audio/mpeg" />
		<feedburner:origLink>http://net.tutsplus.com/articles/web-roundups/17-hours-of-javascript-from-the-masters/</feedburner:origLink></item>
		<item>
		<title>Learn how to AJAXify Comment Forms</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/8vcOZ8bNinI/</link>
		<comments>http://net.tutsplus.com/videos/screencasts/learn-how-to-ajaxify-comment-forms/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 18:28:28 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[Screencasts]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[comments]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[video tutorial]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=7598</guid>
		<description><![CDATA[<img src="http://nettuts.s3.amazonaws.com/486_ajaxComments/200x200.jpg" alt="Learn how to AJAXify your Comment Forms" />]]></description>
			<content:encoded><![CDATA[<p>
In this week&#8217;s video tutorial, I&#8217;ll teach you how to take a simple, boring contact form and add some animations and an AJAX post request to submit the form to your MySQL database asynchronously. </p>
<p>In addition, we&#8217;ll also implement a bit of server and client-side validation to better secure our data. When submitting to the database, we&#8217;ll also review the most secure methods, including the use of prepared statements, which will bind the necessary values to each query, rather than embed them.
</p>
<p><span id="more-7598"></span></p>
<div class="tutorial_image">
<a href="http://nettuts.s3.amazonaws.com/486_ajaxComments/ajaxComment.zip"><img src="http://nettuts.com/wp-content/themes/nettuts/site_images/button_src_nm.jpg"></a>
</div>
<h3>Screencast</h3>
<div class="tutorial_image">
<object width="600" height="450"><param name="movie" value="http://content.screencast.com/users/Nettuts/folders/Camtasia/media/91fdb112-180d-4153-a365-670e3e368ef4/mp4h264player.swf"></param><param name="quality" value="high"></param><param name="bgcolor" value="#FFFFFF"></param><param name="flashVars" value="thumb=http://content.screencast.com/users/Nettuts/folders/Camtasia/media/91fdb112-180d-4153-a365-670e3e368ef4/FirstFrame.jpg&#038;containerwidth=600&#038;containerheight=450&#038;content=http://content.screencast.com/users/Nettuts/folders/Camtasia/media/91fdb112-180d-4153-a365-670e3e368ef4/AJAX%20Comments.mp4&#038;advseek=true"></param><param name="allowFullScreen" value="true"></param><param name="scale" value="showall"></param><param name="allowScriptAccess" value="always"></param><param name="base" value="http://content.screencast.com/users/Nettuts/folders/Camtasia/media/91fdb112-180d-4153-a365-670e3e368ef4/"></param> <embed src="http://content.screencast.com/users/Nettuts/folders/Camtasia/media/91fdb112-180d-4153-a365-670e3e368ef4/mp4h264player.swf" quality="high" bgcolor="#FFFFFF" width="600" height="450" type="application/x-shockwave-flash" allowScriptAccess="always" flashVars="thumb=http://content.screencast.com/users/Nettuts/folders/Camtasia/media/91fdb112-180d-4153-a365-670e3e368ef4/FirstFrame.jpg&#038;containerwidth=600&#038;containerheight=450&#038;content=http://content.screencast.com/users/Nettuts/folders/Camtasia/media/91fdb112-180d-4153-a365-670e3e368ef4/AJAX%20Comments.mp4&#038;advseek=true" allowFullScreen="true" base="http://content.screencast.com/users/Nettuts/folders/Camtasia/media/91fdb112-180d-4153-a365-670e3e368ef4/" scale="showall"></embed></object>
</div>
<p><em>*Note &#8211; please forgive me, but I had a slight cold when recording this. I apologize if my words are a bit mumbled. </em></p>
<h3>Other Viewing Options</h3>
<ul>
<li><a href="http://blip.tv/file/2817301?file_type=flv"> FLV/Download Version</a></li>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?i=60856588&#038;id=291173544">iTunes Version/Download</a></li>
</ul>
<h3>Conclusion</h3>
<div class="tutorial_image">
   <img src="http://nettuts.s3.amazonaws.com/486_ajaxComments/example.jpg" alt="Example" />
</div>
<p>
This screencast demonstrated just one way to animate your contact forms. Truthfully, it&#8217;s probably a bit too much for a regular site! <img src='http://net.tutsplus.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  But we&#8217;re here to have fun with it. If you decide to implement something like this into your own site, perhaps a more toned down version, please do leave a comment with a link to the page for our review!
</p>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>

<p><a href="http://feedads.g.doubleclick.net/~a/kGOpXz0swJY9LB7M2BAuvXJ9-Ps/0/da"><img src="http://feedads.g.doubleclick.net/~a/kGOpXz0swJY9LB7M2BAuvXJ9-Ps/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/kGOpXz0swJY9LB7M2BAuvXJ9-Ps/1/da"><img src="http://feedads.g.doubleclick.net/~a/kGOpXz0swJY9LB7M2BAuvXJ9-Ps/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/nettuts?a=8vcOZ8bNinI:BN3zhlQuJmA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=8vcOZ8bNinI:BN3zhlQuJmA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/nettuts?i=8vcOZ8bNinI:BN3zhlQuJmA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=8vcOZ8bNinI:BN3zhlQuJmA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/nettuts?i=8vcOZ8bNinI:BN3zhlQuJmA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=8vcOZ8bNinI:BN3zhlQuJmA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/nettuts?i=8vcOZ8bNinI:BN3zhlQuJmA:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=8vcOZ8bNinI:BN3zhlQuJmA:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/nettuts/~4/8vcOZ8bNinI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/videos/screencasts/learn-how-to-ajaxify-comment-forms/feed/</wfw:commentRss>
		<slash:comments>70</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/videos/screencasts/learn-how-to-ajaxify-comment-forms/</feedburner:origLink></item>
		<item>
		<title>Book Review: Zend Framework 1.8 Web Application Development</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/FIuUjkesY5U/</link>
		<comments>http://net.tutsplus.com/articles/reviews/book-review-zend-framework-1-8-web-application-development/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 10:01:02 +0000</pubDate>
		<dc:creator>Fred Wu</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[book review]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[model view controller]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[packt]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php framework]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[zend]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=7330</guid>
		<description><![CDATA[<img src="http://nettuts.s3.amazonaws.com/485_review/200x200.jpg" alt="Book Review: Zend Framework 1.8 Web Application Development" />]]></description>
			<content:encoded><![CDATA[<p>If you are looking into buying a book to learn about <a href="http://framework.zend.com/">Zend Framework</a>, chances are you are already set on using Zend Framework to build your next project. Today, we will be looking at <em><a href="http://www.packtpub.com/zend-framework-1-8-web-application-development/book">Zend Framework 1.8 Web Application Development</a></em> by <em>Keith Pope</em>, published by <em><a href="http://www.packtpub.com/">Packt Publishing</a></em>.</p>
<p><span id="more-7330"></span></p>
<p>First of all, you&#8217;ll notice that this book is based on Zend Framework version 1.8, and as of writing this review, the latest stable release of Zend Framework is 1.9.4. This is not an issue, because 1.9, even though it brings new features such as PHP 5.3 compatibility and RESTful web services, does not change its structure or any part of the system that might have impact on your learning.</p>
<div class="tutorial_image"><a href="http://www.packtpub.com/zend-framework-1-8-web-application-development/book"><br />
<img src="https://www.packtpub.com/images/full/1847194222.jpg" alt="Zend Framework 1.8 Web Application Development" /><br />
</a></div>
<h3>Flow of the Book</h3>
<p>The flow of this book is heavily inspired by the famous Ruby on Rails book, <em><a href="http://www.pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition">Agile Web Development with Rails</a></em>, where the author invites you to join the process of building a demo application, which in both cases is a shopping cart system. Judging by the feedback of the Rails book, most people feel quite comfortable learning a framework this way, some don&#8217;t. I guess if you are not a fan of following a defined learning structure, this book probably isn&#8217;t for you.</p>
<h3>Short but Sweet</h3>
<p>It is a relatively short book, with only around 350 pages. As a result, this book expects you to be comfortable with working with PHP 5 and have a solid grasp of Object-Oriented Programming. If you aren&#8217;t already familiar with PHP, or PHP 5&#8217;s OOP features, I highly recommend you to polish up the said skills.</p>
<h3>MVC Still Rules</h3>
<p>The first two chapters of the book focus on the MVC (<a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller">Model-View-Controller</a>) pattern. As the author mentions at the start of the book, Zend Framework is a loosely coupled framework; it does not enforce the MVC principle. However, given the popularity of MVC within the web development community, it is definitely worth while to learn how to write an application in MVC. Chapter one explains the basics of MVC whilst chapter two explains the request/route/dispatcher/response family. These two chapters will set up the foundation nicely for you and get you to understand the basic structure of a Zend Framework powered MVC application.</p>
<h3>Adventure of the Store-Front App</h3>
<p>Chapter three to nine contain the actual &#8216;adventure&#8217; where you as the reader will be riding along with the author on the journey of creating a store-front/shopping-cart application. During the process, the author tells you not only what to do, but also why to do them. A good example is the &#8216;fat controller skinny model&#8217; vs &#8217;skinny controller vs fat model&#8217; comparison, the book illustrates each and tells you why you should stick with the latter.</p>
<p>Chapter ten wraps up the store-front application with some more common tasks such as bootstrapping modules and sharing common application elements.</p>
<h3>Code Optimization, Caching and Testing</h3>
<p>Chapter eleven touches on a very practical topic: code optimization and caching. This is especially beneficial if you&#8217;re to run a large volume web application or if you have limited hardware resources. Pay special attention to the <em>Zend_Cache</em> section as the author tells you how to integrate it effectively in your application in order to achieve the best result.</p>
<p>The last chapter, chapter twelve, introduces you to <em>Zend_Test</em>, a testing framework that utilizes <a href="http://www.phpunit.de/">PHPUnit</a>.</p>
<h3>Verdict</h3>
<p>To wrap the review up, I think this is an excellent book on Zend Framework provided you:</p>
<ul>
<li>already have a good understanding of PHP;</li>
<li>already have a good understanding of OOP;</li>
<li>can follow the rather forceful learning flow;</li>
<li>know how to learn with initiative (e.g. do your own research!).</li>
</ul>
<p>This book sits well in the market, as it aims primarily at web professionals who most likely are already experienced with PHP and perhaps some other PHP frameworks, and don&#8217;t have time to read books with 1000&#8217;s of pages.</p>
<p>You may purchase this book via <a href="http://www.packtpub.com/zend-framework-1-8-web-application-development/book">Packt Publishing&#8217;s website</a>.</p>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>

<p><a href="http://feedads.g.doubleclick.net/~a/_YPdXfxV4DaI415qf8242c47if0/0/da"><img src="http://feedads.g.doubleclick.net/~a/_YPdXfxV4DaI415qf8242c47if0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_YPdXfxV4DaI415qf8242c47if0/1/da"><img src="http://feedads.g.doubleclick.net/~a/_YPdXfxV4DaI415qf8242c47if0/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/nettuts?a=FIuUjkesY5U:578aUt3Czf4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=FIuUjkesY5U:578aUt3Czf4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/nettuts?i=FIuUjkesY5U:578aUt3Czf4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=FIuUjkesY5U:578aUt3Czf4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/nettuts?i=FIuUjkesY5U:578aUt3Czf4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=FIuUjkesY5U:578aUt3Czf4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/nettuts?i=FIuUjkesY5U:578aUt3Czf4:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=FIuUjkesY5U:578aUt3Czf4:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/nettuts/~4/FIuUjkesY5U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/articles/reviews/book-review-zend-framework-1-8-web-application-development/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/articles/reviews/book-review-zend-framework-1-8-web-application-development/</feedburner:origLink></item>
		<item>
		<title>Inside the Mind of ThemeForest’s Top Selling Author</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/5l9YZXNj0lg/</link>
		<comments>http://net.tutsplus.com/articles/interviews/inside-the-mind-of-themeforests-top-selling-author/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 12:33:03 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[Interviews]]></category>
		<category><![CDATA[interview]]></category>
		<category><![CDATA[kriesi]]></category>
		<category><![CDATA[themeforest]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=7579</guid>
		<description><![CDATA[<img src="http://nettuts.s3.amazonaws.com/484_kriesiInterview/200x200.jpg" alt="Inside the Mind of ThemeForest's Top Selling Author" />]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://themeforest.net/user/kriesi">Kriesi</a> is <a href="http://themeforest.net">ThemeForest&#8217;s</a> top selling author; he, last month, broke the record of <a href="http://blog.themeforest.net/site-news/record-holder-for-most-sales-in-a-single-month/">most sales in a single month</a>, across all of the Envato marketplaces! It&#8217;s even more shocking when we consider the fact that he&#8217;s only 27 years old!
</p>
<p>In this interview, we&#8217;ll dive into his work process, and hopefully steal some tips and inspiration! </p>
<p><span id="more-7579"></span></p>
<h4 style="margin-top: 17px;">How long have you been in the web design business? </h4>
<p>
About five years ago, I started the Multimedia and Web Design Course at SAE Vienna in my home country, Austria. Back then, I did mostly Flash stuff (almost every piece of work was REALLY horrible to tell the truth) and I also had some interest in html coding (I loved table design back then <img src='http://net.tutsplus.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ). With every course I took, I lost a little interest in Flash and got more curious about HTML and CSS. When they handed me my Bachelor Degree a few years later, I was pretty decent with HTML and CSS whereas my Flash skills were lousy at best.
</p>
<p>
I did some small projects for an event agency during that time and as soon as I finished College, they offered me a full time Job as a Front-end Developer, which I gladly accepted. I&#8217;m still working at this Agency <img src='http://net.tutsplus.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</p>
<div class="tutorial_image">
<a href="http://themeforest.net/item/twicet-business-portfolio-wordpress-5-in-1/49773"><br />
   <img src="http://nettuts.s3.amazonaws.com/484_kriesiInterview/item1.jpg" alt="" /><br />
</a>
</div>
<h4 style="margin-top: 17px;">When/How did you first come across the Envato marketplaces &#8211; specifically ThemeForest? </h4>
<p>
I was a regular reader of the TUTS-PLUS Websites and therefore was aware that there is a marketplace called ActiveDen, where people sell all this neat Flash stuff; but since I was only a Front-end Developer with HTML, CSS, and some PHP Skills at that time, I didn&#8217;t really bother.
</p>
<p>
When Envato announced the opening of <a href="http://themeforest.net">ThemeForest</a>, I thought I could give it a try, and uploaded my first WordPress theme. The theme flopped really hard and only earned me 30 Bucks during the first month. Out of pure boredom, I created a second theme. <img src='http://net.tutsplus.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>
The second one did a little better, really just a little, but it was enough that I became curious if I could do better with each theme. =)
</p>
<div class="tutorial_image">
<a href="http://themeforest.net/theme_previews/38712-cubit-6-in-1-business-portfolio-theme"><br />
   <img src="http://nettuts.s3.amazonaws.com/484_kriesiInterview/item2.jpg" alt="Cubit" /><br />
</a>
</div>
<h4 style="margin-top: 17px;">You&#8217;ve been particularly successful when it comes to WordPress theme sales. When developing a new item, do you try to plan for PSD, Site Template, and WordPress submissions? Or do you prefer to focus only on one category per design? </h4>
<p>
When I started creating templates, I almost always only planned for the WordPress version. I was thinking that the HTML Templates are far to cheap to earn a good amount of money, which is actually not true.
</p>
<p>
I did this until I invested countless hours into a Wordpress theme which underperformed to a point where I had worked for about 3$/hour for a whole week. Since then, I usually create a HTML template as well, to test if customers like what I  have designed.
</p>
<p>
I still usually don‘t do a PSD version. Unlike other people, I only design to a certain point in Photoshop; many of the small improvements and details that customers see in the final HTML version are added while I code the HTML and CSS.
</p>
<div class="tutorial_image">
<a href="http://themeforest.net/user/Kriesi/portfolio?sort_by=sales_count&#038;type=files&#038;page=1"><br />
   <img src="http://nettuts.s3.amazonaws.com/484_kriesiInterview/portfolio.jpg" alt="Portfolio" /><br />
</a>
</div>
<h4 style="margin-top: 17px;">Though encouraged, we do not require that authors provide support for their items. Do you? Considering how well your items sell, how do you manage to provide quality support to so many different buyers? Any tricks/short-cuts? </h4>
<p>
It is indeed really hard sometimes to support all customers, especially those not familiar with WordPress, but I try to answer all questions. I think it&#8217;s crucial if you want customers to return and buy your themes again. The big problem I guess is providing &#8220;Quality Support&#8221;. I simply don‘t have the time to do more than 90 minutes of theme support each day, so if I see tons of requests on my Author Dashboard, answers usually (and unfortunately) get a little more generic :/
</p>
<p>
There are several &#8220;tricks&#8221; that worked out pretty good for me:
</p>
<ul>
<li>
I am trying to encourage all customers to use the item dashboard and not the mail contact form. That way, other customers benefit from the answers as well and I only have to check one place for requests.
</li>
<li>
Updating the documentation file that comes with the download regularly helps a lot as well. I also save answers that I have given more than 2 or 3 times into a text document for copy/pasting on demand.
</li>
<li>
Overall I can only suggest to find your own method of streamlining support; the best way to cut down support time of course is to create themes and documentation that are so easy to use, that support requests drop to a minimum.
</li>
</ul>
<div class="tutorial_image">
<a href="http://themeforest.net/theme_previews/22741-sleekslide-portfolio-4-in-1"><br />
   <img src="http://nettuts.s3.amazonaws.com/484_kriesiInterview/item3.jpg" alt="Item 3" /><br />
</a>
</div>
<h4 style="margin-top: 17px;">Do you or have you considered selling on the different Envato marketplaces as well? </h4>
<p>
Yes. I have tried to upload a flash file once last Christmas, since I had a pretty neat Santa animation. Those who have checked my portfolio might have already guessed it&#8230; it seems it wasn&#8217;t that neat. ;D
</p>
<div class="tutorial_image">
<a href="http://themeforest.net/item/reflect-portfolio-template/27980"><br />
   <img src="http://nettuts.s3.amazonaws.com/484_kriesiInterview/item4.jpg" alt="Item 4" /><br />
</a>
</div>
<h4 style="margin-top: 17px;">Many successful authors have noted that the biggest advantage to selling their designs through us is that it takes the client completely out of the design process, and instead allows the author full control. Would you agree? Any other advantages? </h4>
<p>
I agree, it is indeed great to be in full control of all decisions. I have worked with too many clients over the past years who thought just because they can use MS Paint they are great designers But you should never underestimate the positive impact of a second opinion when creating your themes. Therefore I almost always ask some of my colleagues at the agency to make suggestions on my designs before I release them.
</p>
<p>
I also love the fact that I don&#8217;t have any deadlines here and can try new stuff with every theme I release <img src='http://net.tutsplus.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</p>
<div class="tutorial_image">
<a href="http://themeforest.net/item/levitation-business-portfolio-4-in-1/58244"><br />
   <img src="http://s3.envato.com/files/170404/images/1_preview.__large_preview.jpg" alt="Levitation" /><br />
</a>
</div>
<h4 style="margin-top: 17px;"> Do you take advantage of our <a href="http://themeforest.net/wiki/referral/referral-program/">referral</a> program, or promote your items in any additional ways to increase sales? </h4>
<p>
Only a little; I promote my themes on my blog and on Twitter when I release them. But since I make postings rarely on my blog, the impact on my sales ain&#8217;t that big.  ;D I will try to post more often in the future when my sites redesign is finally done, but to tell the truth I am not a very persistent writer.
</p>
<div class="tutorial_image">
<a href="http://themeforest.net/item/amplify-5-in-1-portfolio-theme/43491"><br />
   <img src="http://s3.envato.com/files/122695/images/1_Amplify.__large_preview.png" alt="Amplify" /><br />
</a>
</div>
<h4 style="margin-top: 17px;"> Without giving away any of your key techniques, if you could only make one choice, what would be the most important thing to keep in mind when selling on ThemeForest? </h4>
<p>
Study and improve. There are very few authors here that did a great job from the beginning. Almost everyone who is selling a lot nowadays has heavily improved over previous months. I am no exception, I can&#8217;t believe how much I have learned about web design and coding during the last year, and I think that&#8217;s the best weapon we have. Learn from your mistakes, listen to reviewers and customers and improve with every file you release.
</p>
<div class="tutorial_image">
<a href="http://themeforest.net/item/flexy-liquid-admin-skin-7-in-1/46398"><br />
   <img src="http://nettuts.s3.amazonaws.com/484_kriesiInterview/item5.jpg" alt="Item 5" /><br />
</a>
</div>
<h4 style="margin-top: 17px;">A new member signs up with ThemeForest and is hoping to upload his or her first item. Any advice? </h4>
<p>
Use the help of the community to get your items uploaded and to improve yourself. Authors, customers, reviewers, almost everyone here is very helpful; so don‘t hesitate and ask <img src='http://net.tutsplus.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Don‘t give up if an item gets rejected several times, it happened to almost all of us!
</p>
<div class="tutorial_image">
<a href="http://themeforest.net/item/risingstar-4-in-1-business-portfolio-theme/55656"><br />
   <img src="http://nettuts.s3.amazonaws.com/484_kriesiInterview/item6.jpg" alt="RisingStar" /><br />
</a>
</div>
<h4 style="margin-top: 17px;">Final question. What&#8217;s next for you? Any special items planned before the end of the year? </h4>
<p>
I will try to invest more time into my themes, which basically means more themes, hopefully better themes, more updates and better support. I am already in the process of designing the next two items, but it&#8217;s been a very busy month at the agency so I haven&#8217;t been able to release anything new for a while now.
</p>
<p>
Last but not least, I wanted to take the chance and thank everyone who purchased one of my themes! I appreciate it more than you probably can imagine. Earning money here is great of course, but its equally amazing to be part of such a great community!
</p>
<div class="tutorial_image">
<a href="http://themeforest.net/user/kriesi"><br />
   <img src="http://s3.envato.com/files/160552.jpg" alt="Kriesi" /><br />
</a>
</div>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>

<p><a href="http://feedads.g.doubleclick.net/~a/rz-drtUtvdSjIHWKs7bwVvmSLJo/0/da"><img src="http://feedads.g.doubleclick.net/~a/rz-drtUtvdSjIHWKs7bwVvmSLJo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/rz-drtUtvdSjIHWKs7bwVvmSLJo/1/da"><img src="http://feedads.g.doubleclick.net/~a/rz-drtUtvdSjIHWKs7bwVvmSLJo/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/nettuts?a=5l9YZXNj0lg:Au0KIb3kPFQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=5l9YZXNj0lg:Au0KIb3kPFQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/nettuts?i=5l9YZXNj0lg:Au0KIb3kPFQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=5l9YZXNj0lg:Au0KIb3kPFQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/nettuts?i=5l9YZXNj0lg:Au0KIb3kPFQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=5l9YZXNj0lg:Au0KIb3kPFQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/nettuts?i=5l9YZXNj0lg:Au0KIb3kPFQ:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/nettuts?a=5l9YZXNj0lg:Au0KIb3kPFQ:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/nettuts/~4/5l9YZXNj0lg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/articles/interviews/inside-the-mind-of-themeforests-top-selling-author/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/articles/interviews/inside-the-mind-of-themeforests-top-selling-author/</feedburner:origLink></item>
	</channel>
</rss><!--
This site's performance optimized by W3 Total Cache:

W3 Total Cache improves the user experience of your blog by caching
frequent operations, reducing the weight of various files and providing
transparent content delivery network integration.

Learn more about our WordPress Plugins: http://www.w3-edge.com/wordpress-plugins/

Page Caching using memcached
Database Caching 16/25 queries in 0.009 seconds using memcached
Content Delivery Network via 

Served from: psdtutsplus.com @ 2009-11-15 19:33:49 -->
