var defaultFieldValues = new Hash();
var fieldValuesAcceptedTimes = new Hash();
var footerNewsletterSubscribeResponsePanelShowing = false;
var monthNames = new Array('January','February','March','April','May','June','July','August','September','October','November','December');

document.observe('dom:loaded', handleTwitterShareLink);
document.observe('dom:loaded', buttonFixes);
document.observe('dom:loaded', preloadImages);
document.observe('dom:loaded', ChromeYouTubeFix);
document.observe('dom:loaded', function() {
	if ($('sidebarnewslettersignup')) sidebarNewsletterSignupSetup();
	if ($('sidebarsearch')) {
		addDefaultValueTo('q', 'Search this site');
		Event.observe('sidebarsearchform', 'submit', function(event) {
			if ($('q').value == defaultFieldValues.get('q') || $('q').value.strip.length() == 0) event.stop();
		});
	}
	if ($$('div.tweetbuttonbox').length ||
		$('datecommentswrapper') ||
		$('latesttweets') ||
		$('contentsnippetsform') ||
		$('authorboxfollow')) $$('body')[0].insert({'top': new Element('script', { 'type': 'text/javascript', 'src': '//platform.twitter.com/widgets.js' })}); // yes, the protocol looks wrong - see: https://dev.twitter.com/blog/ssl-support-tweet-button-and-follow-button

});

Event.observe(window, 'load', sizeIE6Overlay);

function isChrome() {
	return (navigator.userAgent.toLowerCase().indexOf('chrome') > -1);
}

function ChromeYouTubeFix() {
	// fix for YouTube videos overlaying content in Chrome
	if (isChrome()) {
		$$('iframe.youtube-player').each(function(element) {
			var src = element.readAttribute('src');
			if (src.match(/\?/)) {
				element.writeAttribute('src', src+'&wmode=transparent');
			} else {
				element.writeAttribute('src', src+'?wmode=transparent');
			}
		});
	}
}

function sizeIE6Overlay() {
	if ($('ie6overlay')) $('ie6overlay').setStyle({ height: $$('body').first().getHeight()+'px' });
}

function handleTwitterShareLink() {
	if ($('twittershare')) {
		$('twittershare').observe('click', function(event) {
			event.stop();
			window.open(this.readAttribute('href'), 'win', 'width=500,height=420,status=1,toolbar=0,menubar=0,location=0,scrollbars=0');
		});
	}
}

function buttonFixes() {
	if (navigator.userAgent) {
		if (navigator.userAgent.indexOf('Opera') >= 0) {
			var buttonSpanElements = $('container').select('button span');
			for (var i = 0; i < buttonSpanElements.length; i++) {
				buttonSpanElements[i].observe('mousedown', function(event) {
					this.setStyle({'top': '-1px', 'left': '-1px'});
				});
				buttonSpanElements[i].observe('mouseup', function(event) {
					this.setStyle({'top': 0, 'left': 0});
				});
				buttonSpanElements[i].observe('mouseout', function(event) {
					this.setStyle({'top': 0, 'left': 0});
				});
			}
		} else if (navigator.userAgent.indexOf('MSIE 9.0') >= 0) {
			var buttonElements = $('container').select('button');
			for (var i = 0; i < buttonElements.length; i++) {
				buttonElements[i].observe('mousedown', function(event) {
					this.setStyle({'background-position': '0,0'});
					this.firstDescendant().setStyle({'top': '0', 'left': '0'});
				});
			}
		}
	}
}

function preloadImages() {
	if ($('mainnav')) preloadImage('/images/mainnavbghover.png');
	preloadImage('/images/checkboxcheckedbg.png');
	if ($('footernewsletteremail')) {
		preloadImage('/images/footernewslettersignupresponse/overlaytopbg.png');
		preloadImage('/images/footernewslettersignupresponse/overlaymidbg.png');
		preloadImage('/images/footernewslettersignupresponse/overlaybotbg.png');
		preloadImage('/images/goprogress.gif');
	}
}

function preloadImage(url) {
	var newImage = new Image();
	newImage.src = url;
}

function getDateEnding(day) {
	if (day == 1 || day == 21 || day == 31) return 'st';
	else if (day == 2 || day == 22) return 'nd';
	else if (day == 3 || day == 23) return 'rd';
	else return 'th';
}

