/*extern ActiveXObject, Node, tr, initDaySelect */
var gClientIsGecko = (window.controllers) ? true : false;
var gClientIsOpera = (window.opera) ? true : false;
var gClientIsIE    = (document.all && !gClientIsOpera) ? true : false;
var gClientIsIE5   = (gClientIsIE && /MSIE 5\.0/.test(navigator.appVersion)) ? true : false;
var gClientIsIE55  = (gClientIsIE && /MSIE 5\.5/.test(navigator.appVersion)) ? true : false;
var gClientIsIE6   = (gClientIsIE && /MSIE 6\.0/.test(navigator.appVersion)) ? true : false;
var gClientIsIE7   = (gClientIsIE && /MSIE 7\.0/.test(navigator.appVersion)) ? true : false;
var gClientIsIElte55 = (gClientIsIE && (gClientIsIE5 || gClientIsIE55 ) && !gClientIsIE7);
var gClientIsIElte6 = (gClientIsIE && (gClientIsIElte55 || gClientIsIE6) && !gClientIsIE7);
var gClientIsMac   = (/Mac/.test(navigator.appVersion)) ? true : false;
//var gClientIsOk    = //???
var booking =
{
	description : 'Our global object-literal namespace.',
	version     : '2.5.1',
	env         : {
		"error" : {}
	},
	ensureNamespaceExists : function (namespaceString)
	{
		if (!booking[namespaceString])
		{
			booking[namespaceString] = {};
		}
	}
};
booking.CSS =
{
	units :
	{
		px : 'px'
	}
};
booking.ensureNamespaceExists('utils');
booking.utils.ie = {};
// Used by IE ≤6 window.onload, window.onresize or hider.ondrag to hide elements such as selects that otherwise render above absolutely positioned elements.
booking.utils.ie.hideIntersectingElements = function (hider, hidees)
{
	// hidees is an array of elements to hide when underneath the hider.
	// Q: what happens when the offsetParent isn’t the whole viewport?
	var
		i,
		hidee;
	hider.offsetBottom = hider.offsetTop + hider.offsetHeight;
	hider.offsetRight = hider.offsetLeft + hider.offsetWidth;
	for (i = 0; i < hidees.length; i++)
	{
		hidee = hidees[i];
		// to-do: test for existence of these?
		hidee.offsetBottom = hidee.offsetTop + hidee.offsetHeight;
		hidee.offsetRight = hidee.offsetLeft + hidee.offsetWidth;
		// Test for hider/hidee rectangle intersection.
		if (hidee.offsetLeft  < hider.offsetRight   &&
			hidee.offsetRight  > hider.offsetLeft    &&
			hidee.offsetTop    < hider.offsetBottom  &&
			hidee.offsetBottom > hider.offsetTop)
		{
			hidee.style.visibility = 'hidden';
		}
		else
		{
			hidee.style.visibility = 'visible';
		}
	}
};
// To-do: adopt json to ajax.
booking.ensureNamespaceExists('ajax');
booking.ajax.Request = function (url, callbackFunction, args)
{
	var request = window.XMLHttpRequest ?
		new XMLHttpRequest() :
		new ActiveXObject("MSXML2.XMLHTTP.3.0");
	request.open("GET", url, true);
	request.onreadystatechange = function ()
	{
		if (request.readyState == 4 && request.status == 200)
		{
			if (request.responseText)
			{
				callbackFunction(request.responseText, args);
			}
		}
	};
	request.send(null);
	return request;
};
booking.ensureNamespaceExists('json');
booking.json.Request = function (url, callbackFunction, args)
{
	var request = new booking.ajax.Request(url, function (responseText, args) {
			callbackFunction(booking.json.validate(responseText), args);
		}, args);
	return request;
};
// Tests JSON content for validity per RFC 4627.
booking.json.validate = function (responseJson)
{
	var result = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(responseJson.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + responseJson + ')');
	return result;
};
booking.ensureNamespaceExists('event');
// Add an event listener using the available method, either DOM 2 Event’s addEventListener or IE’s attachEvent.
booking.event.addListener = function (element, event, handler)
{
	if (element)
	{
		if (element.addEventListener)
		{
			element.addEventListener(event, handler, false);
		}
		else
		{
			if (element.attachEvent)
			{
				element.attachEvent('on' + event, handler);
			}
			else
			{
				element['on' + event] = handler;
			}
		}
	}
};
booking.event.removeListener = function (element, event, handler)
{
	if (element)
	{
		if (element.removeEventListener)
		{
			element.removeEventListener(event, handler, false);
		}
		else
		{
			if (element.detachEvent)
			{
				element.detachEvent('on' + event, handler);
			}
			else
			{
				element['on' + event] = '';
			}
		}
	}
};
// Ensures event objects resemble standard DOM 2 Event objects in IE, which lacks support for this standard.
booking.event.preventDefault = function (eventObject)
{
	if (eventObject.preventDefault)
	{
		eventObject.preventDefault();
	}
	else
	{
		eventObject.returnValue = false;
	}
};

