﻿var dm = '/';
var bx;
var aLQ = new Array();
var LQ_loaded = false;
var LQ_PostProcess = '';

AddEventListener(window, 'load', LQ_Process);

function LQ(s)//ADD TO LOAD QUEUE
{
	aLQ.push(s);
	if (LQ_loaded == true) { eval(s); }
}

function LQ_Process()
{
	if (aLQ)
	{
		if (aLQ.length > 0)
		{
			for (var ilq = 0; ilq < aLQ.length; ilq++)
			{
				eval(aLQ[ilq]);
			}
		}
	}
	LQ_loaded = true;

	if (LQ_PostProcess.length > 0)
	{
		eval(LQ_PostProcess);
	}
}

function IsIE() { return (navigator.appVersion.indexOf('MSIE ') > -1) ? true : false; }
function IsSafari() { return (navigator.userAgent.toLowerCase().indexOf(' applewebkit/') > -1) ? true : false; }

function bw()
{

	this.ver = navigator.appVersion;
	this.ie = (this.ver.indexOf('MSIE ') > -1) ? true : false;
	this.iever = 0;
	if (this.ie == true)
	{
		if (document.documentMode) // IE8+
		{
			//IE8+
			this.iever = document.documentMode;
		}
		else // IE 5-7
		{
			this.iever = 5; // Assume quirks mode unless proven otherwise
			if (document.compatMode)
			{
				if (document.compatMode == "CSS1Compat")
				{
					this.iever = 7; // standards mode
				}
			}
		}
	}

	this.d = window.document;
	this.dE = this.d.documentElement;
	this.b = this.d.body;

	return this;
}

bw.prototype.ScrollLeft = function ()
{
	return (typeof this.dE.scrollLeft != 'undefined' && this.dE.scrollLeft > 0) ? this.dE.scrollLeft : this.b.scrollLeft;
}

bw.prototype.ScrollTop = function ()
{
	return (typeof this.dE.scrollTop != 'undefined' && this.dE.scrollTop > 0) ? this.dE.scrollTop : this.b.scrollTop;
}

bw.prototype.ScrollHeight = function ()
{
	return (typeof this.dE.scrollHeight != 'undefined' && this.dE.scrollHeight > 0) ? this.dE.scrollHeight : this.b.scrollHeight;
}

bw.prototype.innerHeight = function ()
{
	return (this.ie == true) ? this.dE.clientHeight : window.innerHeight;
}

bw.prototype.innerWidth = function ()
{
	return (this.ie == true) ? this.dE.clientWidth : window.innerWidth;
}

function IsStrictMode(document)
{
	getBX();
	return ('CSS1Compat' == (document.compatMode || (bx.safari ? 'CSS1Compat' : null)));
}

function $(elm) { return document.getElementById(elm); }

function getElm(elm)
{
	if (typeof elm == 'object') { return elm; }
	else { return $(elm); }
}

function getBX()
{
	if (bx) { }
	else { bx = new bw(); }
}

function gv(elm, selected)//GET VALUE
{
	elm = getElm(elm);

	var testselected = true;
	if (selected != null) { testselected = selected; }

	var r;

	switch (elm.type.toLowerCase())
	{
		case 'checkbox':
			r = elm.value;
			if (testselected == true) { r = elm.checked; }
			break;
		case 'radio':
			r = elm.value;
			if (testselected == true)
			{
				try
				{
					for (var ir = 0; ir < elm.form.elements[elm.name].length; ir++)
					{
						if (elm.form.elements[elm.name][ir].checked == true)
						{
							r = elm.form.elements[elm.name][ir].value;
							break;
						}
					}
				}
				catch (rErr) { r = rErr.message; }
			}
			break;
		case 'select-one':
			r = elm.options[elm.selectedIndex].value;
			break;
		case 'select-multiple':
			r = '';
			for (var ism = 0; ism < elm.options.length; ism++)
			{
				if (elm.options[ism].selected == true)
				{
					r += elm.options[ism].value + ',';
				}
			}
			if (r.length > 0)
			{
				r = new String(r);
				r = r.shave(',');
			}
			break;
		default:
			r = elm.value;
	}

	return r;
}

