Martin of our sister company has written a nice how-to for setting up wordpress cron jobs to run properly when using services similar to our own, which prevent loop-back access to the same machine. The way that wordpress usually runs, is that when a user clicks onto your site after the scheduled time for cron to be fired has gone past the engine opens a loop-back http request to itself. This is to prevent needlessly locking up the server leaving the user staring at a blank screen while ping-backs are fired before they see the page. This means that when services are configured like XYZ Internet’s and IND Web’s servers, the wp-cron just times out and doesn’t fire any ping-backs or do any other maintenance commands. The solution is to add a system scheduled command which uses the command-line php interpreter to call the wp-cron page directly. XYZ Internet and IND Web’s system allows 3 of these scheduled commands, so the cron can be fired once every 20 minutes.

that thar welcome page

as a follow up to the bendy corners post the other day, I thought I should explain how I got my theme to display my welcome page on the main blog listing. Well, it’s actually quite simple, and requires the index.php of your theme to be modified with the following:

<?php $welcome = get_page_by_title('Welcome'); ?>
<?php if ($welcome && $welcome != '') { ?>
<div id="welcome">
<h2><?php print($welcome->post_title); ?></h2>
<?php print(wpautop($welcome->post_content)); ?>
<?php } ?>

What this does, is selects the “page” in wordpress’ database with the title “Welcome” (including the upper case W) and outputs it inside a div with a known id so that we can style it, using css, and play with it’s properties via javascript.

The advantage that this method has over the alternative of hard coding the welcome page into the theme file, is that you can very easily update the content of your welcome page at any time using the standard wordpress authoring techniques.

Bendy Corners

Ooh, Ahh, Just a little bit.
ooh, aah, a little bit more!
</singing Gina-G>

So I wanted that little bit more eye-candy on my site. To fix this, I made a very minor tweak to my CSS (Cascading Style Sheet) code – CSS is what changes web page code into something visually appealing.

The change makes use of a very new edition of CSS called version 3, which not all web browsers support yet. Due to this, you may not see the “bendy corners” that I’ve implemented on the main page (see the top left of the welcome note: if it’s square then you don’t have a recent-enough web browser to see the effect). To use the effect in your own pages, the css code follows:

border-radius: 25px 6px;
-moz-border-radius: 25px 6px;
-webkit-border-top-left-radius: 25px;
-webkit-border-top-right-radius: 6px;
-webkit-border-bottom-right-radius: 25px;
-webkit-border-bottom-left-radius: 6px;

The reason for the -moz and -webkit versions, is due to the fact that mozilla and apple (respectively) implemented their versions before the official standard was “ratified”. [turned into a rat, I’m assuming that means.] Newer versions of both browsers will move over to the official border-radius symantic. Opera supports this feature using the propper code out-of-the-box, IE8 beta supports it, Firefox supports it in version 3 and above using the -moz prefix, Safari supports it using the -webkit prefix, and finally Konqueror does NOT support it yet.

QDos – New boy on the block

It looks like there’s a new social network emerging. This one is different, though, in that rather than you putting content onto their system, they trawl the internet looking for references to yourself or your email address. You can also provide hints as to where you hang out, e.g. your facebook/myspace/linkedin profile pages, your homepage and so on. The system then checks how active you are, and how many people’s lives you influence. This all gets put into a big calculation which determines your qDos score, and allows you to compare your life online to that of famous folk or your friends (if they’ve signed up).

Here, below (and in the sidebar), you can find my own qdos score, which will be updated weekly, but I don’t hold much hope of it changing much in an upward direction as I’m quite reclusive except for IRC. (Perhaps I should suggest that they support IRC in a future iteration of the service?)


Speak like a pirate day

With international “speak like a pirate day” dawning on the 19th of september, I thought I’d republish some content to help those that don’t think they’d be able to pull it off without a guiding hand:

How to Talk Like a Pirate

from wikiHow – The How to Manual That You Can Edit

