var betTypes = new Array();
betTypes[ 0 ] = [ "Choose your bet:", "listbet", 0, null ];
betTypes[ 1 ] = [ "Basic Bets", "sectiontitle", 0, null ];
betTypes[ 2 ] = [ "Single", "listbet", 1, 1, "single" ];
betTypes[ 3 ] = [ "Double", "listbet", 2, 1, null ];
betTypes[ 4 ] = [ "Treble", "listbet", 3, 1, null ];
betTypes[ 5 ] = [ "Fourfold", "listbet", 4, 1, null ];
betTypes[ 6 ] = [ "Fivefold", "listbet", 5, 1, null ];
betTypes[ 7 ] = [ "Sixfold", "listbet", 6, 1, null ];
betTypes[ 8 ] = [ "Sevenfold", "listbet", 7, 1, null ];
betTypes[ 9 ] = [ "Eightfold", "listbet", 8, 1, null ];
betTypes[ 10 ] = [ "Full covers without singles", "sectiontitle", 0, null ];
betTypes[ 11 ] = [ "Trixie", "listbet", 3, 2, null ];
betTypes[ 12 ] = [ "Yankee", "listbet", 4, 2, null ];
betTypes[ 13 ] = [ "Super Yankee (Canadian)", "listbet", 5, 2, null ];
betTypes[ 14 ] = [ "Heinz", "listbet", 6, 2, null ];
betTypes[ 15 ] = [ "Super Heinz", "listbet", 7, 2, null ];
betTypes[ 16 ] = [ "Goliath", "listbet", 8, 2, null ];
betTypes[ 17 ] = [ "Full covers with singles", "sectiontitle", 0, null ];
betTypes[ 18 ] = [ "Patent", "listbet", 3, 2, "single" ];
betTypes[ 19 ] = [ "Lucky 15 (Yap)", "listbet", 4, 2, "single" ];
betTypes[ 20 ] = [ "Lucky 31", "listbet", 5, 2, "single" ];
betTypes[ 21 ] = [ "Lucky 63", "listbet", 6, 2, "single" ];
betTypes[ 22 ] = [ "Super Heinz with Singles", "listbet", 7, 2, "single" ];
betTypes[ 23 ] = [ "Super Goliath", "listbet", 8, 2, "single" ];

var winOdds1Arr = new Array();
var winOdds2Arr = new Array();
var ewOdds1Arr = new Array();
var ewOdds2Arr = new Array();
var finishPosArr = new Array();
var winAmounts = new Array();
var ewAmounts = new Array();

var selBetTypes, betPanel, rowNode;
var betPanelRows = new Array();
var currSymbol = "&euro;";

var totalWin = totalStake = 0;

function initialise() {
	selBetTypes = document.getElementById( 'selBetTypes' );
	betPanel = document.getElementById( 'betPanel' );
	rowNode = document.getElementById( 'oddsRow' );
	
	for ( var i = 0; i < betTypes.length; i++ ) {
		var option = new Option( betTypes[ i ][ 0 ],betTypes[ i ][ 0 ] );
		option.className = betTypes[ i ][ 1 ];
		selBetTypes.options[ i ] = option;
	}
}

function switchtoDecimal() {
	showPanel( "Decimal" );
	hidePanel( "Fraction" );
	hidePanel( "US" );
	setLinkStyle( "dec" );
}

function switchtoFractional() {
	hidePanel( "Decimal" );
	showPanel( "Fraction" );
	hidePanel( "US" );	
	setLinkStyle( "fra" );
}

function switchtoAmerican() {
	hidePanel( "Decimal" );
	hidePanel( "Fraction" );
	showPanel( "US" );	
	setLinkStyle( "us" );
}

function showPanel( name ) {
	for ( var i = 0; i < betPanelRows.length + 1; i++ ) {
		var visWinPnl = eval( "document.getElementById( 'divWinOdds" + name + "_" + i + "' )" );
		var visEWPnl = eval( "document.getElementById( 'divEWOdds" + name + "_" + i + "' )" );
		visWinPnl.style.display = "inline";
		visEWPnl.style.display = "inline";
	}
}

