<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
    <channel>
        <title>New Media Campaigns Blog</title>
        <link>http://www.newmediacampaigns.com/</link>
        <description />
        <language>en-us</language>
        <copyright>Copyright New Media Campaigns.</copyright>
        <lastBuildDate>Wed, 31 Dec 1969 19:00:00 -0500</lastBuildDate>
        <docs>http://blogs.law.harvard.edu/tech/rss</docs>
        <generator>HiFi</generator>
        <managingEditor>accounting@newmediacampaigns.com</managingEditor>
        <webMaster>accounting@newmediacampaigns.com</webMaster>
                    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/NewMediaCampaigns" /><feedburner:info uri="newmediacampaigns" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>NewMediaCampaigns</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
                <title>10 Common Mistakes Political Campaigns Make with Facebook Pages</title>
                <link>http://feedproxy.google.com/~r/NewMediaCampaigns/~3/BdYbuY1dDa8/10-common-mistakes-political-campaigns-make-with-facebook-pages</link>
                <description>&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://files.www.newmediacampaigns.com/blogtp/fbpageobama.png" alt="Obama Facebook Page" width="550" height="336" /&gt;&lt;/p&gt;
&lt;h2&gt;1. Not promoting it &amp;#160;&lt;/h2&gt;
&lt;p&gt;The first tip is super-straightforward, but it is so important yet so often overlooked that it is worth mentioning first. &amp;#160;Once you create a Facebook page it needs to be promoted for voters and supporters to ever find it. Add a link to the page wherever you can online, including the campaign website, Twitter account, and Youtube video descriptions. Additionally, promote the page offline in places like on direct mail, campaign literature, TV ads, and in a candidate&amp;#8217;s stump speeches.&lt;/p&gt;
&lt;p&gt;Targeting Facebook ads to voters and potential supporters can also be tremendously cost-effective, so use some of the money budgeted for online ads (you are, right?) to promote the page.&lt;/p&gt;
&lt;h2&gt;2. Setting up a personal profile for a campaign&lt;/h2&gt;
&lt;p&gt;This is very basic, but I still see many campaigns get this wrong. Campaigns should be using a page, not a personal profile for a candidate.&amp;#160;&lt;/p&gt;
&lt;h2&gt;3. Having both a personal profile and a page for a candidate&lt;/h2&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://files.www.newmediacampaigns.com/blogtp/fb.png" alt="Facebook Profile and Page" width="532" height="192" /&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s the year 2012 and most people are on Facebook, including many candidates. Additionally, many candidates have been on Facebook for years now and accumulated quite a few friends. So the question often pops up on what should be done with a personal profile while a campaign is going on. It's best to simply hide the personal one through the duration of the campaign so voters don&amp;#8217;t get confused trying to decide which place to connect.&lt;/p&gt;
&lt;h2&gt;4. Neglecting to set up a vanity Facebook url (and as soon as possible)&lt;/h2&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://files.www.newmediacampaigns.com/blogtp/Screen_Shot_2012-02-02_at_5.18.42_PM.png" alt="Facebook Username" width="623" height="187" /&gt;&lt;/p&gt;
&lt;p&gt;As soon as a page hits a certain level of &amp;#8220;likes&amp;#8221; (currently 25), a personalized url can be set up for the page that makes it much easier to remember. For instance, the default url for your page will look something like:&amp;#160;&lt;em&gt;http://www.facebook.com/pages/Bob-Smithford/143854752232314&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A personalized Facebook url allows it to be a much simpler:&amp;#160;&lt;em&gt;http://www.facebook.com/bobsmithford.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Also, while this isn&amp;#8217;t always possible, ideally this should be the same as your domain and usernames for every social network you are on. For example, take the Obama campaign: the domain name is &lt;a href="http://www.barackobama.com"&gt;barackobama.com&lt;/a&gt;, the Facebook url is &lt;a href="http://www.facebook.com/barackobama"&gt;facebook.com/barackobama&lt;/a&gt;, the Twitter username is &lt;a href="http://twitter.com/barackobama"&gt;@barackobama&lt;/a&gt;, &amp;#160;and the Youtube username is &lt;a href="http://youtube.com/barackobama"&gt;BarackObama&lt;/a&gt;. Keeping a name the same across platforms makes it much easier for supporters to find the pages.&lt;/p&gt;
&lt;h2&gt;5. Promoting a page on print and TV with just an icon instead of a url&lt;/h2&gt;
&lt;p&gt;On the web you can simply click an icon and it will take you to the website -- but you can&amp;#8217;t do this with a postcard or TV ad, so including a url is import so supporters can find a candidate&amp;#8217;s Facebook page.&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://files.www.newmediacampaigns.com/blogtp/yes.png" alt="Good" width="400" height="200" /&gt;&lt;/p&gt;
&lt;p&gt;In the same way that you wouldn&amp;#8217;t add an icon of a website and tell people to go there without mentioning the url, don't only add a Facebook icon and expect people to find it on their own. Use the personalized url set up for your page and include that on any print or video pieces the campaign puts out.&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://files.www.newmediacampaigns.com/blogtp/yes2.png" alt="Good" width="400" height="200" /&gt;&lt;/p&gt;
&lt;h2&gt;6. Never looking at Facebook Insights&lt;/h2&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://files.www.newmediacampaigns.com/blogtp/fbdemo.png" alt="Facebook demographics" width="500" height="201" /&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve often found campaigns don&amp;#8217;t realize the wealth of information they have access to through the Insights tab on a for the Facebook page. There a wide range of data that can provide insights things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the demographic makeup of those who &amp;#8220;like&amp;#8221; a page&lt;/li&gt;
&lt;li&gt;the best times for posting and the most interacted with type of posts&lt;/li&gt;
&lt;li&gt;the number of people reached through a post&lt;/li&gt;
&lt;li&gt;number of interactions with a post&lt;/li&gt;
&lt;li&gt;how many times a Facebook page has been viewed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;7. Not setting up a custom landing tab&lt;/h2&gt;
&lt;p&gt;Facebook allows a tab other than the wall to be designated as the first tab visitors will see that visit a Facebook page and are not yet fans. &amp;#160;Facebook also gives us the ability to customize a tab specifically how we want it. By combining these two options, campaigns have a great opportunity to convert interested voters into supporters and supporters into donors, volunteers, and more. By default, visitors are shown the wall of a page.&lt;/p&gt;
&lt;p&gt;As an example, take a look at how &lt;a href="https://www.facebook.com/mittromney?sk=app_126201844156923"&gt;Mitt Romney's landing tab is currently set up&lt;/a&gt;. While there is more to it than is probably necessary, it includes valuable elements like an email signup, donation call to action, and more information for voters on why Romney should be President.&lt;/p&gt;
&lt;p&gt;Another example is the signup shown on &lt;a href="https://www.facebook.com/ElizabethWarren?sk=app_311928548822468"&gt;Elizabeth Warren's Facebook page&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://files.www.newmediacampaigns.com/blogtp/warren.png" alt="Warren FB Tab" width="500" height="330" /&gt;&lt;/p&gt;
&lt;h2&gt;8. Auto-posting tweets to Facebook&lt;/h2&gt;
&lt;p&gt;Facebook and Twitter may both be social networks, but both are different from each other in how best to use them. Many campaigns are tempted to autopost tweets from a campaign Twitter account to a Facebook page (or vice versa), but doing doing so removes the ability to customize messaging for the platform.&lt;/p&gt;
&lt;p&gt;There many reasons not to do this, but here are a few:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Facebook allows more characters than Twitter, so it makes sense to take advantage of that and use when necessary&lt;/li&gt;
&lt;li&gt;Facebook gives users the ability to attach links, videos, and picture with a status update. This is lost when autoposting&lt;/li&gt;
&lt;li&gt;It looks lazy to voters&lt;/li&gt;
&lt;li&gt;There's a good chance a campaign will not notice and consequently not respond to any comments people may leave on the Facebook update&lt;/li&gt;
&lt;li&gt;It's much more likely that you will inadvertently barrage users with too many status updates because Twitter is set up for more frequent updates than Facebook&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;9. Using the Facebook page to dump press releases and official statements&lt;/h2&gt;
&lt;p&gt;Keep the press releases and official statements to the reporters and customize your message with a more personal feel for people on Facebook. Press releases are boring, so resist the urge to directly post these to a page. If you do, don't expect fans to actually want to read what is posted. Instead post pictures, videos, and shorter messages that people will actually look at.&lt;/p&gt;
&lt;p&gt;Compare North Carolina Governor &lt;a href="http://www.facebook.com/bevperdue"&gt;Bev Perdue&amp;#8217;s Facebook page&lt;/a&gt; to Florida Governor &lt;a href="https://www.facebook.com/scottforflorida"&gt;Rick Scott&amp;#8217;s Facebook page&lt;/a&gt;. Which do you find more interesting?&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://files.www.newmediacampaigns.com/blogtp/Screen_Shot_2012-02-02_at_4.19.10_PM.png" alt="Perdue FB" width="504" height="424" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://files.www.newmediacampaigns.com/blogtp/Screen_Shot_2012-02-02_at_4.18.50_PM.png" alt="Scott FB" width="523" height="514" /&gt;&lt;/p&gt;
&lt;h2&gt;10. Adding the position sought to the candidate&amp;#8217;s Facebook page title&lt;/h2&gt;
&lt;p&gt;This is something I know other people disagree with, but I strongly believe that the title for a Facebook page should only be the candidate&amp;#8217;s name and nothing more. For example, use &amp;#8220;Frank Miller&amp;#8221; instead of &amp;#8220;Frank Miller for Springfield City Council&amp;#8221; because once Frank Miller gets elected, he will want to keep using the Facebook page but the &amp;#8220;for Springfield City Council&amp;#8221; will no longer be correct. Alternatively, if Frank loses and runs for mayor in two years, the previous page will no longer be able to be used and the campaign will have to start from scratch again.&lt;/p&gt;
&lt;p&gt;Facebook doesn&amp;#8217;t allow changing a page title if there are over 100 likes, and it&amp;#8217;s an awful feeling when you realize the page you worked hard to build to hundreds or thousands of fans is no longer able to be used because the title is incorrect. Keep it simple and stick with solely the candidate&amp;#8217;s name -- in the long run you will be glad.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=BdYbuY1dDa8:tLE3v3T9Sws:IuXuQPol3sE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=BdYbuY1dDa8:tLE3v3T9Sws:IuXuQPol3sE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=BdYbuY1dDa8:tLE3v3T9Sws:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=BdYbuY1dDa8:tLE3v3T9Sws:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=BdYbuY1dDa8:tLE3v3T9Sws:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=BdYbuY1dDa8:tLE3v3T9Sws:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=BdYbuY1dDa8:tLE3v3T9Sws:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=BdYbuY1dDa8:tLE3v3T9Sws:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NewMediaCampaigns/~4/BdYbuY1dDa8" height="1" width="1"/&gt;</description>
                <pubDate>Thu, 02 Feb 2012 16:38:33 -0500</pubDate>
                <guid isPermaLink="false">http://www.newmediacampaigns.com/blog/10-common-mistakes-political-campaigns-make-with-facebook-pages</guid>
                <author>Tyler Pearson</author>
            <feedburner:origLink>http://www.newmediacampaigns.com/blog/10-common-mistakes-political-campaigns-make-with-facebook-pages</feedburner:origLink></item>
                    <item>
                <title>Unveiling our New Case Study Format</title>
                <link>http://feedproxy.google.com/~r/NewMediaCampaigns/~3/_N8mxjznqyY/unveiling-our-new-case-study-format</link>
                <description>&lt;p&gt;&lt;a href="http://www.newmediacampaigns.com/case/north-carolinas-southeast"&gt;&lt;img src="http://files.www.newmediacampaigns.com/case/north-carolinas-southeast-exploring-regional-business-opportunities/NCSE_macbook-7184-process-s600x347.png" alt="" width="600" height="347" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.newmediacampaigns.com/case/ciao-italia"&gt;&lt;img style="float: right; margin: 0 0 20px 20px;" src="http://files.www.newmediacampaigns.com/blog/case-format.jpg" alt="" width="162" height="1059" /&gt;&lt;/a&gt;We've always really liked the way the &lt;a href="http://www.newmediacampaigns.com/portfolio"&gt;portfolio section&lt;/a&gt; of our website works. &amp;#160;Even though we've redesigned our site several times over the years, we've kept the same layout and functionality: a grid of thumbnails that can be filtered by category. This works well because it is easy for prospective clients to find work we've done that interests or is relevant to them. Additionally, the large body of work demonstrates our experience across a wide variety of projects.&lt;/p&gt;