function lpad(content, character, length) {
	content = new String(content);
	if (content.length >= length) return content;
	else return character.times(length - content.length)+content;
}

function popup(url, width, height) {
	window.open(url, 'win', 'width='+width+',height='+height+',status=1,toolbar=0,menubar=0,location=0,scrollbars=1');
}

function toggleDefaultValue(id, defaultvalue) {
	if ($(id).value == defaultvalue) $(id).value = '';
	else if ($(id).value == '') $(id).value = defaultvalue;
}

function addDefaultValueTo(id, defaultvalue) {
	$(id).observe('focus', function(event) {
		toggleDefaultValue(id, defaultvalue);
		if (id == 'footernewsletteremail' && footerNewsletterSubscribeResponsePanelShowing) hideFooterNewsletterSubscribeResponsePanel();
	});
	$(id).observe('blur', function(event) {
		toggleDefaultValue(id, defaultvalue);
	});
	toggleDefaultValue(id, defaultvalue);
	defaultFieldValues.set(id, defaultvalue);
}

function addFocusHighlightToTextField(id) {
	$(id).observe('focus', function(event) {
		$(id+'wrapper').addClassName('focused');
	});
	$(id).observe('blur', function(event) {
		$(id+'wrapper').removeClassName('focused');
	});
}

function hasEmailPattern(str) {
	var filter = /^[\w-]+(\.[\w-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/i;
	return filter.test(str);
}

function hasURLPattern(str) {
	var filter = /^https?:\/\/(([a-z0-9](-[a-z0-9]+)*){1,63}\.)+[a-z]{2,6}(\/[a-z0-9_\-\.\~\%\,\(\)\!\*\'\;\/\@\&\=\+\$]*)?$/i;
	return filter.test(str);
}

function footerNewsletterSetup() {
	Event.observe('footernewslettersubscribeform', 'submit', footerNewsletterSubscribe);
	addDefaultValueTo('footernewsletteremail', 'Your email address');
	addFocusHighlightToTextField('footernewsletteremail');
	fieldValuesAcceptedTimes.set('footernewsletteremail', 0);
	$('footernewsletteremail').observe('focus', function(event) {
		if (fieldValuesAcceptedTimes.get('footernewsletteremail') == 0) checkFooterNewsletterField();
	});
	new Form.Element.Observer(
		'footernewsletteremail',
		0.2,// 200 milliseconds
		function(el, value) {
			if (checkFooterNewsletterField()) {
				if (fieldValuesAcceptedTimes.get('footernewsletteremail') == 0) fieldValuesAcceptedTimes.set('footernewsletteremail', (new Date()).getTime());
			} else fieldValuesAcceptedTimes.set('footernewsletteremail', 0);
		}
	);
	new Form.Element.Observer(
		'footernewslettersubscribefailure',
		2.0,
		function(el, value) {
			$('footernewslettersubscribeform').submit();
		}
	);
	setInterval("clearFooterNewsletterHighlightingCheck()", 200);
	Event.observe(window, 'scroll', function() {
		if (document.viewport.getHeight() + document.viewport.getScrollOffsets()[1] < $('footernewsletteremail').cumulativeOffset()[1]) {
			if (footerNewsletterSubscribeResponsePanelShowing) {
				hideFooterNewsletterSubscribeResponsePanel();
				if (!$('footernewsletteremailwrapper').hasClassName('error')) $('footernewsletteremail').value = defaultFieldValues.get('footernewsletteremail');
			}
			if ($('footernewsletteremailwrapper').hasClassName('error') && ($('footernewsletteremail').value == '' || $('footernewsletteremail').value == defaultFieldValues.get('footernewsletteremail'))) {
				$('footernewsletteremailwrapper').removeClassName('error');
				$('footernewsletteremail').blur();
			}
		}
	});
}

function sidebarNewsletterSignupSetup() {
	addDefaultValueTo('sidebarnewsletteremail', 'Your email address');
	addFocusHighlightToTextField('sidebarnewsletteremail');
	fieldValuesAcceptedTimes.set('sidebarnewsletteremail', 0);
	$('sidebarnewsletteremail').observe('focus', function(event) {
		if (fieldValuesAcceptedTimes.get('sidebarnewsletteremail') == 0) checkSidebarNewsletterSignupField();
	});
	new Form.Element.Observer(
		'sidebarnewsletteremail',
		0.2,// 200 milliseconds
		function(el, value) {
			if (checkSidebarNewsletterSignupField()) {
				if (fieldValuesAcceptedTimes.get('sidebarnewsletteremail') == 0) fieldValuesAcceptedTimes.set('sidebarnewsletteremail', (new Date()).getTime());
			} else fieldValuesAcceptedTimes.set('sidebarnewsletteremail', 0);
		}
	);
	Event.observe('sidebarnewslettersignupform', 'submit', function() {
		if ($('sidebarnewsletteremail').value == defaultFieldValues.get('footernewsletteremail')) $('sidebarnewsletteremail').value = '';
	});
}

function checkSidebarNewsletterSignupField() {
	if (hasEmailPattern($('sidebarnewsletteremail').value)) {
		if ($('sidebarnewsletteremailwrapper').hasClassName('error')) $('sidebarnewsletteremailwrapper').removeClassName('error');
		if (!$('sidebarnewsletteremailwrapper').hasClassName('accepted')) $('sidebarnewsletteremailwrapper').addClassName('accepted');
		return true;
	} else {
		if ($('sidebarnewsletteremailwrapper').hasClassName('accepted')) $('sidebarnewsletteremailwrapper').removeClassName('accepted');
		if (!$('sidebarnewsletteremailwrapper').hasClassName('error')) $('sidebarnewsletteremailwrapper').addClassName('error');
		return false;
	}
}

function checkFooterNewsletterField() {
	if (hasEmailPattern($('footernewsletteremail').value)) {
		if ($('footernewsletteremailwrapper').hasClassName('error')) $('footernewsletteremailwrapper').removeClassName('error');
		if (!$('footernewsletteremailwrapper').hasClassName('accepted')) $('footernewsletteremailwrapper').addClassName('accepted');
		return true;
	} else {
		if ($('footernewsletteremailwrapper').hasClassName('accepted')) $('footernewsletteremailwrapper').removeClassName('accepted');
		if (!$('footernewsletteremailwrapper').hasClassName('error')) $('footernewsletteremailwrapper').addClassName('error');
		return false;
	}
}

function clearFooterNewsletterHighlightingCheck() {
	var now = (new Date()).getTime();
	var acceptedTime = fieldValuesAcceptedTimes.get('footernewsletteremail');
	if ($('footernewsletteremailwrapper').hasClassName('accepted') && acceptedTime > 0 && now - acceptedTime > 5000 && hasEmailPattern($('footernewsletteremail').value)) $('footernewsletteremailwrapper').removeClassName('accepted');
}

function footerNewsletterSubscribe(event) {
	event.stop();
	$('footernewsletteremail').value.strip();
	if (!hasEmailPattern($('footernewsletteremail').value)) {
		showNewsletterSubscribeResponsePanel(true, 'Please enter a valid email address.');
	} else {
		$('footernewslettergobuttontextwrapper').update(new Element('img', { 'src': '/images/goprogress.gif' }));
		// not an AJAX request (page may be over HTTP and we always want the email address transmitted over HTTPS)
		$$('head')[0].insert(new Element('script', { 'type': 'text/javascript', 'src': footerNewsletterSignupBaseURL+'newsletter/subscribe/js/'+base64_encode($('footernewsletteremail').value) }));
	}
}

function footerNewsletterSubscribeSuccess() {
	showNewsletterSubscribeResponsePanel(false, "Thanks!<br /><br />You're on the list so should hear from us soon.");
	$('footernewslettergobuttontextwrapper').update('GO');
}

function footerNewsletterSubscribeFail() {
	$('footernewslettersubscribefailure').value = '1';
}

function showNewsletterSubscribeResponsePanel(error, msg) {
	var boxHTML = '<div class="outer"><div class="inner';
	if (error) boxHTML += ' error';
	boxHTML += '">'+msg+'</div></div>';
	$('footernewslettersubscriberesponse').innerHTML = boxHTML;
	$('footernewslettersubscriberesponse').setStyle({ display: 'block' });
	if (!footerNewsletterSubscribeResponsePanelShowing) footerNewsletterSubscribeResponsePanelShowing = true;
}

function hideFooterNewsletterSubscribeResponsePanel() {
	$('footernewslettersubscriberesponse').setStyle({ display: 'none' });
	footerNewsletterSubscribeResponsePanelShowing = false;
}

function addConfirmActions(styles) {
	$$(styles).each(function(element) {
		element.observe('click', function(event) {
			if (!confirm(this.readAttribute('title')+'?')) event.stop();
		});
	});
}

function addHeaderLinksNavigateAwayWarning() {
	$$('#userheader a, #header a').each(function(element) {
		element.observe('click', function(event) {
			if (!confirm('Are you sure you wish to navigate away from this page? Any unsaved changes will be lost!')) event.stop();
		});
	});
}
function base64_encode (data) {
    // http://kevin.vanzonneveld.net
    // +   original by: Tyler Akins (http://rumkin.com)
    // +   improved by: Bayron Guevara
    // +   improved by: Thunder.m
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Pellentesque Malesuada
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // -    depends on: utf8_encode
    // *     example 1: base64_encode('Kevin van Zonneveld');
    // *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
    // mozilla has this native
    // - but breaks in 2.0.0.12!
    //if (typeof this.window['atob'] == 'function') {
    //    return atob(data);
    //}
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
        ac = 0,
        enc = "",
        tmp_arr = [];

    if (!data) {
        return data;
    }

    data = this.utf8_encode(data + '');

    do { // pack three octets into four hexets
        o1 = data.charCodeAt(i++);
        o2 = data.charCodeAt(i++);
        o3 = data.charCodeAt(i++);

        bits = o1 << 16 | o2 << 8 | o3;

        h1 = bits >> 18 & 0x3f;
        h2 = bits >> 12 & 0x3f;
        h3 = bits >> 6 & 0x3f;
        h4 = bits & 0x3f;

        // use hexets to index into b64, and append result to encoded string
        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
    } while (i < data.length);

    enc = tmp_arr.join('');

    switch (data.length % 3) {
    case 1:
        enc = enc.slice(0, -2) + '==';
        break;
    case 2:
        enc = enc.slice(0, -1) + '=';
        break;
    }

    return enc;
}

function utf8_encode (argString) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: sowberry
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman
    // +   improved by: Yves Sucaet
    // +   bugfixed by: Onno Marsman
    // +   bugfixed by: Ulrich
    // +   bugfixed by: Rafal Kukawski
    // *     example 1: utf8_encode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'

    if (argString === null || typeof argString === "undefined") {
        return "";
    }

    var string = (argString + ''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");
    var utftext = "",
        start, end, stringl = 0;

    start = end = 0;
    stringl = string.length;
    for (var n = 0; n < stringl; n++) {
        var c1 = string.charCodeAt(n);
        var enc = null;

        if (c1 < 128) {
            end++;
        } else if (c1 > 127 && c1 < 2048) {
            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
        } else {
            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
        }
        if (enc !== null) {
            if (end > start) {
                utftext += string.slice(start, end);
            }
            utftext += enc;
            start = end = n + 1;
        }
    }

    if (end > start) {
        utftext += string.slice(start, stringl);
    }

    return utftext;
}

document.observe('dom:loaded', function() {
	$$('body')[0].insert({'top': new Element('div', { 'id': 'fb-root' })});
	$$('body')[0].insert({'top': new Element('script', { 'src': document.location.protocol+'//connect.facebook.net/en_US/all.js#appId=168983376506217&xfbml=1' })});
	$$('body')[0].insert({'bottom': new Element('script', { 'type': 'text/javascript', 'src': 'https://apis.google.com/js/plusone.js' }).update("{lang: 'en-GB'}")});
	if ($$('body')[0].hasClassName('labs')) preloadImage('/images/commentscountlabsbgover.png'); else preloadImage('/images/commentscountbgover.png');
	if (Prototype.Browser.IE && navigator.userAgent.match(/MSIE 7/)) {
		$$('#lcol div.blogpost div.imagewrapper img.listing').each(function(element) {
			element.observe('click', function(event) {
				window.location = $(element.readAttribute('id').replace('image', 'imagelink')).readAttribute('href');
			});
		});
	}
});