booking.event.stopPropagation = function (eventObject)
{
	if (eventObject.stopPropagation)
	{
		eventObject.stopPropagation();
	}
	else
	{
		eventObject.cancelBubble = true;
	}
};

booking.event.ie = {
	PreventDefault : function ( eventObject )
	{
		return function () { eventObject.returnValue = false; };
	},
	StopPropagation : function ( eventObject )
	{
		return function () { eventObject.cancelBubble = true; };
	}
};

booking.event.normalizeExplorerEventObject = function (eventObject)
{
	if (!eventObject)
	{
		eventObject = window.event ? window.event : '';
	}
	if (eventObject)
	{
		if (!eventObject.currentTarget)
		{
			eventObject.currentTarget = eventObject.srcElement;
		}
		if (!eventObject.target)
		{
			eventObject.target = eventObject.srcElement;
		}
		if (!eventObject.stopPropagation)
		{
			eventObject.stopPropagation = new booking.event.ie.PreventDefault( eventObject );
		}
		if (!eventObject.preventDefault)
		{
			eventObject.preventDefault = new booking.event.ie.StopPropagation( eventObject );
		}
	}
	return eventObject;
};
if (!window.Node)
{
	var Node =
	{
		ELEMENT_NODE : 1,
		ATTRIBUTE_NODE : 2,
		TEXT_NODE : 3,
		COMMENT_NODE : 8,
		DOCUMENT_NODE : 9,
		DOCUMENT_FRAGMENT_NODE : 11
	};
}
booking.utils.buildHtmlNode = function (elementsObject, targetNode, refChild)
{
	/*
	Accepts an object of elements where the key specifies the tagname unless prefixed by @, in which case it specifies an attribute of the parent, or when it is #cdata, in which case it specifies a CDATA child.
	
	http://xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html
	
	The big flaw now is the case <a><b/><c/><b/><a/>, which cannot be represented as a JS object. In that case interject an array of generic div or span elements.
	*/
	// If we want to validate as JSON, we must make sure what we pass in is JSON, which it presently isn’t.
	//elementsObject = booking.json.validate(elementsObject);
	var
		key,
		counter,
		found,
		newElement,
		newNode;
	for (key in elementsObject)
	{
		if (elementsObject.hasOwnProperty(key))
		{
			var
				prefix = key.substring(0, 1),
				primaryKey = key.substring(1);
			if (prefix != '_') // We’re on a non-DOM key, so skip.
			{
				if (prefix == '@') // Attribute
				{
					if (!targetNode.getAttribute(primaryKey))
					{
						// Perhaps extend this in the future to support multiple class values.
						booking.utils.dom.setAttribute(targetNode, primaryKey, elementsObject[key]);
					}
				}
				else
				{
					if (prefix == '#') // Text or CDATA
					{
						if (primaryKey == 'text') // Text
						{
							found = false;
							if (targetNode.childNodes && targetNode.childNodes.length > 0)
							{
								// Traverse text node children and append only if it isn’t already there.
								counter = 0;
								while (counter < targetNode.childNodes.length && !found)
								{
									if (targetNode.childNodes[counter].nodeType == Node.TEXT_NODE && targetNode.childNodes[counter].nodeValue == elementsObject[key])
									{
										found = true;
									}
									counter++;
								}
							}
							if (!found)
							{
								newNode = document.createTextNode(elementsObject[key]);
								if (refChild)
								{
									targetNode.insertBefore(
										newNode,
										refChild);
								}
								else
								{
									targetNode.appendChild(
										newNode);
								}
							}
						}
						else
						{
							if (primaryKey == 'cdata') // CDATA
							{
								targetNode.appendChild(document.createCDATANode(elementsObject[key]));
							}
						}
					}
					else // Element
					{
						// If targetNode was passed into this function, append the new child to it…
						if (targetNode)
						{
							// If elementsObject[key] is an array, we’ll create an element of type key for each array member.
							if (elementsObject[key].length > 0)
							{
								for (counter = 0; counter < elementsObject[key].length; counter++)
								{
									if (elementsObject[key][counter])
									{
										if (!elementsObject[key][counter]._node)
										{
											newElement = document.createElement(key);
											elementsObject[key][counter]._node = newElement;
											var r = counter + 1;
											while (r < elementsObject[key].length && !refChild)
											{
												if (elementsObject[key][r])
												{
													refChild = elementsObject[key][r]._node;
												}
												r++;
											}
											if (refChild)
											{
												newNode = targetNode.insertBefore(
													elementsObject[key][counter]._node,
													refChild);
											}
											else
											{
												newNode = targetNode.appendChild(
													elementsObject[key][counter]._node);
											}
											arguments.callee(
												elementsObject[key][counter],
												newNode);
											newElement._elementTree = elementsObject[key][counter];
										}
										else
										{
											arguments.callee(
												elementsObject[key][counter],
												elementsObject[key][counter]._node);
										}
									}
								}
							}
							else
							{
								if (elementsObject[key].length !== 0)
								{
									if (!elementsObject[key]._node)
									{
										newElement = document.createElement(key);
										elementsObject[key]._node = newElement;
										if (refChild)
										{
											newNode = targetNode.insertBefore(
												elementsObject[key]._node,
												refChild);
										}
										else
										{
											newNode = targetNode.appendChild(
												elementsObject[key]._node);
										}
										arguments.callee(
											elementsObject[key],
											newNode);
										newElement._elementTree = elementsObject;
									}
									else
									{
										arguments.callee(
											elementsObject[key],
											elementsObject[key]._node);
									}
								}
							}
						}
						// …else create the new element as targetNode.
						else
						{
							if (!elementsObject[key]._node)
							{
								arguments.callee(elementsObject[key],
									elementsObject[key]._node = targetNode = document.createElement(key));
							}
							else
							{
								arguments.callee(elementsObject[key],
									elementsObject[key]._node);
							}
						}
					}
				}
			}
		}
	}
	return targetNode;
};
booking.utils.hasClass = function (ele, cls)
{
	return ele.className ? ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) : false;
};
booking.utils.addClass = function (ele, cls)
{
	if (!booking.utils.hasClass(ele, cls))
	{
		ele.className += (" " + cls);
	}
};
booking.utils.removeClass = function (ele, cls)
{
	if (booking.utils.hasClass(ele, cls))
	{
		var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
		ele.className = ele.className.replace(reg, ' ');
	}
};
booking.utils.dom = {
	getElementsByClassName : function (searchClass, parentNode, tagName)
	{
		var
			classElements = [],
			candidateElements,
			i;
		if ( !parentNode )
		{
			parentNode = document;
		}
		// Utilize the new native document.getElementsByClassName methods of Mozilla 2 and WebKit 3 if available;
		if ( parentNode == document && document.getElementsByClassName )
		{
			classElements = document.getElementsByClassName(searchClass);
		}
		// Otherwise use the old ways.
		else
		{
			if ( !tagName )
			{
				tagName = '*';
			}
			candidateElements = ( gClientIsIElte55 && tagName == '*' ) ? parentNode.all : parentNode.getElementsByTagName(tagName);
			for (i = 0; i < candidateElements.length; i++)
			{
				if ( booking.utils.hasClass(candidateElements[i], searchClass) )
				{
					classElements.push(candidateElements[i]);
				}
			}
		}
		return classElements;
	},
	setAttribute : function (targetNode, attributeName, attributeValue)
	{
		if (attributeName == 'class')
		{
			targetNode.className = attributeValue;
		}
		else
		{
			targetNode.setAttribute(attributeName, attributeValue);
		}
	}
};
function printDoc()
{
	if (window.print)
	{
		 window.print();
	}
	else
	{
		alert(tr.pressCltP);
	}
}
function bookmark (url, description)
{
	if (window.external)
	{
		window.external.AddFavorite(url,description);
	}
	else
	{
		alert(tr.pressCtlD);
	}
}
function hideFrameContainer (container, frame, busyUrl)
{
	if (document.getElementById)
	{
		var c = document.getElementById(container);
		var f = document.getElementById(frame);
		c.style.display = "none";
	}
}
function tickCheckBox(el)
{
	if (document.getElementById)
	{
		if (document.getElementById(el))
		{
			document.getElementById(el).checked = true;
		}
	}
	return true;
}
function hideDiv (div)
{
	if (document.getElementById)
	{
		var c = document.getElementById(div);
		c.style.display="none";
	}
}
var hide = true;
function getBrowserWidth()
{
	var w = 0;
	if (typeof(window.innerWidth) == 'number')
	{
		//Non-IE
		w = window.innerWidth;
	}
	else
	{
		if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight))
		{
			//IE 6+ in 'standards compliant mode'
			w = document.documentElement.clientWidth;
		}
		else
		{
			if (document.body && (document.body.clientWidth || document.body.clientHeight))
			{
				//IE 4 compatible
				w = document.body.clientWidth;
			}
		}
	}
	return w;
}
function getBrowserHeight()
{
	var h = 0;
	if (typeof(window.innerWidth) == 'number')
	{
		h = window.innerHeight;
	}
	else
	{
		if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight))
		{
			h = document.documentElement.clientHeight;
		}
		else
		{
			if (document.body && (document.body.clientWidth || document.body.clientHeight))
			{
				//IE 4 compatible
				h = document.body.clientHeight;
			}
		}
	}
	return h;
}
function showBlock(el)
{
	if (document.getElementById)
	{
		document.getElementById(el).style.display = 'block';
	}
}
function toggleTxt(ulist, spanAll, spanTop)
{
	var
		ulBlock = document.getElementById(ulist),
		ulBlockDisplay = ulBlock.style.display,
		txtAll = document.getElementById(spanAll),
		txtTop = document.getElementById(spanTop);
	if (ulBlockDisplay == "none")
	{
		txtAll.style.display = "none";
		txtTop.style.display = "inline";
	}
	else
	{
		txtAll.style.display = "inline";
		txtTop.style.display = "none";
	}
}
// Basic event handling
function addListener (elm, event, handler)
{
	if (elm.addEventListener)
	{
		elm.addEventListener(event, handler, false);
	}
	else
	{
		if (elm.attachEvent)
		{
			elm.attachEvent('on' + event, handler);
		}
		else
		{
			elm['on' + event] = handler;
		}
	}
}
function removeListener (elm, event, handler)
{
	if (elm.removeEventListener)
	{
		elm.removeEventListener(event, handler, false);
	}
	else
	{
		if (elm.detachEvent)
		{
			elm.detachEvent('on'+event, handler);
		}
	}
}
var DOM =
{
	isParentOf : function (parentElm, contextElm)
	{
		while (contextElm && (contextElm != parentElm))
		{
			contextElm = contextElm.parentNode;
		}
		return (contextElm == parentElm);
	},
	getParentOrSelf : function (contextElm, nodeName)
	{
		nodeName = nodeName.toLowerCase();
		while (contextElm.nodeName.toLowerCase() != nodeName && contextElm.parentNode)
		{
			contextElm = contextElm.parentNode;
		}
		return contextElm;
	},
	addClass : function (elm, className)
	{
		elm.className += ' ' + className;
	},
	removeClass : function (elm, className)
	{
		var classMatch = new RegExp('\\b' + className + '\\b', 'g');
		if (classMatch.test(elm.className))
		{
			elm.className = elm.className.replace(classMatch, ' ');
		}
	}	
};
// Onload function
function fixMail()
{
	var
		classMatch = /\bencrypted\b/,
		mailMatch = /^mailto:(.*)$/,
		links = document.getElementsByTagName('a'),
		i,
		j,
		address,
		text,
		spans;
	for (i = 0, j = links.length; i < j; i++)
	{
		if (classMatch.test(links[i].className) && mailMatch.test(links[i].href))
		{
			links[i].className = links[i].className.replace(classMatch, '');
			address = mailMatch.exec(links[i].href)[1];
			text = links[i].innerText || links[i].textContent;
			links[i].href = 'mailto:' + address.deCode();
			if (text == address)
			{
				links[i].innerHTML = text.deCode();
			}
		}
	}
	spans = document.getElementsByTagName('span');
	for (i = 0, j = spans.length; i < j; i++)
	{
		if (classMatch.test(spans[i].className))
		{
			spans[i].className = spans[i].className.replace(classMatch, '');
			text = spans[i].innerText || spans[i].textContent;
			spans[i].innerHTML = text.deCode();
		}
	}
}
function _init()
{
	if (!booking.windowLoadDone)
	{
		fixMail();
		if (window.initDaySelect)
		{
			initDaySelect();
		}
		// Prevent this function from being executed twice; for some reason a D2E load event listener on the window object is dispatched twice.
		booking.windowLoadDone = true;
	}
}
addListener(window, 'load', _init);
// Array functions for IE5
if (!Array.prototype.pop)
{
	Array.prototype.pop = function ()
	{
		var item;
		if (this.length > 0)
		{
			item = this[this.length - 1];
			this.length--;
		}
		return item;
	};
}
if (!Array.prototype.push)
{
	Array.prototype.push = function ()
	{
		var start = this.length;
		for (var i = 0; i < arguments.length; i++)
		{
			this[start + i] = arguments[i];
		}
		return this.length;
	};
}
if (!Array.prototype.shift)
{
	Array.prototype.shift = function ()
	{
		var item = this[0];
		if (item)
		{
			this.splice(0, 1);
		}
		return item;
	};
}
if (!Array.prototype.unshift)
{
	Array.prototype.unshift = function ()
	{
		this.reverse();
		for (var i = arguments.length-1; i >= 0; i--)
		{
			this[this.length] = arguments[i];
		}
		this.reverse();
		return this.length;
	};
}
// Number functions for IE5
if (!Number.prototype.toFixed)
{
	Number.prototype.toFixed = function (dc)
	{
		dc = (typeof(dc) == 'number') ? dc : 0;
		return eval('Math.round(this * 1e' + dc + ') / 1e' + dc);
	};
}
function hideEl (hideeIdAttributeValue)
{
	var hidee;
	if (document.getElementById)
	{
		hidee = document.getElementById(hideeIdAttributeValue);
		// If the browser supports getElementById and the element exists,
		if (hidee !== null)
		{
			// If the element is not already display:none,
			if (hidee.style.display !== 'none')
			{
				// Set it to display:none.
				hidee.style.display = 'none';
			}
		}
	}
	return hidee;
}
function showEl (showeeIdAttributeValue)
{
	var showee;
	if (document.getElementById)
	{
		showee = document.getElementById(showeeIdAttributeValue);
		// If the browser supports getElementById and the element exists,
		if (showee !== null)
		{
			// If the element is not already display:block,
			if (showee.style.display !== 'block')
			{
				// Set it to display:block.
				showee.style.display = 'block';
			}
		}
	}
	return showee;
}
function showPhoto (imageSrcAttributeValue, imageContainerAttributeValue, imageWidthMax300, imageHeightMax300)
{
   var imageContainer;
	if (document.getElementById)
	{
		var
			i,
			image;
		imageContainer = document.getElementById(imageContainerAttributeValue);
		for (i = imageContainer.childNodes.length - 1; i >= 0; i--)
		{
			imageContainer.removeChild(imageContainer.childNodes[i]);
		}
		image =
		{
			"img" :
			{
				"@alt" : ""
			}
		};
		if (imageWidthMax300)
		{
			image.img["@width"] = imageWidthMax300;
		}
		if (imageHeightMax300)
		{
			image.img["@height"] = imageHeightMax300;
		}
		if (imageContainer.style.display !== "block")
		{
			image.img["@src"] = imageSrcAttributeValue;
		}
		else
		{
			image.img["@src"] = tr.icons + '/transparent.gif';
			imageContainer.style.display = "none";
		}
		booking.utils.buildHtmlNode(image, imageContainer);
	}
	return false;
}