&lt;p&gt;Where it falls short is in showing the detailed approach we take to every project we do. To paint a clearer picture of the way we work on projects, we're now writing up some of them as case studies. &amp;#160;These give a better picture of our process and the thought that goes into each aspect of the site development process. &amp;#160;Additionally, each one contains a &lt;em&gt;beautiful &lt;/em&gt;photo (thanks to &lt;a href="http://twitter.com/markitos57"&gt;@markitos57&lt;/a&gt;) of the website in action.&lt;/p&gt;
&lt;h5&gt;&lt;a href="http://www.newmediacampaigns.com/case/ciao-italia"&gt;Ciao Italia&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;&lt;a href="http://www.newmediacampaigns.com/case/ciao-italia"&gt;&lt;img src="http://files.www.newmediacampaigns.com/case/ciao-italia/ciao_lead-process-s350x203.jpg" alt="" width="350" height="203" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;&lt;a href="http://www.newmediacampaigns.com/case/north-carolinas-southeast"&gt;North Carolina's Southeast&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;&lt;a href="http://www.newmediacampaigns.com/case/north-carolinas-southeast"&gt;&lt;img src="http://files.www.newmediacampaigns.com/case/north-carolinas-southeast-exploring-regional-business-opportunities/NCSE_macbook-7184-process-s350x203.png" alt="" width="350" height="203" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;&lt;a href="http://www.newmediacampaigns.com/case/ward-and-smith-attorneys-at-law"&gt;Ward and Smith&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;&lt;a href="http://www.newmediacampaigns.com/case/ward-and-smith-attorneys-at-law"&gt;&lt;img src="http://files.www.newmediacampaigns.com/case/ward-and-smith-attorneys-at-law/Ward_and_Smith_Lead_P1070777-process-s350x203.png" alt="" width="350" height="203" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=_N8mxjznqyY:DleXxoVRPOo:IuXuQPol3sE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=_N8mxjznqyY:DleXxoVRPOo:IuXuQPol3sE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=_N8mxjznqyY:DleXxoVRPOo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=_N8mxjznqyY:DleXxoVRPOo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=_N8mxjznqyY:DleXxoVRPOo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=_N8mxjznqyY:DleXxoVRPOo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=_N8mxjznqyY:DleXxoVRPOo:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=_N8mxjznqyY:DleXxoVRPOo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NewMediaCampaigns/~4/_N8mxjznqyY" height="1" width="1"/&gt;</description>
                <pubDate>Wed, 25 Jan 2012 14:38:29 -0500</pubDate>
                <guid isPermaLink="false">http://www.newmediacampaigns.com/blog/unveiling-our-new-case-study-format</guid>
                <author>Joel Sutherland</author>
            <feedburner:origLink>http://www.newmediacampaigns.com/blog/unveiling-our-new-case-study-format</feedburner:origLink></item>
                    <item>
                <title>Recap of "Functional Programming" talk at Triangle JS/PHP/MySQL Meetup</title>
                <link>http://feedproxy.google.com/~r/NewMediaCampaigns/~3/3m1w82pMcBE/functional-programming-talk</link>
                <description>&lt;p&gt;Last night I had the pleasure of giving a talk on 'Functional Programming' techniques in JavaScript and PHP with an emphasis on the popular libraries &lt;a href="http://underscorejs.org/"&gt;underscore.js&lt;/a&gt; and &lt;a href="http://brianhaveri.github.com/Underscore.php/"&gt;underscore.php&lt;/a&gt;. The event was the annual joint gathering of the &lt;a href="http://www.meetup.com/Triangle-JavaScript/"&gt;TriangleJS&lt;/a&gt; and &lt;a href="http://www.meetup.com/mysql-144/"&gt;Triangle PHP/MySQL&lt;/a&gt; Meetups.&lt;/p&gt;