function hidePanel( name ) {
	for ( var i = 0; i < betPanelRows.length + 1; i++ ) {
		var hiddenWinPnl = eval( "document.getElementById( 'divWinOdds" + name + "_" + i + "' )" );
		var hiddenWWPnl = eval( "document.getElementById( 'divEWOdds" + name + "_" + i + "' )"	 );
		hiddenWinPnl.style.display = "none";
		hiddenWWPnl.style.display = "none";
	}
}

function calcDecimalWinOdds( evt ) {
	var decAmt = evt.value;
	var betIndex = evt.id.substring( evt.id.length - 1, evt.id.length );
	var txtWinOdds1 = eval( "document.getElementById( 'txtWinOdds1_" + betIndex + "' )" );
	var txtWinOdds2 = eval( "document.getElementById( 'txtWinOdds2_" + betIndex + "' )"  );
	findWhole( betIndex, decAmt, txtWinOdds1, txtWinOdds2 );
	calcWinOdds( evt );
}

function calcUSWinOdds( evt ) {
	var usAmt = evt.value;
	var betIndex = evt.id.substring( evt.id.length - 1, evt.id.length );
	var txtWinOdds1 = eval( "document.getElementById( 'txtWinOdds1_" + betIndex + "' )" );
	var txtWinOdds2 = eval( "document.getElementById( 'txtWinOdds2_" + betIndex + "' )"  );
	findWholeUS( betIndex, usAmt, txtWinOdds1, txtWinOdds2 );
	calcWinOdds( evt );
}

function calcDecimalEWOdds( evt ) {
	var decAmt = evt.value;
	var betIndex = evt.id.substring( evt.id.length - 1, evt.id.length );
	var txtEWOdds1 = eval( "document.getElementById( 'txtEWOdds1_" + betIndex + "' )" );
	var txtEWOdds2 = eval( "document.getElementById( 'txtEWOdds2_" + betIndex + "' )" );
	findWhole( betIndex, decAmt, txtEWOdds1, txtEWOdds2 );
	calcEWOdds( evt );
}

function calcUSEWOdds( evt ) {
	var usAmt = evt.value;
	var betIndex = evt.id.substring( evt.id.length - 1, evt.id.length );
	var txtEWOdds1 = eval( "document.getElementById( 'txtEWOdds1_" + betIndex + "' )" );
	var txtEWOdds2 = eval( "document.getElementById( 'txtEWOdds2_" + betIndex + "' )" );
	findWholeUS( betIndex, usAmt, txtEWOdds1, txtEWOdds2 );
	calcEWOdds( evt );
}

function calcWinOdds( evt ) {
	var betIndex = evt.id.substring( evt.id.length - 1, evt.id.length );
	var txtWinOdds1 = eval( "document.getElementById( 'txtWinOdds1_" + betIndex + "' )" );
	var txtWinOdds2 = eval( "document.getElementById( 'txtWinOdds2_" + betIndex + "' )" );
	var txtDecOdds = eval( "document.getElementById( 'txtDecWinOdds_" + betIndex + "' )" );
	var txtUSOdds = eval( "document.getElementById( 'txtUSWinOdds_" + betIndex + "' )" );

	var winOdds1 = txtWinOdds1.value;
	var winOdds2 = txtWinOdds2.value;
	var decAmt = ( winOdds1 / winOdds2 ) + 1;
	if ( evt != txtDecOdds ) {
		txtDecOdds.value = decAmt.toFixed( 2 );
	}
	if ( evt != txtUSOdds ) {
		if ( ( winOdds1 * 1 ) > ( winOdds2 * 1 ) ) {
			var usAmt = ( winOdds1 / winOdds2 ) * 100;
			txtUSOdds.value = "+" + usAmt.toFixed( 0 );
		} else {
			var usAmt = ( winOdds2 / winOdds1 ) * 100;
			txtUSOdds.value = "-" + usAmt.toFixed( 0 );
		}
	}
	var calcType = betTypes[ selBetTypes.selectedIndex ][ 3 ];
	if ( calcType == 1 )
		calculate();
	else if ( calcType == 2 )
		calculateCoversWO();
}

