var olsize = {
	'log_in': {w: 400, h: 108},
	'numbers': {w: 700, h: 402}, 
	'package': {w: 639, h: 491}, 
	'details': {w: 700, h: 455}, 
	'payment': {w: 550, h: 320}, 
	'confirm': {w: 700, h: 530}, 
	'confirmed': {w: 400, h: 150}
};

var previous_ol = '';
var current_ol = '';
var ajaxRequest = null;
var url;
var current_hash = window.location.hash;
var ol_fade_time = 250;
var ol_transition_time = 250;
var ol_offsetTop = 0;
var func_ajax = {};
var dom_timer;

var banners_696x86 = new Array(
	'08d-696x86-20090811-1',
	'08d-696x86-20090811-2',
	'08d-696x86-20090811-4',
	'08d-696x86-20090825-1',
	'08d-696x86-20090825-2'
);

if (!window.console) {
	var console = {
		log: function(msg) {
				alert(msg);
			},
		info: function(msg) {
				alert(msg);
			},
		error: function(msg) {
				alert(msg);
			}
	};
}

// functions ///////////////////////////////////

/**
 * addEventListener
 * cross browser event listener.
 */
function addEventListener(el, et, h, c) {
	if (el.addEventListener) {
		el.addEventListener(et, h, c);
	}
	else if (el.attachEvent) {
		el['on' + et] = h;
	}
}

/**
 * removeEventListener
 * cross browser event listener removal.
 */
function removeEventListener(el, et, c) {
	if (el.addEventListener) {
		el.removeEventListener(et, arguments.callee, c);
	}
	else if (el.attachEvent) {
		el['on' + et] = function() {};
	}
}

/**
 * doAjax
 */
 
function doAjax(url, params, actions) {
	if (window.XMLHttpRequest) {
		ajaxRequest = new XMLHttpRequest(); // IE7, Firefox, Mozilla, etc.
	} else if (window.ActiveXObject) {
		ajaxRequest = new ActiveXObject('Microsoft.XMLHTTP'); // IE5 & IE6
	}
	
	if (ajaxRequest !== null) {
		ajaxRequest.open('POST', url, true);
		ajaxRequest.onreadystatechange = actions;
		ajaxRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
		
		if (window.ActiveXObject) {
			ajaxRequest.setRequestHeader('Content-length', params.length);
			ajaxRequest.setRequestHeader('Connection', 'close');
		}
		
		ajaxRequest.send(params);
	}
	else {
		alert('Your browser does not support XMLHttpRequests.');
	}
	return ajaxRequest;
}

/**
 * trackPageView
 */
function trackPageView(url) {
	url = url.replace(window.location.protocol + '//' + window.location.host,'');
	pageTracker._trackPageview(url);
}

/**
 * getElementsByClass
 * gets elements by their class name.
 */
function getElementsByClass(needle, area) {
	area = area || document;
	var my_array = area.getElementsByTagName('*');
	var retvalue = [];
	var j = 0;

	for (var i = 0; i < my_array.length; i++) {
		var c = ' ' + my_array[i].className + ' ';
		if (c.indexOf(' ' + needle + ' ') !== -1) {
			retvalue[j++] = my_array[i];
		}
	}
	
	return retvalue;
}

/**
 * hasClass
 * check if an element has a specified class.
 */
function hasClass(el, str) {
	return el.className.match(new RegExp('(\\s|^)' + str + '(\\s|$)'));
}

function removeClass(el, str) {
	el = el || document;
	
	var k = 0;
	var ecn = el.className.split(' ');
	var rcn = [];
	
	for (var i = 0; i < ecn.length; i++) {
		if (ecn[i] !== str) {
			rcn[k] = ecn[i];
			k++;
		}
	}
		
	el.className = rcn.join(' ');
}

/**
 * toggleClass
 * toggle the prescence of a class in a specific element.
 */
function toggleClass(el, str) {
	el = el || document;
	var exists = hasClass(el, str);
	
	if (exists) {
		removeClass(el, str);
	} else {
		el.className += ((el.className) ? ' ' : '') + str;
	}
}

function addToBasket(number, type) {
	var li			= document.createElement('li');
	li.className	= type;
	li.id			= 'bk_' + number;
	li.innerHTML	= number.substring(0, 4) + ' ' + number.substring(4, 7) + ' ' + number.substring(7, 11);
	
	document.getElementById('basket-numbers').appendChild(li);
}

function removeFromBasket(number, type) {
	var li = document.getElementById('bk_' + number);
	
	if (li) {
		li.parentNode.removeChild(li);
	}
}

function addThousandCommas(num) {
	var regEx = new RegExp('(-?[0-9]+)([0-9]{3})');

	while(regEx.test(num)) {
		num = num.replace(regEx, '$1,$2');
	}
	return num;
} 

function updateTotal(amount) {
	var el_total = document.getElementById('basket-total');
	var total = el_total.innerHTML;
	total = parseInt(total.replace(',', ''), 10);
	
	total += amount;
	
	el_total.innerHTML = addThousandCommas(total.toFixed(2)); // causes scrollbar flicker in IE7 ?
}

/**
 * setTabbing()
 * enable or disable a,input,textarea and select tags from the tabindex for a given element.
 */
function setTabbing(el, enabled) {
	el = el || document;
	var c = el.getElementsByTagName('*');
	
	for (var i = 0; i < c.length; i++) {
		switch (c[i].nodeName.toLowerCase()) {
			case 'a':
			case 'input':
			case 'textarea':
			case 'select':
				if (enabled) {
					c[i].removeAttribute('tabIndex');
				} else {
					c[i].tabIndex = '-1';
				}
				break;
		}
	}
}

/**
 * getEmptyFields
 * returns details on empty fields on a form.
 */
function getEmptyFields(frm) {
	var fields = getElementsByClass('mandatory', frm);
	var mandatory_txt;
				
	if (fields.length > 0) {
		mandatory_txt = ' mandatory';
	} else {
		fields = frm.getElementsByTagName('*');
		mandatory_txt = '';
	}
	
	var empty = 0;
	
	for (var f = 0; f < fields.length; f++) {
		if (fields[f].value === '' && hasClass(fields[f], 'mandatory') && fields[f].nodeName !== 'LI') {
			empty++;
		}
	}
	
	return {'count':empty, 'mandatory_txt':mandatory_txt};
}

/**
 * checkFormFields
 * quick client-side validation to check that no fields on a form are left empty.
 */

function checkFormFields(byClass, area) {
	area = area || 'content';
	var forms = getElementsByClass(byClass, document.getElementById(area));
	
	if (forms.length > 0) {
		for (var i = 0; i < forms.length; i++) {
			addEventListener(forms[i], 'submit', function(e) {
				e = (e) ? e : window.event;
				
				var empty = getEmptyFields(this);
				
				if (empty.count>0) {
					alert('Please fill out all' + empty.mandatory_txt + ' fields on the form.');
					
					if (e.stopPropagation) {
						e.stopPropagation();
					}
					
					if (e.preventDefault) {
						e.preventDefault();
					} else {
						e.returnValue = false;
					}
				}
			}, false);
		}
	}
}

/**
 * getParam
 * get a specified parameter from a string.
 */
function getParam(varname, params) {
	var varvalue = '';
	
	if (params) {
		var vars = params.split('&');
		for (var i = 0; i<= vars.length; i++) {
			if (vars[i]) {
				var varpair = vars[i].split('=');
				if (varpair[0] && varpair[0] === varname) {
					varvalue = varpair[1];
				}
			}
		}
	}
	
	return varvalue;
}

/**
 * getParamsFromForm
 * get a string of parameters set by a form for ajax usage.
 */
function getParamsFromForm(frm) {
	var params = '';
	var ft = '';
	var fv = '';
	var fn = '';
	var el = '';
	var elt = '';
	var elv = '';
	var eln = '';
	
	for (var i = 0; i < frm.elements.length; i++) {
		el  = frm.elements[i];
		elt = el.title;
		elv = el.value;
		eln = el.name;
		
		switch (el.type) {
			case 'text':
			case 'hidden':
			case 'password':
			case 'textarea':
				params += eln + '=' + encodeURI(elv) + '&';
				break;
				
			case 'checkbox':
			case 'radio':
				if (el.checked) {
					params += eln + '=' + encodeURI(elv) + '&';
				}
				break;
				
			case 'select-one':
				params += eln + '=' + el.options[el.selectedIndex].value + '&';
				break;
		}
	}
	params = params.substr(0, (params.length - 1));
	return params;
}