&lt;p&gt;&lt;img style="float: right; margin-left: 5px;" src="http://files.www.newmediacampaigns.com/kris-jordan-javascript-talk-process-sc300x250-q90.jpg" alt="Kris Jordan talking JavaScript and PHP" /&gt;&lt;/p&gt;
&lt;p&gt;We started out with some coverage of why functional programming is compelling to learn and what exactly it is. Functional programming, at its roots, is the idea that functions are values so they can be assigned to variables, passed to other functions as arguments, and returned from functions as return values. We looked at some examples of each which are best illustrated in the slide deck linked and embedded below. We hit on some of the facilities provided by the underscore library. Finally, the conclusion of the talk was a live coding session (with only one syntactical error! thank the Live Coding Gods) where we started fleshing out a little, functional SQL-like DSL for querying data in-memory.&lt;/p&gt;
&lt;p&gt;Overall it was a great time and I really appreciate the TriJS / TriPHP&amp;amp;MySQL groups for putting the event together!&lt;/p&gt;
&lt;p&gt;Slides are available on &lt;a href="http://speakerdeck.com/u/krisjordan/p/functional-programming-fundamentals-in-js-php"&gt;SpeakerDeck&lt;/a&gt;. Demo code is available on &lt;a href="https://github.com/KrisJordan/functional-sql-talk-demo-code"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;script type="text/javascript" src="http://speakerdeck.com/embed/4f1f72fc2800eb001f01147b.js"&gt;&lt;/script&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=3m1w82pMcBE:n0VBquvGx_I:IuXuQPol3sE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=3m1w82pMcBE:n0VBquvGx_I:IuXuQPol3sE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=3m1w82pMcBE:n0VBquvGx_I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=3m1w82pMcBE:n0VBquvGx_I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=3m1w82pMcBE:n0VBquvGx_I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=3m1w82pMcBE:n0VBquvGx_I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=3m1w82pMcBE:n0VBquvGx_I:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=3m1w82pMcBE:n0VBquvGx_I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NewMediaCampaigns/~4/3m1w82pMcBE" height="1" width="1"/&gt;</description>
                <pubDate>Wed, 25 Jan 2012 11:54:47 -0500</pubDate>
                <guid isPermaLink="false">http://www.newmediacampaigns.com/blog/functional-programming-talk</guid>
                <author>Kris Jordan</author>
            <feedburner:origLink>http://www.newmediacampaigns.com/blog/functional-programming-talk</feedburner:origLink></item>
                    <item>
                <title>Accept campaign donations with the NGP contribution API</title>
                <link>http://feedproxy.google.com/~r/NewMediaCampaigns/~3/9G8djIfXwLA/accept-campaign-donations-with-the-ngp-contribution-api</link>
                <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;img src="http://files.www.newmediacampaigns.com/blog/accept-donations-with-the-ngp-contribution-api/ngp-api-image.jpg" alt="Screenshot of the NGP login page" width="600" height="200" /&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; This article is a follow-up to an earlier article on our blog about the NGP contribution API written by Eli Van Zoeren. We have since updated the code we use to integrate with NGP's contribution API. Our newest code is explained in this article.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;New Media Campaigns &lt;a href="http://www.newmediacampaigns.com/portfolio#politics"&gt;works with many political clients&lt;/a&gt; that use the robust &lt;a href="http://www.ngpvan.com/"&gt;NGP fundraising and contact management platform&lt;/a&gt;. Unfortunately, the NGP donation API has proven a tough nut to crack due to sparse documentation. However, we&amp;#8217;ve written a PHP class that makes it super easy to integrate with the NGP donation API so you can avoid the hassle and start accepting political campaign donations right away.&lt;/p&gt;
&lt;h2 id="usingthengpdonationclass"&gt;Using the NgpDonation class&lt;/h2&gt;
&lt;p&gt;The NGP donation API exposes a SOAP web service that consumes an XML request and returns an XML response. Our &lt;code&gt;NgpDonation&lt;/code&gt; PHP class provides a human-friendly wrapper around the NGP SOAP API. Accepting contributions with the NGP donation API has never been easier.&lt;/p&gt;
&lt;h3 id="requirethengpdonationclass"&gt;Require the NgpDonation class&lt;/h3&gt;
&lt;p&gt;First, require the &lt;code&gt;NgpDonation&lt;/code&gt; PHP class into your PHP script:&lt;/p&gt;
&lt;pre class="brush:php"&gt;require 'NgpDonation.php';
&lt;/pre&gt;
&lt;h3 id="instantiatethengpdonationclass"&gt;Instantiate the NgpDonation class&lt;/h3&gt;
&lt;p&gt;Next, create an instance of &lt;code&gt;NgpDonation&lt;/code&gt;. The class constructor accepts three arguments:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Your API credentials string provided by NGP.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt; value that will send or not send email notifications to the donor upon receipt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An associative array of donation fields (&lt;a href="#ngp-donation-fields"&gt;see full list&lt;/a&gt;).&lt;/p&gt;
&lt;pre class="brush:php"&gt;$d = new NgpDonation('your-credentials', true, array(
    'FirstName' =&amp;gt; 'John',
    'LastName' =&amp;gt; 'Doe',
    'Address1' =&amp;gt; '100 Elm Street',
    'Zip' =&amp;gt; '12345',
    'Cycle' =&amp;gt; '2012',
    'Amount' =&amp;gt; '50.00',
    'CreditCardNumber' =&amp;gt; '4111111111111111',
    'ExpYear' =&amp;gt; '13',
    'ExpMonth' =&amp;gt; '05'
));&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The NGP API requires that you provide at least these fields (case-sensitive) to collect a donation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FirstName&lt;/li&gt;
&lt;li&gt;LastName&lt;/li&gt;
&lt;li&gt;Address1&lt;/li&gt;
&lt;li&gt;Zip&lt;/li&gt;
&lt;li&gt;Cycle&lt;/li&gt;
&lt;li&gt;Amount&lt;/li&gt;
&lt;li&gt;CreditCardNumber&lt;/li&gt;
&lt;li&gt;ExpYear&lt;/li&gt;
&lt;li&gt;ExpMonth&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A list of all donation fields and field descriptions is available below.&lt;/p&gt;
&lt;h3 id="processdonation"&gt;Process Donation&lt;/h3&gt;
&lt;p&gt;Finally, accept and process the donation like this:&lt;/p&gt;
&lt;pre class="brush:php"&gt;$result = $d-&amp;gt;save();
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;$result&lt;/code&gt; variable will be a boolean value indicating success or failure. If &lt;code&gt;$result&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt;, you should inspect the &lt;code&gt;NgpDonation&lt;/code&gt; instance for reasons why the donation failed.&lt;/p&gt;
&lt;h3 id="errorhandling"&gt;Error Handling&lt;/h3&gt;
&lt;h4 id="missingfieldsortransactionerrors"&gt;Missing Fields or Transaction Errors&lt;/h4&gt;
&lt;p&gt;If you were unable to accept a donation, you may be missing required fields or the credit card may have been declined. Check for errors like this:&lt;/p&gt;
&lt;pre class="brush:php"&gt;if ( $d-&amp;gt;hasErrors() ) {
    $errors = $d-&amp;gt;getErrors();
}
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;$errors&lt;/code&gt; variable will be a one-dimensional array of error messages. Usually, this array will indicate that several required fields are empty or missing.&lt;/p&gt;
&lt;h4 id="soapfault"&gt;SOAP Fault&lt;/h4&gt;
&lt;p&gt;There may also be an error with the SOAP API itself. In this scenario, a &lt;code&gt;SoapFault&lt;/code&gt; exception will be thrown and caught by your &lt;code&gt;NgpDonation&lt;/code&gt; instance. You can check for and inspect the &lt;code&gt;SoapFault&lt;/code&gt; exception like this:&lt;/p&gt;
&lt;pre class="brush:php"&gt;if ( $d-&amp;gt;hasFault() ) {
    $fault = $d-&amp;gt;getFault();
}
&lt;/pre&gt;
&lt;p&gt;In this example, &lt;code&gt;$fault&lt;/code&gt; will be an instance of &lt;code&gt;SoapFault&lt;/code&gt; that you may inspect as needed.&lt;/p&gt;
&lt;h4 id="inspecttheapiresponse"&gt;Inspect the API response&lt;/h4&gt;
&lt;p&gt;If all else fails, you can inspect the XML response from the NGP API with the &lt;code&gt;NgpDonation&lt;/code&gt; instance&amp;#8217;s &lt;code&gt;getResult()&lt;/code&gt; method. This will return a &lt;code&gt;SimpleXMLElement&lt;/code&gt; object.&lt;/p&gt;
&lt;pre class="brush:php"&gt;$result = $d-&amp;gt;getResult();
var_dump($result);
&lt;/pre&gt;
&lt;h2 id="example"&gt;Example&lt;/h2&gt;
&lt;h3 id="htmlform"&gt;HTML Form&lt;/h3&gt;
&lt;pre class="brush:html"&gt;&amp;lt;form action="" method="post" accept-charset="utf-8"&amp;gt;
    &amp;lt;p&amp;gt;
        &amp;lt;label for="FirstName"&amp;gt;First Name&amp;lt;/label&amp;gt;
        &amp;lt;input type="text" 
                  id="FirstName"
                  name="donation[FirstName]"
                  value=""
                  required/&amp;gt;
    &amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;
        &amp;lt;label for="LastName"&amp;gt;Last Name&amp;lt;/label&amp;gt;
        &amp;lt;input type="text" 
                  id="LastName"
                  name="donation[LastName]"
                  value=""
                  required/&amp;gt;
    &amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;
        &amp;lt;label for="Address1"&amp;gt;Address&amp;lt;/label&amp;gt;
        &amp;lt;input type="text"
                  id="Address1"
                  name="donation[Address1]"
                  value=""
                  required/&amp;gt;
    &amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;
        &amp;lt;label for="Zip"&amp;gt;Zip Code&amp;lt;/label&amp;gt;
        &amp;lt;input type="text"
                  id="Zip"
                  name="donation[Zip]"
                  value=""
                  required/&amp;gt;
    &amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;
        &amp;lt;label&amp;gt;Amount&amp;lt;/label&amp;gt;
        &amp;lt;input type="radio" 
                  name="donation[Amount]"
                  value="100"/&amp;gt; $100&amp;lt;br/&amp;gt;
        &amp;lt;input type="radio"
                  name="donation[Amount]"
                  value="500"/&amp;gt; $500&amp;lt;br/&amp;gt;
        &amp;lt;input type="radio"
                  name="donation[Amount]"
                  value="1000"/&amp;gt; $1000
    &amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;
        &amp;lt;label for="CreditCardNumber"&amp;gt;Credit Card Number&amp;lt;/label&amp;gt;
        &amp;lt;input type="text"
                  id="CreditCardNumber"
                  name="donation[CreditCardNumber]"
                  value=""
                  required/&amp;gt;
    &amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;
        &amp;lt;label&amp;gt;Credit Card Expiration&amp;lt;/label&amp;gt;
        &amp;lt;select name="donation[ExpMonth]" required&amp;gt;
            &amp;lt;option value="01"&amp;gt;01 - January&amp;lt;/option&amp;gt;
            &amp;lt;option value="02"&amp;gt;02 - February&amp;lt;/option&amp;gt;
            &amp;lt;option value="03"&amp;gt;03 - March&amp;lt;/option&amp;gt;
            &amp;lt;option value="04"&amp;gt;04 - April&amp;lt;/option&amp;gt;
            &amp;lt;option value="05"&amp;gt;05 - May&amp;lt;/option&amp;gt;
            &amp;lt;option value="06"&amp;gt;06 - June&amp;lt;/option&amp;gt;
            &amp;lt;option value="07"&amp;gt;07 - July&amp;lt;/option&amp;gt;
            &amp;lt;option value="08"&amp;gt;08 - August&amp;lt;/option&amp;gt;
            &amp;lt;option value="09"&amp;gt;09 - September&amp;lt;/option&amp;gt;
            &amp;lt;option value="10"&amp;gt;10 - October&amp;lt;/option&amp;gt;
            &amp;lt;option value="11"&amp;gt;11 - November&amp;lt;/option&amp;gt;
            &amp;lt;option value="12"&amp;gt;12 - December&amp;lt;/option&amp;gt;
        &amp;lt;/select&amp;gt;
        &amp;lt;select name="donation[ExpYear]" required&amp;gt;
            &amp;lt;option value="12"&amp;gt;2012&amp;lt;/option&amp;gt;
            &amp;lt;option value="13"&amp;gt;2013&amp;lt;/option&amp;gt;
            &amp;lt;option value="14"&amp;gt;2014&amp;lt;/option&amp;gt;
        &amp;lt;/select&amp;gt;
    &amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;
        &amp;lt;input type="hidden" name="donation[Cycle]" value="2012"/&amp;gt;
        &amp;lt;input type="submit" value="Donate Now"/&amp;gt;
    &amp;lt;/p&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/pre&gt;