function calcEWOdds( evt ) {
	var betIndex = evt.id.substring( evt.id.length - 1, evt.id.length );
	var txtEWOdds1 = eval( "document.getElementById( 'txtEWOdds1_" + betIndex + "' )"  );
	var txtEWOdds2 = eval( "document.getElementById( 'txtEWOdds2_" + betIndex + "' )"  );
	var txtDecOdds = eval( "document.getElementById( 'txtDecEWOdds_" + betIndex + "' )"  );
	var txtUSOdds = eval( "document.getElementById( 'txtUSEWOdds_" + betIndex + "' )"  );
	var ewOdds1 = txtEWOdds1.value;
	var ewOdds2 = txtEWOdds2.value;
	var decAmt = ( ewOdds1 / ewOdds2 ) + 1;
	if ( evt != txtDecOdds ) {
		txtDecOdds.value = decAmt;
	}
	if ( evt != txtUSOdds ) {
		if ( ewOdds1 > ewOdds2 ) {
			var usAmt = ( ewOdds1 / ewOdds2 ) * 100;
			txtUSOdds.value = "+" + usAmt.toFixed( 0 );
		} else {
			var usAmt = ( ewOdds2 / ewOdds1 ) * 100;
			txtUSOdds.value = "-" + usAmt.toFixed( 0 );
		}
	}
	calculate();
}

function findWhole( id, decAmt, txtOdds1, txtOdds2 ) {
	var count = 0;
	var winOdds1 = decAmt - 1;
	var winOdds2 = 1;
	var tempWinOdds1 = winOdds1;
	var tempWinOdds2 = winOdds2;
	var whole = isWhole( tempWinOdds1 );
	count = 2;
	while ( ( !whole ) && ( count < 1000 ) ) {
		tempWinOdds1 = winOdds1 * count;
		whole = isWhole( tempWinOdds1 );
		count++;
	}
	txtOdds1.value = tempWinOdds1.toFixed( 0 );
	txtOdds2.value = count - 1;
	calculate();
}

function findWholeUS( id, usAmt, txtOdds1, txtOdds2 ) {
	var count = 0;
	var winOdds1 = usAmt / 100;
	var winOdds2 = 1;
	var tempWinOdds1 = winOdds1;
	var tempWinOdds2 = winOdds2;
	if ( usAmt < 0 ) {
		winOdds1 = Math.abs( usAmt / 100 );
		winOdds2 = 1;
		tempWinOdds1 = winOdds1;
		tempWinOdds2 = winOdds2;
	}
	var whole = isWhole( tempWinOdds1 );
	count = 2;
	while ( ( !whole ) && ( count < 1000 ) ) {
		tempWinOdds1 = winOdds1 * count;
		whole = isWhole( tempWinOdds1 );
		count++;
	}
	if ( usAmt > 0 ) {
		txtOdds1.value = tempWinOdds1.toFixed( 0 );
		txtOdds2.value = count - 1;
	} else {
		txtOdds1.value = count - 1;
		txtOdds2.value = tempWinOdds1.toFixed( 0 );
	}
	calculate();
}

function isWhole( num ) {
	var temp = num.toFixed( 2 );
	var pos = temp.indexOf ( "." );
	var decPart = temp.substring( pos + 1, temp.length );
	return ( decPart * 10 ) == 0;
}

function showBetPanel() {
	var index = selBetTypes.selectedIndex;
	var visibility = "hidden";
	var betCount = betTypes[ index ][ 2 ];
	if ( betCount > 0 ) {
		visibility = "visible";
		cloneBetPanel( betCount - 1 );
	}
	
	betPanel.style.visibility = visibility;
	calculate();
}