function AddStyleRule(sheet, styleName, styleDict)
{
	//SEE IF THE RULE ALREADY EXISTS
	var bIE = IsIE();
	var bExists = false;
	var iRules = (bIE == true) ? sheet.rules.length : sheet.cssRules.length;
	var r;
	for (var ir = 0; ir < iRules; ir++)
	{
		if (bIE == true) { r = sheet.rules[ir]; }
		else { r = sheet.cssRules[ir]; }

		if (r.selectorText == styleName)
		{
			bExists = true;
			break;
		}
	}

	if (bExists == false)
	{
		var x = typeof styleDict;
		var stylestring = '';
		if (x.toLowerCase() == 'object') { stylestring = ElementStylesString(styleDict); }
		else { stylestring = styleDict; }

		if (bIE == true)
		{
			sheet.addRule(styleName, stylestring);
		}
		else
		{
			sheet.insertRule(styleName + '{' + stylestring + '}', sheet.cssRules.length);
		}
	}
}

function ElementStylesString(styleDict)
{
	var s = '';
	for (var styleName in styleDict)
	{
		s += styleName + ':' + styleDict[styleName] + ';';
	}
	return s;
}

function SetElementStyles(elm, styleDict)
{
	var element = getElm(elm);
	var style = element.style;
	for (var styleName in styleDict)
	{
		style[styleName] = styleDict[styleName];
	}
}

function GetElementStyle(elm, styleName)
{
	var element = getElm(elm);

	if (element.currentStyle) //IE
	{
		return element.currentStyle[styleName]
	}
	else if (document.defaultView && document.defaultView.getComputedStyle) //NON-IE
	{
		return document.defaultView.getComputedStyle(element, '')[styleName]
	}
	else
	{
		return element.style[styleName]
	}
}

function hideElm()
{
	a = hideElm.arguments;
	for (i = 0; i < a.length; i++)
	{
		try { SetElementStyles(getElm(a[i]), { 'display': 'none' }); } catch (e) { }
	}
}

function showElm()
{
	a = showElm.arguments;
	for (i = 0; i < a.length; i++)
	{
		try { SetElementStyles(getElm(a[i]), { 'display': '' }); } catch (e) { }
	}
}

function IsVisible(elm)
{
	var element = getElm(elm);
	return (element.style.display != 'none' && element.style.visibility.toLowerCase() != 'hidden');
}

function AddClassName(elm, cn)
{
	var element = getElm(elm);
	var c = element.className;

	if (c)
	{
		if (c == cn)
		{
			//DO NOTHING
		}
		else
		{
			var s = new String(c);

			if (s.Contains(' ' + cn) == true || s.Contains(cn + ' ') == true || s.Contains(' ' + cn + ' ') == true)
			{
				//DO NOTHING
			}
			else
			{
				if (s.endsWith(' ') == false) { s += ' '; }
				s += cn;
			}

			c = s;
		}
	}
	else { c = cn; }

	element.className = c;
}

function OmitClassName(elm, cn)
{
	var element = getElm(elm);
	var c = new String(element.className);

	if (c)
	{
		if (c.length > 0)
		{
			if (c.Contains(cn) == true)
			{

				if (c == cn)
				{
					element.className = '';
					return;
				}

				if (c.endsWith(' ' + cn) == true)
				{
					element.className = c.substring(0, c.length - cn.length - 1);
					return;
				}

				if (c.startsWith(cn + ' ') == true)
				{
					element.className = c.substring(cn.length + 1, c.length);
					return;
				}

				if (c.Contains(' ' + cn + ' ') == true)
				{
					element.className = c.replace(' ' + cn + ' ', ' ');
					return;
				}

			}
		}
	}
}

function GetAllElementsByTagName(elm, tagName)
{
	var a = new Array();
	var element = getElm(elm);
	if (element && tagName)
	{
		var r = null;

		if (element.getElementsByTagName) { r = element.getElementsByTagName(tagName); }

		if (!r && element.all && element.all.tags) { r = element.all.tags(tagName); }

		if (r.length > 0)
		{
			for (var gaebtn = 0; gaebtn < r.length; gaebtn++)
			{
				if (r[gaebtn].nodeType == 1)
				{
					if (r[gaebtn].tagName.toLowerCase() == tagName.toLowerCase())
					{
						a.push(r[gaebtn]);
					}
				}
			}
		}

	}

	return a;
}

function GetChildElementsByTagName(elm, tagName)
{
	var a = new Array();
	var element = getElm(elm);
	if (element && tagName)
	{
		if (element.childNodes.length > 0)
		{
			for (var gcebtn = 0; gcebtn < element.childNodes.length; gcebtn++)
			{
				if (element.childNodes[gcebtn].nodeType == 1)
				{
					if (element.childNodes[gcebtn].tagName.toLowerCase() == tagName.toLowerCase())
					{
						a.push(element.childNodes[gcebtn]);
					}
				}
			}
		}
	}
	return a;
}