&lt;h3 id="phpscript"&gt;PHP Script&lt;/h3&gt;
&lt;pre class="brush:php"&gt;&amp;lt;?php
require 'NgpDonation.php';
$donation = new NgpDonation('credentials', true, $_POST['donation']);
if ( $donation-&amp;gt;save() ) {
    echo "Thank you for your donation!";
} else {
    if ( $donation-&amp;gt;hasErrors() ) {
        $errors = $donation-&amp;gt;getErrors();
        //Show errors to user
    } else if ($donation-&amp;gt;hasFault() ) {
        $fault = $donation-&amp;gt;getFault();
        //Log SoapFault for review
    } else {
        $result = $donation-&amp;gt;getResult();
        //Log API response for review
    }
}
?&amp;gt;
&lt;/pre&gt;
&lt;h2 id="ngp-donation-fields"&gt;NGP Donation Fields&lt;/h2&gt;
&lt;p&gt;This is a comprehensive list of all possible donation fields you may use to accept donations with NGP&amp;#8217;s API. Required fields are shown in &lt;span style="color: #ff0000;"&gt;red&lt;/span&gt;.&lt;/p&gt;
&lt;h3 id="contributorfields"&gt;Contributor Fields&lt;/h3&gt;
&lt;dl&gt;&lt;dt&gt;&lt;span style="color: #ff0000;"&gt;LastName&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;String. The last name of the donor&lt;/dd&gt;&lt;dt&gt;&lt;span style="color: #ff0000;"&gt;FirstName&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;String. The first name of the donor&lt;/dd&gt;&lt;dt&gt;MiddleName&lt;/dt&gt;&lt;dd&gt;String. The middle name of the donor&lt;/dd&gt;&lt;dt&gt;Prefix&lt;/dt&gt;&lt;dd&gt;String. A prefix for the donor&amp;#8217;s name (e.g. &amp;#8220;Mrs.&amp;#8221;)&lt;/dd&gt;&lt;dt&gt;Suffix&lt;/dt&gt;&lt;dd&gt;String. A suffix for the donor&amp;#8217;s name (e.g &amp;#8220;Ph.D&amp;#8221;)&lt;/dd&gt;&lt;dt&gt;&lt;span style="color: #ff0000;"&gt;Address1&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s street address&lt;/dd&gt;&lt;dt&gt;Address2&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s street address continued&lt;/dd&gt;&lt;dt&gt;Address3&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s street address continued&lt;/dd&gt;&lt;dt&gt;City&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s city&lt;/dd&gt;&lt;dt&gt;State&lt;/dt&gt;&lt;dd&gt;String. The two-letter abbreviation of the donor&amp;#8217;s state or region&lt;/dd&gt;&lt;dt&gt;&lt;span style="color: #ff0000;"&gt;Zip&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s five-digit zip code&lt;/dd&gt;&lt;dt&gt;Salutation&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s salutation&lt;/dd&gt;&lt;dt&gt;Email&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s email address&lt;/dd&gt;&lt;dt&gt;HomePhone&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s home phone number&lt;/dd&gt;&lt;dt&gt;WorkPhone&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s work phone number&lt;/dd&gt;&lt;dt&gt;WorkExtension&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s work phone number extension&lt;/dd&gt;&lt;dt&gt;FaxPhone&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s fax number&lt;/dd&gt;&lt;dt&gt;Employer&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s employer name&lt;/dd&gt;&lt;dt&gt;Occupation&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s occupation&lt;/dd&gt;&lt;dt&gt;OptIn&lt;/dt&gt;&lt;dd&gt;Boolean. Should this donor receive future emails about the fundraising campaign?&lt;/dd&gt;&lt;dt&gt;Organization&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s organization&lt;/dd&gt;&lt;/dl&gt;
&lt;h3 id="contributionfields"&gt;Contribution Fields&lt;/h3&gt;
&lt;dl&gt;&lt;dt&gt;&lt;span style="color: #ff0000;"&gt;Cycle&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;String. The fundraising campaign&amp;#8217;s year cycle (e.g. &amp;#8220;2012&amp;#8221;)&lt;/dd&gt;&lt;dt&gt;Member&lt;/dt&gt;&lt;dd&gt;String.&lt;/dd&gt;&lt;dt&gt;Attribution&lt;/dt&gt;&lt;dd&gt;String.&lt;/dd&gt;&lt;dt&gt;Source&lt;/dt&gt;&lt;dd&gt;String.&lt;/dd&gt;&lt;dt&gt;RecurringContrib&lt;/dt&gt;&lt;dd&gt;Boolean. Will this be a recurring contribution?&lt;/dd&gt;&lt;dt&gt;RecurringContribNote&lt;/dt&gt;&lt;dd&gt;String. A note about this recurring contribution&lt;/dd&gt;&lt;dt&gt;&lt;span style="color: #ff0000;"&gt;Amount&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;Float. The amount of the contribution&lt;/dd&gt;&lt;dt&gt;Attend&lt;/dt&gt;&lt;dd&gt;String.&lt;/dd&gt;&lt;dt&gt;RecurringPeriod&lt;/dt&gt;&lt;dd&gt;String. The frequency on which total recurring contributions will be processed. Options are: MONT, WEEK, BIWK, FRWK, QTER, SMYR, YEAR&lt;/dd&gt;&lt;dt&gt;RecurringTerm&lt;/dt&gt;&lt;dd&gt;Integer. The total number of recurring donations&lt;/dd&gt;&lt;/dl&gt;
&lt;h3 id="paymentfields"&gt;Payment Fields&lt;/h3&gt;
&lt;dl&gt;&lt;dt&gt;&lt;span style="color: #ff0000;"&gt;CreditCardNumber&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s credit card number&lt;/dd&gt;&lt;dt&gt;&lt;span style="color: #ff0000;"&gt;ExpYear&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s two-digit credit card expiration year&lt;/dd&gt;&lt;dt&gt;&lt;span style="color: #ff0000;"&gt;ExpMonth&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s two-digit credit card expiration month&lt;/dd&gt;&lt;dt&gt;CVV&lt;/dt&gt;&lt;dd&gt;String. The donor&amp;#8217;s credit card number security code&lt;/dd&gt;&lt;/dl&gt;
&lt;h2&gt;Download&lt;/h2&gt;
&lt;p&gt;Our `NgpDonation` class is released under the MIT Public License.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://files.www.newmediacampaigns.com/blog/accept-donations-with-the-ngp-contribution-api/NgpDonation.php.zip"&gt;Download the NgpDonation class&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=9G8djIfXwLA:pt-kNwHxLmc:IuXuQPol3sE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=9G8djIfXwLA:pt-kNwHxLmc:IuXuQPol3sE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=9G8djIfXwLA:pt-kNwHxLmc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=9G8djIfXwLA:pt-kNwHxLmc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=9G8djIfXwLA:pt-kNwHxLmc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=9G8djIfXwLA:pt-kNwHxLmc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=9G8djIfXwLA:pt-kNwHxLmc:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=9G8djIfXwLA:pt-kNwHxLmc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NewMediaCampaigns/~4/9G8djIfXwLA" height="1" width="1"/&gt;</description>
                <pubDate>Mon, 09 Jan 2012 12:25:20 -0500</pubDate>
                <guid isPermaLink="false">http://www.newmediacampaigns.com/blog/accept-campaign-donations-with-the-ngp-contribution-api</guid>
                <author>Josh Lockhart</author>
            <feedburner:origLink>http://www.newmediacampaigns.com/blog/accept-campaign-donations-with-the-ngp-contribution-api</feedburner:origLink></item>
                    <item>
                <title>Paradigms of Iteration in JavaScript</title>
                <link>http://feedproxy.google.com/~r/NewMediaCampaigns/~3/ZTpXsFefyKU/paradigms-of-iteration-in-javascript</link>
                <description>&lt;p&gt;&lt;img style="float: right;" src="http://files.www.newmediacampaigns.com/Screen_Shot_2012-01-06_at_5.34.30_PM.png" alt="" width="219" height="161" /&gt;One of the joys of programming is that no matter how simple a problem may seem there are always tons of ways to solve it. It can be good practice to go back and revisit fundamentals by solving simple problems with as many implementations as you can think of. In this post we'll explore approaches to basic iteration in JavaScript.&lt;/p&gt;