function setHashUrl(hash_url) {
	hash_url = '/ol' + hash_url.replace(window.location.protocol + '//' + window.location.host,'');
	hash_url = hash_url.replace('//','/');
	window.location.hash = hash_url;
}

function addOpenOverlayEvent(el, evt) {
	addEventListener(el, evt, function(e) {
		e = (e) ? e : window.event;
		
		setHashUrl(this.href);
		
		if (e.stopPropagation) {
			e.stopPropagation();
		}
		
		if (e.preventDefault) {
			e.preventDefault();
		} else {
			e.returnValue = false;
		}
		
		this.blur();
	}, false);
}

function addDisableLinkEvent(el, evt) {
	addEventListener(el, evt, function(e) {
		e = (e) ? e : window.event;
		
		if (e.stopPropagation) {
			e.stopPropagation();
		}
		
		if (e.preventDefault) {
			e.preventDefault();
		} else {
			e.returnValue = false;
		}
		
		this.blur();
	}, false);
}

/**
 * setOpacity
 * set the opacity for a given element;
 */
function setOpacity(el, o) {
	el.style.opacity = o;
	el.style.MozOpacity = o;
	el.style.KhtmlOpacity = o;
	el.style.filter = "alpha(opacity=" + (o * 100) + ");";
}

function fadeById(id, from, to, duration) {
	var f = (duration > 999) ? 30 * (duration / 1000) : 30;
	var s = ((to - from) / f);
	var t = duration / f;
	
	for (var i = 1; i <= f; i++) (function(item) {
		setTimeout(function() {
			setOpacity(document.getElementById(id), (from + (item * s)));
		}, item * t);
	})(i);
}

/**
 * removeOverlay
 * Removes the overlay.
 */
function removeOverlay() {
	var o = document.getElementById('overlay');
	if (o) {
		document.body.style.cursor	= 'wait';
		fadeById('overlay-bg', 0.75, 0, ol_fade_time);
		fadeById('overlay-border', 1, 0, ol_fade_time);
		fadeById('overlay-close', 1, 0, ol_fade_time);
		fadeById('overlay-content', 1, 0, ol_fade_time);
		
		setTimeout(function() {
			document.body.style.cursor = 'default';
			document.body.removeChild(document.getElementById('overlay'));
			setTabbing(document.getElementById('container'),1);
			
			if (window.location.hash !== '') {
				window.location.hash = '/ol/closed';
			}
			
			previous_ol = current_ol;
			current_ol = '';
		}, ol_fade_time);
	}
}

function createOverlay(id, title, size, width, height) {
	setTabbing(document.getElementById('container'), 0);
	
	// place this according to current scrolling position - store in global for resizing if req. later.
	if (typeof pageYOffset !== 'undefined') {
		ol_offsetTop = pageYOffset;
	}
	else {
		var b = document.body; // IE 'quirks'
		var d = document.documentElement; // IE with doctype
		d = (d.clientHeight) ? d : b;
		ol_offsetTop = d.scrollTop;
	}
	
	var o		= document.createElement('div');
	o.id		= 'overlay';
	o.className = 'overlay_' + id;
	
	// overlay background
	var ob 		= document.createElement('div');
	ob.id		= 'overlay-bg';
	o.appendChild(ob);
	
	// overlay border (holds the corners)
	var of				= document.createElement('div');
	of.id				= 'overlay-border';
	of.style.width		= (width + 22) + 'px';
	of.style.height		= (parseInt(height, 10) + 26) + 'px';
	of.style.marginLeft	= (parseInt(width/2, 10) * -1 - 11) + 'px';
	of.style.marginTop	= (ol_offsetTop + parseInt(height/2, 10) * -1) + 'px';
	o.appendChild(of);
	
	// overlay corners
	var of_tl			= document.createElement('span');
	of_tl.id			= 'overlay-corner-tl';
	of_tl.className		= 'overlay-corner';
	of_tl.style.borderBottom = (parseInt(height, 10) + 4) + 'px solid #fff';
	of.appendChild(of_tl);
	
	var of_tr			= document.createElement('span');
	of_tr.id			= 'overlay-corner-tr';
	of_tr.className		= 'overlay-corner';
	of_tr.style.borderBottom = (parseInt(height, 10) + 4) + 'px solid #fff';
	of.appendChild(of_tr);
	
	var of_bl			= document.createElement('span');
	of_bl.id			= 'overlay-corner-bl';
	of_bl.className		= 'overlay-corner';
	of.appendChild(of_bl);
	
	var of_br			= document.createElement('span');
	of_br.id			= 'overlay-corner-br';
	of_br.className		= 'overlay-corner';
	of.appendChild(of_br);
	
	// overlay content
	var oc				= document.createElement('div');
	oc.id				= 'overlay-content';
	oc.style.width		= width + 'px';
	oc.style.height		= (parseInt(height, 10) + 26) + 'px';
	oc.style.marginLeft	= (parseInt(width/2, 10) * -1) + 'px';
	oc.style.marginTop	= (ol_offsetTop + parseInt(height/2, 10) * -1) + 'px';
	
	// overlay loading
	var ol				= document.createElement('div');
	ol.id				= 'overlay-loading';
	ol.innerHTML		= 'Loading&hellip;';
	oc.appendChild(ol);
	
	// 'remove overlay' anchor
	var oa 		= document.createElement('a');
	oa.appendChild(document.createTextNode('Close'));
	oa.id		= 'overlay-close';
	oa.href 	= '#/ol/closed';
	oa.style.marginLeft	= (parseInt(width/2, 10) - 13) + 'px';
	oa.style.marginTop	= (ol_offsetTop + parseInt(height/2 - 8, 10) * -1) + 'px';
	o.appendChild(oa);
	
	o.appendChild(oc);
	document.body.appendChild(o);
}

/**
 * addOverlay
 * Add an overlay to the page.
 */
function addOverlay(id, title, size) {
	var width	= parseInt( olsize[size].w, 10 );
	var height	= parseInt( olsize[size].h, 10 );
	
	if (!document.getElementById('overlay')) {
		createOverlay(id, title, size, width, height);
		
		document.body.style.cursor	= 'wait';
		fadeById('overlay-bg', 0, 0.75, ol_fade_time);
		fadeById('overlay-border', 0, 1, ol_fade_time);
		fadeById('overlay-close', 0, 1, ol_fade_time);
		fadeById('overlay-content', 0, 1, ol_fade_time);
		setTimeout(function() {
			document.body.style.cursor = 'default';
		}, ol_fade_time);
	}
}

/**
 * replaceOverlayLoading
 * replaces the overlay loading with the loaded content.
 */
function replaceOverlayLoading(id, content) {
	var ol = document.getElementById('overlay-loading');
	if (ol) {
		var oc			= document.createElement('div');
		oc.id			= id;
		oc.innerHTML	= content;
		ol.parentNode.replaceChild(oc, ol);
	}
}

function setOverlaySize(oc, of, oftl, oftr, ofbl, ofbr, ox, ofw, ofh, ocw, och) {
	// set width
	of.style.width = ofw + 'px';
	of.style.marginLeft = ( (ofw/2) * -1) + 'px';
	oc.style.width = ocw + 'px';
	oc.style.marginLeft = ( (ocw/2) * -1) + 'px';
	
	// set height
	of.style.height = (ofh) + 'px';
	of.style.marginTop = ( (ofh/2 - 13) * -1 + ol_offsetTop) + 'px';
	oc.style.height = och + 'px';
	oc.style.marginTop = ( (och/2 - 13) * -1 + ol_offsetTop) + 'px';
	
	// set border heights
	oftl.style.borderBottom = (och - 22) + 'px solid #fff';
	oftr.style.borderBottom = (och - 22) + 'px solid #fff';
	
	// set close btn margins
	ox.style.marginLeft	= (parseInt(ofw/2, 10) - 24) + 'px';
	ox.style.marginTop	= (parseInt(ofh/2 + 3, 10) * -1 + 22 + ol_offsetTop) + 'px';
}

