<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Javascript | Woody Hayday | Blog</title>
	<atom:link href="https://blog.woodylabs.com/category/code/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.woodylabs.com</link>
	<description>An exploration of life, technology and writing</description>
	<lastBuildDate>Tue, 13 Jan 2015 15:21:42 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.woodylabs.com/wp-content/uploads/2015/01/cropped-woody-hayday-yosemite-glacier-point-32x32.jpg</url>
	<title>Javascript | Woody Hayday | Blog</title>
	<link>https://blog.woodylabs.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>2013 Annual Review</title>
		<link>https://blog.woodylabs.com/2014/01/2013-annual-review/</link>
					<comments>https://blog.woodylabs.com/2014/01/2013-annual-review/#comments</comments>
		
		<dc:creator><![CDATA[Woody]]></dc:creator>
		<pubDate>Sat, 04 Jan 2014 13:06:14 +0000</pubDate>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Looking Back]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Publishing]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Travel]]></category>
		<category><![CDATA[Web Technology]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Writing]]></category>
		<category><![CDATA[2013]]></category>
		<category><![CDATA[Akala]]></category>
		<category><![CDATA[Alexis Ohanian]]></category>
		<category><![CDATA[Andrew Carnegie]]></category>
		<category><![CDATA[annual review]]></category>
		<category><![CDATA[Charles Munger]]></category>
		<category><![CDATA[Chris Guillebeau]]></category>
		<category><![CDATA[Chris Sacca]]></category>
		<category><![CDATA[Dave Asprey]]></category>
		<category><![CDATA[Graham Hancock]]></category>
		<category><![CDATA[Henry Ford]]></category>
		<category><![CDATA[Joe Rogan]]></category>
		<category><![CDATA[Josh Waitzkin]]></category>
		<category><![CDATA[Keynes]]></category>
		<category><![CDATA[Lee Kuan Yew]]></category>
		<category><![CDATA[Lorenzo Hagerty]]></category>
		<category><![CDATA[Low Key]]></category>
		<category><![CDATA[Maxwell Maltz]]></category>
		<category><![CDATA[Nikola Tesla]]></category>
		<category><![CDATA[Seth Godin]]></category>
		<category><![CDATA[Stefan Molyneux]]></category>
		<category><![CDATA[Steven Pressfield]]></category>
		<category><![CDATA[Thomas Paine]]></category>
		<category><![CDATA[Tim Ferriss]]></category>
		<category><![CDATA[Toggl]]></category>
		<guid isPermaLink="false">http://blog.woodylabs.com/?p=1008</guid>

					<description><![CDATA[<p>2013 was a turbulent year for me, but a great one. Tons of experiments, growth and realisations. Building upon the habit started last year with my 2012 review I&#8217;ll share some highlights of my close-of-year self analysis below. My review of 2013 turned into a mammoth document again, I&#8217;d been saving up thoughts and lists and [&#8230;]</p>
<p>The post <a href="https://blog.woodylabs.com/2014/01/2013-annual-review/">2013 Annual Review</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p><hr /><a href="https://blog.woodylabs.com">Visit Woody Haydays Blog</a><hr />]]></description>
										<content:encoded><![CDATA[<p>2013 was a turbulent year for me, but a great one. Tons of experiments, growth and realisations. Building upon the habit started last year with my <a href="https://blog.woodylabs.com/2013/01/2012-annual-review-looking-back/">2012 review</a> I&#8217;ll share some highlights of my close-of-year self analysis below. My review of 2013 turned into a mammoth document again, I&#8217;d been saving up thoughts and lists and it&#8217;s taken a few days, still, I enthuse you to try reviewing your time, it&#8217;s a worthwhile process and gives useful insight.</p>
<p>Note: With big intent for 2014 I will be moving to a new blog where I can be more focused and share only the big great/painful stuff, it&#8217;ll focus on concious self development and will be the future home of this kind of post. Visit <a title="Woody Hayday" href="http://www.woodyhayday.com" target="_blank">WoodyHayday.com</a> for up to date info on this. For now, back to last year:</p>
<div style="text-align: center;"><img fetchpriority="high" decoding="async" class="size-full wp-image-1010 aligncenter" alt="woody-hayday-review-2013" src="https://blog.woodylabs.com/wp-content/uploads/2014/01/woody-hayday-review-2013.jpg" width="710" height="434" srcset="https://blog.woodylabs.com/wp-content/uploads/2014/01/woody-hayday-review-2013.jpg 710w, https://blog.woodylabs.com/wp-content/uploads/2014/01/woody-hayday-review-2013-450x275.jpg 450w" sizes="(max-width: 710px) 100vw, 710px" /></div>
<div style="text-align: center;"></div>
<h3>Books</h3>
<p>In 2013 I read 2x more books than in 2012, I&#8217;ve been intentionally amping up my reading. 2013 was a fantastic year for inspiration and looking back over the list of titles I&#8217;m glad to say that most were solid reads. Autobiographies gave me great inspiration for living and learning, with a smattering of modern thought tethering it all to today. I was initially looking for role models I could gleam advice from, seeking to replicate &#8211; but I ultimately found so much more in a lot of these books.</p>
<p>Here&#8217;s my 2013 pick, I can&#8217;t recommend these enough:</p>
<div>
<ul>
<li><a href="http://www.amazon.co.uk/The-Authentic-Swing-Notes-Writing/dp/1936891131/ref=sr_1_1?ie=UTF8&amp;qid=1388765189&amp;sr=8-1&amp;keywords=authentic+swing" target="_blank">The Authentic Swing</a> &#8211; Steven Pressfield. Epic reading for any writer.</li>
<li><span style="line-height: 1.5em;"><a href="http://www.amazon.co.uk/Autobiography-Andrew-Carnegie-Gospel-Classics/dp/0451530381/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765204&amp;sr=1-1&amp;keywords=andrew+carnegie" target="_blank">Andrew Carnegie Autobiography and Gospel of Wealth</a>. Inspiring autobiography, though I was told by the museum guy at the Carnegie Birthplace Museum in Dunfermline (I visited this year!) that the book <a href="http://www.amazon.co.uk/Andrew-Carnegie-David-Nasaw/dp/1594201048/ref=sr_1_4?s=books&amp;ie=UTF8&amp;qid=1388765204&amp;sr=1-4&amp;keywords=andrew+carnegie" target="_blank">Andrew Carnegie by David Nasaw</a> is far more accurate, as the family published the former after Carnegies death and so it&#8217;s edited with rose tinted glasses.</span></li>
<li><a href="http://www.amazon.co.uk/My-Life-Work-Autobiography-Henry/dp/0979311985/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765246&amp;sr=1-1&amp;keywords=henry+ford" target="_blank">My Life and Work</a> &#8211; Henry Ford. Epic story of perseverance, a wealth of information for any modern production business/entrepreneur, especially software houses.</li>
<li><a href="http://www.amazon.co.uk/Inventions-Other-Writings-Penguin-Classics/dp/0143106619/ref=sr_1_2?s=books&amp;ie=UTF8&amp;qid=1388765257&amp;sr=1-2&amp;keywords=My+Inventions" target="_blank">My Inventions</a> &#8211; Nikola Tesla. Tesla is a total hero. This autobiography is made up of essays originally published in a magazine, he talks at length about the concious and imagination. A great man, I shall definitely read more.</li>
<li><span style="line-height: 1.5em;"><a href="http://www.amazon.co.uk/Time-Machine-Penguin-Classics/dp/0141439971/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765270&amp;sr=1-1&amp;keywords=the+time+machine+h+g+wells" target="_blank">The Time Machine</a> &#8211; H.G. Wells. Reading great literature is rewarding, even more so when it&#8217;s an authors first book and it happens to be amazing. Reading the quick preface at the start of this book was inspiring to me as a writer.</span></li>
<li><span style="line-height: 1.5em;"><a href="http://www.amazon.co.uk/Art-Learning-Journey-Optimal-Performance/dp/0743277465/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765281&amp;sr=1-1&amp;keywords=The+Art+of+Learning" target="_blank">The Art of Learning</a>  &#8211; Josh Waitzkin. Dudes amazing, just read it.</span></li>
<li><a href="http://www.amazon.co.uk/Psycho-cybernetics-Original-Science-Self-Improvement-Success/dp/0735202850/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765292&amp;sr=1-1&amp;keywords=Psycho+Cybernetics" target="_blank">Psycho Cybernetics</a> &#8211; Maxwell Maltz. More interesting stuff on the concious/subconscious. I&#8217;ve developed some useful practices from this one.</li>
<li><a href="http://www.amazon.co.uk/Symposium-Penguin-Great-Ideas/dp/0141023848/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765304&amp;sr=1-1&amp;keywords=Plato%27s+Symposium" target="_blank">Plato&#8217;s Symposium</a>. There is some fantastic philosophy in this book, on love and education and learning.</li>
<li><a href="http://www.amazon.co.uk/Richest-Man-Babylon-George-Clason/dp/0451205367/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765315&amp;sr=1-1&amp;keywords=The+Richest+Man+in+Babylon" target="_blank">The Richest Man in Babylon</a> I&#8217;ll reread this book every year. Keep your revenue streaming!</li>
<li><a href="http://www.amazon.co.uk/100-Startup-Fire-Your-Better/dp/023076651X/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765324&amp;sr=1-1&amp;keywords=%24100+Startup" target="_blank">$100 Startup</a> &#8211; Chris Guillebeau. If your building product online, read this.</li>
<li><a href="http://www.amazon.co.uk/Rights-Common-Political-Writings-Classics/dp/019953800X/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765336&amp;sr=1-1&amp;keywords=Thomas+Paine" target="_blank">Rights of Man</a> &#8211; Thomas Paine.</li>
<li><a href="http://www.amazon.co.uk/Purple-Cow-Transform-Business-Remarkable/dp/014101640X/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765345&amp;sr=1-1&amp;keywords=Purple+Cow" target="_blank">Purple Cow</a> &#8211; Seth Godin. Be different as a core principle.</li>
<li><a href="http://www.amazon.co.uk/Startup-Playbook-David-S-Kidder/dp/1452105049/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765354&amp;sr=1-1&amp;keywords=Startup+Playbook" target="_blank">Startup Playbook</a>. Hundreds of good coffee-table nuggets.</li>
<li><a href="http://www.amazon.co.uk/Keynes-Twentieth-Centurys-Influential-Economist/dp/1408803917/ref=sr_1_fkmr1_1?s=books&amp;ie=UTF8&amp;qid=1388765386&amp;sr=1-1-fkmr1&amp;keywords=keynes+peter+clark" target="_blank">John Maynard Keynes</a> Biography. Interesting character was Keynes!</li>
<li><a href="http://www.amazon.co.uk/4-Hour-Work-Week-Escape-Anywhere/dp/0091929113/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765399&amp;sr=1-1&amp;keywords=Four+Hour+Work+Week" target="_blank">Four Hour Work Week</a> (4HWW). Another annual read. This year I looked at 4HWW with fresh eyes. I keep reminding myself that Ferriss wrote it after a fairly big financial success, and that the first big hit might take longer hours. I&#8217;m building Efficacy into my days though despite this, I now work MED 6 hours in two 3 hour stints.</li>
<li><a href="http://www.amazon.co.uk/Third-World-First-Intl-Singapore/dp/0060957514/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765409&amp;sr=1-1&amp;keywords=From+third+world+to+first" target="_blank">From third world to first</a> &#8211; Lee Kuan Yew. Long, dry but interesting. Learn how a modern government could work. Certainly none of them work effectively from my point of view, but there&#8217;s elements here which could improve them ten fold, if we can get enough determined men like Lee Kuan Yew to take office.</li>
<li><a href="http://www.amazon.co.uk/Without-Their-Permission-Alexis-Ohanian-ebook/dp/B00HJCA4W6/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1388765417&amp;sr=1-1&amp;keywords=without+their+permission" target="_blank">Without Their Permission</a> &#8211; Alexis Ohanian. Dude co-founded reddit, you have to read what he has to say <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> A pleasant book with a good call to action and a solid message.</li>
</ul>
</div>
<p><span style="line-height: 1.5em;">[None of these are affiliate links.]</span></p>
<p>&nbsp;</p>
<h3>Talks, Podcasts, Videos, Music</h3>
<p>Glad to have found all of these. Thanks to the friends who&#8217;ve shared links and the authors that have lead me to find them. The Joe Rogan Experience podcast is the most coherent thing to my vision of my own existence I have found all year, props to Joe for having rational conversations that tip the balance to positive. Add Akala &amp; Low Key to the mix and I see <em>a future</em>.</p>
<ul>
<li><a href="http://vimeo.com/66294748" target="_blank">Seth Godin Q &amp; A</a></li>
<li><a href="http://www.youtube.com/watch?v=Y0c5nIvJH7w" target="_blank">Graham Hancock &#8211; The War on Conciousness (Banned TED talk)</a></li>
<li><a href="http://www.youtube.com/watch?v=t4AqxNekecY" target="_blank">The Pretotyping Manifesto</a></li>
<li><a href="http://www.youtube.com/watch?v=6VOQnK7O2To" target="_blank">Chris Sacca Interview</a></li>
<li><a href="https://www.youtube.com/watch?v=68vj9QRe_PI" target="_blank">Tim Ferriss on London Real</a> (and <a href="http://www.fourhourworkweek.com/blog/2013/11/03/productivity-hacks/" target="_blank">this post</a> made me smile)</li>
<li><a href="http://www.youtube.com/watch?v=vlghT6kQ-60" target="_blank">Akala &#8211; Another Reason</a> &amp; <a href="http://www.youtube.com/watch?v=nN4eySlToGw" target="_blank">Low Key &#8211; My Soul</a></li>
<li>Joe Rogan Experience Podcast, notably:
<ul>
<li><span style="line-height: 1.5em;">Lorenzo Hagerty &#8211; </span><a style="line-height: 1.5em;" href="http://podcasts.joerogan.net/podcasts/lorenzo-hagerty">http://podcasts.joerogan.net/podcasts/lorenzo-hagerty</a></li>
<li><span style="line-height: 1.5em;">Graham Hancock &#8211; </span><a style="line-height: 1.5em;" href="http://podcasts.joerogan.net/podcasts/graham-hancock-2">http://podcasts.joerogan.net/podcasts/graham-hancock-2</a></li>
<li><span style="line-height: 1.5em;">Dave Asprey &#8211; </span><a style="line-height: 1.5em;" href="http://podcasts.joerogan.net/podcasts/dave-asprey">http://podcasts.joerogan.net/podcasts/dave-asprey</a></li>
<li><span style="line-height: 1.5em;">Steven Pressfield &#8211; </span><a style="line-height: 1.5em;" href="http://podcasts.joerogan.net/podcasts/steven-pressfield-aubrey-marcus">http://podcasts.joerogan.net/podcasts/steven-pressfield-aubrey-marcus</a></li>
<li><span style="line-height: 1.5em;">Stefan Molyneux &#8211; </span><a style="line-height: 1.5em;" href="http://podcasts.joerogan.net/podcasts/stefan-molyneux">http://podcasts.joerogan.net/podcasts/stefan-molyneux</a></li>
</ul>
</li>
</ul>
<p style="text-align: center;"><iframe title="AKALA - FIND NO ENEMY (OFFICIAL MUSIC VIDEO)" width="500" height="281" src="https://www.youtube.com/embed/LjvUMr1-AAU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<p style="text-align: center;">Akala &#8211; Find No Enemy</p>
<p style="text-align: center;">
<h3>Projects</h3>
<p>2013 was a full year of &#8220;work&#8221;. I consulted for ~3 months, building several WordPress plugins and a few web app prototypes, after which I became CTO at SAM, building the MVP there. Towards the close of the year I&#8217;ve now reset my goals and started working on the future of StormGate and Woody Hayday, in business terms (I&#8217;m looking for software problems to fix &amp; finishing my novel!)</p>
<p><strong>Social Gallery </strong>&#8211; Social Gallery <a href="https://blog.woodylabs.com/2013/07/social-gallery-acquired-by-epic-plugins-com/" target="_blank">moved in to the Epic Plugins.com</a> suite of WordPress plugins, it&#8217;s since gone on to continue to sell well and is constantly in the &#8220;top sellers this week&#8221; section on CodeCanyon. It&#8217;s now beaten 2k sales and is on its way to 3k.</p>
<p><strong>SAM &#8211; Social Asset Management (<a href="http://www.samdesk.io" target="_blank">samdesk.io</a>) </strong>&#8211; I joined SAM as CTO in March 2013 at inception stage and spent six months building the first MVP. SAM is a platform for media professionals to find and manage Social Assets (tweets, instagram photos etc.) in a modern, coherent way. It&#8217;s at the leading edge of innovation in the market and I&#8217;m glad I took it to MVP. I got to stretch my legs with almost all of AWS, and up to date JS. I moved on from SAM in October but I am confident it&#8217;s going to be a big success, definitely one to watch. <a href="https://twitter.com/jamesaneufeld" target="_blank">James </a>(CEO/Co Founder) continues to be an inspiration.</p>
<p><strong>Writing/Other/Futures </strong>&#8211; In the last part of 2013 I began experimenting with a few options. I started working towards releasing my sci-fi novel in 2014 (perhaps August &#8211; <a href="https://confirmsubscription.com/h/i/B4CAE951BA689D90" target="_blank">click here to get notified</a>), but for bread and butter I&#8217;ve been working on some software projects (SaaS for freelancers, authors and many other ideas!). I also finalised a joint venture that will begin in January. I&#8217;m keen to keep a fairly open field until I find something which matches my desired conditions.</p>
<p>&nbsp;</p>
<h3>Travel</h3>
<p>We didn&#8217;t intend to travel that much in 2013, what with moving house, twice. We started in Belgium, moved back to Hertfordshire and still fitted in West Wales, Edinburgh, Dunfermline (Carnegie!) Great Yarmouth, Amsterdam (IBC2013) and finished the year in Romania. I couldn&#8217;t think of a better place to spend some time than Sinai with good friends! Now we are back in the home counties we are having lots of great evenings out in London and a few good talks too, it was a highlight of 2013 to go to four Akala gigs, his last featuring Low Key especially.</p>
<div style="text-align:center"><img decoding="async" class="aligncenter size-full wp-image-1027" alt="woody-hayday-sinai-long" src="https://blog.woodylabs.com/wp-content/uploads/2014/01/woody-hayday-sinai-long.jpg" width="710" height="376" srcset="https://blog.woodylabs.com/wp-content/uploads/2014/01/woody-hayday-sinai-long.jpg 710w, https://blog.woodylabs.com/wp-content/uploads/2014/01/woody-hayday-sinai-long-450x238.jpg 450w" sizes="(max-width: 710px) 100vw, 710px" /></div>
<p>&nbsp;</p>
<h3>Time Management</h3>
<p>In 2012 I started logging time I spend on a computer against projects. This was in part for consultancy billing but developed into a total analysis of my time spent. In 2013 I logged every minute I spent at a computer, tagging the time against a project (I used <a href="https://www.toggl.com" target="_blank">Toggl</a>, which is excellent.) The process was interesting, as are the results. Doing this is definitely a solid step towards efficacy in your everyday life.</p>
<h1 style="text-align: center;">Time logged: 2871 Hours 54 Minutes</h1>
<h2 style="text-align: center;">Or: Average 55 hours a week / 8 hours a day!</h2>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="size-full wp-image-1011 aligncenter" alt="pie" src="https://blog.woodylabs.com/wp-content/uploads/2014/01/pie.png" width="136" height="132" /></p>
<p>Here&#8217;s the distribution of my time &#8211; the big blue section is SAM, the other projects seem to share out quite evenly!</p>
<ul>
<li>Email took up way less time than I had expected, totalling around 53 hours (just over an hour a week!) &#8211; I had been purposely lean on this in 2013, trying to avoid all &#8220;busy work&#8221;. Success.</li>
<li>&#8220;Lunch Reading&#8221; took up a bigger chunk than I had expected, though was still less than most people traditionally spend on lunch breaks.</li>
<li>I spent more time in the gym than I remembered!</li>
<li>I spent less than 100 hours playing computer games (Command and Conquer, Battlefield) &#8211; Again I was trying to keep lean here.</li>
<li>Several little projects produced fantastic returns per hour overall. I wonder how this scales.</li>
</ul>
<p>&nbsp;</p>
<h3>2013 Summary</h3>
<div>
<div>2013 was a long year. I&#8217;ve shown a fraction of it here, but the years busy turbulence has stretched time and stretched me. I happily chalk the to&#8217;s and fro&#8217;s of 2013 up to necessary change, it&#8217;s been bold but I&#8217;m in a better place because of it.</div>
<div></div>
<div>We&#8217;ve moved house twice, one of those times was across two countries. I built a hardcore MVP, a log cabin, several app prototypes, landing pages, documents, desks and relationships. I sold Social Gallery, I mentored. I blew the dust off my sci-fi novel and started re-editing. I hope these achievements will reinforce in me my capacity to build, deliver, persevere. I am not <a href="http://www.woodyhayday.com/extended-bio.php" target="_blank">an idle man</a>. Achieving my intent may take me several attempts in micro, but in macro it&#8217;ll resolve. As I ended last year thinking on &#8220;persistence&#8221; so do I this year. Persistence and Perseverance will mark 2014 as the foundational year to my next era.</div>
<div></div>
<div>I&#8217;m grateful for all 2013&#8217;s happenings and challenges as much as its successes. Above all else I&#8217;m grateful to my family, friends, to Alice and to my unknowing inspirations &amp; life guides: Carnegie, Ferriss, Ford, Guillebeau for their awesome business minds. Tesla, Waitzkin and Pressfield for reminding me to be me. Joe Rogan, Munger, Molyneux, Hancock for their needed rational address. Akala, Low Key &amp; Braintax for their soulful reminders to do good.</div>
<div></div>
<div></div>
<div> I&#8217;ll not say anything about 2014 yet, but I&#8217;ll leave you with my thoughts at the close of this year, these are personal, but I wanted to share them anyway.</div>
<div>
<ul>
<li>Stay True to your Self Image (You have no choice, ultimately, the subconscious will make you. The alternative is distress.)</li>
<li><span style="line-height: 1.5em;">Plan for Chaos</span></li>
<li>Take Big Decisions Slowly</li>
<li>People can be Mediocre &amp; Corruptible, but the world does have Good</li>
<li>What seems disparate, fragmented or hard in the micro can make sense in the macro</li>
<li>Have the next project rolling before finishing the current</li>
<li>
<div>To stay content I have to channel my hyper amounts of energy effectively</div>
</li>
<li>Floatation Tanks Kick Ass.</li>
<li>Let it go. Discipline.</li>
</ul>
<p style="text-align: center;">Have an epic 2014,<strong> do good and be your awesome self.</strong></p>
</div>
</div>
<div style="text-align: center;"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1021" alt="woody-hayday-2013-full" src="https://blog.woodylabs.com/wp-content/uploads/2014/01/woody-hayday-2013-full.jpg" width="604" height="624" srcset="https://blog.woodylabs.com/wp-content/uploads/2014/01/woody-hayday-2013-full.jpg 604w, https://blog.woodylabs.com/wp-content/uploads/2014/01/woody-hayday-2013-full-435x450.jpg 435w" sizes="auto, (max-width: 604px) 100vw, 604px" /></div><p>The post <a href="https://blog.woodylabs.com/2014/01/2013-annual-review/">2013 Annual Review</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.woodylabs.com/2014/01/2013-annual-review/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Facebook-Style Photo Viewer WordPress Plugin</title>
		<link>https://blog.woodylabs.com/2012/07/facebook-style-photo-viewer-wordpress-plugin/</link>
		
		<dc:creator><![CDATA[Woody]]></dc:creator>
		<pubDate>Thu, 19 Jul 2012 13:00:04 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Web Technology]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Aberaeron]]></category>
		<category><![CDATA[Facebook-Style]]></category>
		<category><![CDATA[Lightbox]]></category>
		<category><![CDATA[Social Gallery]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress Plugins]]></category>
		<guid isPermaLink="false">http://blog.woodylabs.com/?p=867</guid>

					<description><![CDATA[<p>It&#8217;s been a hectic few months, many successful client projects, many successfuly additions to ChooseFest and StormGate and I haven&#8217;t let myself schedule any writing time. This hiatus has been intentional and it&#8217;s non lexical productivity has been a positive necessity. Short of writing a list of festival essentials the only thing I have written [&#8230;]</p>
<p>The post <a href="https://blog.woodylabs.com/2012/07/facebook-style-photo-viewer-wordpress-plugin/">Facebook-Style Photo Viewer WordPress Plugin</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p><hr /><a href="https://blog.woodylabs.com">Visit Woody Haydays Blog</a><hr />]]></description>
										<content:encoded><![CDATA[<p>It&#8217;s been a hectic few months, many successful client projects, many successfuly additions to <a href="http://www.choosefest.com" title="ChooseFest Festival Finder">ChooseFest</a> and <a href="http://www.stormgate.co.uk" title="UK High End Web Development">StormGate</a> and I haven&#8217;t let myself schedule any writing time. This hiatus has been intentional and it&#8217;s non lexical productivity has been a positive necessity. Short of writing <a href="http://www.choosefest.com/blog/2012/festivals-guide-essential-items-for-a-festival/" title="Guides: List of items essential for a festival">a list of festival essentials</a> the only thing I have written has been code, tons of the stuff. I will be back with a new blogpost or two soon, anyhow on to the main feature:</p>
<h3>Facebook-Style Photo Viewer &#8211; Social Gallery</h3>
<p>Social Gallery is a WordPress plugin which adds a fancy &#8220;Facebook-style&#8221; photo viewer to your blog images. It&#8217;s a bit of an improvement on the existing lightbox plugins which have served their time well but really haven&#8217;t been innovated in too long. This WordPress plugin came about through the combined timing of a client requirement and a schedule collapse, but the end product has ended up working out quite nicely (you can see it in effect by clicking the image below.) </p>
<div align="center" style="background:#2068c4;color:#FFF"><strong>Click this:</strong><br />
<a href="https://blog.woodylabs.com/wp-content/uploads/2011/01/aberaeron-sky.jpg" class="socialGallery"><img decoding="async" src="https://blog.woodylabs.com/wp-content/uploads/2011/01/aberaeron-sky.jpg" alt="" title="An Aberaeron Sky! - Photo is one of mine I found lying about in WordPress - Aberaeron, West Wales" class="aligncenter wp-image-533" style="width:300px"  /></a><br />(Photo is one of mine I found lying about in WordPress &#8211; Aberaeron, West Wales)</div>
<p><span id="more-867"></span><br />
What your seeing is version 1.0, you can see the full website <a href="http://www.socialgalleryplugin.com" title="Social Gallery WordPress Plugin">here</a> and <a href="http://codecanyon.net/item/social-gallery-wordpress-photo-viewer-plugin/2665332?ref=stormgate" title="Buy Social Gallery WordPress plugin">buy it for $14 here</a>. Future versions will have some fancy additions such as Disqus comments (as well as Facebook comments) and more clever ways to feed content into its sidebar. </p>
<p>Social Gallery rides off the wave that is Facebook, using a similar photo-viewing style to give your users a better media experience as well as garnering the benefits of association with Facebook. If you think about it 900+ million users will be familiar with this way of viewing images so it makes sense for more of us to adopt it, Social Gallery is a really easy way to add this functionality to your WordPress. </p>
<p><a href="https://blog.woodylabs.com/wp-content/uploads/2012/07/SocialGalleryWordpressPlugin-preview.png" class="socialGallery"><img loading="lazy" decoding="async" src="https://blog.woodylabs.com/wp-content/uploads/2012/07/SocialGalleryWordpressPlugin-preview-450x228.png" alt="" align="right" title="Social Gallery - Adding Facebook-style photo viewing to your WordPress Blog. Get it today @ SocialGalleryPlugin.com" width="450" height="228" class="alignright size-medium wp-image-869" srcset="https://blog.woodylabs.com/wp-content/uploads/2012/07/SocialGalleryWordpressPlugin-preview-450x228.png 450w, https://blog.woodylabs.com/wp-content/uploads/2012/07/SocialGalleryWordpressPlugin-preview.png 590w" sizes="auto, (max-width: 450px) 100vw, 450px" /></a><strong>Features:</strong></p>
<ul>
<li>Facebook-style lightbox</li>
<li>Get More Likes &#038; More Shares</li>
<li>Get More Comments</li>
<li>Engage your Visitors</li>
<li>Adds Facebook Comments</li>
<li>Familiar to Facebook’s 900+ million users</li>
<li>Easy to Install</li>
</ul>
<p>If you want to know more just hop over to <a href="http://www.socialgalleryplugin.com" title="Social Gallery WordPress Plugin">SocialGalleryPlugin.com</a></p><p>The post <a href="https://blog.woodylabs.com/2012/07/facebook-style-photo-viewer-wordpress-plugin/">Facebook-Style Photo Viewer WordPress Plugin</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>IP to Location Alternative: Javascript &#8211; Using JS to find Browser Country / Location not from IP</title>
		<link>https://blog.woodylabs.com/2011/12/ip-to-location-alternative-javascript-using-js-to-find-browser-country-location-not-from-ip/</link>
		
		<dc:creator><![CDATA[Woody]]></dc:creator>
		<pubDate>Fri, 02 Dec 2011 09:04:41 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[explorations]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[location]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[timezones]]></category>
		<guid isPermaLink="false">http://blog.woodylabs.com/?p=821</guid>

					<description><![CDATA[<p>Know your audience? Got google analytics aggregating their details? Great, good for you! But doe&#8217;s that add any value in the short term? Improve THEIR browsing experience? In the long run you should use analytics to achieve better sites (although many don&#8217;t) &#8211; but for now, right here you can still add some of the [&#8230;]</p>
<p>The post <a href="https://blog.woodylabs.com/2011/12/ip-to-location-alternative-javascript-using-js-to-find-browser-country-location-not-from-ip/">IP to Location Alternative: Javascript – Using JS to find Browser Country / Location not from IP</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p><hr /><a href="https://blog.woodylabs.com">Visit Woody Haydays Blog</a><hr />]]></description>
										<content:encoded><![CDATA[<p>Know your audience? Got google analytics aggregating their details? Great, good for you! But doe&#8217;s that add any value in the short term? Improve THEIR browsing experience? In the long run you should use analytics to achieve better sites (although many don&#8217;t) &#8211; but for now, right here you can still add some of the future frill. Take this situation: You want to show different content/additional content to each nationalities (maybe aim for a few &#8211; US, UK, AUS) &#8211; Did you know that adding a national flag that a user can associate with may increase sales up to 20%, or More? Go read Ca$hvertising. In any case if your sitting comfortably, take a look below for the how to!</p>
<div align="center"><img loading="lazy" decoding="async" src="http://farm1.staticflickr.com/122/303184034_9ac842c4e1.jpg" width="500" height="358" alt="Mars Landers on Map"><br />
Javascript &#8211; Using JS to find Browser Country / Location not from IP <a href="http://www.flickr.com/photos/toasty/303184034/" title="Mars Landers on Map by ToastyKen, on Flickr" rel="nofollow" target="_blank" style="font-size:10px">Photo by ToastyKen</a>
</div>
<p><span id="more-821"></span></p>
<h4>Common solutions to identifying a users locale/localizing/localising a web client:</h4>
<p>Using PHP / ASP.NET take the users IP and feed into an ip to location service (geo ip) to find a country from ip.<br />
<strong>Pro&#8217;s:</strong> Server-side off the bat, can cache a database of IP&#8217;s (although would you?)<br />
<strong>Con&#8217;s:</strong> Adds another 2 hops to at least initial page load, IP location service&#8217;s can cost or be faulty</p>
<p>Using the request headers (again server-side) to identify an &#8220;accepted language&#8221; and then guestimating their location (taking en-US&#8230;for example.)<br />
<strong>Pro&#8217;s:</strong> Server-side to start with, no extra hops/calls required, this data is already available whether you use it or not, more useful for language (although limited)<br />
<strong>Con&#8217;s:</strong> Unreliable &#8211; mostly because of a few of the BIG browsers default to en-US for all english users, often international users might learn to use a browser in English anyway &#8211; defeating the point</p>
<h4>Another solution (work in progress:)</h4>
<p>A step towards a proper solution, and in my case a solution for MY original problem, is to at least work out their TIMEZONE. What? I hear you say, why the timezone? Well if you know, for example using analytics data, that your user base is 40% US, 50% UK and 10% rest of the world you can at least make a START by dealing with the two major constituents of your audience. I can envisage A more complete solution though, by combining the use of request headers accepted language AND the following Javascript timezone detection:</p>
<p>Searching around a bit I found <a href="http://unmissabletokyo.com/country-detector.html" target="_blank" rel="nofollow">this</a> which showed a lot of promise. This javascript works out the users Operating System time offset, and from that you can define which timezone they are in. Useful, if like me you know your users in a specific timezone are likely to be in one country, not particularly if they are possibly in multiple countries within a timezone. </p>
<h4>A solution / exploration &#8211; location detection in javascript</h4>
<p>The following Javascript gives you both indicators, using navigator.language/systemlanguage it detects the browser&#8217;s language, and then using an expanded upon version of the above script it will provide you with the possible countries from the users OS timezone offset. How useful this is to you is depending on the application, but check it out &#8211; build some fantastic solution off of it, then show me, because I probably won&#8217;t get round to it!</p>
<pre class="brush: jscript; title: ; notranslate">
var langCode = navigator.language || navigator.systemLanguage;
var lang = langCode.toLowerCase(); lang = lang.substr(0,2);

var dateObject = new Date(); //this timezone offset calc taken from http://unmissabletokyo.com/country-detector.html
var timeOffset = - dateObject.getTimezoneOffset() / 60; 
var c = &quot;&quot;; //this will ultimately end up as a country/csv of possible countries
switch (timeOffset) { //I expanded upon this switch, adding all the possible countries
	case 0: 
	 c = 'Algeria, Ascension Island, Burkina Faso, Faeroe Islands, Ghana, Guinea Republic, Iceland, Ireland, Ivory Coast, Liberia, Mali, Morocco, Sao Tome &amp; Principe, Senegal, Sierra Leone, St Helena, The Gambia, Togo, United Kingdom'; break;
	
	case 1: 
	 c = 'Albania, Andorra, Angola, Australia, Austria, Belgium, Benin, Bosnia, Cameroon, Central Africa Republic, Chad, Congo, Croatia, Czech Republic, Democratic Republic of Congo (Zaire), Denmark, Equatorial Guinea, France, Gabon, Germany, Gibraltar, Guam, Hungary, Italy, Liechtenstein, Luxembourg, Macedonia (Fyrom), Malta, Mariana Islands, Marshall Islands, Micronesia, Monaco, Netherlands, Niger, Nigeria, Norway, Papua New Guinea, Poland, Portugal, San Marino, Serbia, Slovak Republic, Slovenia, Spain, Sweden, Switzerland, Tunisia'; break;
	 
	case -1: 
	 c = 'Cape Verde Islands, Cook Islands, French Polynesia, Guinea Bissau, USA'; break;
	 
	case 11:	
	 c = 'New Caledonia, Solomon Islands, Vanuatu'; break;
	 
	case -11:
	 c = 'Niue Island, Samoa (American), Samoa (Western), USA'; break;
	 
	case 11.5:
	 c = 'Norfolk Island'; break;
	 
	case 12:	
	 c = 'Fiji Islands, Kiribati, Nauru, New Zealand, Tuvalu, Wallis &amp; Futuna Islands'; break;
	 
	case 13:
	 c = 'Tonga'; break;
	 
	case 2:	
	 c = 'Botswana, Bulgaria, Burundi, Cyprus, Democratic Republic of Congo (Zaire), Egypt, Finland, Greece, Israel, Jordan, Lebanon, Lesotho, Libya, Lithuania, Malawi, Mozambique, Namibia, Palestine, Romania, Rwanda, South Africa, Sudan, Swaziland, Syria, Turkey, Zambia, Zimbabwe'; break;
	 
	case 3:
	 c = 'Bahrain, Belarus, Comoros Island, Djibouti, Eritrea, Estonia, Ethiopia, Iraq, Kenya, Kuwait, latvia, Madagascar, Mayotte Islands, Moldova, Qatar, Russia, Saudi Arabia, Somalia, Tanzania, Uganda, Ukraine, Yemen Arab Republic'; break;
	 
	case -3:
	 c = 'Argentina, Brazil, Cuba, Greenland, Guyana, Uruguay'; break;
	
	case 3.5:
	 c = 'Iran'; break;
	
	case -3.5:
	 c = 'Surinam'; break;
	
	case 4:
	 c = 'Armenia, Azerbaijan, Georgia, Mauritius, Oman, Reunion Island, Seychelles, United Arab Emirates'; break;
	
	case -4:
	 c = 'Anguilla, Antigua and Barbuda, Aruba, Barbados, Bermuda, Bolivia, Brazil, Canada, Chile, Dominica Islands, Dominican Republic, Falkland Islands, French Guiana , Grenada, Guadeloupe, Martinique, Montserrat, Netherlands Antilles, Paraguay, Puerto Rico, St Kitts &amp; Nevia, St Lucia, Trinidad &amp; Tobago, Venezuela'; break;
	
	case 5:
	 c = 'Diego Garcia, Maldives Republic, Pakistan, Turkmenistan'; break;
	
	case -5:
	 c = 'Bahamas, Brazil, Canada, Cayman Islands, Columbia, Ecuador, Haiti, Jamaica, Panama, Peru, Turks &amp; Caicos Islands, USA'; break;
	
	case 5.5:
	 c = 'Bhutan,India,Nepal,Sri Lanka'; break;
	
	case 6:
	 c = 'Bangladesh, Kazakhstan, Kyrgyzstan, Tajikistan, Uzbekistan'; break;
	
	case -6:
	 c = 'Belize, Canada, Costa Rica, El Salvador, Guatemala, Honduras, Mexico, Nicaragua, USA'; break;
	
	case 6.5:
	 c = 'Myanmar (Burma)'; break;
	
	case 7:
	 c = 'Australia, Cambodia, Indonesia, Laos, Thailand, Vietnam'; break;
	
	case -7:
	 c = 'Canada, Mexico, USA'; break;
	
	case 8:
	 c = 'Australia, Brunei, China, Hong Kong, Indonesia, Macau, Malaysia, Mongolia, Philippines, Singapore, Taiwan'; break;
	
	case -8:
	 c = 'Canada, Mexico, USA'; break;
	
	case 9:
	 c = 'Australia, Indonesia, Japan, Korea, North, Korea, South, Palau'; break;
	
	case -9:
	 c = 'USA'; break;
}

//at this point Lang should be a 2 letter language code (e.g. en), timeOffset will be the users hour offset from GMT and c will be the csv of possible countries!
alert('Lang: ' + lang + &quot;\r\n&quot; + 'timeOffset: ' + timeOffset + &quot;\r\n&quot; + 'Possible Countries: ' + &quot;\r\n&quot; + c);
</pre>
<p>You can get the full source for this zipped <a href="https://blog.woodylabs.com/downloads/javascript.timezone.country-detection.zip">here</a>, included is a minified version wrapped in a function, isn&#8217;t that nice of me? Use it as you will, and if you create something epic, show me!</p>
<p><strong>Countries/timezones:</strong> I built the timezone offset switch based on the wikipedia list of countries and their timezones, so its comprehensive.</p><p>The post <a href="https://blog.woodylabs.com/2011/12/ip-to-location-alternative-javascript-using-js-to-find-browser-country-location-not-from-ip/">IP to Location Alternative: Javascript – Using JS to find Browser Country / Location not from IP</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Fix/Hack to make AutoSuggest JQuery Plugin work</title>
		<link>https://blog.woodylabs.com/2011/11/fixhack-to-make-autosuggest-jquery-plugin-work/</link>
		
		<dc:creator><![CDATA[Woody]]></dc:creator>
		<pubDate>Wed, 09 Nov 2011 13:41:12 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web Technology]]></category>
		<category><![CDATA[autosuggest]]></category>
		<category><![CDATA[client-side]]></category>
		<category><![CDATA[hacks]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[ui]]></category>
		<guid isPermaLink="false">http://blog.woodylabs.com/?p=817</guid>

					<description><![CDATA[<p>When I came across Drew Wilson&#8217;s flashy JQuery Autosuggest plugin I happily downloaded the code and started using it within a recent project, but as I used it more and more I kept hitting a bug &#8211; don&#8217;t know if its just the version of JQuery I was tied to using or whether everyone using [&#8230;]</p>
<p>The post <a href="https://blog.woodylabs.com/2011/11/fixhack-to-make-autosuggest-jquery-plugin-work/">Fix/Hack to make AutoSuggest JQuery Plugin work</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p><hr /><a href="https://blog.woodylabs.com">Visit Woody Haydays Blog</a><hr />]]></description>
										<content:encoded><![CDATA[<p>When I came across <a href="http://code.drewwilson.com/entry/autosuggest-jquery-plugin" target="_blank">Drew Wilson&#8217;s flashy JQuery Autosuggest plugin</a> I happily downloaded the code and started using it within a recent project, but as I used it more and more I kept hitting a bug &#8211; don&#8217;t know if its just the version of JQuery I was tied to using or whether everyone using the pretty plugin suffers it. Either way there was peculiar happenings when removing elements, they would remove 75% of the time, but the other 25% they would remove only to not maintain the associated CSV list of objects properly. </p>
<p>Irritating when the thing looks so pretty out of the box. So rather than opt for one of the non-pretty options I just hacked it. Brutally I just added code to maintain an input as a csv, it needs fixing really but this does work, for now.</p>
<p><a href="https://blog.woodylabs.com/downloads/jquery.autoSuggest.fixed.csv.rar" target="_blank">Click here to download my hack/fixed version</a> which maintains a separate csv (in a designated ID &#8211; search replace &#8220;csvHolder&#8221; if you want to change its ID.)</p>
<p>Hopefully Drew can update his plugin so it works out of the box, its a really useful plugin. </p>
<p><strong>Note:</strong> This rar includes <a href="https://blog.woodylabs.com/2011/11/maintain-a-csv-with-javascript-keep-a-hidden-list/">my csv quick maintaining functions</a> which are required.</p><p>The post <a href="https://blog.woodylabs.com/2011/11/fixhack-to-make-autosuggest-jquery-plugin-work/">Fix/Hack to make AutoSuggest JQuery Plugin work</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Maintain a CSV with Javascript &#8211; keep a hidden list</title>
		<link>https://blog.woodylabs.com/2011/11/maintain-a-csv-with-javascript-keep-a-hidden-list/</link>
					<comments>https://blog.woodylabs.com/2011/11/maintain-a-csv-with-javascript-keep-a-hidden-list/#comments</comments>
		
		<dc:creator><![CDATA[Woody]]></dc:creator>
		<pubDate>Tue, 08 Nov 2011 13:25:20 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[client-side]]></category>
		<category><![CDATA[csv]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[ui]]></category>
		<guid isPermaLink="false">http://blog.woodylabs.com/?p=813</guid>

					<description><![CDATA[<p>The situation: Want to build a comma separated list of int&#8217;s (or whatever) client-side, in javascript, remove/add items on the fly using JS. Well these tiny functions below are what I use, useful when you just need to get a clever form / app input done. Using the below you can add/remove items to an [&#8230;]</p>
<p>The post <a href="https://blog.woodylabs.com/2011/11/maintain-a-csv-with-javascript-keep-a-hidden-list/">Maintain a CSV with Javascript – keep a hidden list</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p><hr /><a href="https://blog.woodylabs.com">Visit Woody Haydays Blog</a><hr />]]></description>
										<content:encoded><![CDATA[<p>The situation: Want to build a comma separated list of int&#8217;s (or whatever) client-side, in javascript, remove/add items on the fly using JS. Well these tiny functions below are what I use, useful when you just need to get a clever form / app input done.</p>
<p>Using the below you can add/remove items to an input which acts as a csv holder, should be self explanatory, get and set are just shorteners.</p>
<pre class="brush: jscript; title: ; notranslate">function get(a){ //small get
	if (typeof a != &quot;undefined&quot;) {
		return document.getElementById(a).value;
	} else { 
		return '';
	}
}

function set(i,v){ //small set
	document.getElementById(i).value = v;	
}

function append(i,v){ //small append
	set(i,get(i) + v);		
}

function appendTocsv(i,v){ //small append csv
	if (get(i).length == 0){
		set(i,v);	
	} else { 
		append(i,', ' + v);
	}
}

function incsv(id,v){ //check a csv (in element with id) for a value (v)
	
	var csv = get(id);
	var csvArray = csv.split(', ');
	var found = false;
	
	if (csvArray.length &gt; 0){
		
		for (i = 0; i &lt;= csvArray.length; i++){
		
			if (csvArray&#x5B;i] == v){ found = true;  }
			
		}
		
	}
	
	return found;
		
}

function removeFromcsv(id,v){ //removes a val from csv
	
	var csv = get(id);
	var csvArray = csv.split(', ');
	var removed = false;
	var endString = &quot;&quot;;
	
	if (csvArray.length &gt; 0){
		
		for (i = 0; i &lt;= csvArray.length-1; i++){
		
				
			if (csvArray&#x5B;i] == v){ removed = true;  } else { 
			
				if (endString.length &gt; 0){ endString += ', '; } 
				endString += csvArray&#x5B;i]; 
			
			}
			
		}
		
	}
	
	set(id,endString);
	
	return removed;
	
}</pre><p>The post <a href="https://blog.woodylabs.com/2011/11/maintain-a-csv-with-javascript-keep-a-hidden-list/">Maintain a CSV with Javascript – keep a hidden list</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.woodylabs.com/2011/11/maintain-a-csv-with-javascript-keep-a-hidden-list/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Unable to drop JQuery sortable onto empty list? Hack solution</title>
		<link>https://blog.woodylabs.com/2011/10/unable-to-drop-jquery-sortable-onto-empty-list-hack-solution/</link>
					<comments>https://blog.woodylabs.com/2011/10/unable-to-drop-jquery-sortable-onto-empty-list-hack-solution/#comments</comments>
		
		<dc:creator><![CDATA[Woody]]></dc:creator>
		<pubDate>Thu, 13 Oct 2011 11:34:29 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Sortable]]></category>
		<guid isPermaLink="false">http://blog.woodylabs.com/?p=789</guid>

					<description><![CDATA[<p>The problem: You have a multi column (or area) JQuery UI Sortable (these are neat) which only needs to show a &#8220;drop zone&#8221; when the user has started to drag a sortable object. The JQuery documentation for this doesn&#8217;t account for the reality of the above, its all very well if you want the empty [&#8230;]</p>
<p>The post <a href="https://blog.woodylabs.com/2011/10/unable-to-drop-jquery-sortable-onto-empty-list-hack-solution/">Unable to drop JQuery sortable onto empty list? Hack solution</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p><hr /><a href="https://blog.woodylabs.com">Visit Woody Haydays Blog</a><hr />]]></description>
										<content:encoded><![CDATA[<p>The problem: You have a multi column (or area) JQuery UI Sortable (these are neat) which only needs to show a &#8220;drop zone&#8221; when the user has started to drag a sortable object.</p>
<p>The JQuery documentation for this doesn&#8217;t account for the reality of the above, its all very well if you want the empty column/div to SHOW all the time as empty, that is remain as some sort of visible placeholder, but if the empty list should show as empty, until an object is ready to be dropped on it then JQuery sortable&#8217;s don&#8217;t work. It all comes down to dimensions, if an empty list exists without a height value, you can&#8217;t drop onto it.</p>
<p>More specifically, if an empty jquery-sortable list exists without a specific height set at the point of [.sortable start] (that is BEFORE the event is fired) then you just cannot drop the sortable.</p>
<div align="center" style="font-size:10px;"><img loading="lazy" decoding="async" src="http://farm3.static.flickr.com/2326/2378867408_4cc90791d6.jpg" width="500" height="375" alt="the JavaScript Code"><br />
<a href="http://www.flickr.com/photos/dmitry-baranovskiy/2378867408/" title="the JavaScript Code by Dmitry Baranovskiy, on Flickr">Image by Dmitry Baranovskiy</a></div>
<p>I played with fixing this by adjusting each empty list (in the example belows case #col1,#col2,#col3) to have a defined height (and background, which looks nice) within the sortable &#8220;start&#8221; option, but this just creates boxes (or landing pads/zones) you can see, but not drop on. </p>
<p>Long and short of it &#8211; the solution to being able to drop jquery sortable&#8217;s onto invisible empty lists is to bind a function which adds a css class (or sets the height specifically) to the empty (invisible) sortable list when a user clicks one of the goal objects. This is then fired BEFORE the sortable takes hold and so creates drag-droppable landing zones for the users held sortable. It then uses the sortables &#8220;stop&#8221; property to remove the class it has added to any columns which have it. </p>
<pre class="brush: jscript; title: ; notranslate">
function sortAndDrag() {
    
	//show BEFORE sortable starts
     $(&quot;#col1, #col2, #col3&quot;).bind('click mousedown', function(){
          $(&quot;.col&quot;).each(function (c) {
                if ($(&quot;div&quot;, this).size() == 0) {
                    $(this).addClass(&quot;colZoneEmpty&quot;)
                }
            })
     });
    
	//enable sortable
    $(&quot;#col1, #col2, #col3&quot;).sortable({
        revert: true,
        connectWith: &quot;.col&quot;,
        stop: function (a, d) {
            $(&quot;.col&quot;).removeClass(&quot;colZoneEmpty&quot;);
	    //any ajax processing
        }
    });
	
}
//in this example 3 column div's exist with the id's 'col1','col2','col3', all of which have the class 'col' 
//colZoneEmpty is a css class which makes the empty list visible
</pre>
<p>There are of course improvements you could make here, like checking the users dragging before setting any styling, but this quick hackaround works where it shouldn&#8217;t.</p><p>The post <a href="https://blog.woodylabs.com/2011/10/unable-to-drop-jquery-sortable-onto-empty-list-hack-solution/">Unable to drop JQuery sortable onto empty list? Hack solution</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.woodylabs.com/2011/10/unable-to-drop-jquery-sortable-onto-empty-list-hack-solution/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Firefox, why you mutate my css?</title>
		<link>https://blog.woodylabs.com/2011/06/firefox-why-you-mutate-my-css/</link>
		
		<dc:creator><![CDATA[Woody]]></dc:creator>
		<pubDate>Thu, 30 Jun 2011 06:07:40 +0000</pubDate>
				<category><![CDATA[Browser Compatibility]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[JQuery]]></category>
		<guid isPermaLink="false">http://blog.woodylabs.com/?p=851</guid>

					<description><![CDATA[<p>Quick post to remove the annoyance that is this bug from my short term memory, you would think this would work: var newBGString = $(this).css('background-image'); &#8230;it does, but not in firefox. Say the background property was set to &#8220;url(someimage.png) top left no-repeat&#8221;, making the background-image property &#8220;url(someimage.png)&#8221; right? In every browser except firefox, yes, not [&#8230;]</p>
<p>The post <a href="https://blog.woodylabs.com/2011/06/firefox-why-you-mutate-my-css/">Firefox, why you mutate my css?</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p><hr /><a href="https://blog.woodylabs.com">Visit Woody Haydays Blog</a><hr />]]></description>
										<content:encoded><![CDATA[<p>Quick post to remove the annoyance that is this bug from my short term memory, you would think this would work:</p>
<pre class="brush: jscript; title: ; notranslate">var newBGString = $(this).css('background-image');</pre>
<p>&#8230;it does, but not in firefox. Say the background property was set to &#8220;url(someimage.png) top left no-repeat&#8221;, making the background-image property &#8220;url(someimage.png)&#8221; right? In every browser except firefox, yes, not for firefox. Firefox would set the var as &#8220;url(&#8220;someimage.png&#8221;)&#8221; and THEN complain that the var is not realistic when you go on to use it elsewhere. </p>
<p>Anyway ridiculous bug, almost as annoying is how simple, hacky and rough the fix is:</p>
<pre class="brush: jscript; title: ; notranslate">var newBGString = $(this).css('background-image').replace('&quot;',''); </pre>
<p>So if your firefox doesn&#8217;t like background image swapping via js, try it, I guess&#8230;</p><p>The post <a href="https://blog.woodylabs.com/2011/06/firefox-why-you-mutate-my-css/">Firefox, why you mutate my css?</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ebay Partner Network Changes RSS Urls (again)</title>
		<link>https://blog.woodylabs.com/2011/06/ebay-partner-network-changes-rss-urls-again/</link>
		
		<dc:creator><![CDATA[Woody]]></dc:creator>
		<pubDate>Fri, 24 Jun 2011 13:39:26 +0000</pubDate>
				<category><![CDATA[Affiliate Marketing]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Auction2Post]]></category>
		<category><![CDATA[ebay partner network]]></category>
		<guid isPermaLink="false">http://blog.woodylabs.com/?p=629</guid>

					<description><![CDATA[<p>If you are part of the wave of Ebay Partner Network (EPN) affiliates that stuck up middle-man eshops fed by their RSS feeds you may have missed this. In the 5 years or so I have been an ebay affiliate they have only done this a few times, but for the hundreds of custom scripts [&#8230;]</p>
<p>The post <a href="https://blog.woodylabs.com/2011/06/ebay-partner-network-changes-rss-urls-again/">Ebay Partner Network Changes RSS Urls (again)</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p><hr /><a href="https://blog.woodylabs.com">Visit Woody Haydays Blog</a><hr />]]></description>
										<content:encoded><![CDATA[<p>If you are part of the wave of Ebay Partner Network (EPN) affiliates that stuck up middle-man eshops fed by their RSS feeds you may have missed <a href="http://www.ebaypartnernetworkblog.com/en/2011/03/new-rss-feed-generator-available-soon/" rel="nofollow" target="_blank">this</a>. In the 5 years or so I have been an ebay affiliate they have only done this a few times, but for the hundreds of custom scripts using the urls it can be no small task to reconfigure them. Anyway after putting it off till the last week I thought this week I should remedy the old RSS urls before they stop supporting them: </p>
<div style="border: 1px solid #09C; background-color: #b5d1ea; padding: 4px; margin: 10px; text-align:center">The existing RSS Feed Generator will no longer be available in the ePN portal after April 17th. <em>However, your existing RSS feed URL’s will continue to be supported until June 30th.</em> We do recommend that you switch to the new RSS Feed Generator to be sure you’re getting more relevant results in your RSS feed.</div>
<p>So if your in the same boat and you have hundreds (thousands?) of RSS urls hard-coded into files across multiple servers I would recommend you get working, perhaps the following will be of use. I should mention at this point that <a href="https://blog.woodylabs.com/2009/10/auction-2-post/" target="_blank">Auction 2 Post</a> users (and Bans, Wordbay etc.) will not suffer any fallout as they use the shopping api (which is sensible now, but back in 2006 wasn&#8217;t an accessible option.)</p>
<p>I have written a quick transformation script (js) which will take an old epn RSS url (http://rss.api.ebay.com/ws/rssapi?&#8230;) and transform it into a new one (http://rest.ebay.com/epn/v1/find/item.rss?&#8230;), if you only have a few urls to change over then it might be enough for you:</p>
<div style="border: 1px solid #09C; background-color: #b5d1ea; padding: 4px; margin: 10px; text-align:center">
<a href="http://woodylabs.com/scripts/ebay-epn-rss-url-converter.php" target="_blank">Ebay Partner Network (EPN) RSS Url Converter/Transformer</a>
</div>
<div align="center"><img loading="lazy" decoding="async" src="https://blog.woodylabs.com/wp-content/uploads/2011/06/epn-rss-url-change-2011.png" alt="" title="epn-rss-url-change-2011" width="600" height="346" class="aligncenter size-full wp-image-633" srcset="https://blog.woodylabs.com/wp-content/uploads/2011/06/epn-rss-url-change-2011.png 600w, https://blog.woodylabs.com/wp-content/uploads/2011/06/epn-rss-url-change-2011-450x259.png 450w" sizes="auto, (max-width: 600px) 100vw, 600px" /></div>
<p><span id="more-629"></span></p>
<p>If you have a LOT of these urls in files (like I do) then you might want to use something a little more automated. In my case I wrote a complete FTP spider which flies for each and every file hunting for old ebay RSS urls, transforming them and updating the pages. This was fine in my case because mine were pretty standardly laid out, similar use etc. I wouldn&#8217;t recommend it if you use the extremity of the RSS parameters.</p>
<p>Anyhow as the FTP crawler was pretty huge of a code puke, I might release that separately at some point (it has other good uses ;)), here is the csharp for transforming old RSS urls into new ones though (Note: it doesnt deal with all the parameters, only the most common/ones I use regularly, it may need tailoring.)</p>
<pre class="brush: csharp; title: ; notranslate">static string transformEPNRSSUrl(string inputUrl)
{
    string transformed = &quot;http://rest.ebay.com/epn/v1/find/item.rss?&quot;;

    //split url by ?
    string&#x5B;] splitUrl = inputUrl.Split(new char&#x5B;] { '?' });

    //split second by &amp;
    string&#x5B;] splitParams = splitUrl&#x5B;1].Split(new char&#x5B;] { '&amp;' });

    //new params
    string newParams = &quot;&quot;;

    //transform params
    foreach (string s in splitParams)
    {
        string retID = &quot;&quot;;
        string retVal = &quot;&quot;;
        string&#x5B;] sV = s.Split(new char&#x5B;] { '=' });

        //mostly :p
        retVal = sV&#x5B;1];

        //see if tis required
        if (sV&#x5B;0] == &quot;sacat&quot;) { retID = &quot;categoryId1&quot;; }
        if (sV&#x5B;0] == &quot;satitle&quot;) { retID = &quot;keyword&quot;; }
        if (sV&#x5B;0] == &quot;afepn&quot;) { retID = &quot;campaignid&quot;; }
        if (sV&#x5B;0] == &quot;customid&quot;) { retID = &quot;customid&quot;; }
        if (sV&#x5B;0] == &quot;saprclo&quot;) { retID = &quot;minPrice&quot;; }
        if (sV&#x5B;0] == &quot;saprchi&quot;) { retID = &quot;maxPrice&quot;; }
	
        if (retID != &quot;&quot;)
        {
            if (newParams != &quot;&quot;) { newParams += &quot;&amp;&quot;; } //for all but first
            newParams += retID + &quot;=&quot; + retVal;
        }

        //last few additions 24/06/2011
        if (sV&#x5B;0] == &quot;fts&quot; &amp;&amp; sV&#x5B;1] == &quot;2&quot;) { newParams += &quot;descriptionSearch=true&quot;; }
        if (sV&#x5B;0] == &quot;sascs&quot; &amp;&amp; sV&#x5B;1] == &quot;2&quot;) { newParams += &quot;listingType1=AuctionWithBIN&amp;listingType2=FixedPrice&quot;; }

    }

    transformed += newParams;
    //following is some defaults for me, check these yourself, use:
    //http://woodylabs.com/scripts/ebay-epn-rss-url-converter.php
    transformed += &quot;&amp;sortOrder=EndTimeSoonest&amp;programid=15&amp;toolid=10039&amp;listingType1=All&amp;lgeo=1&amp;feedType=rss&quot;;

    return transformed;
}</pre>
<div align="center"><a href="http://woodylabs.com/scripts/ebay-rss-transformer-csharp.txt" target="_blank">View as txt</a></div>
<p>Use both the transformer script page and the csharp code at your own peril, it worked for me over hundreds of urls, mostly without a hitch, but thats not saying it will for you. Check your urls, after all each is probably worth £ to you. Visit the RSS urls and use the <a href="https://publisher.ebaypartnernetwork.com/PublisherUserManualPage?page_id=ToolValidator" rel="nofollow" target="_blank">ebay tool validator</a> to check the RSS feed has worked!</p>
<p>Just a quick mention of the positives of ebay deciding to rip out the old system (its not all a pain in the arse!): </p>
<ul>
<li>It reminded me how widespread my old ebay affiliate sites are, it was a good excuse to take stock and write FTPCrawler</li>
<li>The whole system is much cleaner, parameter wise</li>
<li>The introduction of multiple selection parameters is useful</li>
<li>The new RSS generator is nice (as much as anyone uses the thing</li>
</ul><p>The post <a href="https://blog.woodylabs.com/2011/06/ebay-partner-network-changes-rss-urls-again/">Ebay Partner Network Changes RSS Urls (again)</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Grab Tabs &#8211; Get chromium urls in a list</title>
		<link>https://blog.woodylabs.com/2011/05/grab-tabs-get-chromium-urls-in-a-list/</link>
					<comments>https://blog.woodylabs.com/2011/05/grab-tabs-get-chromium-urls-in-a-list/#comments</comments>
		
		<dc:creator><![CDATA[Woody]]></dc:creator>
		<pubDate>Thu, 05 May 2011 10:18:54 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web Technology]]></category>
		<guid isPermaLink="false">http://blog.woodylabs.com/?p=603</guid>

					<description><![CDATA[<p>Long story short there is a bunch of extensions for chrome/chromium which provide you with session management and tab control but frankly none of them do exactly what I wanted so I have fudged a solution by using session manager and writing a 5 minute extension: Grab Tabs. Somehow it seemed easier to write an [&#8230;]</p>
<p>The post <a href="https://blog.woodylabs.com/2011/05/grab-tabs-get-chromium-urls-in-a-list/">Grab Tabs – Get chromium urls in a list</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p><hr /><a href="https://blog.woodylabs.com">Visit Woody Haydays Blog</a><hr />]]></description>
										<content:encoded><![CDATA[<p>Long story short there is a bunch of extensions for chrome/chromium which provide you with session management and tab control but frankly none of them do exactly what I wanted so I have fudged a solution by using <a href="https://chrome.google.com/extensions/search?itemlang=&#038;q=session+manager" target="_blank">session manager</a> and writing a 5 minute extension: <a href="https://chrome.google.com/extensions/detail/ldoeilnidhchbjodpehhjjgjmfhjlfgp" target="_blank">Grab Tabs</a>. Somehow it seemed easier to write an extension than to find one which just worked, feature creep gets people bad!</p>
<div style="border:1px solid #09C; background-color:#b5d1ea;padding:4px;margin:10px;">***Grab Tabs is Super Simple<br />
This is a super simple extension which dumps a list of current tabs to a text box, ready to copy out to wherever.</p>
<p>There&#8217;s no need for complexity, sometimes you just need a list of the urls you have open, across windows &#8211; essential functionality for a lot of us power users.</p>
<p>Session managers are great, (I use the extension called Session Manager) &#8211; but they still lack just the brute functionality to get a list of tab urls straight out. This does that.</p>
<p>No frill, simple tab url extraction <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p></div>
<div align="center" style="font-size:24px"><a href="https://chrome.google.com/extensions/detail/ldoeilnidhchbjodpehhjjgjmfhjlfgp" target="_blank">>> Get Grab Tabs <<</a></div><p>The post <a href="https://blog.woodylabs.com/2011/05/grab-tabs-get-chromium-urls-in-a-list/">Grab Tabs – Get chromium urls in a list</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.woodylabs.com/2011/05/grab-tabs-get-chromium-urls-in-a-list/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>Javascript in Spreadsheets? &#8211; Google Apps Script Does that</title>
		<link>https://blog.woodylabs.com/2010/03/javascript-in-spreadsheets-google-apps-script-does-that/</link>
		
		<dc:creator><![CDATA[Woody]]></dc:creator>
		<pubDate>Mon, 08 Mar 2010 09:06:50 +0000</pubDate>
				<category><![CDATA[Affiliate Marketing]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Search Engine Optimisation]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Web Technology]]></category>
		<guid isPermaLink="false">http://blog.woodylabs.com/?p=177</guid>

					<description><![CDATA[<p>Far from being a google promoter, I do like this. Google Apps Script opens up google spreadsheets to scripting &#8211; Just like Macro&#8217;s etc in Excel, but with Javascript. This effectively opens up a world of online data processing and analysis that would have not been easily possible within a browser before hand, especially suiting [&#8230;]</p>
<p>The post <a href="https://blog.woodylabs.com/2010/03/javascript-in-spreadsheets-google-apps-script-does-that/">Javascript in Spreadsheets? – Google Apps Script Does that</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p><hr /><a href="https://blog.woodylabs.com">Visit Woody Haydays Blog</a><hr />]]></description>
										<content:encoded><![CDATA[<p>Far from being a google promoter, I do like <a href="http://www.google.com/google-d-s/scripts/scripts.html" rel="nofollow">this</a>. Google Apps Script opens up google spreadsheets to scripting &#8211; Just like Macro&#8217;s etc in Excel, but with Javascript. This effectively opens up a world of online data processing and analysis that would have not been easily possible within a browser before hand, especially suiting web-devs its nice to see an amount of custom programmability going into semi-democratised tools. </p>
<div align="center"><img loading="lazy" decoding="async" src="https://blog.woodylabs.com/wp-content/uploads/2010/03/javascript-spread-sheet.png" alt="" title="javascript-spread-sheet" width="593" height="222" class="aligncenter size-full wp-image-178" srcset="https://blog.woodylabs.com/wp-content/uploads/2010/03/javascript-spread-sheet.png 593w, https://blog.woodylabs.com/wp-content/uploads/2010/03/javascript-spread-sheet-450x168.png 450w" sizes="auto, (max-width: 593px) 100vw, 593px" /></div>
<p>I can see applications ranging from replacing my SEO QUAKE&#8217;s list parameter check to many many web marketing, analytics, data crawling and recording processes, all of which you could do in ms.excel, yet more accessible here. This isn&#8217;t a big deal, but landed on my lap this morning so here&#8217;s the share <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p><p>The post <a href="https://blog.woodylabs.com/2010/03/javascript-in-spreadsheets-google-apps-script-does-that/">Javascript in Spreadsheets? – Google Apps Script Does that</a> first appeared on <a href="https://blog.woodylabs.com">Woody Hayday | Blog</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