function showFrameContainer (el, container, frame, url, width, height, xOffset, yOffset, busyUrl){
	    if (document.getElementById){
        var e = document.getElementById(el);
        var c = document.getElementById(container);
        var f = document.getElementById(frame);
        if (c.style.display == "block"){
            c.style.display="none";
			return false;
        }
        if (f.src != url) f.src=url;
		// make invisible and set display to block
		// so that we may measure the element
		c.style.visibility = 'hidden';
		c.style.display = 'block';
		var box = getDimensions(e);
		var left = box.x, top = box.y;
		if(xOffset) left += xOffset;
		if(yOffset) top += yOffset;
		if(!width) width = c.offsetWidth;
		var bodywidth = document.getElementById('bodyconstraint').offsetWidth;
		if((left+width) > bodywidth) left = (bodywidth - width - 40);
        c.style.left = left+'px';
        c.style.top = top+'px';
		c.style.visibility = 'visible';
        return false;
    } else {
        window.open(url);
    }
}
function openCurrencyConverter(obj, amount, currency) {
    if (document.getElementById) {
        document.getElementById("amount").value = amount;
        document.getElementById("sourceCurrency").value = currency;
		document.getElementById("currencyResults").style.display = 'none';
        positionObj(obj, 'currencyConverter');
		document.getElementById('currencyConverter').style.display = 'block';
    }
}
function calculateCurrency () {
    if (document.getElementById) {
        var a = document.getElementById("amount").value;
        var sc = currencydb[document.getElementById("sourceCurrency").value];
        var sd = currencydb[document.getElementById("destinationCurrency").value];
        var da = Math.round(100 * a * (sd.val / sc.val)) / 100;
        document.getElementById("displayCurrencyResults").innerHTML = sc.symbol +" "+a+" = " + sd.symbol + " " + da;
		document.getElementById('currencyResults').style.display = "block";
        return false;
    }
}
function closeCurrencyConverter() {
    if (document.getElementById) {
        document.getElementById('displayCurrencyResults').innerHTML = "";
		document.getElementById('currencyResults').style.display = "none";
        document.getElementById('currencyConverter').style.display = "none";
        // return false;
    }
}
function showDiv (el, div, alignX, alignY) {
	// (i) popups etc
	if (document.getElementById){
    	var i = document.getElementById(el);
		var c = document.getElementById(div);
        if (c.style.display != "block"){
			
			//var l=0; var t=0;
            //aTag = i;
            //do {
            //    aTag = aTag.offsetParent;
            //    l += aTag.offsetLeft;
            //    t += aTag.offsetTop;
			//} while (aTag.offsetParent && aTag.tagName != 'BODY');
	        //var left =  i.offsetLeft + l;
    	    //var top = i.offsetTop + t + i.offsetHeight + 2;
			var box = getDimensions(i);
			var left = box.x, top = box.y;
			//if (alignX == 'left' && c.style.width){
			//	left = left - parseInt(c.style.width);
			//}
			//if (alignY == 'top' && c.style.height){
			//	top = top - parseInt(c.style.height) -25;
			//}
			c.style.visibility = 'hidden'; // Needed to measure
			c.style.display = "block";     // Needed to measure
			if(alignX == 'left')
				left -= c.offsetWidth;
			else
				left += i.offsetWidth;
			if(alignY == 'top')
				top -= c.offsetHeight;
			else
				top += i.offsetHeight;
			if(top<10)
				top = 10;
			// XXX: Don't know why IE5 needs this here and not for calendar
			if(gClientIsIE5) {
				left += document.body.scrollLeft;
				top += document.body.scrollTop;
			}
        	c.style.left = left+'px';
	        c.style.top = top+'px';
			c.style.visibility = 'visible';
		} else {
			c.style.display="none";
		}
	}
}
//after a function to hide and another one to show, a simple toggle
function itemToggle(obj) {
	var el = document.getElementById(obj);
	el.style.display = (el.style.display != 'none' ? 'none' : '' );
}