Talk Like A Pirate Day is celebrated on September 19.
If you’re going to dress up like a pirate, nothing will ruin your image more easily than just adding “Arrrrr!” to the end of every sentence. So don’t settle for being an imitation pirate, or you’ll get labeled a “lubber” in no time. Here’s how to be authentic and colorful, like a real swashbuckling man o’the sea!


  1. Growl – and scowl often. Pirates don’t use a cultured, elegant, smooth vocalization – they mutter and growl.
  2. Use pirate lingo. Sounding like a pirate isn’t as hard as it seems! There are lots of resources for picking up pirate “lingo,” so make use of them (some common terms listed below) in addition to trying to affect a vocal sound. Avoid using modern epithets (swear words). It’s much more colorful (and kid-friendly) to use “pirate slang” for those naughty words.
  3. Gesture with your hands frequently. Don’t forget that pirates do most of their talking on the deck of a ship – out on the ocean, where wind, waves, and bird calls make it tough to hear. Gesturing often gives you a sense of “being there.”
  4. Run words together. Saying, “The boys and I were out for a lovely day on the water today” sounds like something you’d overhear at a yacht club, not out on the bounding main! Instead, try, “Me’n’these here scurvy scallywags drug our sorry keesters out t’th’ship’n’had us a grand great adventuaaarrr! We almost had t’keelhaul Mad Connie f’r gettin inter th’ grog behind our backs!” Use contractions whenever possible. Be sure to punctuate often with “Arrrr!”
  5. Never use “you” or “you’re” – ever. Instead, use the piratical form, “yer” or “ya” for all forms of address to others. “Yer a scurvy bilge rat, ya pompous gasbag” or “Here’s yer dinner, ya mangy cockroach.” Note that you should always endeavor to call the addressee by some insulting name, usually involving an animal.
  6. Embellish at will. A pirate is larger than life, and his or her speech should always reflect this. Don’t just say, “We saw a whale off the starboard bow today.” Say, “Me’n’th’ crew seen a great grand sea beastie, th’ mother of all whales, aye!”
  7. Refer to yourself as “me” at all times, never “I” It is not piratically correct to say, “I have a cold.” It is far better as a pirate to declare, “Got me a case o’th’sniffles, ‘ass rye!”
  8. More importantly, substitute “me” for “my” For example, don’t say, “Look at my new sword,” say “Lookit me new sword!.” Also substitute “meself” for “myself” as in “Got meself a right fine ship!”
  9. Mutter unintelligibly unless yelling. Being a pirate usually meant being liquored up to some degree – a lot of time, pirates were pretty mush-mouthed. In the step preceding, the term “‘ass rye” actually translates to “that’s right.” Get it?
  10. Be as loud as humanly possible. Pirates are not shy violets – stand tall, me hearties, and be counted!
  11. Procure one dead stuffed parrot and sew feet to right shoulder of 2nd hand store jacket. This will put you in the mood to adhere to the above mentioned rules and guarantee an abundance of “yers and arghs”.

Pirate Vocabulary

