/*
	$Id: script.js,v 1.3 2006-09-20 10:36:57 jowers Exp $
	Copyright (c) 2005 Orbis Technology Ltd. All rights reserved.
*/

var cgiURL          = null;
var cgiSSLURL       = null;
var gifURL          = null;
var staticURL       = null;
var tocMinus        = null;
var tocPlus         = null;
var invalidStr      = null;
var loginUid        = null;
var betSlipName     = null;

var isBetSlip       = false;
var isLoggedIn      = false;



/**********************************************************************
 * DOM Utilities
 *********************************************************************/

// sniff out problem browsers
function SniffBrowser() {

	this.ns4 = document.layers;
	this.op5 = navigator.userAgent.indexOf("Opera 5") != -1 ||
	           navigator.userAgent.indexOf("Opera/5") != -1;
	this.op6 = navigator.userAgent.indexOf("Opera 6") != -1 ||
	           navigator.userAgent.indexOf("Opera/6") != -1;
	this.op8 = navigator.userAgent.indexOf("Opera 8") != -1;
	this.op  = this.op5 || this.op6 || this.op8;
	this.agt = navigator.userAgent.toLowerCase();
	this.mac = this.agt.indexOf("mac") != -1;
	this.ie  = this.agt.indexOf("msie") != -1;
	this.mac_ie = this.mac && this.ie;
	this.ffox = this.agt.indexOf("firefox") != -1;
}
var browser = new SniffBrowser();



// ie specific APIs...
if(!browser.ie) {

	// swap node
	Node.prototype.swapNode = function(node) {

		var nextSibling = this.nextSibling;
		var parentNode = this.parentNode;

		node.parentNode.replaceChild(this, node);
		parentNode.insertBefore(node, this);
	}


	// remove node
	Node.prototype.removeNode = function() {

		this.parentNode.removeChild(this);
	}
}



// get window inner height
function getWindowInnerHeight() {
	return browser.ie ? document.body.clientHeight : window.innerHeight;
}



// get window inner width
function getWindowInnerWidth() {
	return browser.ie ? document.body.clientWidth : window.innerWidth;
}



// get object for the different types of browsers
function getObject(objectId) {

	if(objectId == null || typeof objectId == 'undefined') {
		return null;
	}
	if(document.getElementById && document.getElementById(objectId)) {
		return document.getElementById(objectId);
	}
	if(document.all && document.all(objectId)) {
		return document.all(objectId);
	}
	if(document.layers && document.layers[objectId]) {
		return getObjNN4(document, objectId);
	}

	return null;
}



// get the style object for the different types of browsers
function getStyleObject(objectId) {

	if(objectId == null || typeof objectId == 'undefined') {
		return null;
	}
	if(document.getElementById && document.getElementById(objectId)) {
		return document.getElementById(objectId).style;
	}
	if(document.all && document.all(objectId)) {
		return document.all(objectId).style;
	}
	if(document.layers && document.layers[objectId]) {
		return getObjNN4(document, objectId);
	}

	return false;
}



// find an object (NS4 only)
function getObjNN4(obj, name) {

	var x = obj.layers;
	var foundLayer;

	for(var i=0; i < x.length; i++) {
		if(x[i].id == name) {
			foundLayer = x[i];
		}
		else if(x[i].layers.length) {
			var tmp = getObjNN4(x[i], name);
		}
		if(tmp) {
			foundLayer = tmp;
		}
	}

	return foundLayer;
}



// change style class of an element
function changeClass(Elem, Class) {

	var elem;

	if(Elem == null || typeof Elem == 'undefined') {
		return;
	}
	if(document.getElementById) {
		elem = document.getElementById(Elem);
	}
	else if(document.all){
		elem = document.all[Elem];
	}
	if(browser.op5 || browser.op6) {
		elem.style.className = Class;
	}
	else {
		elem.className = Class;
	}
}



// hide or show a page element
function changeObjectDisplay(objectId, newDisplay) {

	var styleObject = getStyleObject(objectId, document);
	if(styleObject != null) {
		styleObject.display = newDisplay;
		return true;
	}

	return false;
}



// hide or show a page element
function changeObjectVisibility(objectId, newVisibility) {

	var styleObject = getStyleObject(objectId, document);
	if(styleObject != null) {
		styleObject.visibility = newVisibility;
		return true;
	}

	return false;
}