function scaleOverlay(w, h, d, oc, of, oftl, oftr, ofbl, ofbr, ox) {
	var of_wf = parseInt(of.style.width, 10);
	var of_hf = parseInt(of.style.height, 10);
	var of_wt = of_wf + w;
	var of_ht = of_hf + h;
	
	var oc_wf = of_wf - 22;
	var oc_wt = of_wt - 22;
	var oc_hf = of_hf;
	var oc_ht = of_ht;
	
	var f = (d > 999) ? 30 * (d / 1000) : 30;
	
	var sw_of = ((of_wt - of_wf) / f);
	var sh_of = ((of_ht - of_hf) / f);
	
	var sw_oc = ((oc_wt - oc_wf) / f);
	var sh_oc = ((oc_ht - oc_hf) / f);
	
	var t = d / f;
	
	for (var i = 1; i <= f; i++) (function(item) {
		setTimeout(function() {
			setOverlaySize(
				oc,
				of,
				oftl,
				oftr,
				ofbl,
				ofbr,
				ox,
				(of_wf + (item*sw_of)),
				(of_hf + (item*sh_of)),
				(oc_wf + (item*sw_oc)),
				(oc_hf + (item*sh_oc))
			);
		}, item*t);
	})(i);
}

function resizeOverlay(w, h, d) {
	// get all overlay elements
	
	// border & corners
	var of		= document.getElementById('overlay-border');
	var oftl	= document.getElementById('overlay-corner-tl');
	var oftr	= document.getElementById('overlay-corner-tr');
	var ofbl	= document.getElementById('overlay-corner-bl');
	var ofbr	= document.getElementById('overlay-corner-br');
	
	// close btn
	var ox		= document.getElementById('overlay-close');
	
	// content parts
	var oc	= document.getElementById('overlay-content');
	oc = (oc) ? oc : document.getElementById('overlay-loading');
	
	document.body.style.cursor	= 'wait';
	
	scaleOverlay(w, h, d, oc, of, oftl, oftr, ofbl, ofbr, ox);
	
	setTimeout(function() {
		document.body.style.cursor = 'default';
	}, d);
}

/**
 * setSizeMargin
 * set the size and margin of a given element (to place centerally);
 */
function setSizeMargin(el, w, h, lo, to) {
	lo = (typeof(lo) === 'undefined') ? 0 : lo;
	to = (typeof(to) === 'undefined') ? 0 : to;
	
	el.style.width = w + 'px';
	el.style.marginLeft = ( (w/2) * -1 + lo) + 'px';
	el.style.height = h + 'px';
	el.style.marginTop = ( (h/2) * -1 + to) + 'px';
}

function resizeById(id, widthFrom, heightFrom, widthChange, heightChange, duration) {
	widthFrom		= parseInt(widthFrom, 10);
	heightFrom		= parseInt(heightFrom, 10);
	widthChange		= widthFrom + parseInt(widthChange, 10);
	heightChange	= heightFrom + parseInt(heightChange, 10);
	
	var f = (duration > 999) ? 30 * (duration / 1000) : 30;
	var sW = ((widthChange - widthFrom) / f);
	var sH = ((heightChange - heightFrom) / f);
	var t = duration / f;
	
	for (var i = 1; i <= f; i++) (function(item) {
		setTimeout(function() {
			setSizeMargin(document.getElementById(id), (widthFrom + (item * sW)), (heightFrom + (item * sH)), 0, ol_offsetTop);
		}, item * t);
		
	})(i);
}

function getOverlaySizeDefault(prev, next) {
	var r;
	
	if (prev === '' || next === '') {
		r = {
			w: 0,
			h: 0
		};
	} else {
		r = {
			w: olsize[next].w - olsize[prev].w,
			h: olsize[next].h - olsize[prev].h
		};
	}
	
	return r;
}

/**
 * setSize
 * set the size of a given element;
 */
function setSize(el, w, h) {
	el.style.width = w + 'px';
	el.style.height = h + 'px';
}

function setCurrentOverlay(ol_name) {
	previous_ol = current_ol;
	current_ol = ol_name;
}

function checkHashUrl() {
	if (window.location.hash !== '') {
		if (window.location.hash.substring(0, 5) === '#/ol/' && window.location.hash.substring(5) !== 'closed') {
			
			var hash_url = window.location.hash.substring(5).split('/');
			var id = '';
			var size = '';
			var title = '';
			
			switch (hash_url[0]) {
				case 'basket':
					id = 'overlay-basket';
					size = 'numbers';
					break;
					
				case 'checkout':
					id = 'overlay-basket';
					size = (hash_url[1] === 'choose-package') ? 'package' : hash_url[1];
					break;
					
				case 'log-in':
					id = 'ol-content';
					size = 'log_in';
					break;
					
				default:
					id = 'ol-content';
					size = hash_url[0].replace('-','_');
					break;
			}
			
			var width	= parseInt( olsize[size].w, 10 );
			var height	= parseInt( olsize[size].h, 10 );
			
			if (!document.getElementById('overlay')) {
				createOverlay(id, title, size, width, height);
				
				fadeById('overlay-bg', 0, 0.75, ol_fade_time);
				fadeById('overlay-border', 0, 1, ol_fade_time);
				fadeById('overlay-close', 0, 1, ol_fade_time);
				fadeById('overlay-content', 0, 1, ol_fade_time);
				
				if (typeof(func_ajax[size]) !== 'undefined') {
					setTimeout(function() {
						try {
							func_ajax[size]( window.location.protocol + '//' + window.location.host + '/' + window.location.hash.substring(5) );
						} catch(func_ajaxerror) {
							if (console.error) {
								console.error(func_ajaxerror);
							} else {
								alert(func_ajaxerror);
							}
						}
					}, ol_fade_time);
				} else {
					if (console.error) {
						console.error('func_ajax[' + size + '] is not defined.');
					} else {
						alert('func_ajax[' + size + '] is not defined.');
					}
				}
				
				setCurrentOverlay(size);
			} else {
					if (!document.getElementById('overlay-' + size)) {
					if (typeof(func_ajax[size]) !== 'undefined') {
						try {
							func_ajax[size]( window.location.protocol + '//' + window.location.host + '/' + window.location.hash.substring(5) );
						} catch(func_ajaxerror) {
							if (console.error) {
								console.error(func_ajaxerror);
							} else {
								alert(func_ajaxerror);
							}
						}
					} else {
						if (console.error) {
							console.error('func_ajax[' + size + '] is not defined.');
						} else {
							alert('func_ajax[' + size + '] is not defined.');
						}
					}
				}
			}
		} else {
			if (ajaxRequest) {
				ajaxRequest.abort();
			}
			removeOverlay();
		}
	} else {
		if (document.getElementById('overlay')) {
			if (ajaxRequest) {
				ajaxRequest.abort();
			}
			removeOverlay();
		}
	}
}

function checkHashChange() {
    if(current_hash !== location.hash) {
        current_hash = location.hash;
        checkHashUrl();
    }
}

/**
 * externalLinks
 * open any anchor with the rel="external" or rel="new-window"
 */
function externalLinks() {
	if (!document.getElementsByTagName) {
		return;
	}

    var anchors = document.getElementsByTagName("a");

    for (var i = 0; i < anchors.length; i++) {
        var anchor = anchors[i];

        if (anchor.getAttribute("href") && (anchor.getAttribute("rel") === "external" || anchor.getAttribute("rel") === "new-window")) {
            if (anchor.getAttribute("className")) {
                anchor.target = anchor.getAttribute("className");
            }
            else {
                anchor.target = "_blank";
            }
        }
    }
}

function toggleMandatorySymbol(el, str) {
	el = el || document;
	var exists = getElementsByClass('mandatory_symbol', el);
	exists = (exists[0]) ? exists[0] : 0;
	
	if (exists) {
		el.removeChild(exists);
	} else {
		var ms = document.createElement('span');
		ms.className = 'mandatory_symbol';
		ms.innerHTML = '*';
		el.appendChild(ms);
	}
}

function setMandatory(el, enabled, exclude) {
	el = el || document;
	
	var c = el.getElementsByTagName('*');
	
	for (var i=0;i<c.length;i++) {
		
		switch (c[i].nodeName.toLowerCase()) {
			case 'input':
			case 'textarea':
			case 'select':
				if (c[i] !== exclude) {
					toggleClass(c[i], 'mandatory');
				}
				break;
			case 'label':
				if (c[i].htmlFor !== exclude.id) {
					toggleMandatorySymbol(c[i]);
				}
				break;
		}
	}
}