Credit should be given to the Talk Like a Pirate official website for some of these definitions of authentic pirate-speak:

  • Ahoy! – “Hello!”
  • And ye may lay to that! – “You betcha!”
  • Arrr! – This is often confused with “arrrrgh,” which is, of course, the sound you make when you sit on a belaying pin. “Arrrr!”, like “Aloha,” means variously, “yes,” “I agree,” “I’m happy,” “I’m enjoying this beer,” “My team is going to win it all,” “I saw that television show, it sucked!” and “That was a clever remark you or I just made.” And those are just a few of the myriad possibilities of Arrr!
  • Avast! – derived from “hold fast”. Stop and give attention. This word, like many pirate words, has multiple meanings, so it can also can be used in place of, “Whoa! Get a load of that!” “Check it out” or “No way!” or “Get off!”
  • Aye! – “Yes!”
  • Aye aye! – “I understand what you said and I will carry out your order!”
  • Be – “Am, is, are.” As in “I (or Me) be goin’ t’ get more grog, he be goin’ t’ get more grog, and they be goin’ t’ get more grog.” This will also avoid confusion between “are” and “arrr” or “arrgh.”
  • Beauty – The best possible pirate address for a woman. Always preceded by “me,” as in, “C’mere, me beauty,” or even, “me buxom beauty,” to one particularly well endowed. You’ll be surprised how effective this is.
  • Bilge rat – The bilge is the lowest level of the ship. It’s loaded with ballast and slimy, reeking water. A bilge rat, then, is a rat that lives in the worst place on the ship. Pirates, just like their modern-day counterparts (regular guys), love to joke and jibe with their buddies. By all means, pirates will call their buddies “bilge rats.”
  • Bung hole – It’s the hole in a wooden barrel, usually sealed with a cork. To get what’s in the barrel out, usually, the cork is pried out, opening the bung hole. Saying, “Well, me hearties, let’s see what crawled out of the bung hole” will often be accompanied by the sound of 21st century citizens running for their lives. Yay! Dinner for one, coming up!
  • Davy Jones’ Locker – Where the souls of drowned pirates go.
  • Grog – An alcoholic drink, usually rum diluted with water, but in this context you could use it to refer to any alcoholic beverage other than beer, and we aren’t prepared to be picky about that, either.
  • Hornpipe – Both a single-reeded musical instrument sailors often had aboard ship, and a spirited dance that sailors do. The common term for being filled with lust is “horny,” and hornpipe then has some comical possibilities. “Is that a hornpipe in your pocket, or are you just glad to see me? Or both?”
  • Hearties or Matey – Shipmates or friends.
  • Lubber – (or land lubber) Where a lubber is a poor seaman, a land lubber is an exceptionally ignorant seaman. In a room where everyone is talking like pirates, lubber is always an insult.
  • Motherload – refers to when the largest amount of booty is successfully located.
  • Savvy – Ok or understand. As in, “Savvy?” meaning “Do you understand”
  • Scrumpet– A name for a women, not the most polite term but not rude either.
  • Smartly – Do something quickly. “Smartly, me lass,” you might say when sending the bar maid off for another round. She will be so impressed she might well spit in your beer.
  • Scurvy – Well, of course, it’s an awful affliction that used to bedevil buccaneers in days gone by; that’s one reason there was lime juice added to the rum in the water, making grog. So calling someone a “scurvy bilge rat” is even worse than calling him a “bilge rat.”
  • Shiver me timbers! – Pirate for “Well, I’ll be” or “Is that so?”.
  • Show a Leg! – Phrase to wake up a sailor. “Show a leg!, it be dawn, you scurvy lubber!”.
  • Wench – Woman, girl, or waitress. Whatever.
  • Yardarm – Not just convenient framework to hang the sails, but often times used as a holding post for the disobedient ol’ salts, as in, “Tie that dawg to the yardarm”.


  • Loud and lusty wins the day in Piratespeak!
  • The more colorful you are, the more successful you will be as a pirate – why, you might end up as Cap’n!
  • Don’t worry about whether people understand you. Just squint with one eye (your good eye, the other should be covered by an enigmatic black patch) and nod meaningfully, as if they do understand, when you’re asked to explain. Saying, “Ayyyyyyyye” softly, and stroking your mustache can also help to persuade them that they did understand you the first time.
  • Ar! If you be a practicing pastafarian, ye may wish to punctuate yer greetings with a “His blessings be upon thee, scurvy dog!”


  • If you plan to indulge in ale, grog or other piratical spirits, do not attempt to steer your own ship home, matey!

Sources and Citations

Article provided by wikiHow, a collaborative writing project to build the world’s largest, highest quality how-to manual. Please edit this article and find author credits at the original wikiHow article on How to Talk Like a Pirate. All content on wikiHow can be shared under a Creative Commons license.