// get the Y co-ordinate of an element
function getElementTop(Elem, offsetParent) {

	var elem, yPos, tempEl;

	if(Elem == null || typeof Elem == 'undefined') {
		return 0;
	}

	if(browser.ns4) {
		elem = getObjNN4(document, Elem);
		return elem.pageY;
	}

	if(document.getElementById) {
		elem = document.getElementById(Elem);
	} else if (document.all) {
		elem = document.all[Elem];
	}
	yPos = elem.offsetTop;
	tempEl = elem.offsetParent;
	while((typeof offsetParent == 'undefined' || offsetParent) &&
	        tempEl != null) {
		yPos += tempEl.offsetTop;
		tempEl = tempEl.offsetParent;
	}
	return yPos;
}



// get the X co-ordinate of an element
function getElementLeft(Elem, offsetParent) {

	var elem, xPos, tempEl;

	if(Elem == null || typeof Elem == 'undefined') {
		return;
	}

	if(browser.ns4) {
		elem = getObjNN4(document, Elem);
		return elem.pageX;
	}

	if(document.getElementById) {
		elem = document.getElementById(Elem);
	} else if (document.all){
		elem = document.all[Elem];
	}
	xPos = elem.offsetLeft;
	tempEl = elem.offsetParent;
	while((typeof offsetParent == 'undefined' || offsetParent) &&
	        tempEl != null) {
		xPos += tempEl.offsetLeft;
		tempEl = tempEl.offsetParent;
	}

	return xPos;
}



// get an element's width
function getElementWidth(Elem) {

	var elem, xPos;

	if(Elem == null || typeof Elem == 'undefined') {
		return;
	}

	if(browser.ns4) {
		elem = getObjNN4(document, Elem);
		return elem.clip.width;
	}

	if(document.getElementById) {
		elem = document.getElementById(Elem);
	} else if(document.all) {
		elem = document.all[Elem];
	}

	if(browser.op5) {
		xPos = elem.style.pixelWidth;
	}
	else {
		xPos = elem.offsetWidth;
	}

	return xPos;
}



// get an element's height
function getElementHeight(Elem) {

	var elem, xPos;

	if(Elem == null || typeof Elem == 'undefined') {
		return;
	}

	if(browser.ns4) {
		elem = getObjNN4(document, Elem);
		return elem.clip.height;
	}

	if(document.getElementById) {
		elem = document.getElementById(Elem);
	} else if (document.all) {
		elem = document.all[Elem];
	}

	if(browser.op5) {
		xPos = elem.style.pixelHeight;
	} else {
		xPos = elem.offsetHeight;
	}

	return xPos;
}



// change the background of an element
function changeBGColour(Object, colour) {

	if(browser.ns4) {
		var obj = getObjNN4(document, Object);
		obj.bgColor=colour;
	} else {
		var obj = getStyleObject(Object);
		if(obj != null && browser.op5) {
			obj.background = colour;
		}
		else if(obj != null) {
			obj.backgroundColor = colour;
		}
	}
}



// change an image source
function changeImage(target, source) {

	var imageObj;

	if(browser.ns4) {
		imageObj = getImage(target);
		if(imageObj != null) {
			imageObj.src = eval(source).src;
		}
	} else {
		imageObj = eval('document.images.' + target);
		if(imageObj != null) {
			imageObj.src = eval(source).src;
		}
	}
}



// get an image (NS4 only)
function getImage(name) {

	if(document.layers) {
		return findImage(name, document);
	}
	return null;
}



// find an image (NS4 only)
function findImage(name, doc) {

	var i, img;

	for(i = 0; i < doc.images.length; i++) {
		if(doc.images[i].name == name) {
			return doc.images[i];
		}
	}
	for(i = 0; i < doc.layers.length; i++) {
		if((img = findImage(name, doc.layers[i].document)) != null) {
			img.container = doc.layers[i];
			return img;
		}
	}

	return null;
}



// move an element to a new set of X + Y co-ordinates
function moveXY(Obj, x, y) {

	var obj = getStyleObject(Obj)

	if(obj == null) {
		return;
	}

	if(browser.ns4) {
		obj.top = y;
		obj.left = x;
	}
	else if(browser.op5) {
		obj.pixelTop = y;
		obj.pixelLeft = x;
	}
	else {
		obj.top = y;
		obj.left = x;
	}
}