function GetParentByTagName(element, tagName)
{
	var parent = element.parentNode;
	var upperTagName = tagName.toUpperCase();
	while (parent && (parent.tagName.toUpperCase() != upperTagName))
	{
		parent = parent.parentNode ? parent.parentNode : parent.parentElement;
	}
	return parent;
}

function NoNaN(n, dft)
{
	if (isNaN(n) == true)
	{
		return dft;
	}
	return n;
}

function GetDimensions(elm)
{
	var element = getElm(elm);

	if (element == null) { return; }

	this.tOffset = 0;
	this.lOffset = 0;
	this.wOffset = 0;
	this.hOffset = 0;

	this.tBorder = 0;
	this.rBorder = 0;
	this.bBorder = 0;
	this.lBorder = 0;

	this.tPad = 0;
	this.rPad = 0;
	this.bPad = 0;
	this.lPad = 0;

	this.tActual = 0;
	this.lActual = 0;
	this.wActual = 0;
	this.hActual = 0;

	this.tPerceived = 0;
	this.lPerceived = 0;
	this.wPerceived = 0;
	this.hPerceived = 0;

	//	var t = 0;
	//	var l = 0;

	if (element)
	{
		//ACTUALS
		if (element.style)
		{
			if (
					element.style.border
					|| element.style.borderWidth
					|| element.style.borderTopWidth
					|| element.style.borderRightWidth
					|| element.style.borderBottomWidth
					|| element.style.borderLeftWidth
				)
			{
				this.tBorder = NoNaN(parseInt(element.style.borderTopWidth, 10), 0);
				this.rBorder = NoNaN(parseInt(element.style.borderRightWidth, 10), 0);
				this.bBorder = NoNaN(parseInt(element.style.borderBottomWidth, 10), 0);
				this.lBorder = NoNaN(parseInt(element.style.borderLeftWidth, 10), 0);
			}

			if (
					element.style.padding
					|| element.style.paddingTop
					|| element.style.paddingRight
					|| element.style.paddingBottom
					|| element.style.paddingLeft
				)
			{
				this.tPad = NoNaN(parseInt(element.style.paddingTop, 10), 0);
				this.rPad = NoNaN(parseInt(element.style.paddingRight, 10), 0);
				this.bPad = NoNaN(parseInt(element.style.paddingBottom, 10), 0);
				this.lPad = NoNaN(parseInt(element.style.paddingLeft, 10), 0);
			}

			this.tActual = NoNaN(parseInt(element.style.top, 10), 0);
			this.lActual = NoNaN(parseInt(element.style.left, 10), 0);
			this.wActual = NoNaN(parseInt(element.style.width, 10), 0);
			this.hActual = NoNaN(parseInt(element.style.height, 10), 0);
		}

		//DO THE OFFSETS AT THE END
		//		this.hOffset = element.offsetHeight;
		//		this.wOffset = element.offsetWidth;

		//		while (element)
		//		{
		//			l += element.offsetLeft;
		//			t += element.offsetTop;
		//			element = element.offsetParent;
		//		}
		//		this.lOffset = l;
		//		this.tOffset = t;

		//ALTERNATIVE METHOD FOR OFFSETS
		getBX();
		var rect = element.getBoundingClientRect();

		this.hOffset = (rect.bottom - rect.top);
		this.wOffset = (rect.right - rect.left);

		this.lOffset = rect.left + bx.ScrollLeft();
		this.tOffset = rect.top + bx.ScrollTop();

		if (bx.ie == true)
		{
			this.lOffset += (bx.iever >= 8) ? 0 : -2;
			this.tOffset += (bx.iever >= 8) ? 0 : -2;
		}

	}

	//PERCEIVED
	this.tPerceived = this.tOffset + this.tBorder;
	this.lPerceived = this.lOffset + this.lBorder;
	this.wPerceived = this.wOffset - this.lBorder - this.rBorder;
	this.hPerceived = this.hOffset - this.tBorder - this.bBorder;

	this.StringDimensions = ''
	+ 'OFFSET:'
	+ '\nwOffset: ' + this.wOffset
	+ '\nhOffset: ' + this.hOffset
	+ '\ntOffset: ' + this.tOffset
	+ '\nlOffset: ' + this.lOffset
	+ '\nBORDER:'
	+ '\ntBorder: ' + this.tBorder
	+ '\nrBorder: ' + this.rBorder
	+ '\nbBorder: ' + this.bBorder
	+ '\nlBorder: ' + this.lBorder
	+ '\nPADDING:'
	+ '\ntPad: ' + this.tPad
	+ '\nrPad: ' + this.rPad
	+ '\nbPad: ' + this.bPad
	+ '\nlPad: ' + this.lPad
	+ '\nACTUAL:'
	+ '\ntActual: ' + this.tActual
	+ '\nlActual: ' + this.lActual
	+ '\nwActual: ' + this.wActual
	+ '\nhActual: ' + this.hActual
	+ '\nPERCEIVED:'
	+ '\ntPerceived: ' + this.tPerceived
	+ '\nlPerceived: ' + this.lPerceived
	+ '\nwPerceived: ' + this.wPerceived
	+ '\nhPerceived: ' + this.hPerceived;
}