&lt;p&gt;This style of exercise is a good interviewing technique, too, because it's open ended and leads to good discussions. The focus isn't a tricky, wacky problem you're seeing for the first time ever, but bread and butter programming awareness, command, and comfort. It's a good warmup to get a sense of strengths and depth of knowledge.&lt;/p&gt;
&lt;h2&gt;A Basic JavaScript Iteration Problem&lt;/h2&gt;
&lt;p&gt;Iterate through an array of letters, in order, one-at-a-time, and print them using &lt;code&gt;console.print&lt;/code&gt;. Here are your letters.&lt;/p&gt;
&lt;pre class="brush:javascript"&gt;var letters = [ 'a', 'b', 'c' ];
&lt;/pre&gt;
&lt;p&gt;Your solutions should achieve the equivalent of the following hard-coded, brute force solution, except they should handle arrays of any length.&lt;/p&gt;
&lt;pre class="brush:javascript"&gt;console.log(letters[0]);
console.log(letters[1]);
console.log(letters[2]);
&lt;/pre&gt;
&lt;p&gt;How many different solutions can you come up with? Loop constructs, functions, library functions, you can use any means possible.&lt;/p&gt;
&lt;p&gt;Go on, pop open your developer console. Play around.&lt;/p&gt;
&lt;p&gt;Did you cover the loop constructs (&lt;code&gt;for&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt;, &lt;code&gt;do..while&lt;/code&gt;, &lt;code&gt;for..in&lt;/code&gt;)?&lt;/p&gt;
&lt;p&gt;Did you write an enumeration object?&lt;/p&gt;
&lt;p&gt;What library functions are in your tool belt (&lt;code&gt;Array.forEach&lt;/code&gt;, &lt;code&gt;jQuery.each&lt;/code&gt;, &lt;code&gt;underscore.each&lt;/code&gt;,...)?&lt;/p&gt;
&lt;p&gt;Did you roll your own naive &lt;code&gt;each&lt;/code&gt; function?&lt;/p&gt;
&lt;p&gt;Did you implement your &lt;code&gt;each&lt;/code&gt; function recursively, without using a loop construct at all?&lt;/p&gt;
&lt;p&gt;Did you do something mind blowing not even mentioned? Awesome, leave a comment!&lt;/p&gt;
&lt;h2&gt;Iterative Solutions&lt;/h2&gt;
&lt;p&gt;When learning a language like Java, C, or JavaScript, one of the first things we're often taught are language-defined looping constructs. With JavaScript's functional capabilities it's possible to avoid using looping constructs almost altogether. We're talking fundamentals, here, though, and it's important to be comfortable with each basic construct. Let's take a look at a &lt;code&gt;while&lt;/code&gt; loop based solution.&lt;/p&gt;
&lt;pre class="brush:javascript"&gt;var i = 0;
while( i &amp;lt; letters.length) {
    console.log(letters[i]);
    i++;
}
&lt;/pre&gt;
&lt;p&gt;How would you transform that &lt;code&gt;while&lt;/code&gt; loop to a &lt;code&gt;for&lt;/code&gt; loop? Why is a &lt;code&gt;do..while&lt;/code&gt; loop awkward to use here? What risk does &lt;code&gt;for..in&lt;/code&gt; pose looping through an Array object?&lt;/p&gt;
&lt;h2&gt;Functional Solutions&lt;/h2&gt;
&lt;p&gt;JavaScript's treatment of functions as first-class values enables us to avoid writing loop constructs in a wide variety of situations. Resig's jQuery can largely be thanked for encouraging this style of iteration throughout the web development community. Let's solve the problem with jQuery's &lt;code&gt;each&lt;/code&gt;&amp;#160;function.&lt;/p&gt;
&lt;pre class="brush:javascript"&gt;$.each( letters, function(i) { console.log(letters[i]); } );
// or
$.each( letters, function(i, letter) { console.log(letter); } );
// or - idiomatic jQuery
$.each( letters, function() { console.log(this); });  
&lt;/pre&gt;
&lt;p&gt;jQuery's &lt;code&gt;each&lt;/code&gt; expects a callback with a signature of (&lt;code&gt;index&lt;/code&gt;,&lt;code&gt;value&lt;/code&gt;). This is a different signature than ECMAScript's &lt;code&gt;Array.forEach&lt;/code&gt; function which has the inverse and provides a reference to the array as the third argument (&lt;code&gt;value&lt;/code&gt;,&lt;code&gt;index&lt;/code&gt;,&lt;code&gt;array&lt;/code&gt;).&lt;/p&gt;
&lt;pre class="brush:javascript"&gt;letters.forEach( function(letter) { console.log(letter) } );
// or
['a','b','c'].forEach( function(letter, i, letters) { console.log(letters[i]); });
&lt;/pre&gt;
&lt;p&gt;These iteration functions are nice. Have you implemented one before? If you wrote a for loop you can do it.&lt;/p&gt;
&lt;p&gt;Let's implement a naive equivalent that passes just each element's value to the user-defined function.&lt;/p&gt;
&lt;pre class="brush:javascript"&gt;var each = function( array, fn ) {
    for( var i = 0; i &amp;lt; array.length; i++) {
        fn(array[i]);
    }
};
each( letters, function(letter) { console.log(letter); } );
&lt;/pre&gt;
&lt;p&gt;We've come up with a "functional" solution by abstracting away an iterative solution. A truly functional solution shouldn't need a loop at all. Functions only!&lt;/p&gt;
&lt;h2&gt;Recursive Solutions&lt;/h2&gt;
&lt;p&gt;If we can't use a loop construct we'll need to "jump" back to the top of our iteration by invoking a function recursively. Like a loop we'll need a base case an a recursive case. When will we exit and move back down the stack? Here's one take:&lt;/p&gt;
&lt;pre class="brush:javascript"&gt;var each = function( array, fn, i ) {
    if(i === undefined) { i = 0; }
    if(i &amp;lt; array.length) {
        fn(array[i]);
        each(array, fn, i+1);
    }
}
each( letters, function(letter) { console.log(letter); } );
&lt;/pre&gt;
&lt;p&gt;Look ma, no loops!&lt;/p&gt;
&lt;h2&gt;Object-Oriented Style Enumeration Solutions&lt;/h2&gt;
&lt;p&gt;Enumeration/iteration objects are a commonly used pattern in object-oriented programming. This style isn't frequently used in JavaScript, but it's interesting enough to deserve a mention.&lt;/p&gt;
&lt;p&gt;Iteration state, in this problem the index in the array, as well as the logic for traversal (incrementing the index from 0 to the end of the array), are both encapsulated within the iterator object.&lt;/p&gt;
&lt;pre class="brush:javascript"&gt;var iterator = {
    i:       0,
    hasNext: function() {
        return iterator.i &amp;lt; letters.length;
    }
    next:   function() {
        return letters[iterator.i++];
    }
};
while( iterator.hasNext() ) {
    console.log(iterator.next());
}
&lt;/pre&gt;
&lt;p&gt;What is interesting about this approach is you can use different traversal orders without actually changing the logic of any loops that depend on the iterator object. Can you write a &lt;code&gt;reverseIterator&lt;/code&gt;? Can you write a functional&amp;#160;&lt;code&gt;each&lt;/code&gt; to take an &lt;code&gt;iterator&lt;/code&gt; object rather than a plain old array? What is interesting about the functional style, about the object-oriented style, about combining the two?&lt;/p&gt;
&lt;h2&gt;Wrap up&lt;/h2&gt;
&lt;p&gt;It's good for everyone to get back to the fundamentals every now and then and practice technique. Even trivial programming problems, like printing an array of letters, have non-trivial solutions. Exploring solution spaces can cover a lot of ground and act as a great tool for identifying strengths and discomforts.&lt;/p&gt;
&lt;p&gt;What other solutions did you come up with?&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=ZTpXsFefyKU:SJRQDyPcexU:IuXuQPol3sE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=ZTpXsFefyKU:SJRQDyPcexU:IuXuQPol3sE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=ZTpXsFefyKU:SJRQDyPcexU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=ZTpXsFefyKU:SJRQDyPcexU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=ZTpXsFefyKU:SJRQDyPcexU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=ZTpXsFefyKU:SJRQDyPcexU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=ZTpXsFefyKU:SJRQDyPcexU:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=ZTpXsFefyKU:SJRQDyPcexU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NewMediaCampaigns/~4/ZTpXsFefyKU" height="1" width="1"/&gt;</description>
                <pubDate>Fri, 06 Jan 2012 17:31:29 -0500</pubDate>
                <guid isPermaLink="false">http://www.newmediacampaigns.com/blog/paradigms-of-iteration-in-javascript</guid>
                <author>Kris Jordan</author>
            <feedburner:origLink>http://www.newmediacampaigns.com/blog/paradigms-of-iteration-in-javascript</feedburner:origLink></item>
                    <item>
                <title>Link Vulturing: An Interesting New Link Building Tactic</title>
                <link>http://feedproxy.google.com/~r/NewMediaCampaigns/~3/mMXuzdJQZYw/link-vulturing</link>
                <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/cookipedia/3471318514/in/photostream/" target="_blank"&gt;&lt;img src="http://files.www.newmediacampaigns.com/blog/link-vulturing-an-interesting-new-link-building-tactic/link-vulture.jpg" alt="Link Vulture" width="600" height="338" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A little while ago, we received a form submission on our website that struck my curiousity:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I just wanted to let you know that you have a broken link on an old entry of yours, here:&lt;a href="http://www.newmediacampaigns.com/page/how-trent-reznors-new-media-tips-for-musicians-apply-to-your-organization" target="_blank"&gt;www.newmediacampaigns.com/page/how-trent-reznors-new-media-tips-for-musicians-apply-to-your-organization&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Specifically, the website &lt;a href="http://doshdosh.com/" target="_blank"&gt;doshdosh.com&lt;/a&gt;&lt;span&gt;&amp;#160;went offline in 2010 and no longer exists. If you are interested in correcting the link though, we've written a similar blog post about word of mouth marketing here on our blog so that you could fix it:&amp;#160;&lt;br /&gt;&lt;a rel="nofollow" href="http://blog.hubspot.com/blog/tabid/6307/bid/30490/The-Qualities-of-a-Powerful-Word-of-Mouth-Marketing-Strategy.aspx" target="_blank"&gt;blog.hubspot.com/blog/tabid/6307/bid/30490/The-Qualities-of-a-Powerful-Word-of-Mouth-Marketing-Strategy.aspx&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Thank you!&lt;/p&gt;