function setup_res_form() {
	var area = (document.getElementById('overlay')) ? 'overlay' : 'content';
	checkFormFields('reservation_form', area);
	externalLinks();
	
	var selects = document.getElementsByTagName('select');
	
	if (selects) {
		if (selects.length > 0) {
			for (var i=0;i<selects.length;i++) {
				if (selects[i].id.substring(0, 22) === 'reservation_forwardto_') {
					addEventListener(selects[i], 'change', function(e) {
						e = (e) ? e : window.event;
						
						var el = document.getElementById('reservation_forwardnum_' + this.id.substring(22));
						
						if (this.value === 'fax-to-email') {
								if (el.value === 'e.g. 0789 333 0000' || el.value === 'e.g. 0113 246 6240' || el.value === '') {
									el.value = 'e.g. fax@08direct.co.uk';
								}
						} else {
							if (el.value === 'e.g. 0789 333 0000' || el.value === 'e.g. fax@08direct.co.uk' || el.value === '') {
								el.value = 'e.g. 0113 246 6240';
							}
						}
					});
				}
			}
		}
	}
	
	var reservation_form = document.getElementById('reservation_form');
	
	var reservation_forwardnum = getElementsByClass('reservation_forwardnum', reservation_form);
	if (reservation_forwardnum.length > 0) {
		for (i=0;i<reservation_forwardnum.length;i++) {
	
			addEventListener(reservation_forwardnum[i], 'focus', function(e) {
				e = (e) ? e : window.event;
				
				if (this.value.substring(0, 5) === 'e.g. ') {
					this.value = '';
				}
			});
		}
	}
	
	var reserved_remove_btn = getElementsByClass('reserved-remove-btn', reservation_form);
	
	if (reserved_remove_btn.length > 0) {
		for (i=0;i<reserved_remove_btn.length;i++) {
		
			addEventListener(reserved_remove_btn[i], 'click', function(e) {
					e = (e) ? e : window.event;
					
					if (confirm('Are you sure you want to remove this number from your order?')) {
						doAjax(
							'/json/removed_basket_item/',
							'action=remove&pn=' + this.id.substring(10),
							function() {
								if (ajaxRequest) {
									// loading
									if (ajaxRequest.readyState >= 0 && ajaxRequest.readyState <= 3) {
									}
										
									// completed successfully
									if (ajaxRequest.readyState === 4 && ajaxRequest.status === 200) {
										var deleted = eval('(' + ajaxRequest.responseText + ')');
										
										if (deleted) {
											var tr_to_delete = document.getElementById('reserved-pn-' + deleted.pn);
											var tr_height_change = tr_to_delete.offsetHeight * -1;
											var tr_to_delete_parent = tr_to_delete.parentNode;
											tr_to_delete_parent.removeChild(tr_to_delete);
											if (tr_to_delete_parent.getElementsByTagName('tr').length === 1) {
												var empty_tr		= document.createElement('tr');
												empty_tr.className	= 'reserved-noitems';
												
												var empty_td 		= document.createElement('td');
												empty_td.colSpan	= '4';
												empty_td.innerHTML	= 'No phone numbers were found for your reservation.';
												empty_tr.appendChild(empty_td);
												
												tr_to_delete_parent.appendChild(empty_tr);
												
											} else {
												resizeOverlay(0, tr_height_change, ol_transition_time);
											}
										} else {
											alert('The phone number could not be removed from your basket.');
										}
									}
										
									// not found
									if (ajaxRequest.readyState === 4 && ajaxRequest.status === 404) {
										alert('The phone number could not be removed from your basket.');
									}
								}
							}
						);
					}
					
					if (e.stopPropagation) {
						e.stopPropagation();
					}
					
					if (e.preventDefault) {
						e.preventDefault();
					} else {
						e.returnValue = false;
					}
					
					this.blur();
				}, false);
				
		}
	}
}