function AddEventListener(elm, eventName, listener)
{
	var element = getElm(elm);
	if (IsIE() == true)
	{
		element.attachEvent('on' + eventName, listener);
	}
	else
	{
		element.addEventListener(eventName, listener, false);
	}
}

function RemoveEventListener(elm, eventName, listener)
{
	var element = getElm(elm);
	if (IsIE() == true)
	{
		element.detachEvent('on' + eventName, listener);
	}
	else
	{
		element.removeEventListener(eventName, listener, false);
	}
}

function UTCNumber()
{
	var d = new Date();
	return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds());
}

function RoundNumber(num, dec)
{
	var result = String(Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec));
	if (result.indexOf('.') < 0) { result += '.'; }
	while (result.length - result.indexOf('.') <= dec) { result += '0'; }
	return result;
}

function FormatGBP(num)
{
	return RoundNumber(num, 2);
}

function PageQuery(q)
{
	if (q.length > 1)
	{
		this.q = q.substring(1, q.length);
	}
	else
	{
		this.q = null;
	}

	this.keyValuePairs = new Array();

	if (q)
	{
		for (var i = 0; i < this.q.split("&").length; i++)
		{
			this.keyValuePairs[i] = this.q.split("&")[i];
		}
	}

	this.getKeyValuePairs = function () { return this.keyValuePairs; }

	this.getValue = function (s)
	{
		for (var j = 0; j < this.keyValuePairs.length; j++)
		{
			if (this.keyValuePairs[j].split("=")[0] == s)
			{
				return this.keyValuePairs[j].split("=")[1];
			}
		}
		return '';
	}

	this.getParameters = function ()
	{
		var a = new Array(this.getLength());
		for (var j = 0; j < this.keyValuePairs.length; j++)
		{
			a[j] = this.keyValuePairs[j].split("=")[0];
		}
		return a;
	}

	this.getLength = function () { return this.keyValuePairs.length; }
}

function QueryString(key)
{
	var page = new PageQuery(window.location.search);
	return unescape(page.getValue(key));
}

/* STRING PROTOTYPES */
String.prototype.lTrim = function ()
{
	return this.replace(/^(\s|\xA0)*/, '');
};
String.prototype.rTrim = function ()
{
	return this.replace(/(\s|\xA0)*$/, '');
};
String.prototype.trim = function ()
{
	return this.rTrim().lTrim();
};
String.prototype.endsWith = function (c)
{
	return this.substr(this.length - c.length) == c;
};
String.prototype.startsWith = function (e)
{
	return this.substr(0, e.length) == e;
};
String.prototype.Contains = function (e)
{
	return this.indexOf(e) >= 0;
};
String.prototype.format = function ()
{
	var s = this;
	var re;
	for (var i = 0; i < arguments.length; i++)
	{
		s = s.replace(new RegExp('\\{' + i + '\\}', 'gi'), arguments[i]);
	}
	return s;
};
String.prototype.shave = function (f)
{
	var s = this;

	if (s.startsWith(f)) { s = s.substring(f.length, s.length); }
	if (s.endsWith(f)) { s = s.substring(0, s.length - f.length); }

	return s;
};

String.prototype.occurrences = function (f)
{
	var s = this;

	var re = new RegExp(f,'g');

	var t = s.replace(re, '');

	return ((s.length - t.length) / f.length);
};
