/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Numbers.js - v2.1
	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	Copyright (c) 2006, 2008 Finsoft Ltd
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

var sNumberBetTypes = ",S,D,T,A,TX,P,Y,C,L15,L31,C1,C2,C3,C4,C5,";

var nMarketTypeID = 0;

var nNumberOfBalls = 0;
var nMaxBallsToDraw = 0;
var nMaxBallsToPick = 0;

var sLotteryMode = "STRAIGHTBETS";	//	STRAIGHTBETS | MULTIBETS
var bIsBonusBallIncluded = false;

var nNumberOfStraightBets = 0;
var nActiveStraightRow = 1;
var aStraightBets = new Array();

var nNumberOfBettingRows = 0;
var nMultiPickBallCount = 0;
var aMultiPickedBalls = new Array();

//	hide Submit! button in lottery picker
if (document.getElementById)
	document.write( '<style "type="text/css" media="all">#panellottopicker h2 input{display:none !important} #BSTprices {display:none;}</style>' );

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	setup on page.load
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function NB_Setup() {
	//	setup automatic form submit on lottery change
	var oForm = document.getElementById("panellottopicker");
	if (oForm) {
		var oSl = oForm.elements["slng"];
		if (oSl)
			oSl.onchange = function() { this.form.submit(); };
	}
	
	//	setup mode switcher
	var oSwitch = document.getElementById("lotteryswitch");
	if (oSwitch) {
		//	find all the links
		var aA = oSwitch.getElementsByTagName("a");
		for (var j=0;j<aA.length;j++)
			//	 on link click...
			aA[j].onclick = function() {
				//	...get URL, then extract only QS
				sHref = this.href.substring(this.href.indexOf("?")+1);
				//	split QS into var=value pairs
				var aTmp, aHref = sHref.split("&");
				for (var i=0;i<aHref.length;i++) {
					//	split each pair into var and value
					aTmp = aHref[i].split("=");
					//	find mode identificator, and set mode
					if (aTmp[0].toLowerCase() == "m") {
						var sMode = aTmp[1];
						NB_SetLotteryMode(sMode);
					}
				}
				//	switch classes
				var oParent = this.parentNode.parentNode;	//	ul.id = lotteryswitch
				var oLIparent = this.parentNode;
				var aLI = oParent.getElementsByTagName("li");
				for (var i=0;i<aLI.length;i++) {
					if (aLI[i] == oLIparent) {
						aLI[i].className += " activens";
					} else {
						aLI[i].className = aLI[i].className.replace(/activens/,"");
					}
				}
				
				return false;
			};
	}

	//	setup straight bets containers
	for (var i=0;i<nNumberOfStraightBets;i++)
		aStraightBets[i] = Array();

	//	setup line changers for straight bets
	var oForm = document.getElementById("nslipform");
	if (!oForm) return false;
	var aLine = oForm.elements["line"];
	if (aLine) {
		for (var i=0;i<aLine.length;i++) {
			aLine[i].onclick = function(i) {
				//	clear panel
				NB_ClearPanel();
				//	dim active line
				var oTR = document.getElementById("trow" + nActiveStraightRow);
				if (oTR)
					oTR.className = oTR.className.replace(/activetr/, "");
				//	new active line index
				nActiveStraightRow = this.id.substring(4);
				//	handle the case when user is moving through lines with keyboard arrows
				if (nActiveStraightRow > nNumberOfStraightBets) {
					nActiveStraightRow = 1;
					this.form.elements["line"][0].checked = true;
					this.form.elements["line"][0].focus();
				}
				//	made new line active
				oTR = document.getElementById("trow" + nActiveStraightRow);
				if (oTR)
					oTR.className += " activetr";
				//	update panel
				NB_UpdatePanel();
			};
		}
	}
	
	//	setup add more lines button
	var oBtn = document.getElementById("xAddmorelines");
	if (oBtn)
		oBtn.onclick = function() {
			this.form.onsubmit = function() {return false};
			NB_AddMoreLines(this.form);
		};

	//	setup "add to betslip" checkboxes
	oForm = document.getElementById("nslipform");
	var aAdd2BSChk = oForm.elements["add2slip"];
	for (i=0;i<aAdd2BSChk.length;i++) {
		aAdd2BSChk[i].onclick = function() {
			var nRow = this.id.substring(9);
			NB_Add2Slip(this, nRow);
		};
	}

	//	setup "bonus ball" radio buttons
	var aBonusBall = oForm.elements["bonusball"];
	if (aBonusBall) {
		for (i=0;i<aBonusBall.length;i++) {
			aBonusBall[i].onclick = function() {
				var nWhat = parseInt(this.value, 10);
				var oREGPrices = document.getElementById("REGprices");
				var oBSTPrices = document.getElementById("BSTprices");
				if (nWhat == 0) {
					bIsBonusBallIncluded = false;
					oREGPrices.style.display = "block";
					oBSTPrices.style.display = "none";
				} else {
					bIsBonusBallIncluded = true;
					oREGPrices.style.display = "none";
					oBSTPrices.style.display = "block";
				}
				//	re-calculate all chosen bets in multiples screen
				var oBetType;
				for (i=1;i<=nNumberOfBettingRows;i++) {
					oBetType = document.getElementById("bettype" + i);
					if (oBetType)
						NB_OnBetTypeChange(oBetType, i);
				}
			};
		}
	}

	//	setup "open betslip" button
	var oOpenbetslip = document.getElementById("xOpenbetslip");
	if (oOpenbetslip) {
		oOpenbetslip.onclick = function() {
			var oForm = this.form;
			oForm.onsubmit = function() {return false;};

			if (NB_OpenSlip(oForm)) {
				/*	serialize form data
					- - - - - - - - - -
					an example of what native form POST gives you, grouped as needed:
					#	basic data for this lottery
						nNumberOfBalls = 42
						nMaxBallsToDraw = 6
						nMaxBallsToPick = 5
						sCycleType = WEEK
						sLotteryID = IRISHLOTTERY
						nMarketTypeID = 247.1

					# picked by customer
						draw = 15.1, 19.1
						bonusball = 0
						ncycles = 3

					# straight bets
						nNumberOfStraightBets = 8
						nMaxNumOfStraightBets = 20
						ssels1 = 7,10,16,25,26
						ssels4 = 4,8,39
						#	rest of sselsX (X max is nMaxNumOfStraightBets) is empty, not filled in
						sselsX = 

					# multiple bets
						nNumberOfBettingRows = 8
						msels2 = 36,33
						bettype2 = D
						msels4 = 36,33,1,28
						bettype4 = Y
						# rest is empty, thus ignored
						bettypeX = 
						sselsX = 

					# can be ignored
						add2slip = on, on, on, on
						line = 4

					#	now use the form element names above and pickup this from the form, escape values and call Slip's handler
				*/
				var oFld, sQS = "", i;

				oFld = oForm.elements["nNumberOfBalls"];
				if (oFld) sQS += "&nNumberOfBalls=" + escape(oFld.value);
				oFld = oForm.elements["nMaxBallsToDraw"];
				if (oFld) sQS += "&nMaxBallsToDraw=" + escape(oFld.value);
				oFld = oForm.elements["nMaxBallsToPick"];
				if (oFld) sQS += "&nMaxBallsToPick=" + escape(oFld.value);
				oFld = oForm.elements["sCycleType"];
				if (oFld) sQS += "&sCycleType=" + escape(oFld.value);
				oFld = oForm.elements["sLotteryID"];
				if (oFld) sQS += "&sLotteryID=" + escape(oFld.value);
				oFld = oForm.elements["nMarketTypeID"];
				if (oFld) sQS += "&nMarketTypeID=" + escape(oFld.value);

				oFld = oForm.elements["draw"];
				var sTmp = "", sDraws = "", bReallyAdd2Slip = true;
				if (oFld) {
					for (i=0;i<oFld.length;i++)
						if (oFld[i].checked) {
							sDraws += ',' + oFld[i].value;
							sTmp += ',' + escape(oFld[i].value);
						}
					sQS += "&draw=" + sTmp.substring(1);
					//	save this into slip.
					if (LBS) {
						sDraws = sDraws.substring(1);
						if (!LBS.bSlipEmpty) {
							//	if slip is not empty, warn the customer that whatever he is adding will *replace* slip content and he needs to confirm this
							bReallyAdd2Slip = confirm(NB_MsgSlipContentToBeReplacedWarning);
							if (bReallyAdd2Slip)
								sQS += "&slipclr=1";
						}
					}
				}

				//	if there are no obstacles, continue serializing
				if (bReallyAdd2Slip) {
					oFld = oForm.elements["bonusball"];
					if (oFld) {
						for (i=0;i<oFld.length;i++)
							if (oFld[i].checked)
								sQS += "&bonusball=" + escape(oFld[i].value);
					}
	
					oFld = oForm.elements["ncycles"];
					if (oFld) sQS += "&ncycles=" + escape(oFld.value);
	
					oFld = oForm.elements["nNumberOfStraightBets"];
					if (oFld) {
						sQS += "&nNumberOfStraightBets=" + escape(oFld.value);
						var nNumberOfStraightBets = parseInt(oFld.value, 10);
						for (i=1;i<=nNumberOfStraightBets;i++) {
							oFld = oForm.elements["ssels" + i];
							if (oFld && oFld.value != '') sQS += "&ssels" + i + "=" + escape(oFld.value);
						}
					}
	
					oFld = oForm.elements["nNumberOfBettingRows"];
					var oFld2;
					if (oFld) {
						sQS += "&nNumberOfBettingRows=" + escape(oFld.value);
						var nNumberOfBettingRows = parseInt(oFld.value, 10);
						for (i=1;i<=nNumberOfBettingRows;i++) {
							oFld = oForm.elements["msels" + i];
							oFld2 = oForm.elements["bettype" + i];
							if (oFld && oFld2 && oFld.value != '' & oFld2.value != '')
								sQS += "&msels" + i + "=" + escape(oFld.value) + "&bettype" + i + "=" + escape(oFld2.value);
						}
					}
					
					//	remove leading & from sQS and pass to LottoBetSlip (LBS)
					if (sQS != "" && LBS) {
						LBS.LoadSlip( sQS.substring(1) );
					}
				}
			}
		};
	}

	//	setup bettype drop-downs on MULTIPLES
	var oBetType;
	for (i=1;i<=nNumberOfBettingRows;i++) {
		oBetType = document.getElementById("bettype" + i);
		if (oBetType) {
			oBetType.nRow = i;
			oBetType.onchange = function() {
				NB_OnBetTypeChange(this, this.nRow);
			};
		}
	}

}
DomLoaded.load(NB_Setup);

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	lucky dip
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function NB_LuckyDip(nPick) {
	NB_Clear();

	var s = ",", n = 0;
	while ( n < nPick ) {
		nBallNum = Math.floor(Math.random() * nNumberOfBalls+1);
		if (nBallNum > 0 && s.indexOf("," + nBallNum + ",") == -1) {
			s += nBallNum + ",";
			n++;
		}
	}
	s = s.substring(1);
	s = s.substring(0, s.length-1);

	var a = s.split(",");

	var oTD;
	for (var i=0;i<a.length;i++) {
		oTD = document.getElementById("pb" + a[i]);
		if (oTD) CB(oTD);
	}

	return false;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	clear panel
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function NB_ClearPanel() {
	//	clear the panel
	for (i=1;i<=nNumberOfBalls;i++) {
		oTD = document.getElementById("pb" + i);
		if (oTD) oTD.className = "nc" + i;
	}
}

function NB_Clear() {
	//	clear panel
	NB_ClearPanel();

	if (sLotteryMode == "STRAIGHTBETS") {
		var nRow = __getActiveStraightRow();
		if (!nRow) return null;
		//	clear slip
		__clearStraightSlip();
		//	clear container
		aStraightBets[nRow-1] = new Array();
	} else {	//	MULTIBETS
		//	clear slip
		__clearMultiSlip();
		//	clear container
		aMultiPickedBalls = new Array();
		nMultiPickBallCount = 0;
	}
	return false;
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	update panel
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function NB_UpdatePanel() {
	var oTD;

	if (sLotteryMode == "STRAIGHTBETS") {
		var nRow = __getActiveStraightRow();
		if (!nRow) return null;
		//	get balls
		var aTmp = aStraightBets[nRow-1];
		//	update panel
		for (i=0;i<aTmp.length;i++) {
			oTD = document.getElementById("pb" + aTmp[i]);
			if (oTD) oTD.className = "nch" + aTmp[i];
		}
	} else {	//	MULTIBETS
		var sNum;
		//	update panel
		for (i in aMultiPickedBalls) {
			if (aMultiPickedBalls[i]) {
				sNum = i.substring(1);
				oTD = document.getElementById("pb" + sNum);
				if (oTD) oTD.className = "nch" + sNum;
			}
		}//for
	}//if-else
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	add/remove the clicked ball
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function CB(oTD) {
	var sCls = oTD.className;

	var nSep = sCls.indexOf("nch");
	if (nSep == -1) {	//add
		//	check if maximum number of picked balls is reached
		if (__isMaxBallsAdded()) {
			alert(SG_MsgNumbersMaxBallsReached);
			return;
		}
		//	if not, add this ball to slip
		sCls = sCls.replace("nc", "nch");
		oTD.className += " " + sCls;
		AddBall( sCls );	//	arg = nchX
	} else {	//	remove
		oTD.className = oTD.className.substring(0, nSep);
		sCls = sCls.substring(nSep, sCls.length);
		RemoveBall( sCls );	//	arg = nchX
	}

	return false;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	removes ball, when clicked in numbers slip
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function RB(oTD) {
		sCls = oTD.className;
		nSep = sCls.indexOf("nch");
	
		if (nSep == -1) return;
	
		sCls = sCls.substring(nSep, sCls.length);
		nNum = sCls.replace("nch", "");
		oTD = document.getElementById("pb" + nNum);
		if (oTD) {
			oTD.className = sCls.replace("nch", "nc");
			RemoveBall(sCls);
		}
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	adds ball to current slip, into current line
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function AddBall(sCls) {
	if (sLotteryMode == "STRAIGHTBETS") {
		AddBall2Straight(sCls);
	} else {	//	MULTIBETS
		AddBall2Multi(sCls);
	}
}

//	add ball to straight slip
function AddBall2Straight(sCls) {
	var nRow = __getActiveStraightRow();
	if (!nRow) return null;

	var nBall = sCls.substring(3);
	var aTmp = aStraightBets[nRow-1];
	aTmp[aTmp.length] = nBall;
	aTmp.sort( __numsort );
	aStraightBets[nRow-1] = aTmp;
	__updateStraightSlip(aTmp);
}

//	add ball to multi slip
function AddBall2Multi(sCls) {
	var num = sCls.substring(3);

	//	 add the ball into container
	nMultiPickBallCount++;
	aMultiPickedBalls["b" + num] = nMultiPickBallCount;

	//	add the ball into slip
	for (var i=nMultiPickBallCount;i<=nNumberOfBettingRows;i++) {
		aTD = document.getElementById("mb" + i + "_" + nMultiPickBallCount);
		if (aTD) {
			aTD.innerHTML = num;
			aTD.className += " nc " + sCls;
		}
	}

	//	update bet type offer
	for (var i=nMultiPickBallCount;i<=nNumberOfBettingRows;i++) {
		var oSl = document.getElementById("bettype" + i);
		if (oSl) {
			oForm = oSl.form;
			oSl.disabled = false;
	
			//	load bet types for current number of balls
			NB_ReloadBetTypes(oSl, nMultiPickBallCount, i);
	
			/*
			##	Removed by BF514 ##
			var oDefOpt = document.getElementById("defbt" + (i));
			if (oDefOpt)
				oDefOpt.selected = true;
			*/

			//	load bet types for current number of balls
			NB_OnBetTypeChange(oSl, i);
		}
	}
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	removes the ball from slip
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function RemoveBall(sCls) {
	if (sLotteryMode == "STRAIGHTBETS") {
		RemoveBallFromStraight(sCls);
	} else {	//	MULTIBETS
		RemoveBallFromMulti(sCls);
	}
}

//	remove ball from straight bets
function RemoveBallFromStraight(sCls) {
	var nRow = __getActiveStraightRow();
	if (!nRow) return null;

	var nBall = sCls.substring(3);
	var aTmp = aStraightBets[nRow-1];
	var sTmp = "," + aTmp.join(",") + ",";
	//	remove the clicked number
	sTmp = sTmp.replace("," + nBall + ",", ",");
	//	remove the leading  and ending ,
	sTmp = sTmp.substring(1, sTmp.length-1);
	//	if there was just one number and it is removed, then previous line left us only with , => meaningless, remove it
	if (sTmp == ",") sTmp = "";
	//	return new line state into collector
	if (sTmp == "")
		aTmp = new Array();
	else
		aTmp = sTmp.split(",");
	aStraightBets[nRow-1] = aTmp;
	//	update the visual state
	__updateStraightSlip(aTmp);
}

//	remove ball from multi bets
function RemoveBallFromMulti(sCls) {
	nMultiPickBallCount--;
	var num = sCls.substring(3);
	var x = aMultiPickedBalls["b" + num];

	var aTD, oForm, nCurBallNum;

	//	deselect this ball in numbers panel
	aTD = document.getElementById("mb" + i + "_" + x);
	if (aTD) {
		aTD.innerHTML = "0";
		aTD.className = "nc0";
	}
	aMultiPickedBalls["b" + num] = null;

	//	remove the clicked ball in all affected rows
	for (var i=x;i<=nNumberOfBettingRows;i++) {

		//	re-arrange rest of the balls in current row
		for (var j=x;j<=nMultiPickBallCount+1;j++) {
			//	get the num in higher column (2_3 == 2 is row, 3 is column)
			aTD = document.getElementById("mb" + i + "_" + (j+1));
			if (!aTD) {
				//	the clicked number is the last possible number in the row (i.e. 3rd number in 3rd row == 3_3), thus 3_4 does not exists
				//	look in the next row, on same position (4_4) and then transfer that to 3_3
				aTD = document.getElementById("mb" + (i+1) + "_" + (j+1));
			}

			if (aTD) {
				//	get the ball number in higher column
				nBall = aTD.innerHTML;
				//	if the last number is clicked, then just reset current cell
				if (nBall == "&nbsp;" || nBall == "0") {
					aTD = document.getElementById("mb" + i + "_" + j);
					aTD.innerHTML = "0";
					aTD.className = "nc0";
				} else {
					//	get class name from higher column
					sCls = aTD.className;
					//	set that ball from higher column is now in the lower (current) column 
					aMultiPickedBalls["b" + nBall] = j;
					//	move it to current column
					aTD = document.getElementById("mb" + i + "_" + j);
					aTD.innerHTML = nBall;
					aTD.className = sCls;
					//	clear the higher column
					aTD = document.getElementById("mb" + i + "_" + (j+1));
					if (aTD) {
						aTD.innerHTML = "0";
						aTD.className = "nc0";
					}
				}
			} else {
				//	no number position in the next row too, so...
				aTD = document.getElementById("mb" + i + "_" + j);
				if (aTD) {
					aTD.innerHTML = "0";
					aTD.className = "nc0";
				}
				// ...bail out
				break;
			}
		}
	
		var oSl = document.getElementById("bettype" + i);
		if (oSl) {
			oForm = oSl.form;
			if (nMultiPickBallCount == 0) oSl.disabled = true;

			//	load bet types for current number of balls
			NB_ReloadBetTypes(oSl, nMultiPickBallCount, i);
	
			/*
			##	Removed by BF514 ##
			var oDefOpt = document.getElementById("defbt" + (i));
			if (oDefOpt)
				oDefOpt.selected = true;
			*/

			//	load bet types for current number of balls
			NB_OnBetTypeChange(oSl, i);
		}
	}
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	adds more lines for the straight bets
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function NB_AddMoreLines(oForm) {
	//	add new containers
	var nOld = nNumberOfStraightBets;
	nNumberOfStraightBets++;
	for (var i=nOld;i<nNumberOfStraightBets;i++) {
		aStraightBets[i] = Array();
	}
	//	update hidden field
	var oFld = oForm.elements['nNumberOfStraightBets'];
	if (oFld) oFld.value = nNumberOfStraightBets;
	//	reveal new line
	var oTR = document.getElementById("trow" + nNumberOfStraightBets);
	oTR.style.display = "";
}


/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	set lottery mode on click
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function NB_SetLotteryMode(sMode) {
	var oPanel = document.getElementById("panel" + sLotteryMode);
	var oNewPanel = document.getElementById("panel" + sMode);
	if (!oPanel || !oNewPanel) return;

	oPanel.style.display = "none";

	sLotteryMode = sMode;
	oNewPanel.style.display = "block";
	
	NB_ClearPanel();
	NB_UpdatePanel();
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	reloads bet type drop-down
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function NB_ReloadBetTypes(oBetType, nSelCnt, nBetTypeDDCnt) {
	if (!oBetType || nSelCnt < 1 || nSelCnt > nNumberOfBettingRows) return;
	
	//	remove all existing options but first (which is "Please choose")
	for (var i=1;i<oBetType.options.length;i++) {
		oBetType.options[i--] = null;
	}

	var sBetTypes = BS_aBT4SN[nSelCnt], sBetType, sDefBT, nOptIndex;
	var aBetTypes = sBetTypes.split("|");
	
	var sNFolds = "|" + BS_aBTClasses["SINGLES"] + BS_aBTClasses["NFOLDS"];
	
	for (var i=0;i<aBetTypes.length;i++) {
		sBetType = aBetTypes[i];
		sDefBT = "";
		if (sBetType != "" && sNumberBetTypes.indexOf("," + sBetType + ",") != -1 && BS_aBT[sBetType]) {
			//	if numbers of balls is higher then max. number of balls to choose, allow only combinations
			if (nSelCnt > nMaxBallsToPick && sNFolds.indexOf("|" + sBetType + "|") == -1) continue;
			//	options index
			nOptIndex = oBetType.options.length;
			//	create option
			oBetType.options[nOptIndex] = new Option(BS_aBT[sBetType][0], sBetType, false, false);
			//	is this a default bet type?
			if (("|S|D|T|A|").indexOf("|" + sBetType + "|") != -1)
				oBetType.options[nOptIndex].id = 'defbt' + nBetTypeDDCnt;
		}
	}
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	when bet type has changed, then update price. if multiple, call calculator to get composite odds
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function NB_OnBetTypeChange(oSl, nRow) {
	var nCurBallNum = nRow;
	if (nRow > nMultiPickBallCount)
		nCurBallNum = nMultiPickBallCount;

	var oOddCell = document.getElementById("odd" + nRow);

	var oChk;
	if (sLotteryMode == "STRAIGHTBETS") {
		oChk = document.getElementById("sadd2slip" + nRow);
	} else {	//	MULTIBETS
		oChk = document.getElementById("madd2slip" + nRow);
	}

	var sBetTypeID = oSl.value;
	//	if bettype is not selected, clear the odds and "add2slip" in case they were previously set
	if (sBetTypeID == "") {
		if (oChk)
			oChk.checked = false;
		if (oOddCell)
			oOddCell.innerHTML = "";
		return;
	}

	if (("|S|D|T|A|").indexOf("|" + sBetTypeID + "|") != -1) {
		var sPriceType = (bIsBonusBallIncluded) ? "BST" : "REG";
		if (oOddCell)
			oOddCell.innerHTML = aOdds[sPriceType][nCurBallNum-1];
	} else {
		if (oOddCell)
			NB_CalcOdds(nRow, sBetTypeID, nCurBallNum);
	}
	
	//	also automatically select "add to betslip" checkbox
	if (oChk) {
		oChk.checked = true;
	}
		
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	calculate odds for the multiple bets
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function NB_CalcOdds(nRow, sBetTypeID, nBallCount) {
	var sAction = "CalcOdds.asp";
	var sURL = sAction + "?mkt=" + nMarketTypeID + "&bt=" + sBetTypeID + "&bb=" + bIsBonusBallIncluded + "&bc=" + nBallCount + "&mbc=" + nMaxBallsToPick + "&r=" + nRow;
	NB_oCalcFrame.Load( sURL );
}

function UpdateCompositePrice(nCompositeOdd, nRow) {
	var oOddCell = document.getElementById("odd" + nRow);
	if (oOddCell)
		oOddCell.innerHTML = nCompositeOdd;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	internal functions
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

//	numerical sort
function __numsort(a,b) {
	return a-b;
}

//	get active (current) straight row
function __getActiveStraightRow() {
	return nActiveStraightRow;
}

//	is maximum of balls already reached?
function __isMaxBallsAdded() {
	if (sLotteryMode == "STRAIGHTBETS") {
		var nRow = __getActiveStraightRow();
		if (!nRow) return null;

		if (aStraightBets[nRow-1].length < nMaxBallsToPick)
			return false;
	} else {
		if (nMultiPickBallCount < nNumberOfBettingRows)
			return false;
	}
	return true;
}

//	update straight bets slip
function __updateStraightSlip(aTmp) {
	var nRow = __getActiveStraightRow();
	if (!nRow) return null;

	__clearStraightSlip();

	var oTD, bAtLeastOne;
	bAtLeastOne = false;
	for (var i=0; i<aTmp.length;i++) {
		oTD = document.getElementById("sb" + nRow + "_" + (i+1));
		if (oTD) {
			bAtLeastOne = true;
			oTD.innerHTML = aTmp[i];
			oTD.className += " nc nch" + aTmp[i];
		}
	}

	//	if there is at least one ball, keep this checked for adding to slip
	if (bAtLeastOne) {
		var oChk = document.getElementById("sadd2slip" + nRow);
		if (oChk) oChk.checked = true;
	}
}

//	clear straight bets slip
function __clearStraightSlip() {
	var nRow = __getActiveStraightRow();
	if (!nRow) return null;

	//	clear visual
	var oTD ;
	for (var i=0; i<nMaxBallsToPick;i++) {
		oTD = document.getElementById("sb" + nRow + "_" + (i+1));
		if (oTD) {
			oTD.innerHTML = "&nbsp;";
			oTD.className = "nc0";
		}
	}
	//	clear container
	oSelCont = document.getElementById("ssels" + nRow);
	if (oSelCont)
		oSelCont.value = "";
	//	clear add2slip checkbox
	oAdd2Slip = document.getElementById("sadd2slip" + nRow);
	if (oAdd2Slip)
		oAdd2Slip.checked = false;
}

//	clear multi bets slip
function __clearMultiSlip() {
	//	clear slip
	for (var i=1;i<=nNumberOfBettingRows;i++) {
		for (var j=1;j<=nNumberOfBettingRows;j++) {
			oTD = document.getElementById("mb" + i + "_" + j);
			if (oTD) {
				oTD.innerHTML = "&nbsp;";
				oTD.className = "nc0";
			}
		}
	}

	//	clear the bet types
	var oForm = document.getElementById("nslipform");
	if (!oForm) return false;
	if (oForm.elements) {
		for (var i=1;i<=nNumberOfBettingRows;i++) {
			var oSl = oForm.elements["bettype" + i];
			if (oSl) {
				oSl.selectedIndex = 0;
				oSl.disabled = true;
			}
		}
	}

	//	clear container
	var oSelCont;
	for (var i=1;i<=nNumberOfBettingRows;i++) {
		oSelCont = oForm.elements["msels" + i];
		if (oSelCont)
			oSelCont.value = "";
	}

	//	clear add2slip checkbox
	var oAdd2Slip;
	for (var i=1;i<=nNumberOfBettingRows;i++) {
		oAdd2Slip = document.getElementById("madd2slip" + i);
		if (oAdd2Slip)
			oAdd2Slip.checked = false;
	}

	//	clear the shown price
	var oOddCell;
	for (var i=1;i<=nNumberOfBettingRows;i++) {
		oOddCell = document.getElementById("odd" + i);
		if (oOddCell)
			oOddCell.innerHTML = "&nbsp;";
	}
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	check that there are balls so that it can be added into slip
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function NB_Add2Slip(oChk, nRow) {
	var oForm = oChk.form;
	
	if (!oChk.checked) return;

	//	STRAIGHT BETS
	if (sLotteryMode == "STRAIGHTBETS") {
		if (aStraightBets[nRow-1].length == 0) {
			alert(NB_MsgAddBallsBeforeMarking4Add);
			oChk.checked = false;
			return false;
		}
	//	MULTIBETS
	} else {
		if (nMultiPickBallCount < 1) {
			alert(NB_MsgAddBallsBeforeMarking4Add4Multi);
			oChk.checked = false;
			return false;
		}
		var oBetType = document.getElementById("bettype" + nRow);
		if (oBetType.value == "") {
			alert(NB_MsgChooseBetTypeBeforeMarking4Multi);
			oChk.checked = false;
			return false;
		}
	}

	return;
}

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
	add selected bets to slip - opens popup with slip
	## this is form.onsubmit()
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
function NB_OpenSlip(oForm) {

	var bAtLeastOne = false;
	//	check if at least one bet is selected to be added
	var aAdd2BSChk = oForm.elements["add2slip"];
	for (var i=0;i<aAdd2BSChk.length;i++) {
		if (bAtLeastOne = aAdd2BSChk[i].checked)
			break;
	}

	if (!bAtLeastOne) {
		alert(NB_MsgNoBallsPicked);
		return false;
	}

	//	check if at least one market is checked
	if (bAtLeastOne) {
		bAtLeastOne = false;
		var aChk = oForm.elements["draw"];
		if (aChk.length) {
			for (i=0;i<aChk.length;i++) {
				if (bAtLeastOne = aChk[i].checked)
					break;
			}
		} else {
			bAtLeastOne = aChk.checked;
		}
	}

	if (!bAtLeastOne) {
		alert(NB_MsgNoDrawsPicked);
		return false;
	}

	//	save the list of numbers into hidden fields
	var oSelCont = null;
	var oAdd2Slip = null;
	//	STRAIGHT BETS
	//	go through all rows
	for (i=1;i<=nNumberOfStraightBets;i++) {
		//	if there are balls added to it
		if (aStraightBets[i-1].length != 0) {
			oSelCont = oForm.elements["ssels" + i];
			oAdd2Slip = document.getElementById("sadd2slip" + i);
			//	and it is checked to be added to slip, save the number into container
			if (oSelCont && oAdd2Slip && oAdd2Slip.checked)
				oSelCont.value = aStraightBets[i-1].join(",");
		}
	}
	//	MULTIBETS
	var nNum, j, sCollector;
	//	go through all rows
	for (var i=1;i<=nNumberOfBettingRows;i++) {
		oAdd2Slip = document.getElementById("madd2slip" + i);
		oSelCont = oForm.elements["msels" + i];
		//	if the rows is checked to be added into slip
		if (oSelCont && oAdd2Slip && oAdd2Slip.checked) {
			//	collect the balls in it...
			j = 1;
			sCollector = "";
			for (sNum in aMultiPickedBalls) {
				//	skip nulls
				if (!aMultiPickedBalls[sNum]) continue;
				//	add to collector
				sCollector += "," + sNum.substring(1);
				//	but only up to max number of picked balls or max max possible number in the rows itself
				j++;
				if (j > nMultiPickBallCount || j > i) break;
			}
			//	then save it in the container for that particular row
			oSelCont.value = sCollector.substring(1);
		}
	}

	return bAtLeastOne;
}