function range_tab_actions() {
	var range_select = document.getElementById('range-select');

	if (range_select) {
		var bronze_tab	= getElementsByClass('bronze',range_select)[0].firstChild;
		var silver_tab	= getElementsByClass('silver',range_select)[0].firstChild;
		var gold_tab	= getElementsByClass('gold',range_select)[0].firstChild;
		
		addEventListener(bronze_tab, 'click', function(e) {
			e = (e) ? e : window.event;
			
			if (!hasClass(this.parentNode, 'selected')) {
				
				// set tab
				removeClass(getElementsByClass('silver',this.parentNode.parentNode)[0], 'selected');
				removeClass(getElementsByClass('gold',this.parentNode.parentNode)[0], 'selected');
				this.parentNode.className += ' selected';
				
				// check if list(s) exists
				var bronze_list = document.getElementById('bronze-list');
				var silver_list = document.getElementById('silver-list');
				var gold_list = document.getElementById('gold-list');
				var list_parent = getElementsByClass('left',document.getElementById('checkout'))[0];
				var numbers_loading = document.getElementById('numbers-loading');
				
				// show correct list
				if (bronze_list) {
					bronze_list.style.display = 'block';
					if (numbers_loading) {
						numbers_loading.style.display = 'none';
					}
				} else {
					// AJAX START
					var basket_code = (window.location.hash === '') ? window.location.pathname.split('/')[2] : window.location.hash.split('/')[3];
					
					if (ajaxRequest) {
						ajaxRequest.abort();
					}
					
					doAjax(
						'/',
						'ajaxformat=xhtml&page=phone_select&phone_code=' + basket_code + '&rating_code=bronze&content-only=1',
						function() {
							if (ajaxRequest) {
								// loading
								if (ajaxRequest.readyState >= 0 && ajaxRequest.readyState <= 3) {
									// list loading
									if (numbers_loading) {
										numbers_loading.innerHTML		= 'Loading Bronze Numbers&hellip;';
										numbers_loading.style.display	= 'block';
									} else {
										numbers_loading					= document.createElement('div');
										numbers_loading.id				= 'numbers-loading';
										numbers_loading.innerHTML		= 'Loading Bronze Numbers&hellip;';
										list_parent.appendChild(numbers_loading);
									}
								}
									
								// completed successfully
								if (ajaxRequest.readyState === 4 && ajaxRequest.status === 200) {
									var basket_markup = ajaxRequest.responseText;
									
									if (basket_markup) {
										var bm = document.createElement('div');
										bm.innerHTML = basket_markup;
										bm = bm.firstChild;
										
										if (getElementsByClass('selected', document.getElementById('range-select'))[0].className.split(' ')[0] !== 'bronze') {
											bm.style.display = 'none';
										}
										
										list_parent.appendChild(bm);
										list_parent.removeChild(numbers_loading);
										
										bm = 0;
										bm = document.getElementById('bronze-list');
										
										if (bm) {
											var checkboxes = getElementsByClass('checkbox', bm);
											
											if (checkboxes.length > 0) {
												for (var i=0;i<checkboxes.length;i++) {
											
													addEventListener(checkboxes[i], 'click', function(e) {
														e = (e) ? e : window.event;
														
														var cb_number	= this.id.substring(3);
														var cb_type		= this.parentNode.parentNode.parentNode.className.split(' ')[1];
														var cb_price	= 0;
														
														switch (cb_type) {
															case 'gold':
																cb_price = 49;
																break;
																
															case 'silver':
																cb_price = 29;
																break;
																
															default:
																cb_price = 0;
														}
														
														if (this.checked) {
															addToBasket(cb_number, cb_type);
															updateTotal(cb_price);
														} else {
															removeFromBasket(cb_number, cb_type);
															updateTotal(cb_price * -1);
														}
													});
													
												}
											}
										}
									}
								}
									
								// not found
								if (ajaxRequest.readyState === 4 && ajaxRequest.status === 404) {
									var msg = 'The bronze ' + basket_code + ' numbers could not be loaded. Please try again.';
									var basket_msg_el = document.getElementById('basket_msg');
									if (basket_msg_el) {
										basket_msg_el.parentNode.className = 'error-basket';
										basket_msg_el.innerHTML = msg;
									} else {
										alert(msg);
									}
								}
							}
						}
					);
					
					// AJAX END
				}
				
				// hide other lists if they exist
				if (silver_list) {
					silver_list.style.display = 'none';
				}
				
				if (gold_list) {
					gold_list.style.display = 'none';
				}
			}
			
			if (e.stopPropagation) {
				e.stopPropagation();
			}
			
			if (e.preventDefault) {
				e.preventDefault();
			} else {
				e.returnValue = false;
			}
		});
		
		addEventListener(silver_tab, 'click', function(e) {
			e = (e) ? e : window.event;
			
			if (!hasClass(this.parentNode, 'selected')) {
				
				// set tab
				removeClass(getElementsByClass('bronze',this.parentNode.parentNode)[0], 'selected');
				removeClass(getElementsByClass('gold',this.parentNode.parentNode)[0], 'selected');
				this.parentNode.className += ' selected';
				
				// check if list(s) exists
				var bronze_list = document.getElementById('bronze-list');
				var silver_list = document.getElementById('silver-list');
				var gold_list = document.getElementById('gold-list');
				var list_parent = getElementsByClass('left',document.getElementById('checkout'))[0];
				var numbers_loading = document.getElementById('numbers-loading');
				
				// show correct list
				if (silver_list) {
					silver_list.style.display = 'block';
					if (numbers_loading) {
						numbers_loading.style.display = 'none';
					}
				} else {
					// AJAX START
					var basket_code = (window.location.hash === '') ? window.location.pathname.split('/')[2] : window.location.hash.split('/')[3];
					
					if (ajaxRequest) {
						ajaxRequest.abort();
					}
					
					doAjax(
						'/',
						'ajaxformat=xhtml&page=phone_select&phone_code=' + basket_code + '&rating_code=silver&content-only=1',
						function() {
							if (ajaxRequest) {
								// loading
								if (ajaxRequest.readyState >= 0 && ajaxRequest.readyState <= 3) {
									// list loading
									if (numbers_loading) {
										numbers_loading.innerHTML		= 'Loading Silver Numbers&hellip;';
										numbers_loading.style.display	= 'block';
									} else {
										numbers_loading					= document.createElement('div');
										numbers_loading.id				= 'numbers-loading';
										numbers_loading.innerHTML		= 'Loading Silver Numbers&hellip;';
										list_parent.appendChild(numbers_loading);
									}
								}
									
								// completed successfully
								if (ajaxRequest.readyState === 4 && ajaxRequest.status === 200) {
									var basket_markup = ajaxRequest.responseText;
									
									if (basket_markup) {
										var bm = document.createElement('div');
										bm.innerHTML = basket_markup;
										bm = bm.firstChild;
										
										if (getElementsByClass('selected', document.getElementById('range-select'))[0].className.split(' ')[0] !== 'silver') {
											bm.style.display = 'none';
										}
										
										list_parent.appendChild(bm);
										list_parent.removeChild(numbers_loading);
										
										bm = 0;
										bm = document.getElementById('silver-list');
										
										if (bm) {
											var checkboxes = getElementsByClass('checkbox', bm);
											
											if (checkboxes.length > 0) {
												for (var i=0;i<checkboxes.length;i++) {
											
													addEventListener(checkboxes[i], 'click', function(e) {
														e = (e) ? e : window.event;
														
														var cb_number	= this.id.substring(3);
														var cb_type		= this.parentNode.parentNode.parentNode.className.split(' ')[1];
														var cb_price	= 0;
														
														switch (cb_type) {
															case 'gold':
																cb_price = 49;
																break;
																
															case 'silver':
																cb_price = 29;
																break;
																
															default:
																cb_price = 0;
														}
														
														if (this.checked) {
															addToBasket(cb_number, cb_type);
															updateTotal(cb_price);
														} else {
															removeFromBasket(cb_number, cb_type);
															updateTotal(cb_price * -1);
														}
													});
													
												}
											}
										}
									}
								}
									
								// not found
								if (ajaxRequest.readyState === 4 && ajaxRequest.status === 404) {
									var msg = 'The silver ' + basket_code + ' numbers could not be loaded. Please try again.';
									var basket_msg_el = document.getElementById('basket_msg');
									if (basket_msg_el) {
										basket_msg_el.parentNode.className = 'error-basket';
										basket_msg_el.innerHTML = msg;
									} else {
										alert(msg);
									}
								}
							}
						}
					);
					
					// AJAX END
				}
				
				// hide other lists if they exist
				if (bronze_list) {
					bronze_list.style.display = 'none';
				}
				
				if (gold_list) {
					gold_list.style.display = 'none';
				}
			}
			
			if (e.stopPropagation) {
				e.stopPropagation();
			}
			
			if (e.preventDefault) {
				e.preventDefault();
			} else {
				e.returnValue = false;
			}
		});
		
		addEventListener(gold_tab, 'click', function(e) {
			e = (e) ? e : window.event;
			
			if (!hasClass(this.parentNode, 'selected')) {
				
				// set tab
				removeClass(getElementsByClass('bronze',this.parentNode.parentNode)[0], 'selected');
				removeClass(getElementsByClass('silver',this.parentNode.parentNode)[0], 'selected');
				this.parentNode.className += ' selected';
				
				// check if list(s) exists
				var bronze_list = document.getElementById('bronze-list');
				var silver_list = document.getElementById('silver-list');
				var gold_list = document.getElementById('gold-list');
				var list_parent = getElementsByClass('left',document.getElementById('checkout'))[0];
				var numbers_loading = document.getElementById('numbers-loading');
				
				// show correct list
				if (gold_list) {
					gold_list.style.display = 'block';
					if (numbers_loading) {
						numbers_loading.style.display = 'none';
					}
				} else {
					// AJAX START
					var basket_code = (window.location.hash === '') ? window.location.pathname.split('/')[2] : window.location.hash.split('/')[3];
					
					if (ajaxRequest) {
						ajaxRequest.abort();
					}
					
					doAjax(
						'/',
						'ajaxformat=xhtml&page=phone_select&phone_code=' + basket_code + '&rating_code=gold&content-only=1',
						function() {
							if (ajaxRequest) {
								// loading
								if (ajaxRequest.readyState >= 0 && ajaxRequest.readyState <= 3) {
									// list loading
									if (numbers_loading) {
										numbers_loading.innerHTML		= 'Loading Gold Numbers&hellip;';
										numbers_loading.style.display	= 'block';
									} else {
										numbers_loading					= document.createElement('div');
										numbers_loading.id				= 'numbers-loading';
										numbers_loading.innerHTML		= 'Loading Gold Numbers&hellip;';
										list_parent.appendChild(numbers_loading);
									}
								}
									
								// completed successfully
								if (ajaxRequest.readyState === 4 && ajaxRequest.status === 200) {
									var basket_markup = ajaxRequest.responseText;
									
									if (basket_markup) {
										var bm = document.createElement('div');
										bm.innerHTML = basket_markup;
										bm = bm.firstChild;
										
										if (getElementsByClass('selected', document.getElementById('range-select'))[0].className.split(' ')[0] !== 'gold') {
											bm.style.display = 'none';
										}
										
										list_parent.appendChild(bm);
										list_parent.removeChild(numbers_loading);
										
										bm = 0;
										bm = document.getElementById('gold-list');
										
										if (bm) {
											var checkboxes = getElementsByClass('checkbox', bm);
											
											if (checkboxes.length > 0) {
												for (var i=0;i<checkboxes.length;i++) {
											
													addEventListener(checkboxes[i], 'click', function(e) {
														e = (e) ? e : window.event;
														
														var cb_number	= this.id.substring(3);
														var cb_type		= this.parentNode.parentNode.parentNode.className.split(' ')[1];
														var cb_price	= 0;
														
														switch (cb_type) {
															case 'gold':
																cb_price = 49;
																break;
																
															case 'silver':
																cb_price = 29;
																break;
																
															default:
																cb_price = 0;
														}
														
														if (this.checked) {
															addToBasket(cb_number, cb_type);
															updateTotal(cb_price);
														} else {
															removeFromBasket(cb_number, cb_type);
															updateTotal(cb_price * -1);
														}
													});
													
												}
											}
										}
									}
								}
									
								// not found
								if (ajaxRequest.readyState === 4 && ajaxRequest.status === 404) {
									var msg = 'The gold ' + basket_code + ' numbers could not be loaded. Please try again.';
									var basket_msg_el = document.getElementById('basket_msg');
									if (basket_msg_el) {
										basket_msg_el.parentNode.className = 'error-basket';
										basket_msg_el.innerHTML = msg;
									} else {
										alert(msg);
									}
								}
							}
						}
					);
					
					// AJAX END
				}
				
				// hide other lists if they exist
				if (bronze_list) {
					bronze_list.style.display = 'none';
				}
				
				if (silver_list) {
					silver_list.style.display = 'none';
				}
			}
			
			if (e.stopPropagation) {
				e.stopPropagation();
			}
			
			if (e.preventDefault) {
				e.preventDefault();
			} else {
				e.returnValue = false;
			}
		});
	}
}

function checkout_progress_actions() {
	var in_overlay = document.getElementById('overlay');
	var ck_progind = document.getElementById('checkout-progress');
	
	if (ck_progind && in_overlay) {
		var stages = ck_progind.getElementsByTagName('li');
		for (var i = 0; i < stages.length; i++) {
			if (stages[i].firstChild.nodeName === 'A') {
				addOpenOverlayEvent(stages[i].firstChild, 'click');
			} else {
				addDisableLinkEvent(stages[i].firstChild, 'click');
			}
		}
	}
}

