<?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>Christian Cox - Interactive Design and Development</title>
	<atom:link href="http://christiancox.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://christiancox.com</link>
	<description>Web development and more.</description>
	<lastBuildDate>Sat, 21 Aug 2010 19:56:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>An open letter to Comcast</title>
		<link>http://christiancox.com/?p=110</link>
		<comments>http://christiancox.com/?p=110#comments</comments>
		<pubDate>Sat, 21 Aug 2010 17:24:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Atlanta]]></category>
		<category><![CDATA[Internets]]></category>

		<guid isPermaLink="false">http://christiancox.com/?p=110</guid>
		<description><![CDATA[Dear Comcast,
My name is Christian Cox and my phone number is 678-478-7531. It&#8217;s Saturday, August 21, 2010 at 12:45 PM Eastern time and I just got off the phone with one of your telemarketers. He was interested in promoting an upgrade to a package with High-Speed Internet and your Digital Starter Cable, a package I [...]]]></description>
			<content:encoded><![CDATA[<p>Dear Comcast,<br />
My name is Christian Cox and my phone number is 678-478-7531. It&#8217;s Saturday, August 21, 2010 at 12:45 PM Eastern time and I just got off the phone with one of your telemarketers. He was interested in promoting an upgrade to a package with High-Speed Internet and your Digital Starter Cable, a package I am actually interested in and on terms that sounded fairly reasonable! I can truly say that I was excited that I had answered a telemarketing call that may lead to something positive. Sadly, I will not be upgrading at this time because your customer service representative was so inept and so outright deceptive to me that I am disgusted, once again, with your company&#8217;s customer service. I try. I try again and again to give your company a chance to treat me with fairness and respect, but time and again you prove to me that you, as a company, cannot follow through on that basic service requirement.</p>
<p>I asked your customer service representative to tell me which HD channels were included in the package. He was unable to tell me. Instead of finding out for me, or telling me where to find the information on my own, he offered a money-back guarantee for the service if I was not satisfied. Trying to manipulate me into purchasing additional services that you will not define to me is insulting and rude. Furthermore, I was never able to pin him down on the actual final cost of everything after promotional rates expired. Rather than telling me actual numbers and final costs, he was more interested in telling me how much I would save (&#8221;Your internet cost will go down!&#8221;). I find that to be insulting and purposefully deceptive. When I asked him for a total number for all services after the promotional rate expires, he gave me a number that is lower than the price I am paying now for internet only. Wow, what a deal! When I pointed that out to him, he stated that the number he told me was only for part of the service, not the package. Again, <strong>PURPOSEFULLY DECEPTIVE</strong>. At this point I became frustrated and asked to speak to his supervisor, as I was confused about the terms of the promotion and I needed clarification that he could not provide to me. Rather than put me on hold and get a supervisor (apparently they were all busy), he continued arguing with me and denying that he had been deceptive. I chose to end the call after relating how disgusted I am with both him (the CSR) and your company as a whole.</p>
<p>Normally I would just let this slide but today I feel like sharing it with everyone I know, and anyone else who will listen. Thanks to your high-speed internet service and the beauty that is social networking, I am about to make that happen! I will continue to use your high-speed internet service because the product is actually quite good for my needs and I do not need to interact with your customer service on a regular basis to keep it turned on. On the other hand, I will not be expanding my utility use with your company at this time or in the near future because of your horrible customer service and the treatment I received today.</p>
<p>Sincerely,<br />
Christian Cox</p>
<p>UPDATE<br />
At 3:10 PM this same day I answered a call from a blocked number. It was the telemarketer &#8211; same man, same accent, same voice. He said &#8220;Fuck you,&#8221; then hung up. Classic. </p>
]]></content:encoded>
			<wfw:commentRss>http://christiancox.com/?feed=rss2&amp;p=110</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Braves wallpaper</title>
		<link>http://christiancox.com/?p=92</link>
		<comments>http://christiancox.com/?p=92#comments</comments>
		<pubDate>Wed, 14 Jul 2010 19:38:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Atlanta]]></category>

		<guid isPermaLink="false">http://christiancox.com/?p=92</guid>
		<description><![CDATA[Braves wallpaper (1920&#215;1200, 1.8MB) fo tha kidzz!








]]></description>
			<content:encoded><![CDATA[<p><a href="http://christiancox.com/wordpress/wp-content/uploads/2010/07/bravos.png"><img class="size-thumbnail wp-image-93 alignleft" style="border: 0pt none; margin: 0px 10px;" title="bravos wallpaper!" src="http://christiancox.com/wordpress/wp-content/uploads/2010/07/bravos-150x150.png" alt="bravos wallpaper!" width="150" height="150" /></a><a title="Bravos Wallpaper!" href="http://christiancox.com/wordpress/wp-content/uploads/2010/07/bravos.png" target="_blank">Braves wallpaper</a> (1920&#215;1200, 1.8MB) fo tha kidzz!
<p><!-- --></p>
<p><!-- --></p>
<p><!-- --></p>
<p><!-- --></p>
<p><!-- --></p>
<p><!-- --></p>
<p><!-- --></p>
<p><!-- --></p>
]]></content:encoded>
			<wfw:commentRss>http://christiancox.com/?feed=rss2&amp;p=92</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to get rid of a ghost or demon</title>
		<link>http://christiancox.com/?p=88</link>
		<comments>http://christiancox.com/?p=88#comments</comments>
		<pubDate>Sun, 04 Apr 2010 06:01:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://christiancox.com/?p=88</guid>
		<description><![CDATA[
Turn on some lights. Ghosts/demons are not comfortable unless it&#8217;s dark. Need nightvision or microphones to observe the curious phenomena? Consider saving your money and investing in a hot tub instead. Also, invite me over to enjoy said hot tub.
Learn how to do something useful. Only motherfucking idiots see ghosts, so protect yourself by being [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>Turn on some lights. Ghosts/demons are not comfortable unless it&#8217;s dark. Need nightvision or microphones to observe the curious phenomena? Consider saving your money and investing in a hot tub instead. Also, invite me over to enjoy said hot tub.</li>
<li>Learn how to do something useful. Only motherfucking idiots see ghosts, so protect yourself by being smart or at least productive.</li>
<li>Stop being a woman. I don&#8217;t know if it&#8217;s the periods, verginias or what, but ghosts are all about attaching to some women so buck up and kick that ghost in the damn face (or facial area if said entity happens to be of the faceless variety).</li>
<li>Laugh out loud while watching &#8220;Paranormal Activity.&#8221; They bought a townhouse without inspecting the attic/crawlspace. Dumbasses (see #2). I know San Diego has good weather year round and all, but insulation is non-negotiable.</li>
<li>Ignore it. Ghosts are needy motherfuckers, and if you refuse to acknowledge one&#8217;s existence, it will most likely just give up after a few door closings.</li>
<li>Get a television that&#8217;s not ancient. Ghosts like to turn televisions to static channels, but modern televisions just show a blank or blue screen. Ghosts are totally frustrated because that&#8217;s a tried and true method for scaring fucking idiots (again, see #2).</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://christiancox.com/?feed=rss2&amp;p=88</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quicksand that doesn&#8217;t suck</title>
		<link>http://christiancox.com/?p=79</link>
		<comments>http://christiancox.com/?p=79#comments</comments>
		<pubDate>Tue, 30 Mar 2010 23:25:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Internets]]></category>

		<guid isPermaLink="false">http://christiancox.com/?p=79</guid>
		<description><![CDATA[I am using this awesome Quicksand plugin for jQuery that makes filtering and reordering a list both beautiful and simple. I love this thing &#8211; it&#8217;s snappy, looks great, and put some polish on a regular old unordered list. But I was having trouble getting it to work locally in IE. I have an unordered [...]]]></description>
			<content:encoded><![CDATA[<p>I am using <a href="http://razorjack.net/quicksand/">this awesome Quicksand plugin</a> for jQuery that makes filtering and reordering a list both beautiful and simple. I love this thing &#8211; it&#8217;s snappy, looks great, and put some polish on a regular old unordered list. But I was having trouble getting it to work locally in IE. I have an unordered list of items that I want to sort by type. Some items are one type, some items fall into multiple type categories. I&#8217;m organizing those types by class name as seen here:</p>
<p><code><br />
&lt;ul class="filter-list"&gt;<br />
   &lt;li class="stores"&gt;Lorem&lt;/li&gt;<br />
   &lt;li class="brands"&gt;Ipsum&lt;/li&gt;<br />
   &lt;li class="products"&gt;Dolor&lt;/li&gt;<br />
   &lt;li class="stores brands"&gt;Sit&lt;/li&gt;<br />
   &lt;li class="brands products"&gt;Amet&lt;/li&gt;<br />
   &lt;li class="stores brands products"&gt;Quandis&lt;/li&gt;<br />
&lt;/ul&gt;<br />
</code></p>
<p>To filter the list, I was using links as my triggers instead of inputs. Each link had an href attribute that either triggered ALL items, or corresponded to a particular class of items in the list, as seen here:</p>
<p><strong>WRONG</strong></p>
<p><code><br />
&lt;p class="triggers"&gt;&lt;a href="all"&gt;All&lt;/a&gt; | &lt;a href="brands"&gt;Brands&lt;/a&gt; | &lt;a href="stores"&gt;Stores&lt;/a&gt; | &lt;a href="online"&gt;Online&lt;/a&gt;&lt;/p&gt;<br />
</code></p>
<p>So I was stripping out the href attribute and using that to filter the list. But hold up a minute. In IE 7 when I test locally, that href translates to finding a class of &#8220;/user/Christian/Documents/Clients/blahblahblah/classname&#8221; or something ridiculous like that &#8211; IE appends the entire path when it passes that information to my jQuery script. So I ended up stripping out the href and using another attribute &#8211; rel &#8211; to drive the filters. Here&#8217;s the updated HTML:</p>
<p><code><br />
&lt;p class="triggers"&gt;&lt;a href="#" rel="all"&gt;All&lt;/a&gt; | &lt;a href="#" rel="brands"&gt;Brands&lt;/a&gt; | &lt;a href="#" rel="stores"&gt;Stores&lt;/a&gt; | &lt;a href="#" rel="online"&gt;Online&lt;/a&gt;&lt;/p&gt;<br />
</code></p>
<p>Here&#8217;s the final jQuery:</p>
<p><code><br />
// get the initial (full) list<br />
var $filterList = $('ul.filter-list');<br />
// add unique id's<br />
// i don't like having to write these all in the code<br />
// so i wrote a script to id these for me<br />
for(var i=0; i<$('ul.filter-list li').length; i++){<br />
	$('ul.filter-list li:eq(' + i + ')').attr('id','flitem' + i);<br />
}<br />
// clone first collection to get a second collection<br />
var $data = $filterList.clone();<br />
// handle trigger clicks<br />
$('p.trigger a').click(function(e) {<br />
	if($(this).hasClass('all')) {<br />
		// get a group of all items<br />
		var $filteredData = $data.find('li');<br />
	} else {<br />
		// get a group of items of a particular class<br />
		var $filteredData = $data.find('li.' + $(this).attr('rel'));<br />
	}<br />
	// call quicksand<br />
	$('ul.filter-list').quicksand($filteredData, {<br />
		duration: 500,<br />
		attribute: function(v) {<br />
			// this is the unique id attribute we created above<br />
			return $(v).attr('id');<br />
		 }<br />
	}<br />
	e.preventDefault();<br />
});</p>
<p></code></p>
<p>So if you're having trouble getting Quicksand to work in IE, and you're using a link's href attribute as a trigger, consider moving that trigger to the rel attribute or a class name instead. Hope this helps!</p>
]]></content:encoded>
			<wfw:commentRss>http://christiancox.com/?feed=rss2&amp;p=79</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>txts2myx</title>
		<link>http://christiancox.com/?p=72</link>
		<comments>http://christiancox.com/?p=72#comments</comments>
		<pubDate>Fri, 26 Feb 2010 21:33:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://christiancox.com/?p=72</guid>
		<description><![CDATA[Check out my new site &#8211; txts2myx! What&#8217;s the last text message you sent to your ex? I want to know. txtit!
]]></description>
			<content:encoded><![CDATA[<p>Check out my new site &#8211; <a href="http://txts2myx.com">txts2myx</a>! What&#8217;s the last text message you sent to your ex? I want to know. txtit!</p>
]]></content:encoded>
			<wfw:commentRss>http://christiancox.com/?feed=rss2&amp;p=72</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subscribe list users to a MailChimp mailing list using Flash</title>
		<link>http://christiancox.com/?p=29</link>
		<comments>http://christiancox.com/?p=29#comments</comments>
		<pubDate>Mon, 12 Jan 2009 18:45:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Internets]]></category>
		<category><![CDATA[ActionScript 2.0]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[MailChimp]]></category>

		<guid isPermaLink="false">http://christiancox.com/?p=29</guid>
		<description><![CDATA[UPDATE:
While this code is still functional and useful for AS 2.0 projects, an updated MailChimp AS 3.0 sample is now available from kohactive!
Here&#8217;s some sample code you can use to connect your Flash signup form to the MailChimp API. I recently had a client with an existing MailChimp account ask to allow users to sign [...]]]></description>
			<content:encoded><![CDATA[<p><strong>UPDATE:<br />
While this code is still functional and useful for AS 2.0 projects, an updated <a href="http://www.kohactive.com/html/labs/actionscript-3-0-and-mailchimps-api/" title="MailChimp AS 3.0 sample">MailChimp AS 3.0 sample</a> is now available from <a href="http://kohactive.com">kohactive</a>!</strong></p>
<p>Here&#8217;s some <a href="http://www.christiancox.com/chimp/subscribe_as2.zip">sample code</a> you can use to connect your Flash signup form to the <a href="http://mailchimp.com/api">MailChimp API</a>. I recently had a client with an existing MailChimp account ask to allow users to sign up for their newsletter through their website, which has a full Flash interface. Unfortunately I was not able to find much documentation out there about how to make this work, and it took me some hair pulling to get it sorted out. Finally, with the help of Jesse Peterson and the API team at <a href="http://www.mailchimp.com">MailChimp</a>, we were able to get a working version that doesn&#8217;t require any additional PHP or other backend scripting. Here&#8217;s the AS:</p>
<p><code style="padding: 10px; background: #cfc9bf none repeat scroll 0% 0%; width: 520px; font-size: 0.8em; display: block;"><br />
// Edit your MailChimp specifics here.<br />
// You shouldn't have to edit anything but these two variables<br />
// unless you are collecting additional data.<br />
_global.apiKey = &quot;YOUR_MAILCHIMP_API_KEY&quot;;<br />
_global.listID = &quot;YOUR_MAILCHIMP_LIST_ID&quot;;<br />
<br />
// set tab order for form usability<br />
firstName_txt.tabIndex = 1;<br />
lastName_txt.tabIndex = 2;<br />
email_txt.tabIndex = 3;<br />
submit_mc.tabIndex = 4;<br />
<br />
// submission<br />
submit_mc.onRelease = function()<br />
{<br />
&nbsp;&nbsp;&nbsp;// show a loading message in case transmission is slow<br />
&nbsp;&nbsp;&nbsp;response_txt.text = &quot;Sending&hellip;&quot;;<br />
<br />
&nbsp;&nbsp;&nbsp;// gather form data<br />
&nbsp;&nbsp;&nbsp;var firstName:String = firstName_txt.text;<br />
&nbsp;&nbsp;&nbsp;var lastName:String = lastName_txt.text;<br />
&nbsp;&nbsp;&nbsp;var email:String = email_txt.text;<br />
<br />
&nbsp;&nbsp;&nbsp;// check the email address<br />
&nbsp;&nbsp;&nbsp;// if it's valid&hellip;<br />
&nbsp;&nbsp;&nbsp;if(validEmail(email)){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// disable the submit button while loading data<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;submit_mc.enabled = false;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// set up result xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var result_xml:XML = new XML();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result_xml.ignoreWhite = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result_xml.onLoad = function(success){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// if the user is subscribed successfully, the result set<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// will look something like<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// &lt;MCAPI type=&quot;boolean&quot;&gt;1&lt;/MCAPI&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// so you can reset the form and display<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// the confirmation message.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(result_xml.firstChild.firstChild.toString() == &quot;1&quot;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resetForm(&quot;Please check your email to confirm your subscription.&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// or else there was a data error,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// so you need to parse the error code.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Convert the error string from XML data to a string,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// then display it in the response text field.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var resultCode = result_xml.firstChild.childNodes[0].childNodes[0].toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_root.resetForm(resultCode);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Set up a send XML object, even though we're not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// really sending anything in XML.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// All your data will be encoded in the send_url variable.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var send_xml:XML = new XML();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_xml.ignoreWhite = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Here's where your data is added.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// For additional text fields, add additional merge_vars<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// array elements and append at the end.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var send_url:String = &quot;http://api.mailchimp.com/1.1/?output=xml&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_url += &quot;&amp;method=listSubscribe&amp;apikey=&quot; + apiKey;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_url += &quot;&amp;id=&quot; + listID + &quot;&amp;email_address=&quot; + email;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_url += &quot;&amp;merge_vars[FNAME]=&quot; + firstName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_url += &quot;&amp;merge_vars[LNAME]=&quot; + lastName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// And here's how you send/load:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_xml.sendAndLoad(send_url, result_xml);<br />
<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;// or else there's an issue with the email address<br />
&nbsp;&nbsp;&nbsp;else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// show the email error.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showErrors();<br />
&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
// validate an email address<br />
function validEmail(inputEmail:String):Boolean<br />
{<br />
&nbsp;&nbsp;&nbsp;if (inputEmail.indexOf(&quot; &quot;)&gt;0) {<br />
&nbsp;&nbsp;&nbsp;return false;<br />
}<br />
var emailArray:Array=inputEmail.split(&quot;@&quot;);<br />
if (emailArray.length != 2 || emailArray[0].length == 0 || emailArray[1].length ==0) {<br />
&nbsp;&nbsp;&nbsp;return false;<br />
}<br />
var postArray:Array=emailArray[1].split(&quot;.&quot;);<br />
if (postArray.length &lt; 2) {<br />
&nbsp;&nbsp;&nbsp;return false;<br />
}<br />
for (var i:Number=0; i&lt;postArray.length; i++){<br />
<br />
&nbsp;&nbsp;&nbsp;if (postArray[i].length &lt; 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;}<br />
}<br />
var suffix=postArray[postArray.length-1];<br />
if (suffix.length &lt; 2 || suffix.length &gt; 3) {<br />
&nbsp;&nbsp;&nbsp;return false;<br />
}<br />
&nbsp;&nbsp;&nbsp;return true;<br />
}<br />
<br />
// delete all form elements and display a response message<br />
function resetForm(pResponse){<br />
&nbsp;&nbsp;&nbsp;submit_mc.enabled = true;<br />
&nbsp;&nbsp;&nbsp;firstName_txt.text = &quot;&quot;;<br />
&nbsp;&nbsp;&nbsp;lastName_txt.text = &quot;&quot;;<br />
&nbsp;&nbsp;&nbsp;email_txt.text = &quot;&quot;;<br />
&nbsp;&nbsp;&nbsp;response_txt.text = pResponse;<br />
&nbsp;&nbsp;&nbsp;Selection.setFocus(&quot;firstName_txt&quot;);<br />
}<br />
<br />
// select the email address and display an error message<br />
function showErrors(){<br />
&nbsp;&nbsp;&nbsp;Selection.setFocus(&quot;email_txt&quot;);<br />
&nbsp;&nbsp;&nbsp;Selection.setSelection(0, email_txt.length);<br />
&nbsp;&nbsp;&nbsp;response_txt.text = &quot;Invalid email address.&quot;;<br />
&nbsp;&nbsp;&nbsp;submit_mc.enabled = true;<br />
}<br />
</code></p>
<p>Want to try it out? All you need to do to get it working is set up your MailChimp account and lists, then edit these variables:</p>
<p><code style="padding: 10px; background: #cfc9bf none repeat scroll 0% 0%; width: 520px; font-size: 0.8em; display: block;"><br />
_global.apiKey = &quot;YOUR_MAILCHIMP_API_KEY&quot;;<br />
_global.listID = &quot;YOUR_MAILCHIMP_LIST_ID&quot;;</code></p>
<p>Then push your files online or test your SWF directly in the Flash Player (testing in a browser from your desktop may throw a Flash security error). You should be subscribing users in no time. Thanks again to the API team for working with me on this!</p>
]]></content:encoded>
			<wfw:commentRss>http://christiancox.com/?feed=rss2&amp;p=29</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
		<item>
		<title>Top 10 signs you&#8217;re at a redneck wedding</title>
		<link>http://christiancox.com/?p=27</link>
		<comments>http://christiancox.com/?p=27#comments</comments>
		<pubDate>Sun, 30 Nov 2008 22:01:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Son - what were you thinking?]]></category>
		<category><![CDATA[family]]></category>
		<category><![CDATA[redneck]]></category>
		<category><![CDATA[south carolina]]></category>

		<guid isPermaLink="false">http://christiancox.com/?p=27</guid>
		<description><![CDATA[10. The bride&#8217;s father is wearing his formal camoflage.
9. The ring bearer is wearing his commemorative Dale Earnhardt diaper (and nothing else).
8. The preacher is also the caterer, organist, program printer and volunteer fireman (that&#8217;s a separate post).
7. Before the wedding begins, you are forced to listen to a 70-year-old woman salivate over Hugh Jackman [...]]]></description>
			<content:encoded><![CDATA[<p>10. The bride&#8217;s father is wearing his formal camoflage.</p>
<p>9. The ring bearer is wearing his commemorative Dale Earnhardt diaper (and nothing else).</p>
<p>8. The preacher is also the caterer, organist, program printer and volunteer fireman (that&#8217;s a separate post).</p>
<p>7. Before the wedding begins, you are forced to listen to a 70-year-old woman salivate over Hugh Jackman to your 60 year-old mother, then use disturbing southern euphemisms to describe the things he could do to her &#8211; e.g. &#8220;He could put his shoes under my bed ALL NIGHT.&#8221;</p>
<p>6. The entire buffet is pork. Pork BBQ. Pork chops. Pork skins with pork chili dip. Dessert pork rinds with sugar, cinnamon and lard icing (ok that last one I made up).</p>
<p>5. The best man proposes a toast to the groom by tapping his Bud Light bottle with his tin of Skoal. &#8220;Ya&#8217;ll shut up I&#8217;mbouta say sumthin.&#8221;</p>
<p>4. One of the ushers is late because he&#8217;s being issued a ticket and fine by the state wildlife ranger for shooting too many ducks on his daily morning hunt.</p>
<p>3. The reception is in the newest trailer in the newly expanded west wing of the trailer park. Don&#8217;t hate.</p>
<p>2. The sod hasn&#8217;t arrived at the newest trailer in the newly expanded west wing of the trailer park, and it is raining, so guests must be ferried into said trailer by ATV complete with mud/rain gear and wader boots for each guest.</p>
<p>1. Instead of &#8220;Here comes the bride&#8221;, the Carolina Gamecock Fight Song is played as the bride walks down the aisle.</p>
<p>I swear it&#8217;s like a damn Faulkner novel with my dad&#8217;s family. Epic, I tell you!</p>
]]></content:encoded>
			<wfw:commentRss>http://christiancox.com/?feed=rss2&amp;p=27</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Gas pumps and gift cards</title>
		<link>http://christiancox.com/?p=25</link>
		<comments>http://christiancox.com/?p=25#comments</comments>
		<pubDate>Sun, 12 Oct 2008 15:42:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[customer service]]></category>
		<category><![CDATA[money]]></category>

		<guid isPermaLink="false">http://christiancox.com/?p=25</guid>
		<description><![CDATA[They don&#8217;t mix well, my friends, and American Express should include a very clear warning to that effect on their gift card labels. The problem? Gas merchants may authorize the card for its maximum amount whenever you swipe it at the pump, regardless of how much gas you may or may not actually buy. Last [...]]]></description>
			<content:encoded><![CDATA[<p>They don&#8217;t mix well, my friends, and American Express should include a very clear warning to that effect on their gift card labels. The problem? Gas merchants may authorize the card for its maximum amount whenever you swipe it at the pump, regardless of how much gas you may or may not actually buy. Last weekend I swiped my card (which had never been used, and carried a value of $100) and accidentally picked up the diesel nozzle instead of the unleaded nozzle. After about 30 seconds trying to fit the nozzle into my tank (the scary thing is how close I came to just squeezing the handle over the tank hole),  I realized I was holding a diesel nozzle and replaced it on the pump. So now, that transaction that had been initiated by swiping my card was canceled. No big deal, I can just swipe the card again and use the green nozzle, right? Wrong. The card has already been authorized for its entire value, and now reports a $0 balance &#8211; even though I didn&#8217;t actually purchase anything. At the time, I didn&#8217;t know what had happened and I just assumed there was a problem with the card activation or whatever, so I used another card to get a little bit of gas to hold me to the next station. At the next station, I took the card inside (thinking it needed to be activated at an actual register first) but got declined again. Finally I called AMEX to ask why I was getting declined and the customer service rep explained what had happened at the first POS transaction. I was informed that it could take 7 business days for the discrepancy to be resolved.</p>
<p>To quote Charlie Brown, &#8220;ARRRHGHGHGHHG!&#8221; It&#8217;s just so frustrating, because the customer service rep told me that next time I want to use the card to buy gas, I should take it inside the gas station and get them to charge the card at a cash register. OK, WHY COULDN&#8217;T YOU PUT THAT ON THE GIFT CARD LABEL? There is a big sticker over the top of the card with some basic info about how to use it. Don&#8217;t you think this would be important enough to tell your customers? I do. OBVS.</p>
]]></content:encoded>
			<wfw:commentRss>http://christiancox.com/?feed=rss2&amp;p=25</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MAX Schedule</title>
		<link>http://christiancox.com/?p=22</link>
		<comments>http://christiancox.com/?p=22#comments</comments>
		<pubDate>Fri, 19 Sep 2008 18:07:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Internets]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://christiancox.com/wordpress/?p=22</guid>
		<description><![CDATA[Monday

11:30 &#8211; Getting started with AS 3
2:00 &#8211; Using Flex and AIR to automate CS workflows
4:00 &#8211; Creating effects with Pixel Bender

Tuesday

8:30 &#8211; Build your 1st RIA with Flex 3
1:30 &#8211; AIR boot camp

Wednesday

9:30 &#8211; Text component library for Flash Player
11:00 &#8211; Build a DB-enabled AIR app with Dreamweaver, PHP and AJAX
2:00 &#8211; AIR core [...]]]></description>
			<content:encoded><![CDATA[<p>Monday</p>
<ul>
<li>11:30 &#8211; Getting started with AS 3</li>
<li>2:00 &#8211; Using Flex and AIR to automate CS workflows</li>
<li>4:00 &#8211; Creating effects with Pixel Bender</li>
</ul>
<p>Tuesday</p>
<ul>
<li>8:30 &#8211; Build your 1st RIA with Flex 3</li>
<li>1:30 &#8211; AIR boot camp</li>
</ul>
<p>Wednesday</p>
<ul>
<li>9:30 &#8211; Text component library for Flash Player</li>
<li>11:00 &#8211; Build a DB-enabled AIR app with Dreamweaver, PHP and AJAX</li>
<li>2:00 &#8211; AIR core concepts for developers who use Flash</li>
<li>4:00 &#8211; Thermo hands-on</li>
</ul>
<p>I&#8217;m actually really excited about this! Not only do I get to go to classes 8 hours a day, but I get to go to lots of  <strong>lab classes</strong> &#8211; at the end of the period they make you turn in all your practice work for a grade. No lie! Lowest scorers have to act out a new Microsoft commercial on stage at the closing ceremony. Lots of &#8220;believable&#8221; &#8220;successful&#8221; &#8220;creative&#8221; computer users proclaiming &#8220;I am a PC&#8221;?!!?! John Hodgman owns you and your weak sauce computing persona.</p>
<p>I&#8217;m also hoping to capitalize on the unreasonably high number of freebies I get that week. The company I work for is paying for flights, room and conference. And hopefully Adobe&#8217;s got swag coming out of their square-rim bespectacled eyeballs. Note to self: check the airline&#8217;s policy for extra carry-ons.</p>
]]></content:encoded>
			<wfw:commentRss>http://christiancox.com/?feed=rss2&amp;p=22</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taming the iPhone URL bar</title>
		<link>http://christiancox.com/?p=5</link>
		<comments>http://christiancox.com/?p=5#comments</comments>
		<pubDate>Sun, 14 Sep 2008 16:52:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Internets]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Web Standards]]></category>

		<guid isPermaLink="false">http://christiancox.com/wordpress/?p=5</guid>
		<description><![CDATA[I get to do lots of different kinds of front-end development at maybe.for.you., and right now I&#8217;m cracking on a social networking site optimized for the iPhone. There&#8217;s a simple horizontal header at the top with a logo and a few global nav links. That header is consistent from page to page, and doesn&#8217;t require [...]]]></description>
			<content:encoded><![CDATA[<p>I get to do lots of different kinds of front-end development at maybe.for.you., and right now I&#8217;m cracking on a social networking site optimized for the iPhone. There&#8217;s a simple horizontal header at the top with a logo and a few global nav links. That header is consistent from page to page, and doesn&#8217;t require any animation. But for the main site content, I&#8217;m setting up clickable lists that scroll to reveal more detailed information. It&#8217;s basically a stripped-down version of the IUI, but built specifically for this interface using jQuery. There&#8217;s plenty of information out there about hiding the URL bar at the top of the screen &#8211; a simple javascript function can handle that:</p>
<pre id="line1" style="padding-left: 30px;">&lt;<span class="start-tag">script</span><span class="attribute-name"> language</span>=<span class="attribute-value">"javascript" </span><span class="attribute-name">type</span>=<span class="attribute-value">"text/javascript"</span>&gt;
   addEventListener("load", function(event)
   {
	   setTimeout(function(){window.scrollTo(0, 1);}, 100);
   }, false);
&lt;/<span class="end-tag">script</span>&gt;</pre>
<p>Add that in your &lt;head&gt;tag to scroll the URL bar out of the way when the page loads. But with an AJAX-heavy interface, I found that the URL bar isn&#8217;t easy to keep out of the way. Links, animation, and scripting can all cause the URL bar to drop down, even if you&#8217;re not sending the user to a new HTML page. Eventually I was able to work out my problems, but only after wasting plenty of time with guess-and-check coding &#8211; and continuously uploading my updates to the web because I can&#8217;t test locally on my iPhone. Anyway here&#8217;s a checklist I came up with for troubleshooting the URL bar.</p>
<p><strong>Prevent the default event.</strong> It&#8217;s not something I always think about, but it&#8217;s usually a good idea, and is usually the first thing I check when troubleshooting. If you&#8217;re using &lt;a&gt; links to trigger animations, be sure to catch and prevent that default event.  If you&#8217;re using jQuery to do your animations, this is simple:</p>
<pre style="padding-left: 30px;">$("a.list").click(function(event){
    event.preventDefault();
    // animation scripts go here
});</pre>
<p><strong>Consider the height of existing page content.</strong> Is there enough content visible on the screen to fill up the entire available vertical height? If not, the browser will scroll to the top of the page regardless of whether or not the URL is being manipulated. One solution &#8211; the CSS min-height property. Of course, it&#8217;s not universally supported but since we&#8217;re optimizing for iPhone/iPod touch we&#8217;re pretty well covered. So I create a class called &#8220;page&#8221; that includes a min-height of at least 400px &#8211; combined with the 80px of my header that should be plenty of vertical space to fill the screen.</p>
<pre style="padding-left: 30px;">/* CSS document */
.page
{
    min-height: 400px;
}</pre>
<p>So I thought that would solve all my problems but during some of my page animations I was still seeing the URL bar drop down. I&#8217;m hiding a page element off the right edge of the browser, and setting its display property to &#8220;none&#8221;. When a link is clicked, I animate the original page off the left edge and animate the new page onto the screen. Even though I was using a time-delayed callback to hide the first page after the off-screen animation, since I had that line of code before the line displaying the second page the browser detected an insufficient amount of content on the page for a brief moment and scrolled to the top. Here&#8217;s the bad code:</p>
<pre style="padding-left: 30px;">$("#leftPage").animate({
   "left": "-100%"}, 700, "", function(){
      loadPage(event.target.rel);}
);
$("#rightPage").show();
$("#rightPage").animate({
   "left": "0%"}, 800, "", function(){
   $(".page:eq('0')").hide();}
);</pre>
<p>And the corrected version:</p>
<pre style="padding-left: 30px;">$("#rightPage").show();
$("#leftPage").animate({
   "left": "-100%"}, 700, "", function(){
      loadPage(event.target.rel);}
);
$("#rightPage").animate({
   "left": "0%"}, 800, "", function(){
      $(".page:eq('0')").hide();}
);</pre>
<p>So after a lot of trial and error I worked out most of the glitches with the URL bar. Next week I&#8217;m sure it&#8217;ll be something else.</p>
]]></content:encoded>
			<wfw:commentRss>http://christiancox.com/?feed=rss2&amp;p=5</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