function cloneBetPanel( num ) {
	
	if ( num < betPanelRows.length ) {
		removeBetPanels( betPanelRows.length - num );
	} else {
		for ( var i = betPanelRows.length; i < num; i++ ) {
			betPanelRows[ i ] = rowNode.cloneNode( true );
			renameInputs( i, betPanelRows[ i ], "input" );
			renameInputs( i, betPanelRows[ i ], "select" );
			renameInputs( i, betPanelRows[ i ], "div" );
			rowNode.parentNode.appendChild( betPanelRows[ i ] );
		}
		attachRowEvents( rowNode );
	}
}

function attachRowEvents( panelRow ) {
	attachInputEvents( panelRow, "input" );
	attachInputEvents( panelRow, "select" );
}

function attachInputEvents( panelRow, type ) {
	var inputs = panelRow.getElementsByTagName( type );
	for ( var item = 0; item < inputs.length; item++ ) {
		inputs[ item ].onChange = calculate();
	}
}

function renameInputs( index, panelRow, type ) {
	var inputs = panelRow.getElementsByTagName( type );
	for ( var item = 0; item < inputs.length; item++ ) {
		var id = inputs[ item ].getAttribute( "name" );
		id = id.substring( 0, id.length - 1 );
		id = id + ( index + 1 );
		inputs[ item ].setAttribute( "name", id );
		inputs[ item ].setAttribute( "id", id );
	}
}

function removeBetPanels( count ) {
	var stopIndex = betPanelRows.length - count;
	for ( var i = betPanelRows.length; i > stopIndex; i-- ) {
		rowNode.parentNode.removeChild( betPanelRows[ i - 1 ] );
	}
	var newArray = new Array();
	for ( var i = 0; i < ( betPanelRows.length - count ); i++ ) {
		newArray[ i ] = betPanelRows[ i ];
	}
	betPanelRows = newArray;
}

function calculate() {

	totalWin = totalStake = 0;
	var stake = document.getElementById( 'txtStake' ).value;
	var ew = document.getElementById( 'chkEW' ).checked;

	winOdds1Arr = new Array();
	winOdds2Arr = new Array();
	ewOdds1Arr = new Array();
	ewOdds2Arr = new Array();
	finishPosArr = new Array();		
	winAmounts = new Array();
	ewAmounts = new Array();

	for ( var i = 0; i < ( betPanelRows.length + 1 ); i++ ) {
		var winOdds1 = eval( "document.getElementById( 'txtWinOdds1_" + i + "' ).value" );
		var winOdds2 = eval( "document.getElementById( 'txtWinOdds2_" + i + "' ).value" );
		var ewOdds1 = eval( "document.getElementById( 'txtEWOdds1_" + i + "' ).value" );
		var ewOdds2 = eval( "document.getElementById( 'txtEWOdds2_" + i + "' ).value" );
		var finishpos = eval( "document.getElementById( 'finishPos_" + i + "' ).value" );
				
		winOdds1Arr[ i ] = winOdds1;
		winOdds2Arr[ i ] = winOdds2;
		ewOdds1Arr[ i ] = ewOdds1;
		ewOdds2Arr[ i ] = ewOdds2;
		finishPosArr[ i ] = finishpos;
	}
	winAmounts[ 0 ] = stake;
	ewAmounts[ 0 ] = stake;
	
	
	for ( var v1 = 0; v1 < winOdds1Arr.length; v1++ ) {
		calcRace( v1, 1, ew, stake );
		for ( var v2 = v1 + 1; v2 < winOdds1Arr.length; v2++ ) {
			calcRace( v2, 2, ew, stake );
			for ( var v3 = v2 + 1; v3 < winOdds1Arr.length; v3++ ) {
				calcRace( v3, 3, ew, stake );
				for ( var v4 = v3 + 1; v4 < winOdds1Arr.length; v4++ ) {
					calcRace( v4, 4, ew, stake );
					for ( var v5 = v4 + 1; v5 < winOdds1Arr.length; v5++ ) {
						calcRace( v5, 5, ew, stake );
						for ( var v6 = v5 + 1; v6 < winOdds1Arr.length; v6++ ) {
							calcRace( v6, 6, ew, stake );
							for ( var v7 = v6 + 1; v7 < winOdds1Arr.length; v7++ ) {
								calcRace( v7, 7, ew, stake );
								for ( var v8 = v7 + 1; v8 < winOdds1Arr.length; v8++ ) {
									calcRace( v8, 8, ew, stake );
								}
							}
						}
					}
				}
			}
		}
	}
	
	totalWin = totalWin;
	document.getElementById( 'lblStake' ).innerHTML = formatCurrency( totalStake );
	document.getElementById( 'lblReturn' ).innerHTML = formatCurrency( totalWin );
	document.getElementById( 'lblPL' ).innerHTML = formatCurrency( totalWin - totalStake );
	
}