function confirm_btn_action() {
	var confirmBtn = document.getElementById('btnCompleteOrder');
	
	if (confirmBtn) {
		addEventListener(confirmBtn, 'click', function(e) {
			e = (e) ? e : window.event;
			
			var oc  = document.getElementById('overlay-content');
			var ocw = oc.offsetWidth;
			var och = oc.offsetHeight;
			var ocf = oc.firstChild;
			
			var ol			= document.createElement('div');
			ol.id			= 'overlay-loading';
			ol.innerHTML	= 'Processing Your Order&hellip; Please Wait&hellip;';
			
			if (ocf.id === 'overlay-confirm') {
				try {
					setOpacity(ocf, 0);
					oc.appendChild(ol);
				} catch(tce) {
					alert('The page could not be shown - please try again.');
				}
			}
			
		}, false);
	}
}

function details_btn_action() {
	var detailsBtn = document.getElementById('btnConfirmDetails');

	if (detailsBtn) {
		addEventListener(detailsBtn, 'click', function(e) {
			e = (e) ? e : window.event;
			
			var in_overlay = document.getElementById('overlay');
			var frm = document.getElementById('reservation_form');
			var empty = getEmptyFields(frm);
			
			if (in_overlay) {
				if (empty.count>0) {
					alert('Please fill out all' + empty.mandatory_txt + ' fields on the form.');
				} else {
					var prm = getParamsFromForm(frm) + '&' + this.name + '=1';
					doAjax(
						frm.action,
						prm + '&ajaxformat=xhtml',
						function() {
							var oc  = document.getElementById('overlay-content');
							var ocw = oc.offsetWidth;
							var och = oc.offsetHeight;
							var ocf = oc.firstChild;
							
							// overlay loading
							var ol			= document.createElement('div');
							ol.id			= 'overlay-loading';
							ol.innerHTML	= 'Processing Details&hellip;';
							
							if (ajaxRequest) {
								// loading
								if (ajaxRequest.readyState >= 0 && ajaxRequest.readyState <= 3) {
									if (ocf.id === 'overlay-details') {
										try {
											oc.replaceChild(ol, ocf);
										} catch(tce) {
											alert('The page could not be shown - please try again.');
										}
									}
								}
									
								// completed successfully
								if (ajaxRequest.readyState === 4 && ajaxRequest.status === 200) {
									try {
										ol = document.getElementById('overlay-loading');
										
										var olc = document.createElement('div');
										olc.innerHTML = ajaxRequest.responseText;
										setOpacity(olc, 0);
										
										var content_id = olc.getElementsByTagName('form')[0].action.split('/');
										
										if (content_id.length > 4) {
											content_id = content_id[content_id.length-2];
										} else {
											content_id = 'confirm';
										}
										
										olc.id = 'overlay-' + content_id;
										
										oc.appendChild(olc);
										olc = document.getElementById('overlay-' + content_id);
										
										var defsize = getOverlaySizeDefault(current_ol, content_id);
										
										var olw = olc.scrollWidth - ocw;
										var olh = olc.scrollHeight - och;
										
										if (olw !== defsize.w) {
											olw = defsize.w;
										}
										
										if (olh < defsize.h) {
											olh = defsize.h;
										}
										
										if (olh > defsize.h) {
											olh = olc.scrollHeight - och;
										}
										
										resizeOverlay( olw, olh, ol_transition_time);
										
										setTimeout(function() {
											ol.parentNode.removeChild(ol);
											setOpacity(olc, 1);
											checkout_progress_actions();
											
											if (content_id === 'details') {
												details_btn_action();
												setCurrentOverlay('details');
												trackPageView('/checkout/details/');
											} else if (content_id === 'confirm') {
												confirm_btn_action();
												setCurrentOverlay('confirm');
												setHashUrl('/checkout/confirm/');
												trackPageView('/checkout/confirm/');
											}
											
										}, ol_transition_time);
										
									} catch(tce) {
										alert('The page could not be shown - please try again.');
									}
								}
									
								// not found
								if (ajaxRequest.readyState === 4 && ajaxRequest.status === 404) {
									alert('The page could not be shown - please try again.');
									try {
										oc.replaceChild(ocf, ol);
									} catch(tce) {
										alert('The page could not be shown - please try again.');
									}
								}
							}
						}
					);
				}
				
				if (e.stopPropagation) {
					e.stopPropagation();
				}
				
				if (e.preventDefault) {
					e.preventDefault();
				} else {
					e.returnValue = false;
				}
			} else {
				if (empty.count>0) {
					alert('Please fill out all' + empty.mandatory_txt + ' fields on the form.');
					
					if (e.stopPropagation) {
						e.stopPropagation();
					}
					
					if (e.preventDefault) {
						e.preventDefault();
					} else {
						e.returnValue = false;
					}
				}
			}
		}, false);
	}
}

function replace_basket_holder() {
	var basket_holder = getElementsByClass('phone-select');
	var basket_code;
	var rating_code;
	var basket_parent;
	
	if (basket_holder.length === 1) {
		basket_holder	= basket_holder[0];
		basket_code		= basket_holder.id.split('-')[2];
		rating_code		= basket_holder.id.split('-')[3] || 'bronze';
		
		doAjax(
			'/',
			'ajaxformat=xhtml&page=phone_select&phone_code=' + basket_code + '&rating_code=' + rating_code,
			function() {
				if (ajaxRequest) {
					// loading
					if (basket_holder.className !== 'loading-basket' && (ajaxRequest.readyState >= 0 && ajaxRequest.readyState <= 3) ) {
						basket_holder.className = 'loading-basket';
						var basket_msg	= document.createElement('span');
						basket_msg.id='basket_msg';
						basket_msg.innerHTML = 'Loading ' + basket_code + ' Basket&hellip;';
						basket_holder.appendChild(basket_msg);
					}
						
					// completed successfully
					if (ajaxRequest.readyState === 4 && ajaxRequest.status === 200) {
						var basket_markup = ajaxRequest.responseText;
						
						if (basket_markup) {
							var bm = document.createElement('div');
							bm.innerHTML = basket_markup;
							
							basket_parent = basket_holder.parentNode;
							basket_parent.replaceChild(bm, basket_holder);
							
							var checkout = document.getElementById('checkout');
							
							range_tab_actions();
							
							if (checkout) {
								var checkboxes = getElementsByClass('checkbox', checkout);
								
								if (checkboxes.length > 0) {
									for (var i=0;i<checkboxes.length;i++) {
								
										addEventListener(checkboxes[i], 'click', function(e) {
											e = (e) ? e : window.event;
											
											var cb_number	= this.id.substring(3);
											var cb_type		= this.parentNode.parentNode.parentNode.className.split(' ')[1];
											var cb_price	= 0;
											
											switch (cb_type) {
												case 'gold':
													cb_price = 49;
													break;
													
												case 'silver':
													cb_price = 29;
													break;
													
												default:
													cb_price = 0;
											}
											
											if (this.checked) {
												addToBasket(cb_number, cb_type);
												updateTotal(cb_price);
											} else {
												removeFromBasket(cb_number, cb_type);
												updateTotal(cb_price * -1);
											}
										});
										
									}
								}
							}
							
							var checkoutBtn = document.getElementById('btnCheckout');
							
							if (checkoutBtn) {
								addEventListener(checkoutBtn, 'click', function(e) {
									e = (e) ? e : window.event;
									
									var in_overlay = document.getElementById('overlay');
									var checkoutItems = document.getElementById('basket-numbers');
									checkoutItems = checkoutItems.getElementsByTagName('li');
									
									if (checkoutItems.length === 0) {
										alert('Your cart is currently empty - please add the phone numbers you wish to reserve.');
									} else {
										var frm = document.getElementById('checkout').parentNode;
										var prm = getParamsFromForm(frm) + '&' + this.name + '=1';
										
										if (in_overlay) {
											// this used to call '/checkout/choose-package/'
											doAjax(
												'/checkout/details/',
												prm + '&ajaxformat=xhtml',
												function() {
													var oc  = document.getElementById('overlay-content');
													var ocw = oc.offsetWidth;
													var och = oc.offsetHeight;
													var ocf = oc.firstChild;
													
													// overlay loading
													var ol			= document.createElement('div');
													ol.id			= 'overlay-loading';
													ol.innerHTML	= 'Adding Numbers&hellip;';
													
													if (ajaxRequest) {
														// loading
														if (ajaxRequest.readyState >= 0 && ajaxRequest.readyState <= 3) {
															if (ocf.id === 'overlay-basket') {
																try {
																	oc.replaceChild(ol, ocf);
																} catch(tce) {
																	alert('The page could not be shown - please try again.');
																}
															}
														}
															
														// completed successfully
														if (ajaxRequest.readyState === 4 && ajaxRequest.status === 200) {
															try {
																ol = document.getElementById('overlay-loading');
																
																var olc = document.createElement('div');
																olc.id = 'overlay-details';
																olc.innerHTML = ajaxRequest.responseText;
																setOpacity(olc, 0);
																
																oc.appendChild(olc);
																olc = document.getElementById('overlay-details');
																
																var defsize = getOverlaySizeDefault(current_ol, 'details');
																
																var olw = olc.scrollWidth - ocw;
																var olh = olc.scrollHeight - och;
																
																if (olw !== defsize.w) {
																	olw = defsize.w;
																}
																
																if (olh < defsize.h) {
																	olh = defsize.h;
																}
																
																if (olh > defsize.h) {
																	olh = olc.scrollHeight - och;
																}
																
																resizeOverlay( olw, olh, ol_transition_time);
																
																setTimeout(function() {
																	ol.parentNode.removeChild(ol);
																	setOpacity(olc, 1);
																	
																	setup_res_form();
																	details_btn_action();
																	checkout_progress_actions();
																	addOpenOverlayEvent(document.getElementById('ol-details-login'), 'click');
																	
																	setCurrentOverlay('details');
																	setHashUrl('/checkout/details/');
																	trackPageView('/checkout/details/');
																}, ol_transition_time);
																
															} catch(tce) {
																alert('The page could not be shown - please try again.');
															}
														}
															
														// not found
														if (ajaxRequest.readyState === 4 && ajaxRequest.status === 404) {
															alert('The page could not be found - please try again.');
															try {
																oc.replaceChild(ocf, ol);
															} catch(tce) {
																alert('The page could not be shown - please try again.');
															}
														}
													}
												}
											);
											
											if (e.stopPropagation) {
												e.stopPropagation();
											}
											
											if (e.preventDefault) {
												e.preventDefault();
											} else {
												e.returnValue = false;
											}
										}
									}
								});
							}
						}
					}
						
					// not found
					if (ajaxRequest.readyState === 4 && ajaxRequest.status === 404) {
						var msg = 'The ' + basket_code + ' Basket could not be loaded. Please try reloading the page.';
						var basket_msg_el = document.getElementById('basket_msg');
						if (basket_msg_el) {
							basket_msg_el.parentNode.className = 'error-basket';
							basket_msg_el.innerHTML = msg;
						} else {
							alert(msg);
						}
					}
				}
			}
		);
	}
}