&lt;p&gt;[redacted]@hubspot.com&amp;#160;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We get a fair number of link requests from people hoping to build their Page Rank, but this one is a bit more compelling. It offers something useful: replace a dead link with one to our site.&lt;/p&gt;
&lt;p&gt;When I get a request like this I tend to think about how it came about. &amp;#160;Did this person actually visit our post, find a dead link and then look for useful content that could replace it? Was it a bot? I can never tell for sure, but in this situation I think there is a somewhat interesting story behind the link request.&lt;/p&gt;
&lt;p&gt;The site that went down, &lt;a href="http://www.doshdosh.com"&gt;doshdosh.com&lt;/a&gt; was an extremely popular web marketing blog (34k subscribers) that &lt;a href="http://www.smoblogger.com/dosh-dosh/"&gt;went offline somewhat mysteriously&lt;/a&gt; about two years ago. Even more strangely, the site went offline even though it wouldn't have required much upkeep to be &lt;a href="http://www.dailyblogtips.com/what-happened-to-doshdosh-com/"&gt;fairly profitable given its traffic&lt;/a&gt;. &amp;#160;Hubspot, the company requesting the link, runs an even more popular web marketing blog. They would obviously love to capture some of the doshdosh.com PageRank.&lt;/p&gt;
&lt;p&gt;In order to do this, Hubspot needed to do a couple of things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Gather a list of all DoshDosh.com URLs&lt;/li&gt;
&lt;li&gt;Gather a list of URLs that link to those DoshDosh.com URLs (These could be ordered by PageRank)&lt;/li&gt;
&lt;li&gt;Map the URLs to relevant Hubspot Blog posts&lt;/li&gt;
&lt;li&gt;Create a link request template&lt;/li&gt;
&lt;li&gt;Manually go through the urls in step 2 and send the requests&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What's amazing is how much of this process can be automated. &amp;#160;The DoshDosh urls can be pulled from the web archive. The sites linking to those urls, ordered by PageRank can be done through the amazing &lt;a href="http://apiwiki.seomoz.org/w/page/13991149/SEOmoz%20Site%20Intelligence%20APIs"&gt;SEOMoz Site Intelligence API&lt;/a&gt;. &amp;#160;The link request templates could then be assembled in excel. &amp;#160;In short order, hundreds of requests could be sent out.&lt;/p&gt;
&lt;p&gt;I think calling this vulturing is apt. In nature, the vulture benefits and survives by playing a critical first step in the decomposition process. The web has always been plagued by dead links that infrequently get fixed. This tactic could become more widespread; it's automated and fairly symbiotic to the requester and the requestee.&lt;/p&gt;
&lt;p&gt;So have we updated our dead link? Not yet. We probably won't -- we're just not sure how we feel about it.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=mMXuzdJQZYw:Cqa1ZLAyYzc:IuXuQPol3sE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=mMXuzdJQZYw:Cqa1ZLAyYzc:IuXuQPol3sE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=mMXuzdJQZYw:Cqa1ZLAyYzc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=mMXuzdJQZYw:Cqa1ZLAyYzc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=mMXuzdJQZYw:Cqa1ZLAyYzc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=mMXuzdJQZYw:Cqa1ZLAyYzc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=mMXuzdJQZYw:Cqa1ZLAyYzc:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=mMXuzdJQZYw:Cqa1ZLAyYzc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NewMediaCampaigns/~4/mMXuzdJQZYw" height="1" width="1"/&gt;</description>
                <pubDate>Wed, 04 Jan 2012 16:30:00 -0500</pubDate>
                <guid isPermaLink="false">http://www.newmediacampaigns.com/blog/link-vulturing</guid>
                <author>Joel Sutherland</author>
            <feedburner:origLink>http://www.newmediacampaigns.com/blog/link-vulturing</feedburner:origLink></item>
                    <item>
                <title>A Beautiful Proposal Makes a Great First Impression</title>
                <link>http://feedproxy.google.com/~r/NewMediaCampaigns/~3/2PVF5uoDv8k/a-beautiful-proposal-makes-a-great-first-impression</link>
                <description>&lt;p&gt;&lt;img src="http://files.www.newmediacampaigns.com/proposal-interior-page-process-s600x400.jpg" alt="" width="600" height="400" /&gt;&lt;/p&gt;
