<?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>Code Couch</title>
	<atom:link href="http://www.codecouch.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codecouch.com</link>
	<description>The ramblings of two code monkeys</description>
	<lastBuildDate>Wed, 09 May 2012 21:34:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Resizing the left-hand labels column in Gmail – a bug fix and extra user script compatibility</title>
		<link>http://www.codecouch.com/2012/05/resizing-the-left-hand-labels-column-in-gmail-a-bug-fix-and-extra-user-script-compatibility/</link>
		<comments>http://www.codecouch.com/2012/05/resizing-the-left-hand-labels-column-in-gmail-a-bug-fix-and-extra-user-script-compatibility/#comments</comments>
		<pubDate>Wed, 09 May 2012 01:30:30 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.codecouch.com/?p=512</guid>
		<description><![CDATA[This is the latest version of my Gmail label column resizing code to address the Greasemonkey user script wrapper not working in Chrome, and to fix a minor z-index issue. I&#8217;ve also shrunk the bookmarklet version of the code by 7 bytes (because I could ), and have dropped the &#8220;some whitespace&#8221; version of the [...]]]></description>
			<content:encoded><![CDATA[<p>This is the latest version of my <a href="/2011/11/how-to-enable-resizing-of-the-left-hand-labels-column-in-gmail/" title="How to enable resizing of the left-hand labels column in Gmail">Gmail label column resizing code</a> to address the Greasemonkey user script wrapper not working in Chrome, and to fix a minor z-index issue. I&#8217;ve also shrunk the bookmarklet version of the code by 7 bytes (because I could <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ), and have dropped the &#8220;some whitespace&#8221; version of the code from this post, as it served no real purpose.</p>
<p>Here&#8217;s a quick run-down of what&#8217;s in this post:</p>
<ul>
<li><a href="#gmailResizer20120509_compatibility" class="bookmark">Compatibility</a></li>
<li><a href="#gmailResizer20120509_theCode" class="bookmark">The code</a></li>
<li><a href="#gmailResizer20120509_instructionsBm" class="bookmark">Instructions for running the code as a bookmarklet</a></li>
<li><a href="#gmailResizer20120509_instructionsUsGm" class="bookmark">Instructions for running the code as a user script in Greasemonkey</a></li>
<li><a href="#gmailResizer20120509_instructionsUsGc" class="bookmark">Instructions for running the code as a user script in Chrome</a></li>
<li><a href="#gmailResizer20120509_knownIssues" class="bookmark">Known issues</a></li>
</ul>
<p>As usual, if you find bugs, can suggest improvements, or just have something to say about the code, please use the comment form at the end of the post. Use the code as you like, but please follow the <a href="/terms/" title="Terms of use">terms of use</a> and acknowledge where the code came from if you reproduce it anywhere.</p>
<p>Enjoy!</p>
<p><a id="gmailResizer20120509_compatibility"></a></p>
		<div  class="headingPod headingLevel2 headingLevel2Orange">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>Compatibility</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>This code will not run in IE 8 or below. Other than that, I&#8217;ve tested the code on various versions of Chrome, Safari, Firefox, and Opera without any problems.</p>
<p>While I&#8217;ve implemented some detection for non-standard layouts (e.g. those created by some labs or plugins), it is impossible to guarantee 100% compatibility. I know the following labs worked fine during my testing and caused no issues:</p>
<ul>
<li>Right-side chat</li>
<li>Navbar drag and drop</li>
<li>Move Icon Column</li>
<li>Google Docs gadget</li>
<li>Google Calendar gadget</li>
</ul>
<p>The Xobni &#8220;Smartr Inbox&#8221; plugin is known to prevent my code from working.</p>
<p>I&#8217;ve had a 50% success rate running this as a user script in NinjaKit by using the Chrome user script wrapper and making minor modifications to the code. The other 50% was either nothing happening, or an error being thrown. I might look into this at some point, but it&#8217;s not high on my priority list at the moment.</p>
<p><a id="gmailResizer20120509_theCode"></a></p>
		<div  class="headingPod headingLevel2 headingLevel2Blue">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>The code</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>Here&#8217;s the bookmarklet version. If you&#8217;re unfamiliar with the concept of bookmarklets, read these <a href="#gmailResizer20120509_instructionsBm" class="bookmark">instructions for running the code as a bookmarklet</a>:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span><span class="br0">&#123;</span><span class="kw2">var</span> i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>l<span class="sy0">,</span>r<span class="sy0">,</span>c<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span>b<span class="sy0">=</span>d.<span class="me1">body</span><span class="sy0">,</span>t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span>x<span class="sy0">,</span>w<span class="sy0">,</span>n<span class="sy0">,</span>g<span class="sy0">,</span>Q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="sy0">,</span>W<span class="sy0">=</span><span class="st0">'width'</span><span class="sy0">,</span>U<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="sy0">,</span>P<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span>S<span class="sy0">=</span><span class="st0">'style'</span><span class="sy0">,</span>k<span class="sy0">=</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>r<span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>c<span class="sy0">+</span>P<span class="br0">&#125;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span>c<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">!=</span>b<span class="br0">&#41;</span>i<span class="sy0">=</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>n<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="sy0">=</span><span class="st0">'childNodes'</span><span class="br0">&#93;</span><span class="sy0">,</span>w<span class="sy0">=</span><span class="br0">&#91;</span>n<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span>n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">if</span><span class="br0">&#40;</span>c.<span class="me1">cells</span><span class="br0">&#41;</span><span class="kw1">for</span><span class="br0">&#40;</span>o <span class="kw1">in</span> w<span class="br0">&#41;</span><span class="br0">&#123;</span><span class="kw1">for</span><span class="br0">&#40;</span>l <span class="kw1">in</span> r<span class="sy0">=</span>w<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="kw1">if</span><span class="br0">&#40;</span>parseInt<span class="br0">&#40;</span>r<span class="br0">&#91;</span>l<span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>w<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>l<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">break</span><span class="br0">&#125;</span><span class="br0">&#125;</span>l<span class="sy0">=</span>w<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span>r<span class="sy0">=</span>w<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="sy0">,</span>c<span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>w<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">;</span>g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>n<span class="sy0">=</span>l<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role^=n]'</span><span class="br0">&#41;</span><span class="sy0">;</span>r<span class="br0">&#91;</span><span class="br0">&#40;</span>U<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">=</span>n<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span>n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>g<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>W<span class="sy0">+</span><span class="st0">':4px;position:absolute;z-index:1;left:'</span><span class="sy0">+</span><span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">'px;top:'</span><span class="sy0">+</span>t<span class="sy0">+</span><span class="st0">'px;bottom:0;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>top<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'resize'</span><span class="sy0">,</span>k<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>g<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span><span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>x<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>e.<span class="me1">pageX</span><span class="sy0">,</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">,</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">+=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span>e.<span class="me1">preventDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>x<span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>w<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">+</span>x<span class="sy0">,</span>l<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>w<span class="sy0">+</span>P<span class="sy0">,</span>g<span class="br0">&#91;</span>S<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>w<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>P<span class="sy0">,</span>k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span><span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>x<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span>k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="br0">&#41;</span></pre></div></div></div>

<p>And the &#8220;full monty&#8221; version with comments and formatting for easy reading:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="co1">// Use the Gmail Greasemonkey API to reliably find the 2 main elements (the left- and right-hand columns). You do not need Greasemonkey installed </span>
<span class="co1">// to use this API. See http://code.google.com/p/gmail-greasemonkey/wiki/GmailGreasemonkey10API for details (note: the documentation is out of date)</span>
<span class="co1">//</span>
<span class="co1">// Load the API. It will run our callback function when loaded, passing a GmailAPI object</span>
gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="coMULTI">/*
		Set up variables. To keep the code size down, some are re-used. There should be no global namespace pollution
&nbsp;
		i		initially points to the parent element of the left-hand nav, ultimately points to the parent element of the grab bar
		l		initially used as a loop counter, ultimately points to the element that is resized to change the left-hand column width
		r		initially used as a temporary loop variable, ultimately points to the style object of the element that is resized in the right-hand column
		c		initially points to the parent element of the active view, then parent element of all columns, then used to hold the width of columns 3-n (if present)
		d		this points to the document in the frame we use
		b		this points to the body
		t		this is used to calculate the top coordinate of the grab bar
		x		this holds the initial x delta between mouse click and left-hand column width
		w		initially used to point to the left-hand and main column elements, then during dragging, this holds the new width of the left-hand column
		n		initially holds pointers to all the columns elements, then the left-hand nav, then holds the string 'addEventListener'
		g		this points to the grab bar element
		Q		this holds the string 'querySelector'
		W		this holds the string 'width'
		U		used for many things, most notably holding the strings 'parentNode', 'childNodes', and 'cssText'
		P		this holds the string 'px'
		S		this holds the string 'style'
		k		this is the function that sets the width of the right-hand column
	*/</span>		
&nbsp;
	<span class="kw2">var</span> i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> l<span class="sy0">,</span> r<span class="sy0">,</span> c<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span> b<span class="sy0">=</span>d.<span class="me1">body</span><span class="sy0">,</span> t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span> x<span class="sy0">,</span> w<span class="sy0">,</span> n<span class="sy0">,</span> g<span class="sy0">,</span> Q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="sy0">,</span> W<span class="sy0">=</span><span class="st0">'width'</span><span class="sy0">,</span> U<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="sy0">,</span> P<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span> S<span class="sy0">=</span><span class="st0">'style'</span><span class="sy0">,</span> k<span class="sy0">=</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> r<span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>c<span class="sy0">+</span>P<span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Update c and i to point to their intended elements</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span> c<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">!=</span>b<span class="br0">&#41;</span> i<span class="sy0">=</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Update n to hold pointers to all the column elements (even if more than 2 are present), and w to point to just the first 2</span>
	n<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="sy0">=</span><span class="st0">'childNodes'</span><span class="br0">&#93;</span><span class="sy0">,</span> w<span class="sy0">=</span><span class="br0">&#91;</span>n<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Detect if a table has been used for layout (this happens with some of the Gmail labs, e.g. Right-side chat). If present, find the first</span>
	<span class="co1">// element that is controlling the cell's width by finding the first element that has an explicit non-zero width style set. This isn't a</span>
	<span class="co1">// perfect detection method (working with all the child nodes might be better), but it's better than nothing, and works at the moment :-)</span>
	<span class="kw1">if</span><span class="br0">&#40;</span>c.<span class="me1">cells</span><span class="br0">&#41;</span>
		<span class="kw1">for</span><span class="br0">&#40;</span>o <span class="kw1">in</span> w<span class="br0">&#41;</span> <span class="br0">&#123;</span>						<span class="co1">// Loop over the first two table cells</span>
			<span class="kw1">for</span><span class="br0">&#40;</span>l <span class="kw1">in</span> r<span class="sy0">=</span>w<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="br0">&#41;</span>				<span class="co1">// Find all of the cell's child elements and loop over them</span>
				<span class="kw1">if</span><span class="br0">&#40;</span>parseInt<span class="br0">&#40;</span>r<span class="br0">&#91;</span>l<span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>		<span class="co1">// If the current child element has a non-zero style width explicitly set...</span>
					w<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>l<span class="br0">&#93;</span><span class="sy0">;</span>			<span class="co1">// ... then assume it is the width-controlling element, and store in in the current item in w</span>
					<span class="kw1">break</span><span class="sy0">;</span>				<span class="co1">// There's no point in continuing to check the children (doing a &quot;When a stranger calls&quot;)</span>
				<span class="br0">&#125;</span>
		<span class="br0">&#125;</span>
&nbsp;
	<span class="co1">// Update l and r to point to their intended elements, and determine how much space is taken up</span>
	<span class="co1">// by any other columns (if present) by subtracting the label &amp; main columns widths from the body width</span>
	l<span class="sy0">=</span>w<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> r<span class="sy0">=</span>w<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="sy0">,</span> c<span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>w<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Create the grab bar, and insert it into the page</span>
	g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Copy the inline style from the &quot;Compose&quot; button. At present, the only inline style is a browser-specific user-select style used to prevent text selection.</span>
	<span class="co1">// This is applied to the right-hand column while dragging is underway to stop the text being selected. It is removed afterwards so that text can be copied.</span>
	<span class="co1">// This approach keeps the code size down, as the Gmail code handles the browser detection so I don't have to deal with vendor prefixes.</span>
	<span class="co1">// Store the inline style in a property called 'cssText2' of the right-hand column's style object</span>
	n<span class="sy0">=</span>l<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role^=n]'</span><span class="br0">&#41;</span><span class="sy0">;</span>
	r<span class="br0">&#91;</span><span class="br0">&#40;</span>U<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">=</span>n<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Calculate the top position for the grab bar</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span> n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Style the grab bar</span>
	g<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span> <span class="sy0">=</span> W <span class="sy0">+</span> <span class="st0">':4px;position:absolute;z-index:1;left:'</span> <span class="sy0">+</span> <span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'px;top:'</span> <span class="sy0">+</span> t <span class="sy0">+</span> <span class="st0">'px;bottom:0;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Add a resize event to the window to update the size of the right-hand column when the window is resized</span>
	<span class="co1">// While Gmail does this anyway, it doesn't take into account any size change to the left-hand column</span>
	top<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'resize'</span><span class="sy0">,</span> k<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Add mouse event listeners. mousedown is added to the grab bar, mousemove and mouseup to the document</span>
	g<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// Only trigger with the LMB on grab bar. Stores initial x coord and width of left-hand column</span>
		<span class="co1">// Save a copy of the existing right-hand column style so we can restore it later, then disable text selection</span>
		<span class="co1">// Call e.preventDefault() to stop a native drag operation from starting (this happens a lot in Fx)</span>
		e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>x<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>e.<span class="me1">pageX</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">+=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span> e.<span class="me1">preventDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// If we have the mouse button pressed, work out the x delta then update the column widths and the grab bar position</span>
		x <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>w<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">+</span>x<span class="sy0">,</span> l<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>w<span class="sy0">+</span>P<span class="sy0">,</span> g<span class="br0">&#91;</span>S<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>w<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>P<span class="sy0">,</span> k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// If the LMB is released, stop the mousemove code from running and restore the right-hand column style</span>
		<span class="co1">// k() needs to be called again, as restoring the style could alter the width</span>
		e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>x<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span> k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div>

<p><a id="gmailResizer20120509_instructionsBm"></a></p>
		<div  class="headingPod headingLevel2 headingLevel2Green">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>Running the code as a bookmarklet</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p><a href="http://en.wikipedia.org/wiki/Bookmarklet" title="Visit the Wikipedia article on bookmarklets">Bookmarklets</a> are small pieces of code that are usually designed to add extra functionality to a web page, and they are normally run (activated) by visiting a bookmark (or favourite) in your web browser. Here&#8217;s how to create a bookmarklet:</p>
<p><strong>Note:</strong> these instructions are generic, as different browsers will have different ways of creating a bookmark. If you have trouble getting the code to run, post a comment with the details of the browser you&#8217;re using.</p>
<ol>
<li>Select / highlight the bookmarklet version of <a href="#gmailResizer20120509_theCode" class="bookmark">the code</a></li>
<li>Copy the selected code to your clipboard</li>
<li>Create a new bookmark (or edit an existing one)</li>
<li>Set the name of the bookmark to be anything you like, e.g. &#8220;Gmail resizer&#8221;</li>
<li>Set the URL / address of the bookmark to be the text &#8220;javascript:&#8221; (with the colon, without the quotes), followed immediately by the code you&#8217;ve just copied. <strong>Note:</strong> This first part of this step is very important: the code will not run without the &#8220;javascript:&#8221; prefix. I have not included the prefix in the code, as some browsers strip it when pasted as part of a URL for security reasons; typing the prefix has no such issue</li>
<li>Save the bookmark</li>
</ol>
<p>To run the code:</p>
<ol>
<li><a href="http://www.gmail.com/" title="Load Gmail">Load Gmail</a></li>
<li>Wait for the page to finish loading</li>
<li>Visit the bookmark as you would any other bookmark (normally by selecting it from the &#8220;Bookmarks&#8221; menu or toolbar)</li>
<li>If all has gone to plan, you should see two thin dashed lines between the label column and the main content area. The dashes are grey in colour, so may not be visible if your theme clashes. The should look like this (without the red border):
<div style="background:white; margin:10px 0px;" class="redBorder">
<div style="width:4px; height:50px; margin:5px auto; background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7);"></div>
</p></div>
</li>
</ol>
<p>If you do not see two dotted lines in the red box above, try adjusting your screen&#8217;s brightness or contrast settings, and failing that, check the <a href="#gmailResizer20120509_compatibility" class="bookmark">compatibility section</a> to make sure you are using a supported browser.</p>
<p><a id="gmailResizer20120509_instructionsUsGm"></a></p>
		<div  class="headingPod headingLevel2 headingLevel2Yellow">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>Running the code as a user script in Greasemonkey</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>To get the code to work in Greasemonkey, the &#8220;gmonkey&#8221; variable reference must be prefixed with &#8220;unsafeWindow.&#8221;. Here&#8217;s the wrapper I used around the above &#8220;full monty&#8221; code:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="co1">// ==UserScript==</span>
<span class="co1">// @name           Gmail label column resizer</span>
<span class="co1">// @namespace      http://www.codecouch.com/</span>
<span class="co1">// @description    User script that allows the labels column in Gmail to be resized</span>
<span class="co1">// @include        http://mail.google.com/*</span>
<span class="co1">// @include        https://mail.google.com/*</span>
<span class="co1">// ==/UserScript==</span>
&nbsp;
<span class="co1">// Insert the code here, but don't forget to prefix &quot;gmonkey&quot; with &quot;unsafeWindow.&quot;</span>
<span class="co1">// The first line of code should now read:</span>
<span class="co1">//</span>
<span class="co1">// 	unsafeWindow.gmonkey.load(2, function(o) {</span></pre></div></div></div>

<p><a id="gmailResizer20120509_instructionsUsGc"></a></p>
		<div  class="headingPod headingLevel2 headingLevel2Green">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>Running the code as a user script in Chrome</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>User scripts running in Chrome do not have access to all Greasemonkey features, including access to the &#8220;unsafeWindow&#8221; variable. Therefore, a different method is used to deliver the code.</p>
<p>To install the code into Chrome, follow these steps:</p>
<ol>
<li>Copy the code below into a text editor</li>
<li>Copy the &#8220;full monty&#8221; code above and paste it into the text editor after the line that reads &#8220;// Insert code here.&#8221;</li>
<li>Save the file with a name that ends in &#8220;.user.js&#8221;, for example, &#8220;chromeGmailResizer.user.js&#8221;. <strong>Note:</strong> the &#8220;.user.js&#8221; extension is important as tells Chrome that this code is to be installed as a user script</li>
<li>Drag the file into Chrome.</li>
<li>You should see a security message similar to this:<br /><img src="http://www.codecouch.com/wp-content/uploads/2012/05/installGmailResizerIntoChromeStep1.png" alt="" title="Install Gmail Resizer Into Chrome - Step 1" width="457" height="42" class="alignnone size-full wp-image-531" /><br />Click the &#8220;Continue&#8221; button</li>
<li>You should see another security message similar to this:<br /><img src="http://www.codecouch.com/wp-content/uploads/2012/05/installGmailResizerIntoChromeStep2.png" alt="" title="Install Gmail Resizer Into Chrome - Step 2" width="368" height="152" class="alignnone size-full wp-image-532" /><br />Click the &#8220;Add&#8221; button</li>
<li>You should see a confirmation message similar to this:<br /><img src="http://www.codecouch.com/wp-content/uploads/2012/05/installGmailResizerIntoChromeStep3.png" alt="" title="Install Gmail Resizer Into Chrome - Step 3" width="391" height="133" class="alignnone size-full wp-image-533" /></li>
<li><a href="http://www.gmail.com/" title="Load Gmail">Load Gmail</a>, and you should see the grab bar ready to go!</li>
</ol>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="co1">// ==UserScript==</span>
<span class="co1">// @name           Gmail label column resizer</span>
<span class="co1">// @namespace      http://www.codecouch.com/</span>
<span class="co1">// @description    User script that allows the labels column in Gmail to be resized</span>
<span class="co1">// @include        http://mail.google.com/*</span>
<span class="co1">// @include        https://mail.google.com/*</span>
<span class="co1">// ==/UserScript==</span>
&nbsp;
<span class="kw2">var</span> loadGmailResizer <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">typeof</span><span class="br0">&#40;</span>gmonkey<span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">'object'</span> <span class="sy0">||</span> <span class="sy0">!</span><span class="br0">&#40;</span><span class="st0">'load'</span> <span class="kw1">in</span> gmonkey<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">return</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Insert code here.</span>
	<span class="co1">// No modification to the code is needed when running in Chrome, so the first line of code should still read:</span>
	<span class="co1">//</span>
	<span class="co1">// 	gmonkey.load(2, function(o) {</span>
&nbsp;
<span class="br0">&#125;</span><span class="sy0">;</span>
<span class="kw2">var</span> d <span class="sy0">=</span> document<span class="sy0">,</span> s <span class="sy0">=</span> d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'script'</span><span class="br0">&#41;</span><span class="sy0">;</span>
s.<span class="me1">type</span> <span class="sy0">=</span> <span class="st0">'text/javascript'</span><span class="sy0">;</span>
s.<span class="me1">textContent</span> <span class="sy0">=</span> <span class="st0">'('</span> <span class="sy0">+</span> loadGmailResizer.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">')()'</span><span class="sy0">;</span>
d.<span class="me1">body</span>.<span class="me1">appendChild</span><span class="br0">&#40;</span>s<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div>

<p><a id="gmailResizer20120509_knownIssues"></a></p>
		<div  class="headingPod headingLevel2 headingLevel2Yellow">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>Known issues</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>Here&#8217;s a list of all the issues I&#8217;m currently aware of (whether bugs or things I&#8217;d like to add):</p>
<ul>
<li>When switching between pages / themes, the grab bar may end up in the wrong place. If you experience this, reload the page and run the bookmarklet again</li>
<li>The grab bar disappears if the page is refreshed. Unless you use Greasemonkey, or run the code as a user script in Chrome, you&#8217;ll need to run the bookmarklet each time the page is refreshed</li>
<li>No minimum or maximum column size is enforced. If you drag a column too small, don&#8217;t expect things to look good <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ul>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Resizing+the+left-hand+labels+column+in+Gmail+%E2%80%93+a+bug+fix+and+extra+user+script+compatibility+http%3A%2F%2Fis.gd%2FMJZlUh" title="Post to Twitter"><img class="nothumb" src="http://www.codecouch.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big4.png" alt="Post to Twitter" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://www.codecouch.com/2012/05/resizing-the-left-hand-labels-column-in-gmail-a-bug-fix-and-extra-user-script-compatibility/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Gmail &#8216;backdoor&#8217;</title>
		<link>http://www.codecouch.com/2012/04/gmail-backdoor/</link>
		<comments>http://www.codecouch.com/2012/04/gmail-backdoor/#comments</comments>
		<pubDate>Sun, 01 Apr 2012 09:20:25 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.codecouch.com/?p=488</guid>
		<description><![CDATA[Here&#8217;s an interesting &#8216;feature&#8217; I found while updating my popular Gmail label column resizer script: A way to access certain parts of your mailbox without having to sign in. Whether the same code can be used to access all of your mail &#8211; or possibly someone else&#8217;s mail, I haven&#8217;t quite worked out yet. As [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s an interesting &#8216;feature&#8217; I found while updating my popular <a href="http://www.codecouch.com/2012/02/resizing-the-left-hand-labels-column-in-gmail-support-for-extra-columns/">Gmail label column resizer</a> script: A way to access certain parts of your mailbox without having to sign in.</p>
<p>Whether the same code can be used to access all of your mail &#8211; or possibly someone else&#8217;s mail, I haven&#8217;t quite worked out yet.</p>
<p>As with my resizer code, I&#8217;ll give a &#8216;bookmarklet&#8217; version as well as a version with a bit more whitespace&#8217;.</p>
<p>Here&#8217;s the bookmarklet version:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">javascript<span class="sy0">:</span><span class="kw1">void</span><span class="br0">&#40;</span><span class="kw2">function</span> gmailBackdoor<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="kw2">var</span> api<span class="sy0">,</span> right<span class="sy0">,</span> l<span class="sy0">=</span><span class="st0">''</span><span class="sy0">,</span> u<span class="sy0">=</span><span class="st0">'user'</span><span class="sy0">,</span> p<span class="sy0">=</span><span class="st0">'password'</span><span class="sy0">,</span> c<span class="sy0">=</span>arguments.<span class="me1">callee</span><span class="sy0">,</span> s<span class="sy0">=</span><span class="st0">'split'</span><span class="sy0">,</span> r<span class="sy0">=</span><span class="st0">'trela|ecalper'</span><span class="br0">&#91;</span>s<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">''</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> o <span class="kw1">in</span> l<span class="br0">&#41;</span> <span class="kw1">void</span><span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span> r<span class="sy0">=</span>r.<span class="me1">reverse</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#91;</span>s<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'|'</span><span class="br0">&#41;</span><span class="sy0">;</span> window<span class="br0">&#91;</span>r<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="br0">&#40;</span>c<span class="sy0">+</span><span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#91;</span>r<span class="sy0">=</span>r<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="co2">/(vo(.|\n)*|'[^f]*|v\w.|\Wi.|\S{7,}|[\s\{\)])/g</span><span class="sy0">,</span><span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#91;</span>r<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="co2">/(\w{2}).*?\b/g</span><span class="sy0">,</span><span class="st0">'$1'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>r<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'='</span><span class="sy0">,</span><span class="st0">'<span class="es0">\n</span>'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>r<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="co2">/[,\(]/g</span><span class="sy0">,</span><span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#125;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div>

<p>And here&#8217;s a slightly more formatted version:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="kw2">function</span> gmailBackdoor<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw2">var</span> api<span class="sy0">,</span> right<span class="sy0">,</span> l<span class="sy0">=</span><span class="st0">''</span><span class="sy0">,</span> u<span class="sy0">=</span><span class="st0">'user'</span><span class="sy0">,</span> p<span class="sy0">=</span><span class="st0">'password'</span><span class="sy0">,</span> c<span class="sy0">=</span>arguments.<span class="me1">callee</span><span class="sy0">,</span> s<span class="sy0">=</span><span class="st0">'split'</span><span class="sy0">,</span> r<span class="sy0">=</span><span class="st0">'trela|ecalper'</span><span class="br0">&#91;</span>s<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">''</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> o <span class="kw1">in</span> l<span class="br0">&#41;</span> <span class="kw1">void</span><span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	r<span class="sy0">=</span>r.<span class="me1">reverse</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#91;</span>s<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'|'</span><span class="br0">&#41;</span><span class="sy0">;</span>
	window<span class="br0">&#91;</span>r<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="br0">&#40;</span>c<span class="sy0">+</span><span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#91;</span>r<span class="sy0">=</span>r<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="co2">/(vo(.|\n)*|'[^f]*|v\w.|\Wi.|\S{7,}|[\s\{\)])/g</span><span class="sy0">,</span><span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#91;</span>r<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="co2">/(\w{2}).*?\b/g</span><span class="sy0">,</span><span class="st0">'$1'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>r<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'='</span><span class="sy0">,</span><span class="st0">'<span class="es0">\n</span>'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>r<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="co2">/[,\(]/g</span><span class="sy0">,</span><span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#125;</span></pre></div></div></div>

<p>As long as you&#8217;ve previously signed into Gmail in whatever browser you run this in, it seems to work.</p>
<p>I&#8217;ve yet to comment this code, but when I&#8217;ve finished going through it, I&#8217;ll add it to this post.</p>
<p>If you find any more details regarding this &#8216;oddity&#8217;, do let me know!</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Gmail+%E2%80%98backdoor%E2%80%99+http%3A%2F%2Fis.gd%2FIgNDO1" title="Post to Twitter"><img class="nothumb" src="http://www.codecouch.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big4.png" alt="Post to Twitter" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://www.codecouch.com/2012/04/gmail-backdoor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resizing the left-hand labels column in Gmail &#8211; support for extra columns</title>
		<link>http://www.codecouch.com/2012/02/resizing-the-left-hand-labels-column-in-gmail-support-for-extra-columns/</link>
		<comments>http://www.codecouch.com/2012/02/resizing-the-left-hand-labels-column-in-gmail-support-for-extra-columns/#comments</comments>
		<pubDate>Sun, 19 Feb 2012 06:43:13 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.codecouch.com/?p=469</guid>
		<description><![CDATA[Update (10 May 2012): I&#8217;ve added a new post that has all the various bug fixes to date as well as new code showing how to get the code working as a user script in Chrome as well as Greasemonkey. Here&#8217;s an update to my Gmail label column resizing code that has a bit more [...]]]></description>
			<content:encoded><![CDATA[<hr />
<p><strong>Update (10 May 2012): </strong> I&#8217;ve <a href="/2012/05/resizing-the-left-hand-labels-column-in-gmail-a-bug-fix-and-extra-user-script-compatibility/" title="Resizing the left-hand labels column in Gmail – a bug fix and extra user script compatibility">added a new post</a> that has all the various bug fixes to date as well as new code showing how to get the code working as a user script in Chrome as well as Greasemonkey.</p>
<hr />
<p>Here&#8217;s an update to my <a href="http://www.codecouch.com/2012/02/resizing-the-left-hand-labels-column-in-gmail-an-update-to-fix-text-selection/" title="How to enable resizing of the left-hand labels column in Gmail">Gmail label column resizing code</a> that has a bit more logic to detect other columns that may be present.</p>
<p>The previous versions worked well with Gmail&#8217;s out-of-the-box settings where only two columns were present, but if any plugins or Gmail labs had been enabled that added extra columns (e.g. Gmail&#8217;s &#8220;right-side chat&#8221; lab, etc.), then things started to go pear-shaped.</p>
<p>This update adds code to detect any space that doesn&#8217;t belong to either the label or main columns, and ensures that at least that much space is spare when resizing the columns or the window. In theory, this should work with any Gmail labs or other plugins that simply add a right-hand column to the screen.</p>
<p>I&#8217;ve also added code to specifically work with the Gmail &#8220;right-side chat&#8221; lab, as it modified the page structure by inserting tables around the main elements. Unfortunately, resizing table elements is a different ball-game altogether, and so I&#8217;ve had to traverse into each of the table cells and attempt to find the element that controls their width. While this works (at the moment), it does make an assumption that there is only one such element per cell / column (which is the case with the &#8220;right-side chat&#8221; lab). If a lab / plugin does anything fancy, this update will probably not work as expected.</p>
<p>So, I don&#8217;t expect this to work with all plugins or labs, as they&#8217;ll each have their own way of modifying the page structure, but I have tested it with the &#8220;right-side chat&#8221; lab and it seems to work very nicely.</p>
<p>If you use any other Gmail labs or plugins that add extra columns, please leave a comment below to let me know whether it works OK for you&#8230; there&#8217;s no way I&#8217;d be able to test every add-on available <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>There&#8217;s one extra update to this version of the code: the &#8220;mousedown&#8221; event handler calls &#8220;preventDefault&#8221; on the event object. I found that Firefox would occasionally start a native drag, where the grab bar would move but the mousemove event would not fire. This fixes that issue.</p>
<p><a id="theCode"></a></p>
		<div  class="headingPod headingLevel2 headingLevel2Pink">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>The code</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>As usual, I&#8217;ll start with the no-whitespace bookmarklet version:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">javascript<span class="sy0">:</span>gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span><span class="br0">&#123;</span><span class="kw2">var</span> i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>l<span class="sy0">,</span>r<span class="sy0">,</span>c<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span>b<span class="sy0">=</span>d.<span class="me1">body</span><span class="sy0">,</span>t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span>x<span class="sy0">,</span>w<span class="sy0">,</span>n<span class="sy0">,</span>g<span class="sy0">,</span>Q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="sy0">,</span>W<span class="sy0">=</span><span class="st0">'width'</span><span class="sy0">,</span>U<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="sy0">,</span>P<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span>S<span class="sy0">=</span><span class="st0">'style'</span><span class="sy0">,</span>k<span class="sy0">=</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>r<span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>c<span class="sy0">+</span>P<span class="br0">&#125;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span>c<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">!=</span>b<span class="br0">&#41;</span>i<span class="sy0">=</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>n<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="sy0">=</span><span class="st0">'childNodes'</span><span class="br0">&#93;</span><span class="sy0">,</span>w<span class="sy0">=</span><span class="br0">&#91;</span>n<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span>n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">if</span><span class="br0">&#40;</span>c.<span class="me1">cells</span><span class="br0">&#41;</span><span class="kw1">for</span><span class="br0">&#40;</span>o <span class="kw1">in</span> w<span class="br0">&#41;</span><span class="br0">&#123;</span>r<span class="sy0">=</span>w<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">for</span><span class="br0">&#40;</span>l <span class="kw1">in</span> r<span class="br0">&#41;</span><span class="kw1">if</span><span class="br0">&#40;</span>parseInt<span class="br0">&#40;</span>t<span class="sy0">+</span>r<span class="br0">&#91;</span>l<span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">,</span><span class="nu0">10</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>w<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>l<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">break</span><span class="br0">&#125;</span><span class="br0">&#125;</span>l<span class="sy0">=</span>w<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span>r<span class="sy0">=</span>w<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="sy0">,</span>c<span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>w<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">;</span>g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>n<span class="sy0">=</span>l<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role^=n]'</span><span class="br0">&#41;</span><span class="sy0">;</span>r<span class="br0">&#91;</span><span class="br0">&#40;</span>U<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">=</span>n<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span>n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>g<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>W<span class="sy0">+</span><span class="st0">':4px;position:absolute;z-index:9;left:'</span><span class="sy0">+</span><span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">'px;top:'</span><span class="sy0">+</span>t<span class="sy0">+</span><span class="st0">'px;bottom:0;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>top<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'resize'</span><span class="sy0">,</span>k<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>g<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span><span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>x<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>e.<span class="me1">pageX</span><span class="sy0">,</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">,</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">+=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span>e.<span class="me1">preventDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>x<span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>w<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">+</span>x<span class="sy0">,</span>l<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>w<span class="sy0">+</span>P<span class="sy0">,</span>g<span class="br0">&#91;</span>S<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>w<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>P<span class="sy0">,</span>k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span><span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>x<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span>k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="br0">&#41;</span></pre></div></div></div>

<p>Even at 1123 bytes, all the modern browsers I tested seemed to handle this as a bookmarklet without any problems at all. </p>
<p>Here&#8217;s the same code, with a small amount of whitespace:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw2">var</span> i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> l<span class="sy0">,</span> r<span class="sy0">,</span> c<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span> b<span class="sy0">=</span>d.<span class="me1">body</span><span class="sy0">,</span> t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span> x<span class="sy0">,</span> w<span class="sy0">,</span> n<span class="sy0">,</span> g<span class="sy0">,</span> Q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="sy0">,</span> W<span class="sy0">=</span><span class="st0">'width'</span><span class="sy0">,</span> U<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="sy0">,</span> P<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span> S<span class="sy0">=</span><span class="st0">'style'</span><span class="sy0">,</span> k<span class="sy0">=</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> r<span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>c<span class="sy0">+</span>P<span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">;</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span> c<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span> <span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">!=</span>b<span class="br0">&#41;</span> i<span class="sy0">=</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span> n<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="sy0">=</span><span class="st0">'childNodes'</span><span class="br0">&#93;</span><span class="sy0">,</span> w<span class="sy0">=</span><span class="br0">&#91;</span>n<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="sy0">;</span>
	<span class="kw1">if</span> <span class="br0">&#40;</span>c.<span class="me1">cells</span><span class="br0">&#41;</span> <span class="kw1">for</span><span class="br0">&#40;</span>o <span class="kw1">in</span> w<span class="br0">&#41;</span> <span class="br0">&#123;</span> r<span class="sy0">=</span>w<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span> <span class="kw1">for</span><span class="br0">&#40;</span>l <span class="kw1">in</span> r<span class="br0">&#41;</span> <span class="kw1">if</span> <span class="br0">&#40;</span>parseInt<span class="br0">&#40;</span>t<span class="sy0">+</span>r<span class="br0">&#91;</span>l<span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">,</span> <span class="nu0">10</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> w<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>l<span class="br0">&#93;</span><span class="sy0">;</span> <span class="kw1">break</span><span class="sy0">;</span> <span class="br0">&#125;</span><span class="br0">&#125;</span>
	l<span class="sy0">=</span>w<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> r<span class="sy0">=</span>w<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="sy0">,</span> c<span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>w<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">;</span> g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	n<span class="sy0">=</span>l<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role^=n]'</span><span class="br0">&#41;</span><span class="sy0">;</span> r<span class="br0">&#91;</span><span class="br0">&#40;</span>U<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">=</span>n<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span> <span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span> n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>
	g<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span> <span class="sy0">=</span> W <span class="sy0">+</span> <span class="st0">':4px;position:absolute;z-index:9;left:'</span> <span class="sy0">+</span> <span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'px;top:'</span> <span class="sy0">+</span> t <span class="sy0">+</span> <span class="st0">'px;bottom:0;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>
	top<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'resize'</span><span class="sy0">,</span> k<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
	g<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span> e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>x<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>e.<span class="me1">pageX</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">+=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span> e.<span class="me1">preventDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span> x <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>w<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">+</span>x<span class="sy0">,</span> l<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>w<span class="sy0">+</span>P<span class="sy0">,</span> g<span class="br0">&#91;</span>S<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>w<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>P<span class="sy0">,</span> k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span> e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>x<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span> k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div>

<p>And the full monty:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="co1">// Use the Gmail Greasemonkey API to reliably find the 2 main elements (left- and right-hand columns). You do not need Greasemonkey installed to use the API.</span>
<span class="co1">// See http://code.google.com/p/gmail-greasemonkey/wiki/GmailGreasemonkey10API for more details (note: documentation is out of date)</span>
<span class="co1">//</span>
<span class="co1">// Load the API. It will run our callback function when loaded, passing a GmailAPI object</span>
gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="coMULTI">/*
	Set up variables. To keep the code size down, some are re-used. There should be no global namespace pollution
&nbsp;
	i		initially points to the parent element of the left-hand nav, ultimately points to the parent element of the grab bar
	l		initially used as a loop counter, ultimately points to the element that is resized to change the left-hand column width
	r		initially used as a temporary loop variable, ultimately points to the style object of the element that is resized in the right-hand column
	c		initially points to the parent element of the active view, then parent element of all columns, then used to hold the width of columns 3-n (if present)
	d		this points to the document in the frame we use
	b		this points to the body
	t		this is used to calculate the top coordinate of the grab bar
	x		this holds the initial x delta between mouse click and left-hand column width
	w		initially used to point to the left-hand and main column elements, then during dragging, this holds the new width of the left-hand column
	n		initially holds pointers to all the columns elements, then the left-hand nav, then holds the string 'addEventListener'
	g		this points to the grab bar element
	Q		this holds the string 'querySelector'
	W		this holds the string 'width'
	U		used for many things, most notably holding the strings 'parentNode', 'childNodes', and 'cssText'
	P		this holds the string 'px'
	S		this holds the string 'style'
	k		this is the function that sets the width of the right-hand column
*/</span>		
&nbsp;
	<span class="kw2">var</span> i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> l<span class="sy0">,</span> r<span class="sy0">,</span> c<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span> b<span class="sy0">=</span>d.<span class="me1">body</span><span class="sy0">,</span> t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span> x<span class="sy0">,</span> w<span class="sy0">,</span> n<span class="sy0">,</span> g<span class="sy0">,</span> Q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="sy0">,</span> W<span class="sy0">=</span><span class="st0">'width'</span><span class="sy0">,</span> U<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="sy0">,</span> P<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span> S<span class="sy0">=</span><span class="st0">'style'</span><span class="sy0">,</span> k<span class="sy0">=</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> r<span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>c<span class="sy0">+</span>P<span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Update c and i to point to their intended elements</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span> c<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">!=</span>b<span class="br0">&#41;</span> i<span class="sy0">=</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Update n to hold pointers to all the column elements (even if more than 2 are present), and w to point to just the first 2</span>
	n<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="sy0">=</span><span class="st0">'childNodes'</span><span class="br0">&#93;</span><span class="sy0">,</span> w<span class="sy0">=</span><span class="br0">&#91;</span>n<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Detect if a table has been used for layout... This happens with some of the Gmail labs (e.g. Right-side chat)</span>
	<span class="co1">// If present, find the element inside each table cell that is controlling its width by looking for an element</span>
	<span class="co1">// that has an explicit width style set that is &gt; 0. This isn't perfect, but it's better than nothing :-)</span>
	<span class="kw1">if</span> <span class="br0">&#40;</span>c.<span class="me1">cells</span><span class="br0">&#41;</span>
		<span class="kw1">for</span><span class="br0">&#40;</span>o <span class="kw1">in</span> w<span class="br0">&#41;</span> <span class="br0">&#123;</span>									<span class="co1">// Loop over the first two table cells</span>
			r<span class="sy0">=</span>w<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>									<span class="co1">// Find all of the cell's child elements</span>
			<span class="kw1">for</span><span class="br0">&#40;</span>l <span class="kw1">in</span> r<span class="br0">&#41;</span>									<span class="co1">// And loop over them</span>
				<span class="kw1">if</span> <span class="br0">&#40;</span>parseInt<span class="br0">&#40;</span>t<span class="sy0">+</span>r<span class="br0">&#91;</span>l<span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">,</span> <span class="nu0">10</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>		<span class="co1">// Does the current child element have a non-0 style width explicitly set? </span>
					w<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>l<span class="br0">&#93;</span><span class="sy0">;</span>							<span class="co1">// If so, update the current item in w to point to it</span>
					<span class="kw1">break</span><span class="sy0">;</span>								<span class="co1">// Assume there's only 1 width-controlling element (not perfect, I know)</span>
				<span class="br0">&#125;</span>
		<span class="br0">&#125;</span>
&nbsp;
	<span class="co1">// Update l and r to point to their intended elements, and determine how much space is taken up</span>
	<span class="co1">// by any other columns (if present) by subtracting the label &amp; main columns widths from the body width</span>
	l<span class="sy0">=</span>w<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> r<span class="sy0">=</span>w<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="sy0">,</span> c<span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>w<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Create the grab bar, and insert into DOM</span>
	g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Copy the inline style from the &quot;Compose&quot; button. At present, the only inline style is a browser-specific user-select style used to prevent text selection.</span>
	<span class="co1">// This is applied to the right-hand column while dragging is underway to stop the text being selected. It is removed afterwards so that text can be copied.</span>
	<span class="co1">// As I wanted to keep the code size as small as possible, it was easier to let Google do the browser sniffing and copy their style rather than deal with the vendor prefix approach.</span>
	<span class="co1">// Store this in a property called 'cssText2' of the right-hand column's style object</span>
	n<span class="sy0">=</span>l<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role^=n]'</span><span class="br0">&#41;</span><span class="sy0">;</span>
	r<span class="br0">&#91;</span><span class="br0">&#40;</span>U<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">=</span>n<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Calculate the top position for the grab bar</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span> n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Style the grab bar</span>
	g<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span> <span class="sy0">=</span> W <span class="sy0">+</span> <span class="st0">':4px;position:absolute;z-index:9;left:'</span> <span class="sy0">+</span> <span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'px;top:'</span> <span class="sy0">+</span> t <span class="sy0">+</span> <span class="st0">'px;bottom:0;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Add a resize event to the window to update the size of the right-hand column as the window is sized</span>
	<span class="co1">// While Gmail does this anyway, it doesn't take into account any size change to the left-hand column</span>
	top<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'resize'</span><span class="sy0">,</span> k<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Add event listeners. mousedown is added to the grab bar, mousemove and mouseup to the document</span>
	g<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// Only trigger with LMB on grab bar. Stores initial x coord and width of left-hand column</span>
		<span class="co1">// Save a copy of the existing right-hand column style so we can restore it later, then disable text selection</span>
		<span class="co1">// Call e.preventDefault() to stop a native drag operation from starting (this happens a lot in Fx)</span>
		e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>x<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>e.<span class="me1">pageX</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">+=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span> e.<span class="me1">preventDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// If we have the mouse button pressed, work out the x delta then update the column widths and the grab bar position</span>
		x <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>w<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">+</span>x<span class="sy0">,</span> l<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>w<span class="sy0">+</span>P<span class="sy0">,</span> g<span class="br0">&#91;</span>S<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>w<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>P<span class="sy0">,</span> k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// If LMB is released, stop the mousemove code from running and restore the right-hand column style</span>
		<span class="co1">// k() needs to be called again, as restoring the style alters the width</span>
		e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>x<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span> k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div>

<p><a id="howToRunTheCode"></a></p>
		<div  class="headingPod headingLevel2 headingLevel2Green">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>How to run the code</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>See the <a href="http://www.codecouch.com/2012/02/resizing-the-left-hand-labels-column-in-gmail-an-update-to-fix-text-selection/#howToRunTheCode" title="How to enable resizing of the left-hand labels column in Gmail">instructions in my previous post</a>. Greasemonkey users should note that I&#8217;ve seen odd behaviour when waiting for the window&#8217;s onload event to fire: occasionally, 2 grab bars would show up. For this reason, I recommend not including that line of code, and so the only change (other than the script header) is to prefix &#8220;gmonkey&#8221; with &#8220;unsafeWindow.&#8221;.</p>
		<div  class="headingPod headingLevel2 headingLevel2Orange">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>Known issues</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>As per last version, minus the &#8220;right-side chat&#8221; item <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Resizing+the+left-hand+labels+column+in+Gmail+%E2%80%93+support+for+extra+columns+http%3A%2F%2Fis.gd%2FSMihSr" title="Post to Twitter"><img class="nothumb" src="http://www.codecouch.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big4.png" alt="Post to Twitter" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://www.codecouch.com/2012/02/resizing-the-left-hand-labels-column-in-gmail-support-for-extra-columns/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Resizing the left-hand labels column in Gmail &#8211; an update to fix text selection</title>
		<link>http://www.codecouch.com/2012/02/resizing-the-left-hand-labels-column-in-gmail-an-update-to-fix-text-selection/</link>
		<comments>http://www.codecouch.com/2012/02/resizing-the-left-hand-labels-column-in-gmail-an-update-to-fix-text-selection/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 09:57:44 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.codecouch.com/?p=414</guid>
		<description><![CDATA[Update 2 (10 May 2012): I&#8217;ve added a new post that has all the various bug fixes to date as well as new code showing how to get the code working as a user script in Chrome as well as Greasemonkey. Update 1 (18 Feb 2012): I&#8217;ve added some example code that shows the modifications [...]]]></description>
			<content:encoded><![CDATA[<hr />
<p><strong>Update 2 (10 May 2012): </strong> I&#8217;ve <a href="/2012/05/resizing-the-left-hand-labels-column-in-gmail-a-bug-fix-and-extra-user-script-compatibility/" title="Resizing the left-hand labels column in Gmail – a bug fix and extra user script compatibility">added a new post</a> that has all the various bug fixes to date as well as new code showing how to get the code working as a user script in Chrome as well as Greasemonkey.</p>
<p><strong>Update 1 (18 Feb 2012): </strong> I&#8217;ve <a href="#greasemonkey" class="bookmark">added some example code</a> that shows the modifications needed to allow this to work in Greasemonkey. I&#8217;ve also added back the comments above the &#8220;full monty&#8221; code that I&#8217;d removed, which link to the Gmail Greasemonkey API docs.</p>
<hr />
<p>Here&#8217;s an update to my <a href="/2011/11/resizing-the-left-hand-labels-column-in-gmail-an-update-to-fix-resizing/" title="How to enable resizing of the left-hand labels column in Gmail">Gmail label column resizing code</a> that fixes the issue of not being able to select any page content.</p>
<p>The first version didn&#8217;t have this problem as I&#8217;d not put any restrictions in place. Unfortunately this caused content to become selected while dragging the grab bar, which looked quite ugly. The second version permanently disabled the ability to select content from the right-hand column&#8230; not exactly a desirable feature if you needed to copy something from an email!</p>
<p>This update gives the best of both worlds: content is selectable at all times, except when the grab bar is being dragged.</p>
<p>As with the last few posts, there are three versions: a bookmarklet with all unnecessary whitespace and punctuation  removed, a slightly larger version with some formatting, and lastly a fully commented version for those who want to understand how it works.</p>
<p>From the many emails I&#8217;ve received, I realised that not everyone necessarily knows how to use a bookmarklet, and so <a href="#howToRunTheCode" class="bookmark">I&#8217;ve included some instructions at the end of this post</a> detailing how to run the code in various web browsers. If after reading them you&#8217;re still having trouble getting the code to work, let me know.</p>
<p>Thanks for all the feedback you&#8217;ve been sending. It&#8217;s great to know that so many people are finding this useful!</p>
<p><a id="theCode"></a></p>
		<div  class="headingPod headingLevel2 headingLevel2Orange">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>The code</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>Here&#8217;s the no-whitespace bookmarklet version. Unlike the previous posts, I&#8217;ve included the &#8220;javascript:&#8221; prefix to make it even easier to use.</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">javascript<span class="sy0">:</span>gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span><span class="br0">&#123;</span><span class="kw2">var</span> i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>r<span class="sy0">,</span>l<span class="sy0">,</span>c<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span>b<span class="sy0">=</span>d.<span class="me1">body</span><span class="sy0">,</span>g<span class="sy0">,</span>t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span>x<span class="sy0">,</span>w<span class="sy0">,</span>n<span class="sy0">,</span>Q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="sy0">,</span>W<span class="sy0">=</span><span class="st0">'width'</span><span class="sy0">,</span>U<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="sy0">,</span>P<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span>S<span class="sy0">=</span><span class="st0">'style'</span><span class="sy0">,</span>k<span class="sy0">=</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>r<span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">+</span>P<span class="br0">&#125;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span>c<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">!=</span>b<span class="br0">&#41;</span>i<span class="sy0">=</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>l<span class="sy0">=</span><span class="br0">&#40;</span>n<span class="sy0">=</span>c.<span class="me1">childNodes</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span>r<span class="sy0">=</span>n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="sy0">,</span>n<span class="sy0">=</span>l<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role^=n]'</span><span class="br0">&#41;</span><span class="sy0">,</span>g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>r<span class="br0">&#91;</span><span class="br0">&#40;</span>U<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">=</span>n<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span>n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>g<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>W<span class="sy0">+</span><span class="st0">':4px;position:absolute;z-index:9;left:'</span><span class="sy0">+</span><span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">'px;top:'</span><span class="sy0">+</span>t<span class="sy0">+</span><span class="st0">'px;bottom:0;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>top<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'resize'</span><span class="sy0">,</span>k<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>g<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span><span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>x<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>e.<span class="me1">pageX</span><span class="sy0">,</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">,</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">+=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>x<span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>w<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">+</span>x<span class="sy0">,</span>l<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>w<span class="sy0">+</span>P<span class="sy0">,</span>g<span class="br0">&#91;</span>S<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>w<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>P<span class="sy0">,</span>k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span><span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>x<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span>k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="br0">&#41;</span></pre></div></div></div>

<p>This update has pushed the size up a bit more than the last update did (it&#8217;s now 961 bytes)&#8230; but all the browsers I&#8217;ve tested this in seemed to handle bookmarklets of this size without any problems. </p>
<p>Here&#8217;s the same code, with a small amount of whitespace:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw2">var</span> i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> r<span class="sy0">,</span> l<span class="sy0">,</span> c<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span> b<span class="sy0">=</span>d.<span class="me1">body</span><span class="sy0">,</span> g<span class="sy0">,</span> t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span> x<span class="sy0">,</span> w<span class="sy0">,</span> n<span class="sy0">,</span> Q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="sy0">,</span> W<span class="sy0">=</span><span class="st0">'width'</span><span class="sy0">,</span> U<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="sy0">,</span> P<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span> S<span class="sy0">=</span><span class="st0">'style'</span><span class="sy0">,</span> k<span class="sy0">=</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> r<span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">+</span>P<span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">;</span>
 	<span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span> c<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span> <span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">!=</span>b<span class="br0">&#41;</span> i<span class="sy0">=</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
	l<span class="sy0">=</span><span class="br0">&#40;</span>n<span class="sy0">=</span>c.<span class="me1">childNodes</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> r<span class="sy0">=</span>n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="sy0">,</span> n<span class="sy0">=</span>l<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role^=n]'</span><span class="br0">&#41;</span><span class="sy0">,</span> g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	r<span class="br0">&#91;</span><span class="br0">&#40;</span>U<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">=</span>n<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
 	<span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span> n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>
 	g<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span> <span class="sy0">=</span> W <span class="sy0">+</span> <span class="st0">':4px;position:absolute;z-index:9;left:'</span> <span class="sy0">+</span> <span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'px;top:'</span> <span class="sy0">+</span> t <span class="sy0">+</span> <span class="st0">'px;bottom:0;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>
 	top<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'resize'</span><span class="sy0">,</span> k<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
	g<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span> e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>x<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>e.<span class="me1">pageX</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">+=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span> x <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>w<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">+</span>x<span class="sy0">,</span> l<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>w<span class="sy0">+</span>P<span class="sy0">,</span> g<span class="br0">&#91;</span>S<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>w<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>P<span class="sy0">,</span> k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span> e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>x<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span> k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div>

<p>And the full monty:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="co1">// Use the Gmail Greasemonkey API to reliably find the 2 main elements (left- and right-hand columns). You do not need Greasemonkey installed to use the API.</span>
<span class="co1">// See http://code.google.com/p/gmail-greasemonkey/wiki/GmailGreasemonkey10API for more details (note: documentation is out of date)</span>
<span class="co1">//</span>
<span class="co1">// Load the API. It will run our callback function when loaded, passing a GmailAPI object</span>
gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="coMULTI">/*
	Set up variables. To keep the code size down, some are re-used. There is no global namespace pollution at all.
&nbsp;
	i		this will end up pointing to the element that the grab bar is inserted into
	r		this points to the style object of the element that is resized in the right-hand column
	l		this will end up pointing to the element that is resized to change the left-hand column width
	c		this will end up pointing to the container that holds the left- and right- hand column elements l &amp; r
	d		this points to the document in the frame we use
	b		this points to the body
	g		this points to the grab bar element
	t		this is used initially to calculate the top coordinate of the grab bar, but is re-used to point to the resize function
	x		this holds the initial x delta between mouse click and left-hand column width
	w		during dragging, this holds the new width of the left-hand column
	n		used for many things, most notably holding the string 'addEventListener'
	k		this is the function that sets the width of the right-hand column
	Q		this holds the string 'querySelector'
	W		this holds the string 'width'
	U		used for many things, most notably holding the strings 'parentNode' and 'cssText'
	P		this holds the string 'px'
	S		this holds the string 'style'
*/</span>		
	<span class="kw2">var</span> i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> r<span class="sy0">,</span> l<span class="sy0">,</span> c<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span> b<span class="sy0">=</span>d.<span class="me1">body</span><span class="sy0">,</span> g<span class="sy0">,</span> t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span> x<span class="sy0">,</span> w<span class="sy0">,</span> n<span class="sy0">,</span> Q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="sy0">,</span> W<span class="sy0">=</span><span class="st0">'width'</span><span class="sy0">,</span> U<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="sy0">,</span> P<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span> S<span class="sy0">=</span><span class="st0">'style'</span><span class="sy0">,</span> k<span class="sy0">=</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> r<span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">+</span>P<span class="sy0">;</span> <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Update c and i to point to their intended elements</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span> c<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">!=</span>b<span class="br0">&#41;</span> i<span class="sy0">=</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Update l, r, and n to point to their intended elements. Create the grab bar, and insert into DOM</span>
	l<span class="sy0">=</span><span class="br0">&#40;</span>n<span class="sy0">=</span>c.<span class="me1">childNodes</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> r<span class="sy0">=</span>n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="sy0">,</span> n<span class="sy0">=</span>l<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role^=n]'</span><span class="br0">&#41;</span><span class="sy0">,</span> g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Copy the inline style from the Compose button. At present, the only inline style is a browser-specific user-select style used to prevent text selection.</span>
	<span class="co1">// This is applied to the right-hand column while dragging is underway to stop the text being selected. It is removed afterwards so that text can be copied.</span>
	<span class="co1">// As I wanted to keep the code size as small as possible, it was easier to let Google do the browser sniffing and copy their style rather than deal with the vendor prefix approach.</span>
	<span class="co1">// Store this in a property called 'cssText2' of the right-hand column's style object</span>
	r<span class="br0">&#91;</span><span class="br0">&#40;</span>U<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">=</span>n<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Calculate the top position for the grab bar</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span> n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Style the grab bar</span>
	g<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span> <span class="sy0">=</span> W <span class="sy0">+</span> <span class="st0">':4px;position:absolute;z-index:9;left:'</span> <span class="sy0">+</span> <span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'px;top:'</span> <span class="sy0">+</span> t <span class="sy0">+</span> <span class="st0">'px;bottom:0;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Add a resize event to the window to update the size of the right-hand column as the window is sized</span>
	<span class="co1">// While Gmail does this anyway, it doesn't take into account any size change to the left-hand column</span>
	top<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'resize'</span><span class="sy0">,</span> k<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Add event listeners. mousedown is added to the grab bar, mousemove and mouseup to the document</span>
	g<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// Only trigger with LMB on grab bar. Stores initial x coord and width of left-hand column</span>
		<span class="co1">// Save a copy of the existing right-hand column style so we can restore it later, then disable text selection</span>
		e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>x<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>e.<span class="me1">pageX</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">+=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// If we have the mouse button pressed, work out the x delta then update the column widths and the grab bar position</span>
		x <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>w<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">+</span>x<span class="sy0">,</span> l<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>w<span class="sy0">+</span>P<span class="sy0">,</span> g<span class="br0">&#91;</span>S<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>w<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>P<span class="sy0">,</span> k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// If LMB is released, stop the mousemove code from running and restore the right-hand column style</span>
		<span class="co1">// k() needs to be called again, as restoring the style alters the width</span>
		e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>x<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span> r<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>r<span class="br0">&#91;</span>U<span class="sy0">+</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span> k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div>

<p><a id="howToRunTheCode"></a></p>
		<div  class="headingPod headingLevel2 headingLevel2Yellow">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>How to run the code</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>I&#8217;ll start by showing how to run the bookmarklet version of the code, followed by a quick overview of the one modification needed to run the code using Greasemonkey.</p>
<h3>Running the code as a bookmarklet</h3>
<p>I know that many people will be unfamiliar with the term &quot;bookmarklet&quot;, or what they do. In a nutshell, they&#8217;re small pieces of code that are usually designed to add extra functionality to a web page, and they are normally run (activated) by clicking a link on a page or in your browser&#8217;s bookmarks / favourites list. If you want to find out more, take some time to read the <a href="http://en.wikipedia.org/wiki/Bookmarklet" title="Visit the Wikipedia article on bookmarklets">Wikipedia article that covers the topic in great detail</a>.</p>
<p>Note: these instructions are generic, as different web browsers have different interfaces and trying to detail every combination would make for a very long (and boring) read. If you have trouble getting the code to run, post a comment with the details of which web browser you&#8217;re using (including the version, if possible).</p>
<p>Regarding terminology, I&#8217;ll be referring to &#8220;bookmarks&#8221; throughout these instructions. If you&#8217;re more familiar with the term &#8220;favourites&#8221;, don&#8217;t worry &#8211; they&#8217;re exactly the same thing, so mentally substitute one word with the other <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<ol>
<li>Select / highlight the <a href="#theCode" class="bookmark">no-whitespace / bookmarklet</a> version of the code</li>
<li>Copy it to your clipboard. If you&#8217;re running Windows, pressing Ctrl+C should copy the selected text, while Mac users should find Cmd+C (&#8984;+C) works. You&#8217;ll probably also find that right-clicking the code box will give you a menu with an option to copy. If you&#8217;re running Linux, you already know how to copy to the clipboard, and if not, there&#8217;s probably a twenty page &#8220;man&#8221; document you can read to find out <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li>Now that you&#8217;ve got the code copied to your clipboard, you need to create a new bookmark to paste it into. How you do this depends on your web browser, but normally there will be a &#8220;Bookmarks&#8221; menu with an &#8220;Add&#8221; or &#8220;Manage&#8221; option</li>
<li>You can set the name of the bookmark to be anything you like, but normally the name should be descriptive so you know what it is</li>
<li>Set the URL / address of the bookmark to be the code that you copied earlier</li>
<li>Save the bookmark</li>
</ol>
<p>That&#8217;s half the job done&#8230; now to run the code:</p>
<ol>
<li><a href="http://www.gmail.com/" title="Load Gmail">Load Gmail</a></li>
<li>Wait for the page to finish loading</li>
<li>Run the bookmark as you would any other bookmark (normally by selecting it from the &#8220;Bookmarks&#8221; menu / toolbar)</li>
<li>If all has gone to plan, you should see two thin dotted lines between the label column and the main content area. They&#8217;re grey in colour, so if you&#8217;ve chosen a grey theme for Gmail, you might not see them. They look something like this (without the red border):
<div style="background:white; margin:10px 0px;" class="redBorder">
<div style="width:4px; height:50px; margin:5px auto; background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7);"></div>
</div>
</li>
</ol>
<p>If you do not see two dotted lines in the red box above, then chances are the code will not work for you in Gmail. You might want to refer to the trouble-shooting steps below. </p>
<p>If you see the dotted lines in Gmail, then the code has loaded. You should be able to click and drag to change the width of the label column. If you do not see the lines in Gmail, or they are visible but are not draggable, here are some trouble-shooting steps you can try:</p>
<ul>
<li>Ensure you&#8217;re running a modern web browser; this code will not work on ancient browsers. If you&#8217;re running Internet Explorer, you need to be using at least version 9. Up-to-date versions of Firefox, Safari, Chrome, Opera, or any other modern browser should run the code without any problems, as it&#8217;s all fairly run-of-the-mill code and doesn&#8217;t use any non-standard or browser-specific routines (I tested the previous version of the code in Firefox v3.6 and it worked perfectly)</li>
<li>Disable any Google Labs features you are using. Based upon the feedback left in the comments, it appears some of the Labs are not compatible with this code, or they change the layout of the page too much for the code to handle (for example, the Labs code that moves the chat section to the right-hand side of the page)</li>
<li>While I&#8217;ve tested this code on several Gmail themes on the classic and new look, it&#8217;s possible that some themes may not be compatible. If you&#8217;re using anything other than one of the default themes, try switching back and see if things start working</li>
<li>If you still cannot get the code to work, let me know. The more browsers I can get this to work in, the better. One exception is Internet Explorer: I&#8217;ve no intention of getting this to work with IE 6, 7, or 8. I still have flashbacks to the good old days when I had to debug IE 4 and Netscape 4 problems <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ul>
<p><a id="greasemonkey"></a></p>
<h3>Running the code from Greasemonkey</h3>
<p>To get the code to work in Greasemonkey, the &#8220;gmonkey&#8221; variable must be prefixed with &#8220;unsafeWindow.&#8221;. Here&#8217;s the wrapper I used around the above &#8220;full monty&#8221; code that I&#8217;ve tested working in Fx 10.0.2:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="co1">// ==UserScript==</span>
<span class="co1">// @name           Gmail label column resizer</span>
<span class="co1">// @namespace      http://www.codecouch.com/</span>
<span class="co1">// @description    User script that allows the labels column in Gmail to be resized</span>
<span class="co1">// @include        http://mail.google.com/*</span>
<span class="co1">// @include        https://mail.google.com/*</span>
<span class="co1">// ==/UserScript==</span>
&nbsp;
<span class="co1">// Insert the code here, but don't forget to prefix &quot;gmonkey&quot; with &quot;unsafeWindow.&quot;</span>
<span class="co1">// The first line of code should now read:</span>
<span class="co1">// 	unsafeWindow.gmonkey.load(2, function(o) {</span></pre></div></div></div>

<hr />
<p><strong>Update: </strong>I&#8217;ve changed this code since first publishing it. I found that waiting for the window&#8217;s onload event would occasionally cause 2 grab bars to show up. If you&#8217;ve copied the old version that contains the following two lines, you should remove them:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">window.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">'load'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="br0">&#125;</span><span class="sy0">,</span> <span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div>

<hr />
<p>Feel free to tinker and modify the code as you see fit, but please follow the <a href="/terms/" title="Terms of use">terms of use</a> and acknowledge where the code came from. I don&#8217;t expect you to fit the license into the bookmarklet, obviously <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . If you do come up with any improvements, I&#8217;d love to see them!</p>
		<div  class="headingPod headingLevel2 headingLevel2Orange">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>Known issues</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>Here&#8217;s a list of the issues I&#8217;m currently aware of:</p>
<ul>
<li>The grab bar disappears if the page is reloaded. If you find that it has vanished, try running the bookmarklet again. Alternatively, use a plugin like Greasemonkey to automatically run the code once the page has loaded</li>
<li>When switching between pages / themes, the grab bar may end up in the wrong place. If you experience this, reload the page and run the bookmarklet again</li>
<li>No minimum or maximum column size is enforced. If you drag a column too small, don&#8217;t expect things to look good <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li>The position of the grab bar isn&#8217;t persisted over a page reload. This is something I&#8217;m looking at adding to the next version</li>
<li>Certain Gmail labs options or plugins are not compatible with this code. Maintaining a complete list is impossible, but almost certainly, anything that adds a right-hand column (e.g. the Gmail &#8220;Right-side chat&#8221; lab, Xobni &#8220;Smartr Inbox&#8221; plugin, etc.) will cause problems</li>
</ul>
<p>Thanks again for all your feedback. If you&#8217;ve got any suggestions on how I can improve this, please let me know.</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Resizing+the+left-hand+labels+column+in+Gmail+%E2%80%93+an+update+to+fix+text+selection+http%3A%2F%2Fis.gd%2FQwkFXj" title="Post to Twitter"><img class="nothumb" src="http://www.codecouch.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big4.png" alt="Post to Twitter" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://www.codecouch.com/2012/02/resizing-the-left-hand-labels-column-in-gmail-an-update-to-fix-text-selection/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Remote debugging Mobile Safari web apps that have been added to the home screen</title>
		<link>http://www.codecouch.com/2011/11/remote-debugging-mobile-safari-web-apps-that-have-been-added-to-the-home-screen/</link>
		<comments>http://www.codecouch.com/2011/11/remote-debugging-mobile-safari-web-apps-that-have-been-added-to-the-home-screen/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 23:55:10 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[HTML/XHTML]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.codecouch.com/?p=394</guid>
		<description><![CDATA[On his blog, Nathan de Vries shows how to remotely debug code running in Mobile Safari by calling a private WebKit API. This is a great discovery if you&#8217;ve got a problem that doesn&#8217;t show itself on the desktop version of Safari. Unfortunately I had such a problem, and unfortunately, I didn&#8217;t realise that as [...]]]></description>
			<content:encoded><![CDATA[<p>On his blog, Nathan de Vries <a href="http://atnan.com/blog/2011/11/17/enabling-remote-debugging-via-private-apis-in-mobile-safari/" title="Enabling remote debugging in Mobile Safari">shows how to remotely debug code running in Mobile Safari</a> by calling a private WebKit API. This is a great discovery if you&#8217;ve got a problem that doesn&#8217;t show itself on the desktop version of Safari.</p>
<p>Unfortunately I had such a problem, and unfortunately, I didn&#8217;t realise that as I was running my code from an icon that I&#8217;d added to the home screen, Nathan&#8217;s script wouldn&#8217;t work for me. All I&#8217;d get was the error &#8220;Mobile Safari.app must be running in the Simulator to enable the remote inspector.&#8221;</p>
<p>A bit of debugging and one &#8220;<code>man grep</code>&#8221; later, I&#8217;d got a solution, and it&#8217;s pretty easy: modify the parameter passed to grep to look for &#8220;Web.app&#8221; as well as &#8220;MobileSafari&#8221;. There are many ways that this particular cat could be skinned, but I opted for a very straightforward locigal OR in the regular expression:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="bash"><span class="kw2">grep</span> <span class="st0">&quot;MobileSafari|Web.app&quot;</span></pre></div></div></div>

<p>I&#8217;m fairly good with regular expressions, so couldn&#8217;t work out why my pipe character (&#8220;|&#8221;) wasn&#8217;t doing the job, so had to admit defeat and RTFM, which gave me the answer:</p>
<blockquote><p>Grep understands two different versions of regular expression syntax: &#8220;basic&#8221; and &#8220;extended.&#8221;<br />
&#8230;<br />
In basic regular expressions the metacharacters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).</p></blockquote>
<p>And so I had the answer to my problem. Of course, as I&#8217;ve come to expect from man pages, it wasn&#8217;t exactly stated right at the beginning, nor in big bold letters that said <strong>&#8220;By default, grep on OS X uses the basic syntax&#8221;</strong>. Clearly the people who write man pages take great delight in forcing you to read the description of every damn option to find out what the defaults are. Ironically, I could have found out by using grep, for example:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="bash"><span class="kw2">man</span> <span class="kw2">grep</span> <span class="sy0">|</span> <span class="kw2">grep</span> <span class="re5">-C</span> <span class="nu0">2</span> <span class="st0">&quot; default&quot;</span></pre></div></div></div>

<p>Meh.</p>
<p>Anyway, I had the answer: either place a backslash before the pipe, tell grep to use the extended syntax, or use egrep. Telling grep to use the extended syntax is as simple as using the -E command-line parameter (or &#8211;extended-regexp for those who prefer typing a whole essay to get anything done), and so any of these would do the trick:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="bash"><span class="kw2">ps</span> x <span class="sy0">|</span> <span class="kw2">egrep</span> <span class="st0">&quot;MobileSafari|Web.app&quot;</span>
<span class="kw2">ps</span> x <span class="sy0">|</span> <span class="kw2">grep</span> <span class="st0">&quot;MobileSafari\|Web.app&quot;</span>
<span class="kw2">ps</span> x <span class="sy0">|</span> <span class="kw2">grep</span> <span class="re5">-E</span> <span class="st0">&quot;MobileSafari|Web.app&quot;</span>
<span class="kw2">ps</span> x <span class="sy0">|</span> <span class="kw2">grep</span> <span class="re5">--extended-regexp</span> <span class="st0">&quot;MobileSafari|Web.app&quot;</span></pre></div></div></div>

<p>I chose to use egrep. Job done. I&#8217;m sure Nathan won&#8217;t mind me reproducing his script here with my update in place:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="bash"><span class="re2">MobileSafari_PID</span>=$<span class="br0">&#40;</span><span class="kw2">ps</span> x <span class="sy0">|</span> <span class="kw2">egrep</span> <span class="st0">&quot;MobileSafari|Web.app&quot;</span> <span class="sy0">|</span> <span class="kw2">grep</span> <span class="re5">-v</span> <span class="kw2">grep</span> <span class="sy0">|</span> <span class="kw2">awk</span> <span class="st_h">'{ print $1 }'</span><span class="br0">&#41;</span>
&nbsp;
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="st0">&quot;<span class="es2">$MobileSafari_PID</span>&quot;</span> == <span class="st0">&quot;&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span>
  <span class="kw3">echo</span> <span class="st0">&quot;Mobile Safari.app must be running in the Simulator to enable the remote inspector.&quot;</span>
<span class="kw1">else</span>
&nbsp;
  <span class="kw2">cat</span> <span class="sy0">&lt;&lt;</span>EOM <span class="sy0">|</span> <span class="kw2">gdb</span> <span class="re5">-quiet</span> <span class="sy0">&gt;</span> <span class="sy0">/</span>dev<span class="sy0">/</span>null
  attach <span class="re1">$MobileSafari_PID</span>
  p <span class="br0">&#40;</span>void <span class="sy0">*</span><span class="br0">&#41;</span><span class="br0">&#91;</span>WebView _enableRemoteInspector<span class="br0">&#93;</span>
  detach
EOM
&nbsp;
<span class="kw1">fi</span></pre></div></div></div>

<p>Then you point your desktop webkit (Chrome or Safari) at <code>http://localhost:9999</code> and there you have it. Bob&#8217;s your uncle, and Fanny&#8217;s a rude word.</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Remote+debugging+Mobile+Safari+web+apps+that+have+been+added+to+the+home+screen+http%3A%2F%2Fis.gd%2Fg62YNy" title="Post to Twitter"><img class="nothumb" src="http://www.codecouch.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big4.png" alt="Post to Twitter" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://www.codecouch.com/2011/11/remote-debugging-mobile-safari-web-apps-that-have-been-added-to-the-home-screen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resizing the left-hand labels column in Gmail &#8211; an update to fix resizing</title>
		<link>http://www.codecouch.com/2011/11/resizing-the-left-hand-labels-column-in-gmail-an-update-to-fix-resizing/</link>
		<comments>http://www.codecouch.com/2011/11/resizing-the-left-hand-labels-column-in-gmail-an-update-to-fix-resizing/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 05:21:34 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.codecouch.com/?p=387</guid>
		<description><![CDATA[Update 2 (10 May 2012): I&#8217;ve added a new post that has all the various bug fixes to date as well as new code showing how to get the code working as a user script in Chrome as well as Greasemonkey. Update 1 (13 Feb 2012): I&#8217;ve fixed the bug where selecting content on the [...]]]></description>
			<content:encoded><![CDATA[<hr />
<p><strong>Update 2 (10 May 2012): </strong> I&#8217;ve <a href="/2012/05/resizing-the-left-hand-labels-column-in-gmail-a-bug-fix-and-extra-user-script-compatibility/" title="Resizing the left-hand labels column in Gmail – a bug fix and extra user script compatibility">added a new post</a> that has all the various bug fixes to date as well as new code showing how to get the code working as a user script in Chrome as well as Greasemonkey.</p>
<p><strong>Update 1 (13 Feb 2012): </strong> I&#8217;ve fixed the bug where selecting content on the page was disabled. You&#8217;ll find the new code <a href="/2012/02/resizing-the-left-hand-labels-column-in-gmail-an-update-to-fix-text-selection/" title="Resizing the left-hand labels column in Gmail – an update to fix text selection">in this post</a></p>
<hr />
<p>The code in <a href="/2011/11/how-to-enable-resizing-of-the-left-hand-labels-column-in-gmail/" title="How to enable resizing of the left-hand labels column in Gmail">my original article</a> had a few bugs that I wasn&#8217;t happy with, the main one being that if the browser window was resized, things went very pear-shaped. I&#8217;m happy to say that I&#8217;ve fixed this with a small update, along with a bit of global namespace pollution that I&#8217;d overlooked (oops!).</p>
<p>Text selection is next on my list: some ability to select text is lost, and and the inadvertent selection of text is possible.</p>
<p>For those of you running the bookmarklet version, don&#8217;t worry about the fix bloating the code: the size increased by 2 bytes, so at 901 bytes, it&#8217;s still pretty small.</p>
<p>Here&#8217;s the no-whitespace version:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span><span class="br0">&#123;</span><span class="kw2">var</span> i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>r<span class="sy0">,</span>l<span class="sy0">,</span>c<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span>b<span class="sy0">=</span>d.<span class="me1">body</span><span class="sy0">,</span>g<span class="sy0">,</span>t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span>x<span class="sy0">,</span>w<span class="sy0">,</span>n<span class="sy0">,</span>Q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="sy0">,</span>W<span class="sy0">=</span><span class="st0">'width'</span><span class="sy0">,</span>U<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="sy0">,</span>P<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span>S<span class="sy0">=</span><span class="st0">'style'</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span>c<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">!=</span>b<span class="br0">&#41;</span>i<span class="sy0">=</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>l<span class="sy0">=</span><span class="br0">&#40;</span>n<span class="sy0">=</span>c.<span class="me1">childNodes</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span>r<span class="sy0">=</span>n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="sy0">,</span>n<span class="sy0">=</span>l<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role^=n]'</span><span class="br0">&#41;</span><span class="sy0">,</span>g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>r<span class="br0">&#91;</span>U<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#93;</span><span class="sy0">+=</span>n<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span>n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>g<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>W<span class="sy0">+</span><span class="st0">':4px;position:absolute;z-index:9;left:'</span><span class="sy0">+</span><span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">'px;top:'</span><span class="sy0">+</span>t<span class="sy0">+</span> <span class="st0">'px;bottom:0;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>top<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'resize'</span><span class="sy0">,</span>k<span class="sy0">=</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>r<span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">+</span>P<span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>g<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span><span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>x<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>e.<span class="me1">pageX</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>x<span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>w<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">+</span>x<span class="sy0">,</span>l<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>w<span class="sy0">+</span>P<span class="sy0">,</span>g<span class="br0">&#91;</span>S<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>w<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>P<span class="sy0">,</span>k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>x<span class="sy0">=</span><span class="nu0">0</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="br0">&#41;</span></pre></div></div></div>

<p><strong>Note:</strong> If you are going to use this as a bookmarklet, you need to prefix the code with javascript: when adding it to the URL field.</p>
<hr />
<p><b>Update:</b> Here are some generic steps that you can try if you&#8217;re new to the concept of a bookmarklet.</p>
<ol>
<li>Select / highlight the initial &#8220;no whitespace&#8221; version of the code above</li>
<li>Copy it to your clipboard</li>
<li>Create a new bookmark (or edit an existing one)</li>
<li>Set the URL to be &#8220;javascript:&#8221; (without the quotes), followed immediately by the code you&#8217;ve just copied</li>
<li><a href="http://www.gmail.com/" title="Load Gmail">Load Gmail</a></li>
<li>Load the bookmark</li>
</ol>
<hr />
<p>The same code, with a small amount of whitespace:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span><span class="br0">&#123;</span>
	<span class="kw2">var</span> i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>r<span class="sy0">,</span>l<span class="sy0">,</span>c<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span>b<span class="sy0">=</span>d.<span class="me1">body</span><span class="sy0">,</span>g<span class="sy0">,</span>t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span>x<span class="sy0">,</span>w<span class="sy0">,</span>n<span class="sy0">,</span>Q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="sy0">,</span>W<span class="sy0">=</span><span class="st0">'width'</span><span class="sy0">,</span>U<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="sy0">,</span>P<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span>S<span class="sy0">=</span><span class="st0">'style'</span><span class="sy0">;</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span>c<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">!=</span>b<span class="br0">&#41;</span>i<span class="sy0">=</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
	l<span class="sy0">=</span><span class="br0">&#40;</span>n<span class="sy0">=</span>c.<span class="me1">childNodes</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span>r<span class="sy0">=</span>n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="sy0">,</span>n<span class="sy0">=</span>l<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role^=n]'</span><span class="br0">&#41;</span><span class="sy0">,</span>g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	r<span class="br0">&#91;</span>U<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#93;</span><span class="sy0">+=</span>n<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span>n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>
	g<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">=</span>W<span class="sy0">+</span><span class="st0">':4px;position:absolute;z-index:9;left:'</span><span class="sy0">+</span><span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">'px;top:'</span><span class="sy0">+</span>t<span class="sy0">+</span> <span class="st0">'px;bottom:0;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>
	top<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'resize'</span><span class="sy0">,</span>k<span class="sy0">=</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>r<span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">+</span>P<span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
	g<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span><span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>x<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>e.<span class="me1">pageX</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>x<span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>w<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">+</span>x<span class="sy0">,</span>l<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>w<span class="sy0">+</span>P<span class="sy0">,</span>g<span class="br0">&#91;</span>S<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>w<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>P<span class="sy0">,</span>k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>x<span class="sy0">=</span><span class="nu0">0</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span></pre></div></div></div>

<p>And the full monty, with some more updated comments :</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="co1">// Use the Gmail Greasemonkey API to reliably find the 2 main elements (left- and right-hand columns). You do not need Greasemonkey installed to use the API.</span>
<span class="co1">// See http://code.google.com/p/gmail-greasemonkey/wiki/GmailGreasemonkey10API for more details (note: documentation is out of date)</span>
<span class="co1">//</span>
<span class="co1">// Load the API. It will run our callback function when loaded, passing a GmailAPI object</span>
gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="coMULTI">/*
	Set up variables. To keep the code size down, some are re-used. There is no global namespace pollution at all.
&nbsp;
	i		this will end up pointing to the element that the grab bar is inserted into
	r		this points to the style object of the element that is resized in the right-hand column
	l		this will end up pointing to the element that is resized to change the left-hand column width
	c		this will end up pointing to the container that holds the left- and right- hand column elements l &amp; r
	d		this points to the document in the frame we use
	b		this points to the body
	g		this points to the grab bar element
	t		this is used initially to calculate the top coordinate of the grab bar, but is re-used to point to the resize function
	x		this holds the initial x delta between mouse click and left-hand column width
	w		during dragging, this holds the new width of the left-hand column
	n		used for many things, most notably holding the string 'addEventListener'
	Q		this holds the string 'querySelector'
	W		this holds the string 'width'
	U		used for many things, most notably holding the strings 'parentNode' and 'cssText'
	P		this holds the string 'px'
	S		this holds the string 'style'
*/</span>		
	<span class="kw2">var</span> i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> r<span class="sy0">,</span> l<span class="sy0">,</span> c<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span> b<span class="sy0">=</span>d.<span class="me1">body</span><span class="sy0">,</span> g<span class="sy0">,</span> t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span> x<span class="sy0">,</span> w<span class="sy0">,</span> n<span class="sy0">,</span> Q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="sy0">,</span> W<span class="sy0">=</span><span class="st0">'width'</span><span class="sy0">,</span> U<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="sy0">,</span> P<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span> S<span class="sy0">=</span><span class="st0">'style'</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Update c and i to point to their intended elements</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span> c<span class="sy0">=</span>c<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">!=</span>b<span class="br0">&#41;</span> i<span class="sy0">=</span>i<span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Update l, r, and n to point to their intended elements. Create grab bar, and insert into DOM</span>
	l<span class="sy0">=</span><span class="br0">&#40;</span>n<span class="sy0">=</span>c.<span class="me1">childNodes</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> r<span class="sy0">=</span>n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="sy0">,</span> n<span class="sy0">=</span>l<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role^=n]'</span><span class="br0">&#41;</span><span class="sy0">,</span> g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Copy the browser-specific user-select style from the Compose button to the right-hand column in order to minimise text selection while dragging.</span>
	<span class="co1">// Copying the existing style seemed easier than adding from scratch... but as I didn't try, I can't say this with 100% certainty :-)</span>
	r<span class="br0">&#91;</span>U<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#93;</span><span class="sy0">+=</span>n<span class="br0">&#91;</span>Q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Calculate the top position for the grab bar</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span>n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Style the grab bar</span>
	g<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>U<span class="br0">&#93;</span> <span class="sy0">=</span> W <span class="sy0">+</span> <span class="st0">':4px;position:absolute;z-index:9;left:'</span> <span class="sy0">+</span> <span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'px;top:'</span> <span class="sy0">+</span> t <span class="sy0">+</span> <span class="st0">'px;bottom:0;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Add a resize event to the window to update the size of the right-hand column as the window is sized</span>
	<span class="co1">// While Gmail does this anyway, it doesn't take into account any size change to the left-hand column</span>
	top<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'resize'</span><span class="sy0">,</span>k<span class="sy0">=</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		r<span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>b<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">+</span>P
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Add event listeners. mousedown is added to the grab bar, mousemove and mouseup to the document</span>
	g<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// Only trigger with LMB on grab bar. Stores initial x coord and width of left-hand column</span>
		e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>x<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">-</span>e.<span class="me1">pageX</span><span class="br0">&#41;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// If we have the mouse button pressed, work out the x delta, update the column widths and the grab bar position</span>
		x <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>w<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">+</span>x<span class="sy0">,</span> l<span class="br0">&#91;</span>S<span class="br0">&#93;</span><span class="br0">&#91;</span>W<span class="br0">&#93;</span><span class="sy0">=</span>w<span class="sy0">+</span>P<span class="sy0">,</span> g<span class="br0">&#91;</span>S<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>w<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>P<span class="sy0">,</span> k<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// Stop the mousemove code from running when LMB is released</span>
		x<span class="sy0">=</span><span class="nu0">0</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span></pre></div></div></div>

<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Resizing+the+left-hand+labels+column+in+Gmail+%E2%80%93+an+update+to+fix+resizing+http%3A%2F%2Fis.gd%2Fy4ZUUF" title="Post to Twitter"><img class="nothumb" src="http://www.codecouch.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big4.png" alt="Post to Twitter" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://www.codecouch.com/2011/11/resizing-the-left-hand-labels-column-in-gmail-an-update-to-fix-resizing/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>How to enable resizing of the left-hand labels column in Gmail</title>
		<link>http://www.codecouch.com/2011/11/how-to-enable-resizing-of-the-left-hand-labels-column-in-gmail/</link>
		<comments>http://www.codecouch.com/2011/11/how-to-enable-resizing-of-the-left-hand-labels-column-in-gmail/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 22:40:10 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.codecouch.com/?p=358</guid>
		<description><![CDATA[Update 3 (10 May 2012): I&#8217;ve added a new post that has all the various bug fixes to date as well as new code showing how to get the code working as a user script in Chrome as well as Greasemonkey. Update 2 (13 Feb 2012): I&#8217;ve fixed the bug where selecting content on the [...]]]></description>
			<content:encoded><![CDATA[<hr />
<p><strong>Update 3 (10 May 2012): </strong> I&#8217;ve <a href="/2012/05/resizing-the-left-hand-labels-column-in-gmail-a-bug-fix-and-extra-user-script-compatibility/" title="Resizing the left-hand labels column in Gmail – a bug fix and extra user script compatibility">added a new post</a> that has all the various bug fixes to date as well as new code showing how to get the code working as a user script in Chrome as well as Greasemonkey.</p>
<p><strong>Update 2 (13 Feb 2012): </strong> I&#8217;ve fixed the bug where selecting content on the page was disabled. You&#8217;ll find the new code <a href="/2012/02/resizing-the-left-hand-labels-column-in-gmail-an-update-to-fix-text-selection/" title="Resizing the left-hand labels column in Gmail – an update to fix text selection">in this post</a></p>
<p><strong>Update 1 (Nov 2011): </strong> I&#8217;ve fixed the bug where resizing the browser window caused things to break. You&#8217;ll find the new code <a href="/2011/11/resizing-the-left-hand-labels-column-in-gmail-an-update-to-fix-resizing/" title="Resizing the left-hand labels column in Gmail – an update to fix resizing">in this post</a></p>
<hr />
<p>You can still <a href="#showMeTheMerchandise" class="bookmark">go directly to the original code</a> if you want to &#8211; it&#8217;s still at the bottom of this article.</p>
<p>I like Gmail, and I like it a lot, even though I was a very &#8220;late starter&#8221;, only really starting to use it at the start of this year. I was the social outcast of my geek friends, and as known as &#8220;the luddite&#8221; for my refusal to upgrade from Windows XP to Windows 7, or move away from Outlook and my beloved 1.3GB .PST file.</p>
<p>However, I&#8217;m far from a luddite: I&#8217;m a control freak, and my reasons for sticking with XP &#038; Outlook were simply because I knew the software very well, and if something went wrong, I knew how to fix it. I&#8217;d also tried Vista for some weeks at work, and didn&#8217;t exactly find it was aiding my productivity (to put it nicely).</p>
<p>It was a similar story with Outlook &#8211; I knew that I had my mail locally, and could make my own backups, for free, and quickly. Gmail seemed to be a mystical entity that people talked about, but no-one really knew how safe their data was. I had to have faith that my data was safe, and that I could access it just as quickly, and not be slowed down by an interface less powerful than a native application (as a software developer / power user, I&#8217;m also a keyboard whore. I like shortcut keys, and I like intuitive interfaces).</p>
<p>I&#8217;m happy to say that since the start of the year, my I.T. environment has changed significantly &#8211; and for the better, I believe:</p>
<ul>
<li>I sold my Windows Mobile 6.5 phone (an HTC HD2), and purchased an iPhone 4S. Technically, the HD2 was &#8211; and still is, a damn good phone. With Windows Mobile 6.5 I could record calls, edit the registry, whatever &#8211; I was in control of my phone. However, the OS was rapidly losing supporters. For example, Moxier who for a long time had their WM6.5 Wallet software &#8220;coming soon&#8221; removed these statements from their blog.</li>
<li>I deleted my Windows BootCamp partition and started booting into OSX<strong>[1]</strong>. I&#8217;ve owned this iMac for 3+ years, and it has served me very well, as a Windows PC. As you can imagine, I didn&#8217;t buy it for the Apple logo; the purchasing decision was made with my head, not my heart: At the time, it was the best computer I could get with a small footprint, and I have a very small desk. It also ran Windows, and I&#8217;ve been a Windows user since starting on v2.x at school. I still remember many happy hours typesetting on Aldus PageMaker on the school&#8217;s first 386, playing Sopwith Camel and The Game With No Name at CGA resolution, only a lot faster than the 286 machines. Wow &#8211; I feel old, and I&#8217;m not even 40!</li>
<li>While I still have my 1.3GB PST file, I very rarely go near it. In fact, I very rarely kick open my Windows VM (it was odd that I used to run OSX in a VM on my iMac under Windows. It&#8217;s certainly easier to get Windows running in a VM on OSX!). I&#8217;ve made it read-only, and keep it only to reference client emails when I need to. This switch from Outlook coincided with the deletion of Windows and starting to use Gmail.</li>
</ul>
		<div  class="headingPod headingLevel2 headingLevel2Blue">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>Gmail isn&#8217;t perfect</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>&#8230; well, what did you expect me to say? No software is bug-free (this I know: I seem to be a bug magnet). I&#8217;ve got issues with Gmail, but none of them are bad enough to stop me using it. My two biggest gripes with it are, in no particular order:</p>
<ul>
<li>The searching is nowhere near as good as I would expect, and this is not something that Google are shouting from the rooftops. A lot of the blurb tells you that it&#8217;s the &#8220;same powerful technology&#8221; that&#8217;s behind their search engine. Really? Give me substring matching, then I&#8217;ll believe you. My typical search on Google involves brackets, quotes, ANDs and ORs. While I can use these, not having substring / partial matching is a very big negative point.</li>
<li>The left-hand column is not resizable. It was not resizable on the old interface, nor the old new look, nor the latest new look. As you can imagine, my label structure is quite specific. Don&#8217;t get me wrong &#8211; I know they&#8217;re not folders, I know they&#8217;re much better than folders, and my label structure is not even approaching a tenth of the size of my Outlook folder structure, as a lot of the good features in Gmail make it a lot easier to keep things simpler. The conversation view is a fantastic boost to productivity, yet it&#8217;s such a simple concept.</li>
</ul>
<p>I wouldn&#8217;t mind if the left-hand column could resize within limits&#8230; anything more than the 176 pixels I&#8217;m currently allowed would be a bonus. At full-screen with 1920 pixels to fill, it looks very sad and lonely.</p>
<p>I cannot do anything about the search engine, other than report bugs if I find them. If I find bugs in Gmail, Google Docs, or any software from any company, I report them. I normally give very detailed information &#8211; after all, it&#8217;s in my best interests that the software I use gets better. I also read the help forums and see that many users share my frustrations of many pieces of software, Gmail being no exception.</p>
		<div  class="headingPod headingLevel2 headingLevel2Yellow">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>Stop moaning and do something about it then!</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>Today I thought I&#8217;d do something about the left-hand labels column being a fixed size. Why? Because as a web developer, I could. That&#8217;s what I like about web applications &#8211; you can modify them as much as you like. And, after all, there&#8217;s no point in moaning about a problem that you are able to do something about.</p>
<p>I started out this morning with no real idea of where I was going, and finished an hour or so ago with a good first cut. It&#8217;s not perfect, but I&#8217;m very happy with what I&#8217;ve created &#8211; and without too much effort, which does make me wonder why Google have not implemented it already.</p>
<p>To say I had no real idea of where I was going isn&#8217;t strictly true. I did have a list of ideals that the code should adhere to:</p>
<ul>
<li>It had to run without any extra JavaScript framework. I like jQuery, and I use it often. However, the main reasons I use it are pretty much obsolete. All modern browsers support .querySelector() / .querySelectorAll(), and IE 9 works with addEventListener. No more testing for global event objects (yippee!). Anyway, I felt that this was such a simple task, it didn&#8217;t need a library weighing it down</li>
<li>It had to run without Greasemonkey being installed. I know that Chrome will run user scripts without any extra extensions, but not everyone has Chrome, and I don&#8217;t believe that people should have to install an add-on to get behaviour than can be provided natively. I don&#8217;t run Greasemonkey scripts at all. I may, one day, but I&#8217;ve never yet had the need to.</li>
<li>The code had to be small enough to use in a bookmarklet. I didn&#8217;t have an ideal size in mind, but needless to say, I&#8217;m <strong>very</strong> happy with how it turned out <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li>It had to run on modern browsers. Admittedly, I didn&#8217;t include IE in that list, but I&#8217;m slowly realising that IE 9 isn&#8217;t so bad (although I run OSX, so I don&#8217;t see it that often)</li>
<li>It had to support at very least the new new look, and possibly the old new look Anything other than that was a bonus (the old old look, or any look with themes)</li>
<li>It had to be as future-proof as possible. Google change their code frequently, and IDs and classes come and go. I wanted code that weathered these changes. Incidentally, I don&#8217;t follow the belief that Google go out of their way to make their code as hard to follow as possible. Why would they provide vast amounts of API documentation, scripting facilities with a visual IDE, etc, if they wanted to keep people from tinkering? Perhaps short class names have something to do with keeping the byte count down? Network traffic doesn&#8217;t come for free, and nor does storage space. If you believe Google want to stop you tinkering, you&#8217;d best stop reading now, lest your blood pressure raise too high <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
</ul>
		<div  class="headingPod headingLevel2 headingLevel2Pink">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>Compatibility</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>I can honestly say I was surprised by the outcome &#8211; and it&#8217;s not often I&#8217;m surprised by my own code. I tested it on the following browsers:</p>
<ul>
<li>IE 9 (Windows 7 VM)</li>
<li>Chrome 17 dev stream (OSX)</li>
<li>Fx 8 (OSX)</li>
<li>Fx 3.6.24 (OSX)</li>
<li>Opera 11.52 (OSX)</li>
</ul>
<p><a id="showMeTheMerchandise"></a></p>
<p>In all cases, I tested the &#8220;new new look&#8221; (&#8216;new look&#8217;), the &#8220;old new look&#8221; (&#8216;preview&#8217;), and the &#8220;old old look&#8221; (&#8216;classic&#8217;). In all cases, the code &#8220;just worked&#8221;: I could resize and everything reflowed nicely. I could even resize the settings pages.</p>
<p>When I started coding this morning, I did not think that I would get it working in all the different UIs, let alone IE 9. Now you see why I was surprised with the results &#8211; and also with Google for not implementing this much asked-for feature.</p>
		<div  class="headingPod headingLevel2 headingLevel2Green">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>The code</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>Earlier, I said I wanted to keep it small enough to use as a bookmarklet. I must admit, I&#8217;ve not actually tried it as a bookmarklet in any browser, as I&#8217;ve been using the various consoles to paste the JS code into. However, I think that 899 bytes would count as acceptable, wouldn&#8217;t you?</p>
<p>OK &#8211; it&#8217;s 899 bytes with all whitespace removed, and no comments. However, this is not a lesson in obfuscation, I simply wanted to keep the code size down for bookmarklets. I&#8217;ll also post a commented version (still pretty small, just over 3.5kB).</p>
<p>Before I post the code, let me paste in a quote that you read recently:</p>
<blockquote><p>No software is bug-free</p></blockquote>
<p>Here&#8217;s a list of all the issues I&#8217;m currently aware of (whether bugs or things I&#8217;d like to add):</p>
<ul>
<li>When switching between pages / themes, the grab bar may end up in the wrong place</li>
<li>Sometimes content will become selected during a drag.</li>
<li>The bar doesn&#8217;t come back after a page reload</li>
<li>If you resize the browser window, the calculations do not update so you may well see the right-hand column drop underneath the left-hand column</li>
<li>No minimum size is enforced. If you drag too small, don&#8217;t expect things to look good <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ul>
<p>The good news is that if you see any visual glitches you can simply refresh the page and re-run the code. Or, edit the code and fix any bugs you find. Then share the fixes. That, ladies and gentlemen, is why I adore web development: it&#8217;s impossible to hide your code, and with the tools at our disposal getting better by the minute, there&#8217;s never been a better time to be a front-end developer (incidentally, if you are a front-end developer and you haven&#8217;t watched the <a href="http://paulirish.com/2011/a-re-introduction-to-the-chrome-developer-tools/" title="A Re-introduction to the Chrome Developer Tools video by Paul Irish">Re-introduction to Chrome Developer Tools</a> video on Paul Irish&#8217;s blog, I strongly suggest you spend 30 minutes watching it. You will learn something; probably lots of somethings <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Here&#8217;s the no-whitespace version for those of you wanting to run it as a bookmarklet:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span><span class="br0">&#123;</span><span class="kw2">var</span> l<span class="sy0">=</span>i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>c<span class="sy0">=</span>r<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span>p<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span>t<span class="sy0">=</span>sx<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span>dx<span class="sy0">,</span>lw<span class="sy0">,</span>rw<span class="sy0">,</span>n<span class="sy0">,</span>s<span class="sy0">,</span>q<span class="sy0">,</span>g<span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>l<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span>c<span class="sy0">=</span>c<span class="br0">&#91;</span>u<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>u<span class="br0">&#93;</span><span class="sy0">!=</span>d.<span class="me1">body</span><span class="br0">&#41;</span>i<span class="sy0">=</span>i<span class="br0">&#91;</span>u<span class="br0">&#93;</span><span class="sy0">;</span>l<span class="sy0">=</span><span class="br0">&#40;</span>n<span class="sy0">=</span>c.<span class="me1">childNodes</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span>r<span class="sy0">=</span>n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span>n<span class="sy0">=</span>l<span class="br0">&#91;</span>q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role=navigation]'</span><span class="br0">&#41;</span><span class="sy0">,</span>b<span class="sy0">=</span>n<span class="br0">&#91;</span>q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="sy0">,</span>g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>r<span class="br0">&#91;</span>s<span class="sy0">=</span><span class="st0">'style'</span><span class="br0">&#93;</span><span class="br0">&#91;</span>u<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#93;</span><span class="sy0">+=</span>b<span class="br0">&#91;</span>s<span class="br0">&#93;</span><span class="br0">&#91;</span>u<span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span>n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>g<span class="br0">&#91;</span>s<span class="br0">&#93;</span><span class="br0">&#91;</span>u<span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">'position:absolute;z-index:9;left:'</span><span class="sy0">+</span><span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">'px;top:'</span><span class="sy0">+</span>t<span class="sy0">+</span><span class="st0">'px;bottom:0;width:4px;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>g<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span><span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>sx<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">,</span>lw<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">,</span>rw<span class="sy0">=</span>r<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>sx<span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>dx<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">-</span>sx<span class="sy0">,</span>g<span class="br0">&#91;</span>s<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>lw<span class="sy0">+</span>dx<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>p<span class="sy0">,</span>l<span class="br0">&#91;</span>s<span class="br0">&#93;</span>.<span class="me1">width</span><span class="sy0">=</span>lw<span class="sy0">+</span>dx<span class="sy0">+</span>p<span class="sy0">,</span>r<span class="br0">&#91;</span>s<span class="br0">&#93;</span>.<span class="me1">width</span><span class="sy0">=</span>rw<span class="sy0">-</span>dx<span class="sy0">+</span>p<span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>sx<span class="sy0">=</span><span class="nu0">0</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="br0">&#41;</span></pre></div></div></div>

<p><strong>Note:</strong> If you are going to use this as a bookmarklet, you need to prefix the code with javascript: when adding it to the URL field.</p>
<p>The same code, with a small amount of whitespace:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span><span class="br0">&#123;</span>
	<span class="kw2">var</span> l<span class="sy0">=</span>i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>c<span class="sy0">=</span>r<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span>p<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span>t<span class="sy0">=</span>sx<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span>dx<span class="sy0">,</span>lw<span class="sy0">,</span>rw<span class="sy0">,</span>n<span class="sy0">,</span>s<span class="sy0">,</span>q<span class="sy0">,</span>g<span class="sy0">;</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>l<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span>c<span class="sy0">=</span>c<span class="br0">&#91;</span>u<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="br0">&#93;</span><span class="sy0">;</span><span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>u<span class="br0">&#93;</span><span class="sy0">!=</span>d.<span class="me1">body</span><span class="br0">&#41;</span>i<span class="sy0">=</span>i<span class="br0">&#91;</span>u<span class="br0">&#93;</span><span class="sy0">;</span>
	l<span class="sy0">=</span><span class="br0">&#40;</span>n<span class="sy0">=</span>c.<span class="me1">childNodes</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span>r<span class="sy0">=</span>n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span>n<span class="sy0">=</span>l<span class="br0">&#91;</span>q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role=navigation]'</span><span class="br0">&#41;</span><span class="sy0">,</span>b<span class="sy0">=</span>n<span class="br0">&#91;</span>q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="sy0">,</span>g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	r<span class="br0">&#91;</span>s<span class="sy0">=</span><span class="st0">'style'</span><span class="br0">&#93;</span><span class="br0">&#91;</span>u<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#93;</span><span class="sy0">+=</span>b<span class="br0">&#91;</span>s<span class="br0">&#93;</span><span class="br0">&#91;</span>u<span class="br0">&#93;</span><span class="sy0">;</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span>n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
g<span class="br0">&#91;</span>s<span class="br0">&#93;</span><span class="br0">&#91;</span>u<span class="br0">&#93;</span><span class="sy0">=</span><span class="st0">'position:absolute;z-index:9;left:'</span><span class="sy0">+</span><span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">'px;top:'</span><span class="sy0">+</span>t<span class="sy0">+</span><span class="st0">'px;bottom:0;width:4px;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>
	g<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span><span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>sx<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">,</span>lw<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">,</span>rw<span class="sy0">=</span>r<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>sx<span class="sy0">&amp;&amp;</span><span class="br0">&#40;</span>dx<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">-</span>sx<span class="sy0">,</span>g<span class="br0">&#91;</span>s<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>lw<span class="sy0">+</span>dx<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>p<span class="sy0">,</span>l<span class="br0">&#91;</span>s<span class="br0">&#93;</span>.<span class="me1">width</span><span class="sy0">=</span>lw<span class="sy0">+</span>dx<span class="sy0">+</span>p<span class="sy0">,</span>r<span class="br0">&#91;</span>s<span class="br0">&#93;</span>.<span class="me1">width</span><span class="sy0">=</span>rw<span class="sy0">-</span>dx<span class="sy0">+</span>p<span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>sx<span class="sy0">=</span><span class="nu0">0</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span></pre></div></div></div>

<p>And the full monty:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="co1">// Use the Gmail Greasemonkey API to reliably find the 2 main elements (left- and right-hand columns). You do not need Greasemonkey installed to use the API.</span>
<span class="co1">// See http://code.google.com/p/gmail-greasemonkey/wiki/GmailGreasemonkey10API for more details (note: documentation is out of date)</span>
&nbsp;
<span class="co1">// Load the API. It will run our callback function when loaded, passing a GmailAPI object</span>
gmonkey.<span class="me1">load</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
	<span class="coMULTI">/*
		Set up variables. To keep the code size down, I re-use some of these until they hold their final value.
&nbsp;
		l		this will end up pointing to the element that is resized to change the left-hand column width
		i		this will end up pointing to the element that the grab bar is inserted into
		c		this will end up pointing to the container that holds the left- and right- hand column elements l &amp; r
		r		this will end up pointing to the element that is resized to change the right-hand column width
		d		this points to the document in the frame we use
		b		this points to the 'Compose' button
		p		this holds the string 'px'
		t		this is used to calculate the top coordinate of the grab bar
		sx		this holds the x coordinate of the mouse when dragging starts
		dx		when dragging, this holds the difference between the start x coordinate and the current one
		lw		this holds the initial width of the left-hand column (updated at the start of each drag)
		rw		this holds the initial width of the right-hand column (updated at the start of each drag)
		n		used for many things, most notably holding the string 'addEventListener'
		s		this holds the string 'style'
		q		this holds the string 'querySelector'
		g		this points to the grab bar element
		u		used for many things, most notably holding the strings 'parentNode' and 'cssText'
	*/</span>		
	<span class="kw2">var</span> l<span class="sy0">=</span>i<span class="sy0">=</span>o.<span class="me1">getNavPaneElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> c<span class="sy0">=</span>r<span class="sy0">=</span>o.<span class="me1">getActiveViewElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> d<span class="sy0">=</span>c.<span class="me1">ownerDocument</span><span class="sy0">,</span> p<span class="sy0">=</span><span class="st0">'px'</span><span class="sy0">,</span> t<span class="sy0">=</span>sx<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">,</span> dx<span class="sy0">,</span> lw<span class="sy0">,</span> rw<span class="sy0">,</span> n<span class="sy0">,</span> s<span class="sy0">,</span> q<span class="sy0">,</span> g<span class="sy0">;</span>
&nbsp;
	<span class="co1">// Update c and i to point to their intended elements</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>c.<span class="me1">compareDocumentPosition</span><span class="br0">&#40;</span>l<span class="br0">&#41;</span><span class="sy0">&amp;</span><span class="nu0">2</span><span class="br0">&#41;</span> c<span class="sy0">=</span>c<span class="br0">&#91;</span>u<span class="sy0">=</span><span class="st0">'parentNode'</span><span class="br0">&#93;</span><span class="sy0">;</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>i<span class="br0">&#91;</span>u<span class="br0">&#93;</span><span class="sy0">!=</span>d.<span class="me1">body</span><span class="br0">&#41;</span> i<span class="sy0">=</span>i<span class="br0">&#91;</span>u<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Update l, r, and b to point to their intended elements. Create grab bar, and insert into DOM</span>
	l<span class="sy0">=</span><span class="br0">&#40;</span>n<span class="sy0">=</span>c.<span class="me1">childNodes</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> r<span class="sy0">=</span>n<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span> n<span class="sy0">=</span>l<span class="br0">&#91;</span>q<span class="sy0">=</span><span class="st0">'querySelector'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role=navigation]'</span><span class="br0">&#41;</span><span class="sy0">,</span> b<span class="sy0">=</span>n<span class="br0">&#91;</span>q<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'[role]'</span><span class="br0">&#41;</span><span class="sy0">,</span> g<span class="sy0">=</span>i.<span class="me1">appendChild</span><span class="br0">&#40;</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Copy whatever x-user-select style is on the Compose button and add it to the RH column to minimise text selection while dragging.</span>
	<span class="co1">// Copying the existing style seemed easier than adding from scratch... but as I didn't try, I can't say this with 100% certainty :-)</span>
	r<span class="br0">&#91;</span>s<span class="sy0">=</span><span class="st0">'style'</span><span class="br0">&#93;</span><span class="br0">&#91;</span>u<span class="sy0">=</span><span class="st0">'cssText'</span><span class="br0">&#93;</span> <span class="sy0">+=</span> b<span class="br0">&#91;</span>s<span class="br0">&#93;</span><span class="br0">&#91;</span>u<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Calculate the cumulative offsetTop of for the top of the grab bar</span>
	<span class="kw1">while</span><span class="br0">&#40;</span>t<span class="sy0">+=</span>n.<span class="me1">offsetTop</span><span class="sy0">,</span>n<span class="sy0">=</span>n.<span class="me1">offsetParent</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Style the grab bar</span>
	g<span class="br0">&#91;</span>s<span class="br0">&#93;</span><span class="br0">&#91;</span>u<span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">'position:absolute;z-index:9;left:'</span> <span class="sy0">+</span> <span class="br0">&#40;</span>l<span class="br0">&#91;</span>o<span class="sy0">=</span><span class="st0">'offsetWidth'</span><span class="br0">&#93;</span><span class="sy0">-</span><span class="nu0">5</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">'px;top:'</span> <span class="sy0">+</span> t <span class="sy0">+</span> <span class="st0">'px;bottom:0;width:4px;cursor:ew-resize;cursor:col-resize;background:url(data:image/gif;base64,R0lGODlhAwAEAIAAAL+/v////yH5BAAAAAAALAAAAAADAAQAAAIERGKnVwA7)'</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Add event listeners. mousedown is added to the grab bar, mousemove and mouseup to the document</span>
	g<span class="br0">&#91;</span>n<span class="sy0">=</span><span class="st0">'addEventListener'</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousedown'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// Only trigger with LMB on grab bar. Stores initial x coord, and widths of left- and right- hand columns</span>
		e.<span class="me1">which</span><span class="sy0">==</span><span class="nu0">1</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>sx<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">,</span> lw<span class="sy0">=</span>l<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="sy0">,</span> rw<span class="sy0">=</span>r<span class="br0">&#91;</span>o<span class="br0">&#93;</span><span class="br0">&#41;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mousemove'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// If we have the mouse button pressed, work out the x delta, update the column widths and the grab bar position</span>
		sx <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>dx<span class="sy0">=</span>e.<span class="me1">pageX</span><span class="sy0">-</span>sx<span class="sy0">,</span> g<span class="br0">&#91;</span>s<span class="br0">&#93;</span>.<span class="me1">left</span><span class="sy0">=</span>lw<span class="sy0">+</span>dx<span class="sy0">-</span><span class="nu0">5</span><span class="sy0">+</span>p<span class="sy0">,</span> l<span class="br0">&#91;</span>s<span class="br0">&#93;</span>.<span class="me1">width</span><span class="sy0">=</span>lw<span class="sy0">+</span>dx<span class="sy0">+</span>p<span class="sy0">,</span> r<span class="br0">&#91;</span>s<span class="br0">&#93;</span>.<span class="me1">width</span><span class="sy0">=</span>rw<span class="sy0">-</span>dx<span class="sy0">+</span>p<span class="br0">&#41;</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	d<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="st0">'mouseup'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="co1">// Stop the mousemove code from running when LMB is released</span>
		sx<span class="sy0">=</span><span class="nu0">0</span>
	<span class="br0">&#125;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span></pre></div></div></div>

		<div  class="headingPod headingLevel2 headingLevel2Orange">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>How do I run it?</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>I&#8217;m going to follow the advice of a <a href="http://elitistreview.com/" title="elitistreview. The limits of pleasure are yet to be defined or reached">very good friend of mine</a>, as much as it hurts my aesthetes to do so:</p>
<blockquote><p>There&#8217;s no noun you can&#8217;t verb</p></blockquote>
<p>The short answer: Google it.</p>
<p>The long answer: Google for &#8216;bookmarklet&#8217; <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>If you find bugs, make improvements, or whatever, do let me know. Other than that, use the code as you like, but please follow the <a href="/terms/" title="Terms of use">terms of use</a> and acknowledge where the code came from. I don&#8217;t expect you to fit the license into the bookmarklet, obviously <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Enjoy!</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=How+to+enable+resizing+of+the+left-hand+labels+column+in+Gmail+http%3A%2F%2Fis.gd%2FjoNS2o" title="Post to Twitter"><img class="nothumb" src="http://www.codecouch.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big4.png" alt="Post to Twitter" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://www.codecouch.com/2011/11/how-to-enable-resizing-of-the-left-hand-labels-column-in-gmail/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Detecting orientation changes in mobile Safari on iOS, and other supported browsers</title>
		<link>http://www.codecouch.com/2011/11/detecting-orientation-changes-in-mobile-safari-on-ios-and-other-supported-browsers/</link>
		<comments>http://www.codecouch.com/2011/11/detecting-orientation-changes-in-mobile-safari-on-ios-and-other-supported-browsers/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 22:58:24 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.codecouch.com/?p=320</guid>
		<description><![CDATA[I&#8217;ve been writing a tool for the iPad recently, and found a need to detect when its orientation had changed (whether from landscape to portrait or vice versa). If I were writing this post years ago, I&#8217;d probably advise that the best way of detecting this change would be to have a timer run a [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been writing a tool for the iPad recently, and found a need to detect when its orientation had changed (whether from landscape to portrait or vice versa).</p>
<p>If I were writing this post years ago, I&#8217;d probably advise that the best way of detecting this change would be to have a timer run a function every half a second or so, with that function detecting the width of the window. I&#8217;m happy to report that times have changed since 2007, when <a href="http://www.evotech.net/blog/2007/07/web-development-for-the-iphone/" title="this blog post">this blog post</a> was written.</p>
<p>These days, things are a lot easier and less clunky: you can listen for the <code>orientationchange</code> event which is fired on iOS devices whenever they change orientation. Having said that, it appears that Safari running on any iPhone doesn&#8217;t fire the 180 degree event and does not rotate the screen when in that orientation (I tested on my 3g, 4, and 4S models). Safari on my iPad fires it for all four positions (0, 90, 180, 270 degrees).</p>
<p>Enough waffle, here is Apple&#8217;s sample code taken from the <a href="http://developer.apple.com/library/IOs/#documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html" title="Handling Orientation Events">Handling Orientation Events</a> section of their Safari Web Content Guide:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;
    &lt;title&gt;Orientation test&lt;/title&gt;
    <span class="sy0">&lt;</span>script type<span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span><span class="sy0">&gt;</span>
        <span class="kw2">function</span> updateOrientation<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw2">var</span> displayStr <span class="sy0">=</span> <span class="st0">'Orientation: '</span><span class="sy0">;</span>
&nbsp;
            <span class="kw1">switch</span><span class="br0">&#40;</span>window.<span class="me1">orientation</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="kw1">case</span> <span class="nu0">0</span><span class="sy0">:</span>
                    displayStr <span class="sy0">+=</span> <span class="st0">'Portrait'</span><span class="sy0">;</span>
                    <span class="kw1">break</span><span class="sy0">;</span>
&nbsp;
                <span class="kw1">case</span> <span class="sy0">-</span><span class="nu0">90</span><span class="sy0">:</span>
                    displayStr <span class="sy0">+=</span> <span class="st0">'Landscape (right, screen turned clockwise)'</span><span class="sy0">;</span>
                    <span class="kw1">break</span><span class="sy0">;</span>
&nbsp;
                <span class="kw1">case</span> <span class="nu0">90</span><span class="sy0">:</span>
                    displayStr <span class="sy0">+=</span> <span class="st0">'Landscape (left, screen turned counterclockwise)'</span><span class="sy0">;</span>
                    <span class="kw1">break</span><span class="sy0">;</span>
&nbsp;
                <span class="kw1">case</span> <span class="nu0">180</span><span class="sy0">:</span>
                    displayStr <span class="sy0">+=</span> <span class="st0">'Portrait (upside-down portrait)'</span><span class="sy0">;</span>
                    <span class="kw1">break</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
&nbsp;
            document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">'output'</span><span class="br0">&#41;</span>.<span class="me1">innerHTML</span> <span class="sy0">=</span> displayStr<span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="sy0">&lt;/</span>script<span class="sy0">&gt;</span>
&lt;/head&gt;
&nbsp;
&lt;body onorientationchange=&quot;updateOrientation();&quot;&gt;
    &lt;div id=&quot;output&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></div></div></div>

<p>There are two things I would change about this code (other than the XHTML 1.0 Strict DOCTYPE, which I&#8217;ve already changed for the much more memorable HTML5 DOCTYPE). The first is the attachment of the event handler as an attribute on the <code>&lt;body&gt;</code> element &#8211; I&#8217;d attach an event listener (it&#8217;s much cleaner IMHO). The second issue both irks and puzzles me: the orientation has to be read from the <code>window</code> object instead of being passed in with the event data. Why is this? I can&#8217;t think of another case where data associated with an event not made available through the event data in some form or other. So why not with this event type?</p>
		<div  class="headingPod headingLevel2 headingLevel2Yellow">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>Reducing the amount of code needed</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>I&#8217;m not a fan of switch statements. Don&#8217;t get me wrong, I&#8217;ll use them when they are appropriate, but I don&#8217;t believe this is such an occasion. All I wanted to do was determine whether my iPad was in landscape or portrait orientation; I really didn&#8217;t care whether the home button was to the left or to the right. After puzzling it over for a few minutes, I realised I could apply the same bitwise AND trick used to determine odd / even numbers (n &#038; 1), using the value 2 instead of 1.</p>
<p>For those of you unfamiliar with bitwise operators, the <a href="https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators" title="Bitwise Operators page at MDN">Bitwise Operators page at MDN</a> is a good all-round read covering a bit of everything, and <a href="http://bateru.com/news/2011/03/javascript-binary-operations-the-easy-way/" title="JavaScript Binary Operations – the easy way">JavaScript Binary Operations – the easy way</a> is definitely worth a read as well. Anyway, here is my take on how it could be done, followed by an explanation of how it works:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;
    &lt;title&gt;Orientation test&lt;/title&gt;
    <span class="sy0">&lt;</span>script type<span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span><span class="sy0">&gt;</span>
        window.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">'orientationchange'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">'output'</span><span class="br0">&#41;</span>.<span class="me1">innerHTML</span> <span class="sy0">=</span> <span class="st0">'Orientation: '</span> <span class="sy0">+</span> <span class="br0">&#91;</span><span class="st0">'Portrait'</span><span class="sy0">,,</span><span class="st0">'Landscape'</span><span class="br0">&#93;</span><span class="br0">&#91;</span>window.<span class="me1">orientation</span> <span class="sy0">&amp;</span> <span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span><span class="sy0">,</span> <span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="sy0">&lt;/</span>script<span class="sy0">&gt;</span>
&lt;/head&gt;
&nbsp;
&lt;body&gt;
    &lt;div id=&quot;output&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></div></div></div>

<p>I&#8217;m not going to go into detail about addEventListener in this article, as event handling is already very well documented. All I need to say on the subject is that if you prefer to use the method shown in Apple&#8217;s sample code to attach the event handler from my code, everything should still work correctly.</p>
		<div  class="headingPod headingLevel2 headingLevel2Pink">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>So how does it work?</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>The window object has a read-only property named orientation that holds one of four numbers: 0, -90, 90, or 180. As you might have deduced, these values are the angle of rotation in degrees, from the default upright portrait position.</p>
<p>To better understand how my code works, let&#8217;s take a look at the binary representations of the 5 numbers (I&#8217;m limiting the number of bits to 16 for brevity. In reality, they are operated on as 32-bit numbers):</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="text">Decimal    Binary
&nbsp;
   0       0000000000000000
  90       0000000001011010
 180       0000000010110100
 -90       1111111110100110
   2       0000000000000010</pre></div></div></div>

<p>As with the topic of event handling, the topic of bitwise logic and bitwise operations deserves much more in-depth coverage than I want to go into, so I&#8217;ll keep this brief: the result of a bitwise AND operation between any two bits will be 1 if and <strong>only</strong> if both operands are 1. In all other cases (0/0, 0/1, 1/0), the result will be 0. Here are the results for all for orientation values after the logical AND:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="text">                   Portrait           Landscape            Portrait           Landscape
&nbsp;
(Decimal)                 0                  90                 180                 -90
Binary     0000000000000000    0000000001011010    0000000010110100    1111111110100110
&amp; 2        0000000000000010    0000000000000010    0000000000000010    0000000000000010
Result     0000000000000000    0000000000000010    0000000000000000    0000000000000010
(Decimal)                 0                   2                   0                   2</pre></div></div></div>

<p>Hopefully my very brief explanation makes sense. In a nutshell, the results of the bitwise AND operations are as follows:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="text">  0 &amp; 2 == 0
180 &amp; 2 == 0
 90 &amp; 2 == 2
-90 &amp; 2 == 2</pre></div></div></div>

		<div  class="headingPod headingLevel2 headingLevel2Yellow">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>What to do with the result of the bitwise operation</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>If you need to know only whether the device is in landscape mode or not, or portrait mode or not, then you can simply return the result of the bitwise operation and use that in any tests. Remember, 0 equates to false and 2 equates to true, as does 1, or 42, or 109.6, etc. If you really need it as a boolean, the simplest way is to perform two logical NOT operations by using !!, e.g:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;
    &lt;title&gt;Orientation test&lt;/title&gt;
    <span class="sy0">&lt;</span>script type<span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span><span class="sy0">&gt;</span>
        window.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">'orientationchange'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
            <span class="co1">// You can test like this (on the values 0 and 2):</span>
&nbsp;
            <span class="kw1">if</span> <span class="br0">&#40;</span>window.<span class="me1">orientation</span> <span class="sy0">&amp;</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="co1">// Do something if in landscape mode</span>
            <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
                <span class="co1">// Do something if in portrait mode</span>
            <span class="br0">&#125;</span>
&nbsp;
&nbsp;
            <span class="co1">// Or, if you really need to have boolean values, then logical NOT the result of the bitwise AND twice</span>
            <span class="co1">// The first NOT converts it to a boolean of the opposite state, the second restores its state</span>
&nbsp;
            <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!!</span><span class="br0">&#40;</span>window.<span class="me1">orientation</span> <span class="sy0">&amp;</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="co1">// Do something if in landscape mode</span>
            <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
                <span class="co1">// Do something if in portrait mode</span>
            <span class="br0">&#125;</span>
&nbsp;
        <span class="br0">&#125;</span><span class="sy0">,</span> <span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="sy0">&lt;/</span>script<span class="sy0">&gt;</span>
&lt;/head&gt;
&nbsp;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></div></div></div>

		<div  class="headingPod headingLevel2 headingLevel2Green">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>What about the weird array syntax? What do the double commas mean?</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>There&#8217;s nothing special about the double-comma syntax used in the array; it simply means that I&#8217;ve chosen not to define one element of the array (or to put it another way, I&#8217;ve chosen to skip over that position). Therefore, the element at that position in the array will be undefined. The array will still have a length of 3, and it still holds 3 values &#8211; it just so happens that one of these is the value undefined. Element 0 will be the string &#8216;Portrait&#8217;, element 1 will be undefined, and element 2 will be the string &#8216;Landscape&#8217;:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="kw2">var</span> arr <span class="sy0">=</span> <span class="br0">&#91;</span><span class="st0">'Portrait'</span><span class="sy0">,,</span><span class="st0">'Landscape'</span><span class="br0">&#93;</span><span class="sy0">;</span>
<span class="kw3">alert</span><span class="br0">&#40;</span>arr<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>         <span class="co1">// 'Portrait'</span>
<span class="kw3">alert</span><span class="br0">&#40;</span>arr<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>         <span class="co1">// undefined</span>
<span class="kw3">alert</span><span class="br0">&#40;</span>arr<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>         <span class="co1">// 'Landscape'</span>
<span class="kw3">alert</span><span class="br0">&#40;</span>arr.<span class="me1">length</span><span class="br0">&#41;</span><span class="sy0">;</span>     <span class="co1">// 3</span></pre></div></div></div>

<p>So, the bitwise AND returns either 0 or 2, and I&#8217;ve got an array with data at elements 0 and 2. If it hasn&#8217;t done so yet, the penny should now be well and truly dropping: the result of the bitwise AND is being used to select one of the two array elements containing data &#8211; data that gives us the orientation.</p>
<p>Here&#8217;s an example of how this might be used in a real situation: The device orientation is added as an attribute to the <code>&lt;body&gt;</code> element, and this is used by the CSS to ensure that content (in this case, an image) is always displayed at the same position on the screen, no matter what the orientation, or where the status bar is. This avoids the problem of having to resize the content &#8211; which can become tricky, depending on the content. Note: this example was designed for the resolution and aspect ratio of the iPad screen. While the image does rotate on an iPhone, it doesn&#8217;t fit nicely. As the code I&#8217;m writing is not designed to be run on an iPhone (the small screen makes it impractical), I haven&#8217;t spent any time getting these examples to look perfect on an iPhone. However, it should be good enough to get the idea across <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p>There are two things I&#8217;d like to point out about this example: In addition to the orientationchange event, the attribute on the <code>&lt;body&gt;</code> is being updated once the page has loaded so the device doesn&#8217;t have to be rotated to ensure everything is sized correctly. The second point is the issue of the empty CSS rule <code>body[orient="landscape"] {}</code>. On my iPad running iOS 4.3.3, if I do not include this line, the code fails to size the image as expected &#8211; even though the rule contains no styling, and thus should make no difference. Unfortunately, I don&#8217;t have an iPad 2 to test it on. If anyone would like to donate one to me, I&#8217;d be only too happy to accept it <img src='http://www.codecouch.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>If anyone can tell me why this might be happening, or how to fix it without having to frig my code in a manner I thought I&#8217;d seen the last of with IE6 (correction: that was until I found that Safari/iOS will not fire touchstart events on anchors containing semi-opaque PNGs&#8230; Apple must have got the IE6 devs going cheap. <a href="https://devforums.apple.com/thread/132122" title="Read more on the PNG bug">Read more on the PNG bug</a>).</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=0&quot; /&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;
    &lt;title&gt;Orientation test&lt;/title&gt;
    <span class="sy0">&lt;</span>script type<span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span><span class="sy0">&gt;</span>
        <span class="kw2">function</span> updateOrientation<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            document.<span class="me1">body</span>.<span class="me1">setAttribute</span><span class="br0">&#40;</span><span class="st0">'orient'</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="st0">'portrait'</span><span class="sy0">,,</span><span class="st0">'landscape'</span><span class="br0">&#93;</span><span class="br0">&#91;</span>window.<span class="me1">orientation</span> <span class="sy0">&amp;</span> <span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            window.<span class="me1">scrollTo</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span><span class="sy0">;</span>
        window.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">'orientationchange'</span><span class="sy0">,</span> updateOrientation<span class="sy0">,</span> <span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span>
        window.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">'load'</span><span class="sy0">,</span> updateOrientation<span class="sy0">,</span> <span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="sy0">&lt;/</span>script<span class="sy0">&gt;</span>
&nbsp;
    &lt;style type=&quot;text/css&quot;&gt;
        html, body {
            margin: 0px;
            padding: 0px;
        }
        body {
            text-align: center;
        }
        body[orient=&quot;landscape&quot;] {}
        body[orient=&quot;landscape&quot;] img {
            width: 890px;
            height: 690px;
        }
        body[orient=&quot;portrait&quot;] img {
            -webkit-transform: rotate3d(0, 0, 1, -90deg) translate3d(-90px, -22px, 0px);
            width: 890px;
            height: 690px;
        }
    &lt;/style&gt;
&lt;/head&gt;
&nbsp;
&lt;body&gt;
    &lt;img src=&quot;http://oi39.tinypic.com/2l97b41.jpg&quot; /&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></div></div></div>

		<div  class="headingPod headingLevel2 headingLevel2Yellow">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>A quick note on decimal / binary conversion</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>You can easily convert from decimal to binary in JavaScript by passing 2 as the radix (base) into the toString() method available on every Number instance, and from binary back to decimal by passing 2 as the radix to parseInt. There are some caveats, but for positive integer numbers, you should find these two methods are reliable:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="kw3">alert</span><span class="br0">&#40;</span><span class="nu0">6</span>..<span class="me1">toString</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>            <span class="co1">// '110'</span>
<span class="kw3">alert</span><span class="br0">&#40;</span><span class="nu0">42</span>..<span class="me1">toString</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>           <span class="co1">// '101010'</span>
<span class="kw3">alert</span><span class="br0">&#40;</span>parseInt<span class="br0">&#40;</span><span class="st0">'110'</span><span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>        <span class="co1">// 6</span>
<span class="kw3">alert</span><span class="br0">&#40;</span>parseInt<span class="br0">&#40;</span><span class="st0">'101010'</span><span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>     <span class="co1">// 42</span></pre></div></div></div>

<p>I mentioned a few caveats. These are that you will not be able to use the same methods to convert to and from floating point numbers, and negative numbers will need another step or two. As you may have already discovered, the toString representation of -90 in binary is nothing like the number I used:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="text">The -90 I used (16-bit)    1111111110100110
The -90 I used (8-bit)             10100110
-90..toString(2)                   -1011010</pre></div></div></div>

<p>The representation I used is the <a href="http://en.wikipedia.org/wiki/Two's_complement" title="Two's complement page at Wikipedia">two&#8217;s complement</a> of the positive number (90, in this case). Here&#8217;s the quick-and-dirty method I mentioned to give me the correct negative binary representation, which does require specifying a number of bits. For -90/90, an 8-bit number is fine, but I&#8217;ll show the 16-bit version as well:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="kw2">var</span> bitCount <span class="sy0">=</span> <span class="nu0">8</span><span class="sy0">;</span>                                                        <span class="co1">// 8 bit version</span>
<span class="kw2">var</span> negativeNum <span class="sy0">=</span> <span class="sy0">-</span><span class="nu0">90</span><span class="sy0">;</span>                                                   <span class="co1">// Negative number to use</span>
<span class="kw2">var</span> combosForBitCount <span class="sy0">=</span> Math.<span class="me1">pow</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> bitCount<span class="br0">&#41;</span><span class="sy0">;</span>                           <span class="co1">// 2 ** 8 == 256</span>
<span class="co1">// Here's the conversion to binary and back to decimal</span>
<span class="kw2">var</span> negativeBinary <span class="sy0">=</span> <span class="br0">&#40;</span>combosForBitCount <span class="sy0">+</span> negativeNum<span class="br0">&#41;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span>      <span class="co1">// 10100110</span>
<span class="kw2">var</span> negativeDecimal <span class="sy0">=</span> parseInt<span class="br0">&#40;</span>negativeBinary<span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="sy0">-</span> combosForBitCount<span class="sy0">;</span>   <span class="co1">// -90</span>
&nbsp;
<span class="kw2">var</span> bitCount <span class="sy0">=</span> <span class="nu0">16</span><span class="sy0">;</span>                                                       <span class="co1">// 16 bit version</span>
<span class="kw2">var</span> negativeNum <span class="sy0">=</span> <span class="sy0">-</span><span class="nu0">90</span><span class="sy0">;</span>                                                   <span class="co1">// Negative number to use</span>
<span class="kw2">var</span> combosForBitCount <span class="sy0">=</span> Math.<span class="me1">pow</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> bitCount<span class="br0">&#41;</span><span class="sy0">;</span>                           <span class="co1">// 2 ** 16 == 65536</span>
<span class="co1">// Here's the conversion to binary and back to decimal</span>
<span class="kw2">var</span> negativeBinary <span class="sy0">=</span> <span class="br0">&#40;</span>combosForBitCount <span class="sy0">+</span> negativeNum<span class="br0">&#41;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span>      <span class="co1">// 1111111110100110</span>
<span class="kw2">var</span> negativeDecimal <span class="sy0">=</span> parseInt<span class="br0">&#40;</span>negativeBinary<span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="sy0">-</span> combosForBitCount<span class="sy0">;</span>   <span class="co1">// -90</span></pre></div></div></div>

<p>It&#8217;s probably worth mentioning that there are multiple ways of converting negative binary numbers, and the method I&#8217;ve given above shouldn&#8217;t be used without ensuring that it is providing valid results. I really only included it so you could see how I obtained the binary value for -90. If you haven&#8217;t lost the will to live just yet, I&#8217;d read through the <a href="http://celtickane.com/projects/computer-science-primer/binary-numbers/" title="Binary Numbers page at Celtic Kane Online">Binary Numbers page at Celtic Kane Online</a> and the <a href="http://en.wikipedia.org/wiki/Signed_number_representations" title="Wikipedia article on Signed number representations">Wikipedia article on Signed number representations</a>.</p>
<p>The floating point issue is easy to understand: parseInt can&#8217;t be used to convert a floating point number (the clue is in its name), and parseFloat doesn&#8217;t take a radix. Converting to and from floating point binary numbers, while not overly tricky, isn&#8217;t something I will go into here. I can recommend <a href="http://www.amazon.co.uk/gp/product/0070379904/ref=as_li_tf_tl?ie=UTF8&#038;tag=codcou-21&#038;linkCode=as2&#038;camp=1634&#038;creative=6738&#038;creativeASIN=0070379904">Essential Computer Mathematics by Seymour Lipschutz (Schaum&#8217;s Outline Series)</a><img src="http://www.assoc-amazon.co.uk/e/ir?t=codcou-21&#038;l=as2&#038;o=2&#038;a=0070379904" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> as a fantastic all-round read (I still refer to my 1982 copy today, and have even taught the occasional class with the book as my only aid). 40+ million students can&#8217;t be wrong!</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Detecting+orientation+changes+in+mobile+Safari+on+iOS%2C+and+other+supported+browsers+http%3A%2F%2Fis.gd%2Fm71c8i" title="Post to Twitter"><img class="nothumb" src="http://www.codecouch.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big4.png" alt="Post to Twitter" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://www.codecouch.com/2011/11/detecting-orientation-changes-in-mobile-safari-on-ios-and-other-supported-browsers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to stop Internet Explorer from caching AJAX requests</title>
		<link>http://www.codecouch.com/2009/01/how-to-stop-internet-explorer-from-caching-ajax-requests/</link>
		<comments>http://www.codecouch.com/2009/01/how-to-stop-internet-explorer-from-caching-ajax-requests/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 13:53:34 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[IE7]]></category>
		<category><![CDATA[Internet Explorer]]></category>

		<guid isPermaLink="false">http://www.codecouch.com/?p=250</guid>
		<description><![CDATA[There are several ways to solve the problem of browsers caching AJAX requests. You can use a 'cache buster' parameter, or you can set the response headers server-side. This article discusses these two options.]]></description>
			<content:encoded><![CDATA[<p>I recently had to revisit the issue of IE&#8217;s default cache settings causing problems when making AJAX requests. Out-of-the-box, the cache setting is &#8216;Automatically&#8217;, where pages are only fetched from the server if the cached content is from an earlier day, old or from an earlier session.</p>
<p>This can be a nightmare to deal with, as you cannot ask all users of a web site to change their browser settings.</p>
<p>One workaround is to use a &#8216;cache buster&#8217; parameter in your GET request. Something like this:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript"><span class="kw2">var</span> urlToFetch <span class="sy0">=</span> <span class="st0">'whatever.php?randNum='</span> <span class="sy0">+</span> <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div>

<p>This works very well, but can have drawbacks, depending on your server setup. For example, if your application server sits behind a caching layer, you wouldn&#8217;t want the URL to be different every time for idempotent requests, as the cached version would never get used, and so your application server would get a direct hit every time.</p>
<p>One way around this without using to parameters is to set the &#8216;Cache-Control&#8217; response header to direct the browser how to cache the response.</p>
<p>The &#8216;Cache-Control&#8217; header can have various values, one of which is &#8216;no-cache&#8217;. This tells the browser that it should not cache the response, so the next time the same URL is requested, new content will always be sent (as there is no previous version in the browser&#8217;s cache).</p>
<p>This is how we do it using Groovy:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">response.<span class="me1">addHeader</span> <span class="st0">&quot;Cache-Control&quot;</span><span class="sy0">,</span> <span class="st0">&quot;max-age=0,no-cache,no-store&quot;</span></pre></div></div></div>

<p>So really, which method you use boils down to this: If you know that the cache buster will have a performance hit on your setup, then don&#8217;t use it, otherwise use whichever method you prefer.</p>
<p>Also, as a developer, I can highly recommend changing your IE cache settings to &#8216;Every visit to the page&#8217;.</p>
		<div  class="headingPod headingLevel2 headingLevel2Pink">
			<div class="img">
				<div class="verticalCentreOuter">
					<div class="verticalCentreMiddle">
						<div class="verticalCentreInner">
							<h2>Update 10/02/2008</h2>
						</div>
					</div>
				</div>
			</div>
		</div>
<p>We&#8217;re finding that with some of our automated testing, IE 7 still caches the odd file now and then. To get around this, we have modified our &#8216;Cache-Control&#8217; header to include two non-standard properties, &#8216;post-check&#8217; and &#8216;pre-check&#8217;, and added an &#8216;Expires&#8217; header as well:</p>

<div class="wp_syntax_outer"><div class="wp_syntax"><div class="wp_syntax_inner"><pre class="javascript">response.<span class="me1">addHeader</span> <span class="st0">&quot;Cache-Control&quot;</span><span class="sy0">,</span> <span class="st0">&quot;max-age=0,no-cache,no-store,post-check=0,pre-check=0&quot;</span><span class="sy0">;</span>
response.<span class="me1">addHeader</span> <span class="st0">&quot;Expires&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Mon, 26 Jul 1997 05:00:00 GMT&quot;</span></pre></div></div></div>

<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=How+to+stop+Internet+Explorer+from+caching+AJAX+requests+http%3A%2F%2Fis.gd%2FZzSteJ" title="Post to Twitter"><img class="nothumb" src="http://www.codecouch.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big4.png" alt="Post to Twitter" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://www.codecouch.com/2009/01/how-to-stop-internet-explorer-from-caching-ajax-requests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speed up your Javascript</title>
		<link>http://www.codecouch.com/2009/01/speed-up-your-javascript/</link>
		<comments>http://www.codecouch.com/2009/01/speed-up-your-javascript/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 12:31:38 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.codecouch.com/?p=248</guid>
		<description><![CDATA[Nicolas Zakas (of Professional JavaScript, Second Edition fame) has a series of articles discussing improving Javascript performance - avoiding browsers complaining about long-running scripts. Some useful suggestions on how to optimise and chunk interactions.]]></description>
			<content:encoded><![CDATA[<p>I came across some very interesting and informative articles on Javascript performance improvement from Nicolas Zakas (the author of the newly released <strong>Professional JavaScript, Second Edition</strong> book):</p>
<ul>
<li><a href="http://www.nczonline.net/blog/2009/01/13/speed-up-your-javascript-part-1/">Speed up your Javascript part 1</a></li>
<li><a href="http://www.nczonline.net/blog/2009/01/20/speed-up-your-javascript-part-2/">Speed up your Javascript part 2</a></li>
</ul>
<p>This is an ongoing series of articles with specific Javascript examples that make sense.</p>
<div class="tweetthis" style="text-align:left;"><p> <a target="_blank" rel="nofollow" class="tt" href="http://twitter.com/intent/tweet?text=Speed+up+your+Javascript+http%3A%2F%2Fis.gd%2Fmnuc4U" title="Post to Twitter"><img class="nothumb" src="http://www.codecouch.com/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big4.png" alt="Post to Twitter" /></a></p></div>]]></content:encoded>
			<wfw:commentRss>http://www.codecouch.com/2009/01/speed-up-your-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