/* end of functions */

/** AJAX functions **/

// load basket via AJAX
func_ajax.numbers = function(url) {
	doAjax(
		url,
		'ajaxformat=xhtml',
		function() {
			var ol_open = document.getElementById('overlay');
			if (ajaxRequest) {
				// loading
				if (ajaxRequest.readyState >= 0 && ajaxRequest.readyState <= 3) {
					if (ol_open) {
						var oc  = document.getElementById('overlay-content');
						var ocf = oc.firstChild;
									
						if (ocf.id !== 'overlay-loading') {
							// overlay loading
							var ol			= document.createElement('div');
							ol.id			= 'overlay-loading';
							ol.innerHTML	= 'Loading&hellip;';
							try {
								oc.replaceChild(ol, ocf);
							} catch(tce) {
								alert('The page could not be shown - please try again.');
							}
						}
					} else {
						addOverlay(
							'overlay-basket',
							'Your Basket',
							'numbers'
						);
						setCurrentOverlay('numbers');
					}
				}
					
				// completed successfully
				if (ajaxRequest.readyState === 4 && ajaxRequest.status === 200) {
					if (ol_open && current_ol !== 'numbers') {
						oc = document.getElementById('overlay-content');
						var ocw = oc.offsetWidth;
						var och = oc.offsetHeight;
						ol = document.getElementById('overlay-loading');
						
						var olc = document.createElement('div');
						olc.id = 'overlay-basket';
						olc.innerHTML = ajaxRequest.responseText;
						setOpacity(olc, 0);
						
						oc.appendChild(olc);
						olc = document.getElementById('overlay-basket');
						
						var defsize = getOverlaySizeDefault(current_ol, 'numbers');
						
						var olw = olc.scrollWidth - ocw;
						var olh = olc.scrollHeight - och;
						
						if (olw !== defsize.w) {
							olw = defsize.w;
						}
						
						if (olh !== defsize.h) {
							olh = defsize.h;
						}
						
						resizeOverlay( olw, olh, ol_transition_time);
					
						setTimeout(function () {
							ol.parentNode.removeChild(ol);
							setOpacity(olc, 1);
							
							checkout_progress_actions();
							replace_basket_holder();
							
							setCurrentOverlay('numbers');
						}, ol_transition_time);
					} else {
						replaceOverlayLoading(
							'overlay-basket',
							ajaxRequest.responseText
						);
						checkout_progress_actions();
						replace_basket_holder();
						setCurrentOverlay('numbers');
					}
					
					trackPageView(url);
				}
					
				// not found
				if (ajaxRequest.readyState === 4 && ajaxRequest.status === 404) {
					alert('The page could not be found.');
				}
			}
		}
	);
};

// load checkout/details via AJAX
func_ajax.details = function(url) {
	doAjax(
		url,
		'ajaxformat=xhtml',
		function() {
			var ol_open = document.getElementById('overlay');
			if (ajaxRequest) {
				// loading
				if (ajaxRequest.readyState >= 0 && ajaxRequest.readyState <= 3) {
					if (ol_open) {
						var oc  = document.getElementById('overlay-content');
						var ocf = oc.firstChild;
									
						if (ocf.id !== 'overlay-loading') {
							// overlay loading
							var ol			= document.createElement('div');
							ol.id			= 'overlay-loading';
							ol.innerHTML	= 'Loading&hellip;';
							try {
								oc.replaceChild(ol, ocf);
							} catch(tce) {
								alert('The page could not be shown - please try again.');
							}
						}
					} else {
						addOverlay(
							'overlay-details',
							'Your Basket',
							'details'
						);
						setCurrentOverlay('details');
					}
				}
					
				// completed successfully
				if (ajaxRequest.readyState === 4 && ajaxRequest.status === 200) {
					setCurrentOverlay('details');
				
					try {
						var oc  = document.getElementById('overlay-content');
						var ocw = oc.offsetWidth;
						var och = oc.offsetHeight;
						var ocf = oc.firstChild;
						
						ol = document.getElementById('overlay-loading');
						
						var olc = document.createElement('div');
						olc.id = 'overlay-details';
						olc.innerHTML = ajaxRequest.responseText;
						setOpacity(olc, 0);
						
						oc.appendChild(olc);
						olc = document.getElementById('overlay-details');
						
						var defsize = getOverlaySizeDefault(current_ol, 'details');
						
						var olw = olc.scrollWidth - ocw;
						var olh = olc.scrollHeight - och;
						
						if (olw !== defsize.w) {
							olw = defsize.w;
						}
						
						if (olh !== defsize.h) {
							olh = olc.scrollHeight - och;
						}
						
						resizeOverlay(olw, olh, ol_transition_time);
						
						setTimeout(function() {
							ol.parentNode.removeChild(ol);
							setOpacity(olc, 1);
							
							setup_res_form();
							details_btn_action();
							checkout_progress_actions();
							addOpenOverlayEvent(document.getElementById('ol-details-login'), 'click');
							
							setCurrentOverlay('details');
							setHashUrl('/checkout/details/');
							trackPageView('/checkout/details/');
						}, ol_transition_time);
						
					} catch(tce) {
						alert('The page could not be shown - please try again. ' + tce);
					}
					
					trackPageView(url);
				}
					
				// not found
				if (ajaxRequest.readyState === 4 && ajaxRequest.status === 404) {
					alert('The page could not be found.');
				}
			}
		}
	);
};