// Add a form variable
function insertInputObj(form, type, id, name, value) {

	var doc = form.ownerDocument;

	if(browser.ie){
		inputObj = doc.createElement("<input name='" + name + "'>");
	} else {
		inputObj = doc.createElement("input");
		inputObj.name = name;
	}

	inputObj.type  = type;
	inputObj.id    = id;
	inputObj.value = value;

	form.appendChild(inputObj);
}



// get the X co-ordinate of an image
function getImageLeft(img) {

	if(document.layers) {
		var m = getImage(img);
		if(m.container != null) {
			return m.container.pageX + m.x;
		}
		return m.x;
	}

	return getElementLeft(img);
}



// get the Y co-ordinate of an image
function getImageTop(img) {

	if(document.layers) {
		var m = getImage(img);
		if(m.container != img) {
			return m.container.pageY + m.y;
		}
		return m.y;
	}

	return getElementTop(img);
}



// get image width
function getImageWidth(img) {

	if(document.layers) {
		var m = getImage(img);
		return m.width;
	}

	return getElementWidth(img);
}



// get image height
function getImageHeight(img) {

	if(document.layers) {
		var m = getImage(img);
		return m.height;
	}

	return getElementHeight(img);
}



/**********************************************************************
 * Table Utilties
 *********************************************************************/

/*
 * Loads up the customer menu preferences; determining whether or
 * not particular menu tables specified by parameter 'name' should
 * should be expanded/collapsed
 */
function loadCustMenuPrefs(name, default_value) {

	var displayExpandedTable = getCookie ("expanded_" + name);

	if (displayExpandedTable == null) {
		displayExpandedTable = default_value;
	}

	if (displayExpandedTable == "Y") {
		expandTable(name);
	} else {
		collapseTable(name);
	}

}

// expand a menu table
function expandTable(name) {

	changeObjectDisplay('expanded_' + name, '');
	changeObjectDisplay('collapsed_' + name, 'none');

	// set cookie so that the expanded table will be displayed
	setCookie("expanded_" +name, "Y");
}


// collapse a menu table
function collapseTable(name) {

	changeObjectDisplay("expanded_" + name, 'none');
	changeObjectDisplay("collapsed_" + name, '');

	// set cookie so that the collapsed table will be displayed
	setCookie("expanded_" + name, "N");
}

function load_drilldown (sections) {

	var cookie = getCookie ("drilldown");

	if (cookie) {

		var expanded_sections = cookie.split ("|");

		for (var i = 0; i < sections.length; ++i) {

			changeObjectDisplay ("expanded_dd_"  + sections[i], 'none');
			changeObjectDisplay ("collapsed_dd_" + sections[i], 'block');

			for (var j = 0; j < expanded_sections.length; ++j) {

				if (sections[i] == expanded_sections[j]) {
					changeObjectDisplay ("expanded_dd_"  + sections[i], 'block');
					changeObjectDisplay ("collapsed_dd_" + sections[i], 'none');
				}

			}

		}

	} else {

		for (var i = 0; i < sections.length; ++i) {

			changeObjectDisplay ("expanded_dd_"  + sections[i], 'none');
			changeObjectDisplay ("collapsed_dd_" + sections[i], 'block');

		}

	}

}


// update the games drilldown
function update_dd (section, expand) {

	var cookie = getCookie ("drilldown"),
		sections = cookie ? cookie.split ("|") : [];

	if (expand) {

		sections.push (section);

		changeObjectDisplay ("expanded_dd_"  + section, 'block');
		changeObjectDisplay ("collapsed_dd_" + section, 'none');

	} else {

		changeObjectDisplay ("expanded_dd_"  + section, 'none');
		changeObjectDisplay ("collapsed_dd_" + section, 'block');

		for (var i = 0; i < sections.length; ++i)
			if (sections[i] == section) {
				sections.splice (i, 1);
				break;
			}

	}

	setCookie ("drilldown", sections.join ("|"));

}



/**********************************************************************
 * Cookie Utilities
 *********************************************************************/

// get a cookie
function getCookie (name) {

	var dc = document.cookie.split (/;\s*/);
	var re = new RegExp ("^" + name + "=(.*)$");

	for (var i = 0; i < dc.length; i++)
		if (dc[i].match (re))
			return unescape (RegExp.$1);

	return null;

}