&lt;p&gt;A lot of people, including us, are putting more &lt;a href="http://www.newmediacampaigns.com/blog/building-a-mobile-site-with-clever-navigation"&gt;emphasis on mobile website design&lt;/a&gt; because of the increasing frequency of readers viewing content on mobile devices. People are doing much more than just looking at websites on their mobile devices however, they're reading books, watching movies, playing games and checking email.&amp;#160;&lt;/p&gt;
&lt;p&gt;NMC's first impression on many of our clients is our proposal. And more often than not, this first impression comes into their inbox. In the last two years, &lt;a href="http://www.campaignmonitor.com/blog/post/3495/the-rise-of-mobile-email/" target="_blank"&gt;checking email on mobile devices has increased 20%, whereas viewing email on a desktop has decreased by 11%&lt;/a&gt;. That's why we put great care into making sure our proposal looks beautiful on cell phones and tablets, in addition to when printed out or viewed on a desktop.&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://files.www.newmediacampaigns.com/proposal-front-page-process-s600x400.jpg" alt="" width="600" height="400" /&gt;&lt;/p&gt;
&lt;p&gt;The attention to detail and effort in a proposal's design can go a long way toward showing a potential client the quality of your work and the care with which you approach projects. Apple is notorious for paying close attention to the &lt;a href="http://www.business-strategy-innovation.com/2006/08/importance-of-packaging.html" target="_blank"&gt;design of the packaging&lt;/a&gt; of its products. They ensure that when it comes to their products, if people are going to judge a book by its cover, they're going to judge that cover favorably.&amp;#160;&lt;/p&gt;
&lt;p&gt;The same is true for a proposal. When a potential client's first impression of your firm's work is often your proposal, that first impression needs to show the attention to detail that you put into your work. And that attentional to detail should come across no matter where they're viewing your proposal. &amp;#160;Make sure to think through every possible way a potential client will interact with your firm and the materials you provide them.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=2PVF5uoDv8k:wsuUo7FlBks:IuXuQPol3sE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=2PVF5uoDv8k:wsuUo7FlBks:IuXuQPol3sE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=2PVF5uoDv8k:wsuUo7FlBks:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=2PVF5uoDv8k:wsuUo7FlBks:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=2PVF5uoDv8k:wsuUo7FlBks:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=2PVF5uoDv8k:wsuUo7FlBks:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=2PVF5uoDv8k:wsuUo7FlBks:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=2PVF5uoDv8k:wsuUo7FlBks:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NewMediaCampaigns/~4/2PVF5uoDv8k" height="1" width="1"/&gt;</description>
                <pubDate>Thu, 29 Dec 2011 10:57:31 -0500</pubDate>
                <guid isPermaLink="false">http://www.newmediacampaigns.com/blog/a-beautiful-proposal-makes-a-great-first-impression</guid>
                <author>Alex Pomer</author>
            <feedburner:origLink>http://www.newmediacampaigns.com/blog/a-beautiful-proposal-makes-a-great-first-impression</feedburner:origLink></item>
                    <item>
                <title>2011 In Review</title>
                <link>http://feedproxy.google.com/~r/NewMediaCampaigns/~3/AD-6sVQV9VA/2011-in-review</link>
                <description>&lt;p&gt;&lt;img style="float: right;" src="http://files.www.newmediacampaigns.com/2011-1.jpg" alt="" width="220" height="165" /&gt;2011 was an exciting (and fast) year for NMC! &amp;#160;Our company added new team members, launched sites for organizations around the world, strengthened our product offering, and sparked some exciting new partnerships. &amp;#160;We're all really proud of the work we did this year for a variety of clients. &amp;#160;Below are some highlights from client projects and NMC successes in 2011.&lt;/p&gt;