// load checkout/confirm via AJAX
func_ajax.confirm = function(url) {
	doAjax(
		url,
		'ajaxformat=xhtml',
		function() {
			var ol_open = document.getElementById('overlay');
			if (ajaxRequest) {
				// loading
				if (ajaxRequest.readyState >= 0 && ajaxRequest.readyState <= 3) {
					if (ol_open) {
						var oc  = document.getElementById('overlay-content');
						var ocw = oc.offsetWidth;
						var och = oc.offsetHeight;
						var ocf = oc.firstChild;
									
						if (ocf.id !== 'overlay-loading') {
							// overlay loading
							var ol			= document.createElement('div');
							ol.id			= 'overlay-loading';
							ol.innerHTML	= 'Loading&hellip;';
							try {
								oc.replaceChild(ol, ocf);
							} catch(tce) {
								alert('The page could not be shown - please try again.');
							}
						}
					} else {
						addOverlay(
							'overlay-confirm',
							'Your Basket',
							'confirm'
						);
						setCurrentOverlay('confirm');
					}
				}
					
				// completed successfully
				if (ajaxRequest.readyState === 4 && ajaxRequest.status === 200) {
					if (ol_open && current_ol !== 'confirm') {
						setCurrentOverlay('confirm');
						var newsize = getOverlaySizeDefault(previous_ol, current_ol);
						resizeOverlay(newsize.w, newsize.h, ol_transition_time);
					
						setTimeout(function () {
							replaceOverlayLoading(
								'overlay-confirm',
								ajaxRequest.responseText
							);
							checkout_progress_actions();
							setCurrentOverlay('confirm');
						}, ol_transition_time);
					} else {
						replaceOverlayLoading(
							'overlay-confirm',
							ajaxRequest.responseText
						);
						checkout_progress_actions();
						replace_basket_holder();
						setCurrentOverlay('confirm');
					}
					
					trackPageView(url);
				}
					
				// not found
				if (ajaxRequest.readyState === 4 && ajaxRequest.status === 404) {
					alert('The page could not be found.');
				}
			}
		}
	);
};

// load login via AJAX
func_ajax.log_in = function(url) {
	doAjax(
		url,
		'ajaxformat=xhtml',
		function() {	
			var ol_open = document.getElementById('overlay');
			if (ajaxRequest) {
				// loading
				if (ajaxRequest.readyState >= 0 && ajaxRequest.readyState <= 3) {
					if (ol_open) {
						var oc  = document.getElementById('overlay-content');
						var ocw = oc.offsetWidth;
						var och = oc.offsetHeight;
						var ocf = oc.firstChild;
									
						if (ocf.id !== 'overlay-loading') {
							// overlay loading
							var ol			= document.createElement('div');
							ol.id			= 'overlay-loading';
							ol.innerHTML	= 'Loading&hellip;';
							try {
								oc.replaceChild(ol, ocf);
							} catch(tce) {
								alert('The page could not be shown - please try again.');
							}
						}
					} else {
						addOverlay(
							'ol-content',
							'Customer Log In',
							'log_in'
						);
						setCurrentOverlay('log_in');
					}
				}
					
				// completed successfully
				if (ajaxRequest.readyState === 4 && ajaxRequest.status === 200) {
					if (ol_open && current_ol !== 'log_in') {
						setCurrentOverlay('log_in');
						var newsize = getOverlaySizeDefault(previous_ol, current_ol);
						resizeOverlay(newsize.w, newsize.h, ol_transition_time);
					
						setTimeout(function () {
							replaceOverlayLoading(
								'overlay-loaded',
								ajaxRequest.responseText
							);
							//newsletter_btn_action();
							setCurrentOverlay('log_in');
						}, ol_transition_time);
					} else {
						replaceOverlayLoading(
							'overlay-loaded',
							ajaxRequest.responseText
						);
						//newsletter_btn_action();
						setCurrentOverlay('log_in');
					}
					
					trackPageView(url);
				}
					
				// not found
				if (ajaxRequest.readyState === 4 && ajaxRequest.status === 404) {
					alert('The page could not be found.');
				}
			}
		}
	);
};

function init08DBanners696x86(w,h) {
	change08DBanner696x86();
	setInterval(function() {
		change08DBanner696x86();
	}, 7000);
}

function change08DBanner696x86() {
	var rndbanner = banners_696x86[Math.floor(Math.random() * banners_696x86.length)];
	var o8_banner = new SWFObject('/swf/banners/' + rndbanner + '.swf', 'flash_banner_' + rndbanner, '696', '86', '8', '#ffffff');
	o8_banner.addParam('wmode', 'transparent');
	o8_banner.addParam('menu', 'false');
	o8_banner.write('banner-08d-696x86');
}

/**
 * init()
 * initialise JS when DOM loaded (quicker than window.onload for Moz/Webkit/IE/Opera9+)
 * ref: http://dean.edwards.name/weblog/2006/06/again/#comment5338
 **/

function init() {
	if (arguments.callee.done) {
		return;
	}
	
	arguments.callee.done = true;
	
	if (dom_timer) {
		clearInterval(dom_timer);
	}
	
	checkFormFields('login_form'); // this = broken -> TODO
	checkFormFields('account_form');
	setup_res_form();
	
	replace_basket_holder();
	
	// add overlay action to any anchor with a basket link.
	// disabled on 04/09/2009 to check conversions
	/*
	var btn_basket = document.getElementsByTagName('a');
	var btn_basket_url = '';
	for (var b = 0; b < btn_basket.length; b++) {
		btn_basket_url = btn_basket[b].href.replace(window.location.protocol + '//' + window.location.host,'');
		
		if (btn_basket_url.substring(0, 8) === '/basket/' && btn_basket[b].parentNode.id !== 'ckp-numbers') {
			addOpenOverlayEvent(btn_basket[b], 'click');
		}
	}
	*/
	
	// add overlay action to log-in link
	var nav_login = document.getElementById('nav-log-in');
	nav_login = (nav_login) ? nav_login.getElementsByTagName('a')[0] : 0;
	
	if (nav_login) {
		addOpenOverlayEvent(nav_login, 'click');
	}
	
	// close overlay if escape key is pressed.
	addEventListener(document, 'keydown', function(e) {
		e = (e) ? e : window.event;
		
		if (e.keyCode === 27) {
			var ol = document.getElementById('overlay');
			if (ol) {
				removeOverlay();
			}
		}
	}, false);
	
	checkHashUrl();
	setInterval(checkHashChange, 25);
	
	try {
		document.execCommand("BackgroundImageCache", false, true);
	} catch(tce) {
		// do nothing.
	}
	
	// add Flash banners to page using SWFObject.
	if (document.getElementById('swf-call-routing')) {
		var swf_call_routing = new SWFObject("/swf/banners/call-routing.swf", "flash_banner_call_routing", "690", "199", "8", "#ffffff");
		swf_call_routing.addParam("wmode", "transparent");
		swf_call_routing.write('swf-call-routing');
	}
	
	if (document.getElementById('swf-call-whisper')) {
		var swf_call_whisper = new SWFObject("/swf/banners/call-whisper.swf", "flash_banner_call_whisper", "690", "199", "8", "#ffffff");
		swf_call_whisper.addParam("wmode", "transparent");
		swf_call_whisper.write('swf-call-whisper');
	}
	
	if (document.getElementById('swf-ebooks')) {
		var swf_ebook = new SWFObject("/swf/banners/ebook.swf", "flash_banner_ebook", "690", "199", "8", "#ffffff");
		swf_ebook.addParam("wmode", "transparent");
		swf_ebook.write('swf-ebooks');
	}
	
	if (document.getElementById('swf-nongeo')) {
		var swf_nongeo = new SWFObject("/swf/banners/nongeo.swf", "flash_banner_nongeo", "690", "199", "8", "#ffffff");
		swf_nongeo.addParam("wmode", "transparent");
		swf_nongeo.write('swf-nongeo');
	}
	
	if (document.getElementById('swf-fax2bbry')) {
		var swf_fax2bbry = new SWFObject("/swf/banners/fax2bbry.swf", "flash_banner_fax2bbry", "690", "199", "8", "#ffffff");
		swf_fax2bbry.addParam("wmode", "transparent");
		swf_fax2bbry.write('swf-fax2bbry');
	}
	
	if (document.getElementById('banner-08d-696x86')) {
		init08DBanners696x86();
	}
}

if (document.addEventListener) {
	document.addEventListener("DOMContentLoaded", init, false);
}

/*@cc_on @*/
/*@if (@_win32)
	document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
	var script = document.getElementById("__ie_onload");
	script.onreadystatechange = function() {
		if (this.readyState === 'complete') {
			init();
		}
	};
/*@end @*/

if (/WebKit/i.test(navigator.userAgent)) {
	dom_timer = setInterval(function() {
		if (/loaded|complete/.test(document.readyState)) {
			init();
		}
	}, 10);
}

window.onload = init;