after a brief foray into the world of joomla!, I have decided that I like wordpress much better for bloggy-type stuffs, and possibly for other less bloggy-type situations. Comments are included in wordpress as standard, whereas I needed to add them to joomla!. Joomla defaulted to a weird layout that I couldn’t work out how to change, which meant that there were multiple columns of entries on the blog page, which needn’t necessarily be in the right order – especially if you read left-to-right rather than top-to-bottom.


The observant amongst you may have noticed a new page appear in the navigation, or that the bar down the right hand side of each page within this site has disappeared. Well, the sidebar is still there, just hidden. To get at all the functionality of the sidebar, one just needs to click the little arrow to the right of every page under the sunset (or the vertical text underneath that) and the sidebar will be revealed by some technological wizardry written by myself with the aid of the fabulous script.aculo.us+prototype.js programing libraries (though I would like to reimplement it using YAHOO’s YUI, which is even more fabulous than scriptaculous!!). Also, so tells the new page I mentioned earlier, page loading is all done in the background using what is known as AJAX. This acronym means “Asynchronous Javascript and XML”.

The XML part I can explain straight away to mean my web pages, as the language that webpages are written in is a SuperSet of XML (meaning that you can pass a webpage through an xml program and still get a meaningful output).

Javascript is the language that adds interactivity to otherwise dull and lifeless static web pages. It is at the very heart of the so-called “Web 2.0” movement, and drives popular sites like google maps and gmail, or yahoo mail.

The asynchronous part is the interresting bit, meaning that you can do other things while the page is loading. For example, you could click a link on my site to another page within my site, and while it’s loading you can still listen to the music in the top right-hand music player (to be fixed) without interruptions. Even once the page has loaded and the “Browser” program you are viewing my site through is displaying the new content, the music will carry right on playing, and the sidebar will be fully accessible throughout the loading process.

Now for tidbit stuff: Google has a service called “analytics” which provides website owners a thorough breakdown of the site’s audience’s actions while on the site that is being analised. This is done through yet more javascript which the site owner (in this case me) adds to each and every page on the site. (In reality that means just adding it to the “template” that the website uses to insert the content into so that each page has the same look about it). However, when the pages are being loaded by AJAX, the javascript isn’t reloaded, meaning that all google ever sees is the user spending a lot of time on one page with their thumb up their proverbial posterier. The code that I wrote for my AJAX Blog stuff does some clever behind-the-scenes calls to google’s analytics code which forces it to acknowledge a new page has been visited when the user clicks a link that merely runs some javascript code instead of loading a brand new page. This allows me to see where people are going on my site, and work out what type of content people like reading so that I can tailor future articles to match what my readers are reading (not that I have readers.. I know this is merely a backwater of the internet that is viewed only by my friends and family, but it keeps me happy, so nyer!).

Review: Sony Ericsson K770i