function calcRace( race, iteration, ew, stake ) {
	winAmounts[ iteration ] = calcSingle( winAmounts[ iteration - 1 ], winOdds1Arr[ race ], winOdds2Arr[ race ], finishPosArr[ race ] );
	ewAmounts[ iteration ] = calcEachWay( ewAmounts[ iteration - 1 ], winOdds1Arr[ race ], winOdds2Arr[ race ], ewOdds1Arr[ race ], ewOdds2Arr[ race ], finishPosArr[ race ] );

	var selectedIndex = selBetTypes.selectedIndex;
	if ( doAccumulator( selectedIndex, iteration ) ) {
		totalStake += ( stake * 1 );
		totalWin += winAmounts[ iteration ];
		if ( ew ) {
			totalStake += ( stake * 1 );
			totalWin += ewAmounts[ iteration ];
		}
	}
}

function doAccumulator( selectedIndex, iteration )	{
	var isAccumulator = betTypes[ selectedIndex ][ 3 ] == 2;
	var isSingle = betTypes[ selectedIndex ][ 4 ] == "single";
	var numSelections = betPanelRows.length + 1;
	var ret = !( iteration == 1 && !isSingle ) && ( isAccumulator || numSelections == iteration );
	return ret;
}

function formatCurrency( value ) {
	return currSymbol + " " + value.toFixed( 2 );
}

function calcBetRow( index ) {
	var winOdds1 = document.all.txtWinOdds1_0.value;
	var winOdds2 = document.all.txtWinOdds2_0.value;
	var ewOdds1 = document.all.txtEWOdds1_0.value;
	var ewOdds2 = document.all.txtEWOdds2_0.value;
	var finishpos = document.all.finishPos_0.value;

}

function calcSingle ( stake, odds1, odds2, finishpos ) {
	if( finishpos=="w" ) {
		return ( stake * 1 ) + ( stake * 1 ) / odds2 * odds1;
	} else if ( finishpos=="n" ) {
		return stake;
	} else { 
		return 0;
	}
}

function calcEachWay( stake, odds1, odds2, eachodds1, eachodds2, finishpos) { 
	if( finishpos=="w" || finishpos=="p" ) {
		winodds = odds1 / odds2;
		eachodds = eachodds1 / eachodds2;
		eachodds = winodds * eachodds;
		return ( stake * 1 ) + ( eachodds * stake );
	} else if ( finishpos=="n" ) { 
		return stake;
	} else {
		return 0;
	}
}

function expandOddsRow()
{
	var rowNode = document.all.oddsRow;
	var newRow = rowNode.cloneNode(true);
	var inputs = newRow.getElementsByTagName( "input" );
	for ( var i = 0; i < inputs.length; i++ ) {
		var id = inputs[ i ].getAttribute( "name" );
		inputs[ i ].setAttribute( "name", id + "2" );
	}
	rowNode.parentNode.appendChild( newRow );
}

function BetCalc( numBets ) {
	this.numBets = numBets;
}

function setLinkStyle( enabled ) {
	unselectLink( document.getElementById( 'fraLink' ) );
	unselectLink( document.getElementById( 'decLink' ) );
	unselectLink( document.getElementById( 'usLink' ) );
	var enabledLink = eval( "document.getElementById( '" + enabled + "Link' )" );
	enabledLink.style.color = "#FFFFAA";
	enabledLink.style.textDecoration = "none";
}

function unselectLink( link ) {
	link.style.color = "#FFFFFF";
	link.style.textDecoration = "underline";
}