// set a cookie
function setCookie(name, value, expire, path, domain, secure) {

	var curCookie = name + "=" + escape(value) +
	    ((expire && expire.length) ? "; expire=" + expire.toGMTString() : "") +
	    ((path && path.length) ? "; path=" + path : "") +
	    ((domain && domain.length) ? "; domain=" + domain : "") +
	    ((secure && secure.length) ? "; secure" : "");

	document.cookie = curCookie;
}


/**********************************************************************
 * Form Utilities
 *********************************************************************/

// form-validation error list
function Error() {

	var errorList = "";
	var total = 0


	// any errors
	this.isErr = function() {
		return this.total;
	}


	// reset the error-list
	this.reset = function() {

		this.errorList = "";
		this.total = 0;
	}


	// add an error
	this.add = function(str) {

		if (this.errorList.length > 0) {
			this.errorList += "\n";
		}
		this.errorList += str;
		this.total++;

		return this.total;
	}


	// display the error list within an alert
	this.alert = function() {
		alert(this.errorList);
	}
}
var err = new Error();



// check a mandatory string
function ckMandatory(str, desc, min_len, max_len, val_chars) {

	if(str.length <= 0 || (min_len != 0 && str.length < min_len) ||
			(max_len != 0 && str.length > max_len)) {
		return err.add(invalidStr + desc + ".");
	}

	if(val_chars) {
		var re = "^[A-Za-z0-9\.\_\-]*$";
		if(!str.match(new RegExp(re))) {
			return err.add(invalidStr + desc + ".");
		}
	}
	return 0;
}



// check an integer
function ckInteger(str, desc, pm, min_len, max_len) {

	var inStr = strTrim(str, " ");
	var exp = pm ? /^[+-]?[0-9]+$/ : /^[0-9]+$/;

	if(!exp.test(inStr)) {
		return err.add(invalidStr + desc + ".");
	}

	if((min_len != 0 && inStr.length < min_len) || (max_len != 0 && inStr.length > max_len)) {
		return err.add(invalidStr + desc + ".");
	}

	return 0;
}



// check a float
function ckFloat(str, desc) {

	var inStr = strTrim(str, " ");
	var exp = /^([0-9]*(\.[0-9]+))$|^([0-9]+(\.)?)$/;

	if((!inStr.length) || !exp.test(inStr)) {
		return err.add(invalidStr + desc + ".");
	}

	return 0;
}



// check a amount field
function ckAmount(str, desc, pm) {

	var inStr = strTrim(str, " ");
	var exp = pm ? /(^[+-]?\d+$)|(^[+-]?\d*\.\d{1,2}$)/ : /(^\d+$)|(^\d*\.\d{1,2}$)/;

	if((!inStr.length) || !inStr.match(new RegExp(exp))) {
		return err.add(invalidStr + desc + ".");
	}

	return 0;
}



// submit a form
function submitOBForm() {

	var name = arguments[0];
	var action = arguments[1];
	var method = 'get';

	if (arguments.length == 3) {
		method = arguments[2];
	}

	var f = document.forms[name];

	if (typeof (f.action.value) == "undefined" || f.action.value == null) {
		insertInputObj(f, 'hidden', '', 'action', action);
	} else {
		f.action.value = action;
	}

	if(!isLoggedIn) {
			insertInputObj(f, 'hidden', '', 'uid', loginUid);
	}

	f.method = method;
	f.submit();
}



// submit a form over SSL
function submitSSLForm(name, action) {

	var f = document.forms[name];

	f.action = cgiSSLURL;
	submitOBForm(name, action, 'post');
}



/**********************************************************************
 * Misc Utilties
 *********************************************************************/



// open a window
function openWindow(url, name, width, height, resizable, scrollbars) {

	var w = window.screen.width;
	var h = window.screen.height;

	if(width > w) {
		width = w / 2;
	}
	if(height > h) {
		heigth = h / 2;
	}

	var w = window.open(url, name,
		"resizable=" + resizable +
		",scrollbars=" + scrollbars +
		",width=" + width +
		",height=" + height +
		",status=yes");
	w.focus();
	w.opener = window;
}



// get a currency symbol
function getCcySymbol (code) {

	switch(code) {
		case "GBP": { return "\u00A3"; }
		case "EUR": { return "\u20AC"; }
		case "USD": { return "$"; }
		default:    { return code + " "; }
	}
}



