1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
\r
2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
\r
4 <meta http-equiv="X-UA-Compatible" content="chrome=1">
\r
5 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
\r
6 <title>YOURLS: Your Own URL Shortener</title>
\r
7 <style type="text/css" media="screen">
\r
10 font-family: Verdana, Arial;
\r
30 margin: 10px 20px 0px 20px;
\r
32 border: 1px solid #8d8d8d;
\r
33 background-color: #f5f5f5;
\r
41 a, a:active, a:link, a:visited {
\r
43 text-decoration: none;
\r
47 text-decoration: underline;
\r
57 border-bottom:1px solid #ccc;
\r
59 /* Place Holder Style */
\r
63 margin-right: auto;
\r
66 background-color: #fff;
\r
67 border: 1px solid #2A85B3;
\r
70 -moz-border-radius:15px;
\r
71 -webkit-border-radius:15px;
\r
75 font-family: Verdana, Arial;
\r
79 border-bottom: 1px solid #2a85b3;
\r
80 margin-bottom: 10px;
\r
81 background:transparent url(http://yourls.org/images/yourls-logo.png) top center no-repeat;
\r
88 font-family: Verdana, Arial;
\r
98 font-family: Verdana, Arial;
\r
110 font-family: Verdana, Arial;
\r
113 list-style-type: none;
\r
114 padding-bottom: 28px;
\r
115 border-bottom: 1px solid #2A85B3;
\r
116 margin-bottom: 12px;
\r
124 background-color: #deedfb;
\r
125 margin: 2px 0px 0px 5px;
\r
126 border: 1px solid #2A85B3;
\r
127 -moz-border-radius-topleft:5px;
\r
128 -moz-border-radius-topright:5px;
\r
129 -webkit-border-top-left-radius:5px;
\r
130 -webkit-border-top-right-radius:5px;
\r
136 text-decoration: none;
\r
139 #Tabs li.Tab a:hover {
\r
140 background-color: #bfe0fe;
\r
141 border-bottom: 1px solid #bfe0fe;
\r
144 #Tabs li.SelectedTab {
\r
147 background-color: #fff;
\r
148 margin: 2px 0px 0px 5px;
\r
149 border-top: 1px solid #2A85B3;
\r
150 border-right: 1px solid #2A85B3;
\r
151 border-bottom: 1px solid #fafafa;
\r
152 border-left: 1px solid #2A85B3;
\r
153 -moz-border-radius-topleft:3px;
\r
154 -moz-border-radius-topright:3px;
\r
155 -webkit-border-top-left-radius:3px;
\r
156 -webkit-border-top-right-radius:3px;
\r
158 #Tabs li.SelectedTab a {
\r
162 text-decoration: none;
\r
168 text-align: center;
\r
179 -moz-border-radius:10px;
\r
180 -webkit-border-radius:10px;
\r
181 border:1px solid #2A85B3;
\r
182 -moz-border-radius-bottomleft:30px;
\r
183 -moz-border-radius-bottomright:30px;
\r
184 -webkit-border-bottom-left-radius:25px;
\r
185 -webkit-border-bottom-right-radius:25px;
\r
188 background:#fff url(http://yourls.org/images/favicon.gif) 2px center no-repeat;
\r
194 <div id="Container">
\r
196 <h1>YOURLS: <span>Y</span>our <span>O</span>wn <span>URL</span> <span>S</span>hortener</h1>
\r
200 <li id="ShowcaseTab" class="Tab"><a href="#Showcase" onclick="toggle(this);">More</a></li>
\r
201 <li id="FAQTab" class="Tab"><a href="#FAQ" onclick="toggle(this);">FAQ</a></li>
\r
202 <li id="APITab" class="Tab"><a href="#API" onclick="toggle(this);">API</a></li>
\r
203 <li id="PluginTab" class="Tab"><a href="#Plugin" onclick="toggle(this);">WordPress plugin</a></li>
\r
204 <li id="ConfigTab" class="Tab"><a href="#Config" onclick="toggle(this);">Configuration</a></li>
\r
205 <li id="InstallTab" class="Tab"><a href="#Install" onclick="toggle(this);">Install/Upgrade</a></li>
\r
206 <li id="AboutTab" class="SelectedTab"><a href="#About" onclick="toggle(this);">About</a></li>
\r
212 <div id="AboutDiv">
\r
213 <h2>About YOURLS</h2>
\r
215 <h3>What is YOURLS</h3>
\r
216 <p>YOURLS is a small set of PHP scripts that will allow you to run your own URL shortening service (<em>a la</em> TinyURL). You can make it private or public, you can pick custom keyword URLs, it comes with its own API. You will love it.</p>
\r
217 <p>There's a <a href="#Plugin" onclick="toggle(this);">WordPress plugin</a> available for YOURLS, making integration with your blog a snap: create short URLs and tweet them automagically as you publish blog posts.</p>
\r
219 <h3>YOURLS Features</h3>
\r
221 <li><tt>Public</tt> (everybody can create short links) or <tt>private</tt> (your links only)</li>
\r
222 <li>Sequential or custom URL keyword</li>
\r
223 <li>Handy <tt>bookmarklet</tt> to easily shorten and share links</li>
\r
224 <li>Awesome <tt>stats</tt>: historical click reports, referrers tracking, visitors geo-location</li>
\r
225 <li>Neat <tt>AJAXed</tt> interface</li>
\r
226 <li>Developer <tt>API</tt></li>
\r
227 <li>Friendly <tt>installer</tt></li>
\r
230 <h3>Screenshots</h3>
\r
232 <div class="sshot">
\r
233 <p>Main admin dashboard</p>
\r
234 <img src="http://yourls.org/images/admin-dashboard.gif" />
\r
236 <p>Stats for each short URL</p>
\r
237 <img src="http://yourls.org/images/stats_1.png" />
\r
238 <img src="http://yourls.org/images/stats_2.png" />
\r
239 <img src="http://yourls.org/images/stats_3.png" />
\r
241 <p>See a live example of YOURLS stats on <a href="http://yourls.org/download+">http://yourls.org/download+</a></p>
\r
246 <p><a href="http://yourls.org/download">Download YOURLS</a> from Google Code</p>
\r
247 <p>You can follow YOURLS' development on the <a href="http://yourls.org/revisions">revision list</a> and get current snapshot <a href="http://yourls.org/svnco">using SVN</a></p>
\r
251 <p>YOURLS is made by:</p>
\r
253 <li><a href="http://yourls.org/lesterchan" title="Visit Lester Chan's site">Lester Chan</a> &ndash <a href="http://twitter.com/gamerz">@GamerZ</a> on Twitter</li>
\r
254 <li><a href="http://yourls.org/ozh" title"Visit Ozh's site">Ozh Richard</a> &ndash <a href="http://twitter.com/ozh">@Ozh</a> on Twitter</li>
\r
258 <!-- Installation Instructions -->
\r
259 <div id="InstallDiv" style="display: none;">
\r
260 <h2>Fresh Install</h2>
\r
262 <li>Unzip the YOURLS archive</li>
\r
263 <li>Copy <code>includes/config-sample.php</code> to <code>includes/config.php</code></li>
\r
264 <li>Open <code>includes/config.php</code> with a raw text editor (like Notepad) and fill in the required settings</li>
\r
265 <li>Upload the unzipped files to your domain <code>public_html</code> or <code>www</code> folder</li>
\r
266 <li>Create a new database (see <a href="#Config" onclick="toggle(this);">Configuration</a> – you can also use an existing one)</li>
\r
267 <li>Point your browser to <code>http://yoursite.com/admin/</code></li>
\r
270 <h2>Upgrade from YOURLS 1.3 or earlier</h2>
\r
272 <li>Make a copy of your <code>config.php</code></li>
\r
273 <li>Delete all files including <code>.htaccess</code> in YOURLS root directory</li>
\r
274 <li>Unzip the YOURLS archive, upload the files</li>
\r
275 <li>Copy <code>config-sample.php</code> to <code>config.php</code> and fill in details. <strong>Don't start with your old config file</strong>, use the new sample config file.</li>
\r
276 <li>In your new <code>config.php</code>, add the <em>defines</em> for <code>YOURLS_DB_TABLE_URL</code> and <code>YOURLS_DB_TABLE_NEXTDEC</code> you had in your previous config file
\r
277 <li><strong>Backup the database!</strong></li>
\r
278 <li>Point your browser to <code>http://yoursite.com/admin/</code> and follow instructions</li>
\r
279 <li>After upgrade is well and over, remove the define <code>YOURLS_DB_TABLE_NEXTDEC</code> from your config file</li>
\r
280 <li>I promise that during next upgrade you won't need to touch your config file again :)</li>
\r
285 <!-- Configuration Instructions -->
\r
286 <div id="ConfigDiv" style="display: none;">
\r
287 <h2>Configuration (in includes/config.php)</h2>
\r
288 <h3>MySQL settings</h3>
\r
290 <li><code>YOURLS_DB_USER</code><br/>
\r
291 your MySQL username<br/>
\r
292 <em>Example:</em> <tt>'joe'</tt></li>
\r
293 <li><code>YOURLS_DB_PASS</code><br/>
\r
294 your MySQL password<br/>
\r
295 <em>Example:</em> <tt>'MySeCreTPaSsW0rd'</tt></li>
\r
296 <li><code>YOURLS_DB_NAME</code>:
\r
297 The database name<br/>
\r
298 <em>Example:</em> <tt>'yourls'</tt></li>
\r
299 <li><code>YOURLS_DB_HOST</code><br/>
\r
300 The database host<br/>
\r
301 <em>Example:</em> <tt>'localhost'</tt></li>
\r
302 <li><code>YOURLS_DB_PREFIX</code><br/>
\r
303 The name prefix for all the tables YOURLS will need<br/>
\r
304 <em>Example:</em> <tt>'yourls_'</tt></li>
\r
307 <h3>Site options</h3>
\r
309 <li><code>YOURLS_SITE</code><br/>
\r
310 Your (short) domain URL, no trailing slash<br/>
\r
311 <em>Example:</em> <tt>'http://ozh.in'</tt></li>
\r
312 <li><code>YOURLS_HOURS_OFFSET</code><br/>
\r
313 Timezone GMT offset<br/>
\r
314 <em>Example:</em> <tt>'-5'</tt></li>
\r
315 <li><code>YOURLS_PRIVATE</code><br/>
\r
316 Private means protected with login/pass as defined below. Set to false for public usage<br/>
\r
317 <em>Example:</em> <tt>'true'</tt></li>
\r
318 <li><code>YOURLS_UNIQUE_URLS</code><br/>
\r
319 Allow multiple short URLs for a same long URL<br/>
\r
320 Set to <tt>true</tt> to allow only one pair of shortURL/longURL (default YOURLS behavior), or to <tt>false</tt> to allow creation of multiple short URLs pointing to the same long URL (as bit.ly does)<br/>
\r
321 <em>Example:</em> <tt>'true'</tt></li>
\r
322 <li><code>YOURLS_COOKIEKEY</code><br/>
\r
323 A random secret hash used to encrypt cookies. You don't have to remember it, make it long and complicated. Hint: generate a unique one at <a href="http://yourls.org/cookie">http://yourls.org/cookie</a><br/>
\r
324 <em>Example:</em> <tt>'qQ4KhL_pu|s@Zm7n#%:b^{A[vhm'</tt></li>
\r
325 <li><code>yourls_user_passwords</code><br/>
\r
326 A list of username(s) and password(s) allowed to access the site if private<br/>
\r
327 <em>Example:</em> <tt>'joe' => 'mypassword'</tt></li>
\r
330 <h3>URL Shortening settings</h3>
\r
332 <li><code>YOURLS_URL_CONVERT</code><br/>
\r
333 URL shortening method: base <tt>36</tt> or <tt>62</tt>. See <a onclick="toggle(this);" href="#FAQ">FAQ</a> for more explanations</li>
\r
334 <li><code>yourls_reserved_URL</code><br/>
\r
335 A list of reserved keywords that won't be used as short URLs. Define here negative, unwanted or potentially misleading keywords<br/>
\r
336 <em>Example:</em> <tt>'porn', 'faggot', 'sex', 'nigger', 'fuck', 'cunt', 'dick', 'gay'</tt></li>
\r
339 <h3>Optional settings</h3>
\r
341 <li><code>YOURLS_PRIVATE_INFOS</code><br/>
\r
342 If <code>YOURLS_PRIVATE</code> is set to <tt>true</tt>, you can still easily make your individual stat pages public. To do so, override the global private setting with:<br/>
\r
343 <tt>define('YOURLS_PRIVATE_INFOS', false);</tt>
\r
345 <li><code>YOURLS_PRIVATE_API</code><br/>
\r
346 If <code>YOURLS_PRIVATE</code> is set to <tt>true</tt>, you can still easily make your API public. To do so, override the global private setting with:<br/>
\r
347 <tt>define('YOURLS_PRIVATE_API', false);</tt>
\r
348 <li><code>YOURLS_NOSTATS</code><br/>
\r
349 If <code>YOURLS_NOSTATS</code> is set to <tt>true</tt>, redirects won't be logged and there will be not stats available.<br/>
\r
353 <!-- WordPress plugin -->
\r
354 <div id="PluginDiv" style="display:none">
\r
355 <h2>WordPress Plugin</h2>
\r
359 <li>Generate short URLs for each new post or page</li>
\r
360 <li>Send a tweet on your Twitter account with the post title and short URL as you publish them</li>
\r
361 <li>Works if YOURLS is hosted on the same server or on a remote server</li>
\r
362 <li>Also compatible with tr.im, is.gd, tinyurl.com and bit.ly for maximum fun</li>
\r
365 <h3>Screenshots</h3>
\r
366 <div class="sshot">
\r
367 <img src="http://yourls.org/images/wpplugin.gif"/>
\r
370 <h3>Download & more informations</h3>
\r
372 <li>Download <a href="http://yourls.org/plugin">YOURLS: WordPress to Twitter</a> from the official WordPress plugin repository</li>
\r
373 <li>More information, tips and feedback on <a href="http://yourls.org/plugindoc">the plugin page</a> from planetOzh</li>
\r
379 <div id="APIDiv" style="display:none">
\r
380 <h2>YOURLS' API</h2>
\r
384 <li>Generate or get existing short URLs, with sequential or custom keyword</li>
\r
385 <li>Get some statistics about your links: top clicked links, least clicked links, newest links</li>
\r
386 <li>Output format: JSON, XML, or simple raw text</li>
\r
390 <p>You need to send parameters to <code>http://yoursite.com/yourls-api.php</code> either via <code>GET</code> or <code>POST</code>. These parameters are:</p>
\r
392 <li>A valid <code>username</code></li>
\r
393 <li>A valid <code>password</code></li>
\r
394 <li>The requested <code>action</code>: <tt>"shorturl"</tt> (get short URL for a link), <tt>"expand"</tt> (get long URL of a shorturl) or <tt>"stats"</tt> (get stats about your links)</li>
\r
395 <li>With <tt>action = "shorturl"</tt> :
\r
397 <li>the <code>url</code> to shorten</li>
\r
398 <li>optional <code>keyword</code> for custom short URLs</li>
\r
399 <li>output <code>format</code>: either <tt>"json"</tt>, <tt>"xml"</tt> or <tt>"simple"</tt></li>
\r
402 <li>With <tt>action = "expand"</tt> :
\r
404 <li>the <code>shorturl</code> to expand (can be either 'abc' or 'http://site/abc')</li>
\r
405 <li>output <code>format</code>: either <tt>"json"</tt>, <tt>"xml"</tt> or <tt>"simple"</tt></li>
\r
408 <li>With <tt>action = "stats"</tt> :
\r
410 <li>the <code>filter</code>: either <tt>"top"</tt>, <tt>"bottom"</tt> , <tt>"rand"</tt> or <tt>"last"</tt></li>
\r
411 <li>the <code>limit</code> (maximum number of links to return)</li>
\r
412 <li>output <code>format</code>: either <tt>"json"</tt> or <tt>"xml"</tt></li>
\r
417 <h3>Sample return</h3>
\r
418 <pre><tt><result>
\r
420 <id>62019439011</id>
\r
421 <keyword>shorter</keyword>
\r
422 <url>http://somereallylongurlyouneedtoshrink.com/</url>
\r
423 <date>2009-06-23 18:08:07</date>
\r
424 <ip>127.0.0.1</ip>
\r
426 <status>success</status>
\r
427 <message>http://somereallylongurlyouneedtoshrink.com/ (ID: shorter) added to database</message>
\r
428 <shorturl>http://yoursite.com/shorter</shorturl>
\r
429 </result></tt></pre>
\r
431 <h3>Sample file</h3>
\r
432 <p>There's a sample file included that serves as an example on how to play with the API</p>
\r
437 <!-- FAQ Instructions -->
\r
438 <div id="FAQDiv" style="display: none;">
\r
441 <h3>Server requirements</h3>
\r
443 <li>A server with <strong>mod_rewrite</strong> enabled</li>
\r
444 <li>At least <strong>PHP 4.3</strong></li>
\r
445 <li>At least <strong>MYSQL 4.1</strong></li>
\r
446 <li><em>Note</em>: YOURLS can also run on Nginx (<a href="http://foolrulez.org/blog/2009/08/foolz-us-make-yourls-work-on-ngin/">Read more</a>)</li>
\r
449 <h3>Server recommendations</h3>
\r
451 <li>PHP <a href="http://www.php.net/curl">CURL extension</a> installed if you plan on playing with the API</li>
\r
454 <h3>Limitations</h3>
\r
456 <li>Maximum length of long URLs to be shortened is <strong>2000 characters</strong></li>
\r
457 <li>Maximum length of custom keyword is <strong>200 characters</strong></li>
\r
458 <li>That makes about <strong>8 sexdecillions of centillions</strong> of available URLs (<a href="http://en.wikipedia.org/wiki/Names_of_large_numbers">seriously</a>. That's a 355 digits number). </li>
\r
461 <h3>Difference Between Base 36 And Base 62 Encoding</h3>
\r
463 <li>Base 36 encoding uses <code>0123456789abcdefghijklmnopqrstuvwxyz</code></li>
\r
464 <li>Base 62 encoding uses <code>0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz</code></li>
\r
465 <li>Stick to one setting, don't change after you've created links as it will change all your short URLs!</li>
\r
466 <li>Base 36 should be picked. Use 62 only if you understand what it implies.</li>
\r
467 <li>Consider Base 62 encoding a <code>beta feature</code></li>
\r
470 <h3>Getting a short domain name for your YOURLS install</h3>
\r
472 <li>Unless you plan on making it public, any shared hosting should be fine</li>
\r
473 <li><a href="http://domai.nr/">Domainr</a> is a fun search tool that might inspire and help you</li>
\r
474 <li>Aim for exotic top level domains (.in, .im, .li ...), they're often cheap and a lot are still available. <a href="https://www.gandi.net/domain/buy/search/">Gandi</a> is a pretty comprehensive registrar, for instance.</li>
\r
477 <h3>YOURLS needs its own .htaccess</h3>
\r
479 <li>You cannot install YOURLS and, say, WordPress, in the same directory. Both of them need to handle URLs differently</li>
\r
480 <li>If you want to install YOURLS on the same domain than your blog, give it its own (short) subdirectory, such as yourblog.com/s/ (for "short") or yourblog.com/x/ (for "exit")</li>
\r
483 <h3>If YOURLS generates 404 for your short URLs</h3>
\r
485 <li>Make sure <strong>mod_rewrite</strong> is enabled with your Apache server</li>
\r
486 <li>Some (crappy) hosts such as GoDaddy or 1and1 need <a href="http://code.google.com/p/yourls/issues/detail?id=25">a small fix</a> to .htaccess:</li>
\r
489 <h3>Feedback and bug reporting</h3>
\r
491 <li>Please don't get in touch directly by mail or Twitter</li>
\r
492 <li>Raise an <a href="http://yourls.org/issues">issue here</a> and give all the details. Thanks!</li>
\r
499 <div id="ShowcaseDiv" style="display: none;">
\r
502 <h3>Here are a few examples of sites running YOURLS with a unique design or concept</h3>
\r
505 <li><a href="http://hmm.ph/">http://hmm.ph/</a><br/>
\r
506 Funny domain name, nicely styled</li>
\r
507 <li><a href="http://qte.me/">http://qte.me/</a><br/>
\r
508 Another YOURLS setup with a cute quote look</li>
\r
509 <li><a href="http://unsl.im/">http://unsl.im/</a><br/>
\r
510 Gorgeous design listing latest links with a custom RSS feed (private use)</li>
\r
511 <li><a href="http://mrte.ch/">http://mrte.ch/</a><br/>
\r
512 Mr Tech's public YOURLS setup, listing top links and some stats</li>
\r
513 <li><a href="http://s4c.in/">http://s4c.in/</a><br/>
\r
514 Shorten 4 Charity, a public YOURLS setup with shortened links displayed within a frame containing ads for charities </li>
\r
515 <li><a href="http://girv.in/">http://girv.in/</a><br/>
\r
516 John Girvin's YOURLS setup with all links in a sortable display</li>
\r
517 <li><a href="http://www.iyeman.net/">http://www.iyeman.net/</a><br/>
\r
518 <a href="http://tinytags.co.cc/">http://tinytags.co.cc/</a><br/>
\r
519 Examples of portals for your online self with links to your places (blog, Twitter) and your URL shortener</li>
\r
520 <li><a href="http://li.nkto.me/">http://li.nkto.me/</a><br/>
\r
521 A nice domain name hack :)</li>
\r
522 <li><a href="http://vb.ly/">http://vb.ly/</a><br/>
\r
523 Public YOURLS setup run by famous sex writer Violet Blue as "the internet's first and only sex-positive url shortener"</li>
\r
527 <h2>More stuff about or with YOURLS</h2>
\r
530 <li><a href="http://screenr.com/nTs">http://screenr.com/nTs</a><br/>
\r
531 A screencast explaining how to setup YOURLS</li>
\r
533 <li><a href="http://foolrulez.org/blog/2009/09/yourls-widget-released">YOURLS Widget for WordPress</a><br/>
\r
534 This widget adds a convenient short URL service into your sidebar. Check the above link for a live example</li>
\r
536 <li><a href="http://github.com/pjain/WWW-Shorten-Yourls">WWW-Shorten-Yourls</a><br/>
\r
537 A Perl module to shorten URLs using YOURLS</li>
\r
539 <li><a href="http://www.chrismarquardt.com/blog.php?id=7952283233607249761">Textexpander and YOURLS</a><br/>
\r
540 Making YOURLS and Textexpander on the Mac play together</li>
\r
542 <li><a href="http://www.eugenegordin.com/etc/how-to-use-your-custom-yourls-shortener-with-tweetie-2.html">YOURLS and Tweetie 2</a><br/>
\r
543 How to set up Tweetie2 so it uses your own service</li>
\r
545 <li><a href="http://code.google.com/p/yourls/issues/detail?id=137">Export URLS as text list</a><br/>
\r
546 A simple script to list all URLs, one per line, in plain text (for using as an indexer config file, for example)</li>
\r
548 <li>YOURLS featured on <a href="http://lifehacker.com/5335216/make-your-own-url-shortening-service">Lifehacker</a></li>
\r
552 </div> <!-- content -->
\r
553 </div> <!-- container -->
\r
555 <div id="Copyright"><p><a href="http://yourls.org/">YOURLS</a>: Your Own URL Shortener<br />All Free & GPL – 2009</p></div>
\r
557 <script type="text/javascript">
\r
559 // Dynamically get tabs
\r
560 function getTabs() {
\r
561 var d = document.getElementById('Tabs');
\r
562 var matches = d.innerHTML.match(/<li id="(.+?)Tab"/g);
\r
564 for (i in matches) {
\r
565 tabs[i]= matches[i].replace('<li id="','').replace('Tab"', '');
\r
567 tabs = tabs.reverse();
\r
570 // Toggle tab display
\r
571 function toggle(el) {
\r
572 //var tabs = ["About", "Install", "Config", "Plugin", "FAQ"];
\r
573 var target = el.toString().replace(/^.*#/, '');
\r
574 for (var tab in tabs) {
\r
576 document.getElementById(tabs[tab]+'Tab').className = 'Tab';
\r
578 document.getElementById(tabs[tab]+'Div').style.display= 'none';
\r
580 // highlight & display target
\r
581 document.getElementById(target+'Div').style.display = 'block';
\r
582 document.getElementById(target+'Tab').className = 'SelectedTab';
\r
583 try { el.blur(); } catch(err) {}
\r
586 var tabs = getTabs();
\r
587 // On page load/refresh display required tab
\r
588 if (location.hash) {
\r
589 toggle(location.hash);
\r