So, I decided to get mobile broadband on a whim for my holiday (I’m writing this on the broadband connection. Because I wanted it for the holiday, and I only decided the day before we left, I went into town to the 3 store to see what they had. It turns out that they had a special offer on the mobile broadband for “existing customers”. This meant that I could get the mobile broadband at half price with a new phone and contract.

I mulled this over, and decided to get a new phone and the mobile broadband for approx £25 per month. Once I cancel my vodafone contract, this will leave me out of pocket by £10/month ish. The phone I decided to get with this new contract is, as the post title says, the Sony Ericsson K770i.

I’m now in Wales on my holiday, and have had a chance to fiddle with the phone. I took a couple of photos on the journey up, and have been impressed with the 3.2MegaPixel camera. Unlike my old phone, this one has a cover for the lens, which helps to keep it clear of the bulk of the dust and grime of my jeans’ pockets. Also, on opening the lens cover automatically switches to the CyberShot mode ready for photographic goodness. Available shoot modes are standard, panoramic, burst and “frames”.

  • – Panoramic mode allows you to take three photos which are then stiched together. After you’ve taken the first picture, the phone displays an “onion skin” to the left of the viewport, which you can then use to line up the second photo before you take it (and again for the third).
  • – Burst takes a series of photos in quick succession.
  • – and, Frame mode allows you to take a photo and overlay it with a “frame” such as a bunny suit, or a space suit.

The 3G internet access on the phone is nice and fast, and 3 automatically translate standard html pages into wml for the phone to be able to display. There is also a link, which I have not yet tried, at the bottom of every page converted from html to download the full original page. There is a button on the main menu screen for Windows Live Messenger. This works just like the full version on your desktop machine, but comes in at a mere 400KB.

The screen is very well defined and the colours are vibrant. Photos are displayed very well, and the icons are very crisp. The internet in supported 3G regions is fast, but degrades nicely in less well-covered areas. Messenger works well, and prompts you for new messages once you’ve minimised it. All-in-all it’s a decent enough phone, though I’m still craving either an openMoko or iPhone.


This project has now been superseded by AJAXLoader which is our premium version and will be the supported option going forward.

Following up from my FramedBlog, I’ve now replaced my frames with an AJAX load system. This allows the sidebar and any header and footer to remain constant. This was initially due to my desire to have a music player written in flash to remain loaded and playing throughout pageloads. At first, I thought it would be better to use Frames, but have since been playing with asynchronous loading. The AJAX method allows for pages to load without first showing an empty screen/frame, and as previously stated for my flash music player to remain loaded.

AJAXBlog is built upon the techniques I learned for use with the FramedBlog, and owes it’s existence to the previous project.

Here are the instructions:

  1. edit your theme’s functions.php and add a line: wp_enqueue_script(‘ajaxblog’,’-content/themes/yourtheme/js/ajaxblog.js’,array(‘scriptaculous’));
  2. download ajaxblog.js at the end of this article
  3. edit ajaxblog.js and set the var AJAXBlogBaseURL = line to the top level web address of your wordpress directory _WITHOUT_ the trailing /. e.g. https://bowlhat.net/ (where my wordpress install is accessed by the top-level domain only) or …net/wordpress (where wordpress is the dir containing my wp install)
  4. upload ajaxblog.js to your webspace in the wp-content/themes/yourtheme/js directory (or another of your choosing, remembering to update the wp_enqueue_script call in functions.php).
 * AJAXBlog - intercepts anchor clicks and requests the document asynchronously
 * Copyright (C) 2010  Daniel Llewellyn aka Fremen the Honeymonster
 * ( daniel@bowlaht.net - https://bowlhat.net/ )
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Affero General Public License as
 *  published by the Free Software Foundation, either version 3 of the
 *  License, or (at your option) any later version.
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  GNU Affero General Public License for more details.
 *  You should have received a copy of the GNU Affero General Public License
 *  along with this program.  If not, see .

var AJAXBlog = {Opts: {}};
// this domain matching requires that you manually enter any subdirectories yourself in the BaseUrl, AdminUrl and LoginUrl vars.
window.location.href.match(new RegExp('^(http[s]?:\/\/\w+(\.\w+))*\/'));
AJAXBlog.Opts.BaseUrl = new String(RegExp.$1);
AJAXBlog.Opts.AdminUrl = new String(AJAXBlog.Opts.BaseUrl+'-admin');
AJAXBlog.Opts.LoginUrl = new String(AJAXBlog.Opts.BaseUrl+'-login.php');
/* don't fiddle with anything below unless ya know what ya doing */

AJAXBlog.RegEx = {
AdminUrl: new RegExp('^'+AJAXBlog.Opts.AdminUrl),
LoginUrl: new RegExp('^'+AJAXBlog.Opts.LoginUrl),
AnchorPath: new RegExp('(#(.*))$'),
QueryString: new RegExp('(\?.*)(#(.*(#\w*)?))?$')

var AJAXBlogDocDomain = '';
var AJAXBlogCurrentDocument = window.location.href;
var AJAXBlogEventTracker = '';
var AJAXBlogTimeTracker = '';
var AJAXBlogRequest = null;
var AJAXBlogRequestedURL = '';
var AJAXBlogAdsenseHidden = 0;
var AJAXBlogTimeout = null;

//AJAXBlog_clsTimeTracker - see http://code.google.com/apis/analytics/docs/eventTrackerWrappers.html
// this AJAXBlog_clsTimeTracker code is copyright 2009 Google Inc.
// it is released under the terms of the APACHE v2.0 License.
var AJAXBlog_clsTimeTracker = function(opt_bucket) { if (opt_bucket) { this.bucket_ = opt_bucket.sort(this.sortNumber); } else { this.bucket_ = AJAXBlog_clsTimeTracker.DEFAULT_BUCKET; } }
AJAXBlog_clsTimeTracker.DEFAULT_BUCKET = [100, 250, 500, 1500, 2500, 5000];
AJAXBlog_clsTimeTracker.prototype._getTimeDiff = function() { return (this.stopTime_ - this.startTime_); };
AJAXBlog_clsTimeTracker.prototype.sortNumber = function(a, b) { return (a - b); }
AJAXBlog_clsTimeTracker.prototype._recordStartTime = function(opt_time) { if (opt_time != undefined) { this.startTime_ = opt_time; } else { this.startTime_ = (new Date()).getTime(); } };
AJAXBlog_clsTimeTracker.prototype._recordEndTime = function(opt_time) { if (opt_time != undefined) { this.stopTime_ = opt_time; } else { this.stopTime_ = (new Date()).getTime(); } };
AJAXBlog_clsTimeTracker.prototype._setHistogramBuckets = function(buckets_array) { this.bucket_ = buckets_array.sort(this.sortNumber); };
AJAXBlog_clsTimeTracker.prototype._track = function(opt_event_label) {
var i;
var bucketString;
for(i = 0; i < this.bucket_.length; i++) {
if ((this._getTimeDiff()) < this.bucket_[i]) {
if (i == 0) {
bucketString = "0-" + (this.bucket_[0]);
} else {
bucketString = this.bucket_[i - 1] + "-" + (this.bucket_[i] - 1);
if (!bucketString) {
bucketString = this.bucket_[i - 1] + "+";
window.pageTracker._trackEvent(bucketString, opt_event_label, this._getTimeDiff());
// END AJAXBlog_clsTimeTracker

jQuery(document).ready(function() {
if (window.pageTracker) {
AJAXBlogEventTracker = window.pageTracker._createEventTracker('AJAXBlog');
AJAXBlogTimeTracker = new AJAXBlog_clsTimeTracker();
indexdoc = new String(window.location.href);

anchorval = basedoc = querystring = '';
if (indexdoc.match(AJAXBlog.RegEx.AnchorPath)) {
anchorval = RegExp.$2;
basedoc = indexdoc.replace(AJAXBlog.RegEx.AnchorPath, '');
} else basedoc = indexdoc;
if (basedoc.match(AJAXBlog.RegEx.QueryString)) {
querystring = RegExp.$1;
basedoc = basedoc.replace(AJAXBlog.RegEx.QueryString, '');

if (querystring.match(new RegExp('[\?&]s='))) {

if (basedoc == AJAXBlog.Opts.BaseUrl || basedoc == AJAXBlog.Opts.BaseUrl+'/') {
AJAXBlogDocDomain = new RegExp('^http[s]?:\/\/'+RegExp.$1);

if (anchorval) {
window.location.href= '#'+anchorval;


if (!basedoc.match(AJAXBlog.RegEx.AdminUrl)
&& !basedoc.match(AJAXBlog.RegEx.LoginUrl)) {
myurl = querystring = newhome = '';
if (basedoc.match(AJAXBlog.RegEx.QueryString)) {
querystring = RegExp.$1;
if (RegExp.$3) myurl = RegExp.$3;
else myurl = myurl.replace(AJAXBlog.RegEx.QueryStringOnly, '');
} else if (basedoc.match(AJAXBlog.RegEx.AnchorPath)) {
myurl = RegExp.$2;
} else {
myurl = basedoc.replace(new RegExp(AJAXBlog.Opts.BaseUrl), '');
newhome = AJAXBlog.Opts.BaseUrl;
if (myurl) {
window.location.href = newhome + querystring + '#' + myurl;

function AJAXBlogLoading(showorhide) {
try {
if (showorhide == 'show' || showorhide == 1) jQuery('#loadingscreen').style.display = 'block';
else jQuery('#loadingscreen').style.display = 'none';
} catch (e) {}
function AJAXBlogSetTimeout(delay) {
AJAXBlogTimeout = setTimeout(AJAXBlogCheckAddressBar, ((delay) ? delay : 500));
function AJAXBlogUpdateAddress(newlocation) {
newlocation = new String(newlocation);

if (newlocation.match(AJAXBlogDocDomain)
&& !newlocation.match(AJAXBlog.RegEx.AdminUrl)
&& !newlocation.match(AJAXBlog.RegEx.LoginUrl)) {
newlocation = newlocation.substr(AJAXBlog.Opts.BaseUrl.length);
baseurl = '#';
if (newlocation.match(AJAXBlog.RegEx.QueryString)) {
baseurl = RegExp.$1 + baseurl;
newlocation = newlocation.replace(AJAXBlog.RegEx.QueryStringOnly, '');
window.location.href = baseurl + newlocation;
return 1;
return 0;
function AJAXBlogCheckAddressBar() {
anchorval = basedoc = '';
loaddoc = new String(window.location.href);
if (loaddoc.match(AJAXBlog.RegEx.AnchorPath)) {
basedoc = RegExp.$1;
anchorval = RegExp.$2;
loaddoc = anchorval;
if (loaddoc != '' && AJAXBlog.Opts.BaseUrl+loaddoc != AJAXBlogCurrentDocument) {
function AJAXBlogUnsetLinkHandlers() {
jQuery('a').each(function(anchor) {
jQuery(anchor).unbind('click', AJAXBlogClickHandler);
function AJAXBlogSetLinkHandlers() {
jQuery('a').not('.thickbox,.noajax,[rel^=lightbox]').each(function(anchor) {
jQuery(anchor).bind('click', AJAXBlogClickHandler);
function AJAXBlogClickHandler(event) {
myurl = event.target.href;
if (AJAXBlogRequest) {
res = confirm('Are you sure you want to navigate away from this page? The browser is currently awaiting data from the server. You can either wait it out, or continue this request.');
if (!res) {
if (AJAXBlogEventTracker) {
AJAXBlogTimeTracker._track(AJAXBlogEventTracker, 'AJAXBlog', 'Navigate Away while awaiting '+AJAXBlogRequestedURL);
if (AJAXBlogUpdateAddress(myurl)) {
function AJAXBlogNav(url) {
if (AJAXBlogCurrentDocument == url) return;
    if (AJAXBlogEventTracker) { AJAXBlogTimeTracker._recordStartTime(); }
    AJAXBlogCurrentDocument = url;
    AJAXBlogRequest = jQuery('#outercontent').load(url + ' #content', function(responseText, textStatus, XMLHttpRequest) {
    AJAXBlogRequest = null;
    if (typeof(window['tb_init']) == 'function') {
    tb_init('a.thickbox, area.thickbox, input.thickbox');

    if (textStatus == 'error') {
    jQuery('#content').empty().append('<h2>Error</h2><p>There was an error getting the content you requested. Go <a href="javascript:history.go(-1)">back</a> and try again.</p>');

       if (AJAXBlogEventTracker) {



framed blog update

I’ve just uploaded an update to my framedblog plugin for wordpress. You can find information about it on the framedblog page by clicking the link on the right-hand navigation column of this site. Of note, and the reason for the update, is that back and forward buttons and editing of the address bar in-situ. are all supported. This means that clicking the back button will, with a maximum of 1 second delay, navigate to the previous page viewed. Also, changing anything after the # symbol on the addressbar and hitting enter will have the same effect as navigating directly to that page, only within the frameset.

I’ve not tested this in Internet Explorer yet…