// fraction to decimal conversion
function fracToDec(num, den) {

	var p = num + "/" + den;

	if(p == "13/8") {
		return 2.62;
	}
	if(p == "15/8") {
		return 2.87;
	}
	if(p == "11/8") {
		return 2.37;
	}
	if(p == "8/13") {
		return 1.61;
	}
	if(p == "2/7") {
		return 1.28;
	}
	if(p == "1/8") {
		return 1.12;
	}

	return (parseFloat(num) / parseFloat(den)) + 1.00;
}



// trim a string
function strTrim(src, delim) {

	var r = "";
	var b = "";
	var skipsp = false;

	for(var i = 0; i < src.length; i++) {
		var c = src.charAt(i);
		if(delim.indexOf(c) >= 0) {
			b += c;
		} else {
			if(r.length > 0) {
				r += b;
			}
			b = "";
			r += c;
		}
	}

	return r;
}



// round a float to 2 decimal places
function roundFloat(n) {

	var s = "" + Math.round(n * 100) / 100
	var i = s.indexOf('.')

	if(i < 0) {
		return s + ".00"
	}

	var t = s.substring(0, i + 1) + s.substring(i + 1, i + 3)
	if(i + 2 == s.length) {
		t += "0"
	}

	return t;
}



// write a select input box
function writeSelect() {

	var sel = arguments[0];
	var i;
	var n;
	var v;
	var sel_tag;

	for(i = 1; i < arguments.length; i += 2) {
		v = arguments[i];
		n = arguments[i + 1];
		sel_tag = (sel == v) ? " selected" : "";
		document.writeln('<option value="' + v + '"' +
		                  sel_tag + '>' + n + '</option>');
	}
}



// open a different url
function goUrl(url, new_win, win_width, win_height, win_resizeable,
	           win_scrollbars, win_menubar) {

	if(new_win == "Y") {

		if (win_resizeable == "Y") {
			win_resizeable = "yes";
		} else {
			win_resizeable = "no";
		}

		if (win_scrollbars == "Y") {
			win_scrollbars = "yes";
		} else {
			win_scrollbars = "no";
		}

		if (win_menubar == "Y") {
			win_menubar = "yes";
		} else {
			win_menubar = "no";
		}

		var newsWin = window.open(url, "newsWin",
			"width=" + win_width +
			",height=" + win_height +
			",toolbar=" + win_menubar +
			",location=" + win_menubar +
			",directories=" + win_menubar +
			",status=yes" +
			",menubar=" + win_menubar +
			",scrollbars=" + win_scrollbars +
			",copyhistory=yes,resizable=" + win_resizeable);
		newsWin.focus();
	} else {
		self.location = url;
	}
}



/**********************************************************************
 * Images
 *********************************************************************/

// Swaps images
function MM_swapImgRestore() {

	var i,x,a=document.MM_sr;

	for(i=0; a && i<a.length && (x=a[i]) && x.oSrc; i++) {
		x.src=x.oSrc;
	}
}



// Preloads images
function MM_preloadImages() {

	var d=document;

	if (d.images) {
		if (!d.MM_p) {
			d.MM_p=new Array();
		}
		var i,j=d.MM_p.length,a=MM_preloadImages.arguments;
		for(i=0; i<a.length; i++) {
			if (a[i].indexOf("#") !=0) {
				d.MM_p[j]=new Image;
				d.MM_p[j++].src=a[i];
			}
		}
	}
}



// finds an image element
function MM_findObj(n, d) {

	var p,i,x;

	if(!d) {
		d=document;
	}
	if ((p=n.indexOf("?")) > 0 && parent.frames.length) {
		d=parent.frames[n.substring(p+1)].document;
		n=n.substring(0,p);
	}

	if(!(x =d[n]) && d.all) {
		x=d.all[n];
	}

	for (i=0; !x && i<d.forms.length; i++) {
		x=d.forms[i][n];
	}

	for (i=0; !x && d.layers && i<d.layers.length; i++) {
		x=MM_findObj(n,d.layers[i].document);
	}
	if(!x && d.getElementById) {
		x=d.getElementById(n);
	}
	return x;
}



// Swaps images
function MM_swapImage() {
	var i,j=0,x,a=MM_swapImage.arguments;

	document.MM_sr=new Array;

	for(i=0; i<(a.length-2); i+=3) {
		if ((x=MM_findObj(a[i])) !=null) {
			document.MM_sr[j++]=x;
			if(!x.oSrc) {
				x.oSrc=x.src;
			}
			x.src=a[i+2];
		}
	}
}