&lt;h2&gt;2011 NMC Highlights&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a name="growing-team"&gt;&lt;/a&gt;&amp;#65279;Growing team&lt;/strong&gt;&amp;#65279;. We were really excited to add two talented developers to our team, this year! &lt;a href="http://www.newmediacampaigns.com/about/team/ashley-bennett"&gt;Ashley Bennett&lt;/a&gt; joined as a front-end developer right after graduating from UNC's School of Journalism in May. &amp;#160;She has been a great addition to our team, designing and coding sites for a variety of clients since she came on board. &amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.newmediacampaigns.com/about/team/tyler-pearson"&gt;Tyler Pearson&lt;/a&gt; quickly followed, coming on board in September as a designer and developer. &amp;#160;Tyler came from West Virginia where he had previously been running his own company, Blue Peak Digital, focused on political campaign websites, making him a great fit to help us serve our political client base in addition to the work he does for our other clients. &amp;#160;&lt;/p&gt;
&lt;p&gt;Finally, at the turn of the new year, &lt;a href="https://twitter.com/#!/claire_atwell" target="_blank"&gt;Claire Atwell&lt;/a&gt; will be joining us as a Project Manager. &amp;#160;Claire interned with us while an undergrad at UNC and joined a digital marketing company after graduation until we convinced her to rejoin the NMC family. &amp;#160;We couldn't be happier with the quality of people and depth of talent we've added over the past year.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a name="fleet-feet-franchises"&gt;&lt;/a&gt;Launching more than 50 Fleet Feet Franchise websites. &amp;#160;&lt;/strong&gt;While we are proud of all of the projects we have been a part of in the past year, there's one in particular that stands out to us. &amp;#160;Early in the year, we launched a site for &lt;a href="http://www.newmediacampaigns.com/fleetfeet.com" target="_blank"&gt;Fleet Feet Sports&lt;/a&gt;, a national franchise of running gear with more than ninety stores around the country. &amp;#160;That process went so well that they enlisted us to setup a standard template that franchises could choose to use. &amp;#160;The new template would help unite stores with a common look and brand and also make available many new features powered by our CMS. &amp;#160;&lt;/p&gt;
&lt;p&gt;We were overwhelmed by the response from the franchises and have already launched more than 50 different franchises onto the template. &amp;#160;The stores span from &lt;a href="http://www.fleetfeetsanfrancisco.com/"&gt;California&lt;/a&gt; to &lt;a href="http://www.fleetfeetsyracuse.com/" target="_blank"&gt;New York&lt;/a&gt;&amp;#160;and are all running on a unified template that ensures new features benefit all franchises and that we can continue to improve the template for all franchises into the future. &amp;#160;The template lets the stores register people for races, publicize upcoming specials, integrates their social media, provides fitness calculators, and plenty more. &amp;#160;It was a real blast to work with so many small business owners around the country and help them launch their new sites.&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Improving HiFi CMS. &amp;#160;&lt;/strong&gt;While our primary emphasis has been building powerful online campaigns for our clients around the country, we were still able to spend a lot of time improving our product &lt;a href="http://www.gethifi.com" target="_blank"&gt;HiFi Content Management System&lt;/a&gt; to both benefit our business and the developers around the world using the platform. &amp;#160;Improvements have ranged from&amp;#160;fine tuning&amp;#160;the UI to building out new features. &amp;#160;The new features have really rounded out the product into what we think is a premiere platform. NMC occasionally uses different systems like WordPress, Drupal, and ExpressionEngine for certain projects, but each time we complete one of those, we're reminded what a joy it is to have such a powerful and flexible system like HiFi at our disposal. &amp;#160;We have heard those same sentiments echoed by other agencies and developers who have fallen in love with HiFi and now use it as their preferred platform. &amp;#160;If you haven't tried the system recently, go &lt;a href="http://www.tryhifi.com/" target="_blank"&gt;sign up for a free trial&lt;/a&gt; to see the new features and experience the system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Moving to a new office. &lt;/strong&gt;In November, we were excited to move to our new office, a store front in downtown Carrboro. &amp;#160;We're still working on getting the space decorated, but we have already been enjoying the added space and wonderful location. &amp;#160;We've enjoyed all of you who have stopped by and encourage others to feel free to poke their heads in. &amp;#160;To see the space and read more about why we needed a change, &lt;a href="http://www.newmediacampaigns.com/blog/we-have-moved-to-a-new-office"&gt;read our blog post about the move.&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;strong&gt;Launching our new site. &lt;/strong&gt;Early in the Fall, we launched a new site for ourselves. &amp;#160;It was a long process as client work always came first, but we are really excited with the final product and how it has been performing. &amp;#160;The new site aimed to put our work up front and center and also give clients a better feel for the quality of work we do. &amp;#160;We also built in several cool features like our &lt;a href="http://www.newmediacampaigns.com/portfolio"&gt;filterable portfolio&lt;/a&gt; and our &lt;a href="http://www.newmediacampaigns.com/footprint"&gt;Footprint&lt;/a&gt;, which lets you sort through all the content our team is creating. &amp;#160;&lt;a href="http://www.newmediacampaigns.com/blog/new-media-campaigns-new-website"&gt;Read what Joel had to say&lt;/a&gt;&amp;#160;after the launch&amp;#160;about the process and some specific features to check out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Going 8-2 in 2011 general elections. &lt;/strong&gt;We continued our strength in building &lt;a href="http://www.newmediacampaigns.com/services/political-website-design"&gt;political campaign websites&lt;/a&gt; and online campaigns by&lt;a href="http://www.newmediacampaigns.com/blog/nmc-clients-go-8-2-in-2011-general-elections"&gt; going 8-2 in the 2011 general elections&lt;/a&gt;. &amp;#160;It was an exciting year in politics, and we're proud of all our clients and the work they did. &amp;#160;We're looking forward the big election cycle in 2012, and we have already lined up a roster of campaigns that we're really excited to work with and help them win.&lt;/p&gt;
&lt;h2&gt;2011 Featured Site Launches&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.fleetfeet.com" target="_blank"&gt;Fleet Feet Sports&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ies.ncsu.edu" target="_blank"&gt;NC State's Industrial Extension Service&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cmhnetwork.org" target="_blank"&gt;Children's Mental Health Network&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ncse.org" target="_blank"&gt;North Carolina's Southeast&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://foodallergy.org" target="_blank"&gt;FAAN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://trustinthecloud.harris.com" target="_blank"&gt;Harris Cloud Computing&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Looking to 2012&lt;/h2&gt;
&lt;p&gt;2011 was a great year for our company and that has us incredibly excited for our prospects in 2012. &amp;#160;We're excited about projects already in the pipeline and others that we haven't even imagined yet. &amp;#160;In 2012, we're hoping to expand our portfolio of &lt;a href="http://www.newmediacampaigns.com/blog/hacker-news-mobile-frontend"&gt;mobile projects&lt;/a&gt;, as mobile becomes such an important element of any online campaign. &amp;#160;We're also excited to take on more custom development projects as our team has technically grown and also been freed up from the initial HiFi sprint. &amp;#160;Finally, we want to continue to grow and promote HiFi as the &lt;a href="http://www.gethifi.com" target="_blank"&gt;leading hosted Content Management System for developers &lt;/a&gt;around the world. &amp;#160;All of this of course is in addition to building great sites and online campaigns for our clients and helping them market on the web. &amp;#160;It should be an exciting year and we hope to have a chance to continue to collaborate with all of our clients and build on those relationships.&lt;/p&gt;
&lt;h2&gt;Thank You!&lt;/h2&gt;
&lt;p&gt;None of the items listed above would be possible without the continued support of our clients, friends, and family, and we want to extend a very heartfelt thank you to everyone for helping us continue to grow. &amp;#160;We look forward to seeing all of you in 2012 and hope you stop by the new office. &amp;#160;Thanks!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=AD-6sVQV9VA:1txO9RFTgeM:IuXuQPol3sE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=AD-6sVQV9VA:1txO9RFTgeM:IuXuQPol3sE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=AD-6sVQV9VA:1txO9RFTgeM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=AD-6sVQV9VA:1txO9RFTgeM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=AD-6sVQV9VA:1txO9RFTgeM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=AD-6sVQV9VA:1txO9RFTgeM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=AD-6sVQV9VA:1txO9RFTgeM:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=AD-6sVQV9VA:1txO9RFTgeM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NewMediaCampaigns/~4/AD-6sVQV9VA" height="1" width="1"/&gt;</description>
                <pubDate>Fri, 23 Dec 2011 17:30:00 -0500</pubDate>
                <guid isPermaLink="false">http://www.newmediacampaigns.com/blog/2011-in-review</guid>
                <author>Clay Schossow</author>
            <feedburner:origLink>http://www.newmediacampaigns.com/blog/2011-in-review</feedburner:origLink></item>
                    <item>
                <title>Building a Mobile Site with Clever Navigation</title>
                <link>http://feedproxy.google.com/~r/NewMediaCampaigns/~3/tGGWmAZBaVE/building-a-mobile-site-with-clever-navigation</link>
                <description>&lt;p&gt;&lt;img src="http://files.www.newmediacampaigns.com/blog/building-a-mobile-site-with-clever-navigation/yourtown.jpg" alt="Your Town CMS home page" width="600" height="345" /&gt;&lt;/p&gt;
&lt;p&gt;We recently built a mobile website for YourTown CMS in partnership with &lt;a href="http://www.liaisondesigngroup.com/" target="_blank"&gt;Liaison Design Group&lt;/a&gt;. We've had increasing demand for mobile web development lately, and we're particularly excited to show off our success on the &lt;a href="http://www.yourtowncms.com/"&gt;YourTown CMS mobile website&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Mobile-Friendly Navigation&lt;/h2&gt;
&lt;p&gt;We were inspired by an example we saw in "Mobile First Web Design" recently released by &lt;a href="http://www.lukew.com/about/index.asp" target="_blank"&gt;Luke Wroblewski&lt;/a&gt; through &lt;a href="http://www.abookapart.com/" target="_blank"&gt;A Book Apart&lt;/a&gt;. A simple "Navigation" hyperlink resides at the top right corner of each page. When you click the link, the page whooshes upwards revealing the site navigation. The navigation links allow you to jump to another page or return to the current page. It's a simple but effective &amp;#8212; and really cool &amp;#8212; way to implement mobile website navigation while still keeping content front and center.&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;Here are a few screenshots of the YourTown CMS mobile website.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://files.www.newmediacampaigns.com/blog/building-a-mobile-site-with-clever-navigation/yourtown-mobile1.jpg" alt="Your Town CMS mobile home page" width="506" height="667" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://files.www.newmediacampaigns.com/blog/building-a-mobile-site-with-clever-navigation/yourtown-mobile2.jpg" alt="Your Town CMS mobile navigation" width="506" height="667" /&gt;&lt;/p&gt;
&lt;h2&gt;Mobile Javascript Framework&lt;/h2&gt;
&lt;p&gt;The website is driven by a simple, light-weight Javascript mobile framework created by our own &lt;a href="http://www.newmediacampaigns.com/about/team/joel-sutherland"&gt;Joel Sutherland&lt;/a&gt;. The framework routes hash-bang paths to appropriate jQuery templates populated with data pulled down from the &lt;a href="http://gethifi.com" target="_blank"&gt;HiFi API&lt;/a&gt;. It's a brilliant bit of code and is still getting some polish before it's public release. Look for this soon.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.yourtowncms.com/"&gt;Visit the YourTown CMS website&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=tGGWmAZBaVE:NKp1d3jDqZg:IuXuQPol3sE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=tGGWmAZBaVE:NKp1d3jDqZg:IuXuQPol3sE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=tGGWmAZBaVE:NKp1d3jDqZg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=tGGWmAZBaVE:NKp1d3jDqZg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=tGGWmAZBaVE:NKp1d3jDqZg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?i=tGGWmAZBaVE:NKp1d3jDqZg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=tGGWmAZBaVE:NKp1d3jDqZg:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/NewMediaCampaigns?a=tGGWmAZBaVE:NKp1d3jDqZg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/NewMediaCampaigns?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NewMediaCampaigns/~4/tGGWmAZBaVE" height="1" width="1"/&gt;</description>
                <pubDate>Fri, 16 Dec 2011 17:35:00 -0500</pubDate>
                <guid isPermaLink="false">http://www.newmediacampaigns.com/blog/building-a-mobile-site-with-clever-navigation</guid>
                <author>Josh Lockhart</author>
            <feedburner:origLink>http://www.newmediacampaigns.com/blog/building-a-mobile-site-with-clever-navigation</feedburner:origLink></item>
            </channel>
</rss>