function positionObj (p, el){
	// calendar
	//alert('positionObj');
	if (document.getElementById){
		var e = document.getElementById(el);
        var bw = getBrowserWidth();
		//var l=0; var t=0;
		//aTag = p;
		//do {
		//	aTag = aTag.offsetParent;
		//	l += aTag.offsetLeft;
		//	t += aTag.offsetTop;
		//} while (aTag.offsetParent && aTag.tagName != 'BODY');
		//var left =  p.offsetLeft + l;
		var box = getDimensions(p);
		var left = box.x, top = box.y;
		// this should be replaced by something generic.
		// for some reason e.style.width is emptly, so
		// i cannot read the width of this element
		// XXX, Hakan: e.style.width is unsafe. Use e.offsetWidth
		// instead, and make sure the element is not set to display: none
		//var width = 300;
		e.style.visibility = 'hidden';
		e.style.display = 'block';
		if ((left + e.offsetWidth) > bw){
			left = (bw - e.offsetWidth - 30);
		}
		var x = document.getElementById('bodyconstraint').offsetLeft;
		left -= x;
		e.style.display = 'none';
		e.style.visibility = 'visible';
		//var top = p.offsetTop + t + p.offsetHeight + 2;
		e.style.left = left+'px';
		e.style.top = top+'px';
	}
}
function displayArrow(ulist, image) {
    var ulBlock = document.getElementById(ulist);
    var ulBlockDisplay = ulBlock.style.display;
    var arrowImg = document.getElementById(image);
    if (ulBlockDisplay == "none") {
        arrowImg.style.backgroundPosition = "0 -11px";
    }
    else {
        arrowImg.style.backgroundPosition = "left top";
    }
}
function sSc(q, bar, score){
    if (document.getElementById){
		// we don't use this global scores bar anymore and this bit is troublesome
        // document.getElementById('rbar_'+q).style.backgroundPosition= bar + 'px 0';
        document.getElementById('rsc_' + q).innerHTML=score;
    }
}
function sSc2(nr, el){
    if (document.getElementById){
        document.getElementById('rnr').innerHTML=nr;
        for ( var i = -1; i < 10; i++ ) {
            var l = document.getElementById('rl' + i);
            if (l) {
                l.style.color='';
                l.style.textDecoration='underline';
            }
        }
        el.style.color='#003580';
        el.style.textDecoration='none';
        el.blur();
    }
}
function fixBanner() {
}
// Getting element dimensions
function getDimensions( elm ) {
	var box = { x:0, y:0, w:0, h:0 };
	if(document.getBoxObjectFor) {
		var boxRef = document.getBoxObjectFor(elm);
		box.x = boxRef.x;
		box.y = boxRef.y;
		box.w = boxRef.width;
		box.h = boxRef.height;
	}
	else if(elm.getBoundingClientRect) {
		var rxIE50 = /MSIE 5\.0/g;
		//alert(rxIE50 + '.test("' + navigator.appVersion + '" = ' + rxIE50.test(navigator.appVersion));
		var boxRef = elm.getBoundingClientRect();
		box.x = boxRef.left;
		box.y = boxRef.top;
		box.w = (boxRef.right - boxRef.left);
		box.h = (boxRef.bottom - boxRef.top);
		//var s='';for(p in boxRef) s+=p+'    '; alert(s);
		// Damn IE...
		if(document.compatMode && document.compatMode != 'BackCompat') {
			// IE6/compliance mode
			box.x += document.documentElement.scrollLeft - 2;
			box.y += document.documentElement.scrollTop - 2;
		}
		else if(!gClientIsIE5) {
			// IE5.5
			box.x += document.body.scrollLeft - 2;
			box.y += document.body.scrollTop - 2;
		}
	}
	else {
		// No known box information available, walking
		// manually through offsetParents to calculate x/y coordinates
		box.w = elm.offsetWidth;
		box.h = elm.offsetHeight;
		while(elm) {
			box.x += elm.offsetLeft;
			box.y += elm.offsetTop;
			if(elm.offsetParent) // Required for Safari 1.3 :(
				elm = elm.offsetParent;
			else
				break;
		}
	}
	var cc;
	if(cc = document.getElementById('bodyconstraint'))
		box.x -= cc.offsetLeft;
	return box;
}
String.prototype.deCode = function() {
	return this.replace(/[a-zA-Z]/g, function(c){
		return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);
	});
};
Date.prototype.getTwoDigitMonth = function ()
{
	// Returns a two-digit string from '01' to '12' representing the month property of a Date object.
	var month = (this.getMonth() + 1).toFixed().toString();
	if (month.length == 1)
	{
		month = '0' + month;
	}
	return month;
};
Date.prototype.MILLISECONDS_PER_DAY = 86400000;

