function Racecard(hostDocument, form, meetingID, eventID, betTypeCode, betString) {

	//Race card modes
	Racecard.MODE_RESULTS = 1;
	Racecard.MODE_SELECTION = 2;
	
	// Flexi bet percentage verification
	var _FLEXI_VERIFYRESPONSE_ERROR = "ERROR:";
	var _FLEXI_VERIFYRESPONSE_OK = "OK:";
	var _MSG_FLEXI_VERIFY_INVALID 
		= "Sorry, there was a problem trying to confirm your flexi bet.";
	
	// HTML formatted bet type unavailable message
	var HTML_MSG_BETTYPE_UNAVAILABLE
		= "<center><span class='sectionTitle'><br><br>"
		+ MSG_BETTYPE_UNAVAILABLE
		+ "<br><br></span></center>";
	
	// The locations of services called
	var SERVICE_GETMEETINGEVENTS = "services/GetMeetingEvents.aspx";
	var SERVICE_GETPOOLS = "services/GetPools.aspx";
	var SERVICE_GETRACEINFO = "services/GetRaceInfo.aspx";
	var SERVICE_GETRESULTS = "services/GetResults.aspx";
	var SERVICE_GETRUNNERS = "services/GetRunners.aspx";
	var SERVICE_GETRUNNERSMULTI = "services/GetRunnersMulti.aspx";
	
	// Other constants
	var RACE_NONE = "NoRace";

	var LEGS_TRIWIN = 4;
	var NAME_INPUT_WIN = "win";
	var NAME_INPUT_PLACE = "place";
	var RACENO_NEXT = 15;

	// Other variables
	var _checkStandoutQuinellaField = true;
	var _document = hostDocument;
	var _eventIdToSet = 0;
	var _form = form;
	var _meetingId;
	var _mode = Racecard.MODE_SELECTION;
	var _naming = new ClassicControlNaming();
	var _pageRefreshRequired = false;
	var _timedRefreshing = true;
	var _triwinPoints = new Array();
	var _updateBetCost = true;
	var _xml_amountEntry = null;
	var betCoster = new BetCoster();
	var betType = new BetType();
	var selections = new RacecardSelection();
	var selectionsTranslator = new SpeedBetPlusTranslator();
	var wager = new WagerAmount();
	
	// Utility type functions

	var _displayMessage = function(message) {
		alert(message);
	}
	
	var element = function(id) {
		return _document.getElementById(id);
	}

	var element_click = function(name) {
		var _element = element(name);
		if (_element != null) _element.click();
	}

	var leg_eventId = function(formElement) {
		return (formElement==null)
			? 0: formElement.value.split(",")[0].split("~")[0];
	}

	var leg_raceNumber = function(formElement) {
		var value = formElement.value;
		var values = value.split(",");
		value = (values.length > 1)? values[1]: (value == RACE_NONE)? 0 :value;
		return parseInt(value);
	}

	var pageRefreshRequired = function() {
		return _pageRefreshRequired;
	}

	var refreshPageOnNextUpdate = function() {
		_pageRefreshRequired = true;
	}
	
	var setRaceNumberToDisplayed = function() {
		var raceSelect = element(_naming.eventId());
		if (raceSelect != null)
			selections.setRaceNumber(0, _event_raceNumber
				(raceSelect.options[raceSelect.selectedIndex]));
	}
	
	
	//Public
	this.mode = function() {
		return _mode;
	}
	
	this.setMode = function(mode) {
		_mode = mode;
	}
	
	function dollarReturn_triwin() {
		var _points = 0;
		if (_triwinPoints.length == LEGS_TRIWIN) {
			var legPoints;
			for (var i=0; i<LEGS_TRIWIN-1; ++i) {
				legPoints = _triwinPoints[i];
				if (legPoints != null)
					_points += legPoints;
				else {
					_points = 0;
					break;
				}
			}
			if ((legPoints = _triwinPoints[i]) != null) _points *= legPoints;
		}
		return wager.toWin() * (_points + 1);
	}
	
	function showDollarReturn_triwin() {
		var display = _form.returnAmount;
		if (display != null)
			display.value = dollarReturn_triwin();
	}
	
	// For Triwin bets
	this.update_points = function(leg, points) {
		_triwinPoints[leg - 1] = points;
		showDollarReturn_triwin();
	}

	
	
	// Functions dealing with selections

	// Bet amount button handling
	var _addToBet = function(amount, win) {
		var amount = parseFloat(amount);
		var input = (win)? _form.win: _form.place;
		var inputExists = (input != null);
		var max = WagerAmount.MAXIMUM;
		var setTo = 0;
		if (inputExists && wager.validAmount(amount)) {
			setTo = (input.value * 1) + amount;
			if (setTo > max) {
				setTo = max;
				_displayMessage(MSG_BET_MAXIMUM + max);
			}
		}
		if (win) {
			wager.setWin(setTo);
			if (inputExists) input.value = wager.toWin();
		} else {
			wager.setPlace(setTo);
			if (inputExists) input.value = wager.toPlace();
		}
		updateBetCost();
	}

	this.addToPlaceBet = function(amount) {
		_addToBet(amount, false);
		return false;
	}
	
	this.addToWinBet = function(amount) {
		_addToBet(amount, true);
		return false;
	}
	
	this.zeroPlaceBet = function() {
		this.addToPlaceBet("clear");
		return false;
	}
	
	this.zeroWinBet = function() {
		this.addToWinBet("clear");
		return false;
	}
	
	this.mysterySingle = function() {
		var amount = 1;
		this.zeroWinBet();
		this.addToWinBet(amount);
		if (wager.toWin() == amount) selections.setBoxed(false);
	}
	
	this.mysteryBoxed = function() {
		var amount = 3;
		this.zeroWinBet();
		this.addToWinBet(amount);
		if (wager.toWin() == amount) selections.setBoxed(true);
	}

	this.resetSelections = function() {
		this.zeroWinBet();
		this.zeroPlaceBet();
		selections.clear();
		_triwinPoints = new Array();
		if (betType.singleLeg() || betType.of(BetType.RUNNINGDOUBLE)) 
			setRaceNumberToDisplayed();
		if (betType.of(BetType.MYSTERYTRIFECTA)) selections.shroud();
		updateBetCost();
	}
	
	var selection = function(group, selected) {

		if (!betType.of(BetType.TRIWIN)) {
			var select_field = element(_naming.field(group));

			if (select_field != null && select_field.checked && !selected)
				select_field.checked = false;
		}	
	}


	var setBox = function(box) {
		var isQuinella = betType.of(BetType.QUINELLA);
		var _standoutNo;
		
		if (isQuinella) {
			var _sels = selections.getRunnerSelection(0).combination().elements();
			_standoutNo = (_sels.length > 0)? _sels[0]: 0;
		}
		
		if (box && (isQuinella 
			&& (selections.getRunnerSelection(0).count() > 1))) 
		{
			var select_box = element(_naming.box());

			if (select_box != null)	{
				select_box.checked = false;
				_displayMessage(MSG_ERR_QUINELLASTANDOUTTOOMANY);
			}

		} else {
			var elementId;
			var firstFour = betType.of(BetType.FIRSTFOUR);
			var formElement;

			if (isQuinella) {
				element(_naming.field(0)).disabled = box;
				element(_naming.field(1)).disabled = !box;

			} else if (firstFour || betType.of(BetType.TRIFECTA)) {
				element(_naming.field(2)).disabled = box;
				if (firstFour) element(_naming.field(3)).disabled = box;
			}

			for (var i=_form.elements.length - 1; i>=0; --i) {
				
				formElement = _form.elements[i];
				
				elementId = formElement.id;
				
				if (_naming.isRunnerFromGroup(elementId, 1) 
					|| _naming.isFieldFromGroup(elementId, 1)) 
				{
					formElement.disabled = (box ^ isQuinella)
						 || (_naming.number_runner(elementId) == _standoutNo);
				}
			
				if (_naming.isRunnerFromGroup(elementId, 2) 
					|| _naming.isRunnerFromGroup(elementId, 3))
					formElement.disabled = box;

				if (formElement.checked & formElement.disabled)
					formElement.checked = false;
			}
			selections.setBoxed(box);
		}
	}

	var setFlexi = function(flexi) {
		selections.setFlexi(flexi);
	}

	var _selectMystery = function(race) {
		selections.setRace(race);
	}

	var _updateSelectedRace = function() {
		var e = _form.eventID;
		var index = e.selectedIndex;
		if (index == -1) {
			if (e.options.length > 0) {
				e.selectedIndex = index = 0;
			} else {
				_displayMessage(MSG_NOEVENTSFORMEETING);
				return;
			}
		}
		currentEventId_local = e.value;
		selections.setRaceNumber(0, _event_raceNumber(e.options[index]));
	}
	
	var _setRaceByEventId = function(eventId) {
		_form.eventID.value = eventId;
		_updateSelectedRace();
	}
	
	var _setRaceByNumber = function(raceNumber) {
		var e = _form.eventID;
		var o;
		var race = raceNumber;
		for (var i=e.options.length-1; i>=0; --i) {
			o = e.options[i];
			if (race == _event_raceNumber(o) && o.className == "open") {
				o.selected = true;
				break;
			}
		}
		_updateSelectedRace();
	}
	
	var _updateStandoutQuinellaFieldSelect = function() {
		if (!_checkStandoutQuinellaField || !betType.of(BetType.QUINELLA)) 
			return;
		
		var _GROUP = 1;
		var _selected = false;
		for (var i=element("runnerCount").value; i>0; --i) {
			var _tickBox = element(_naming.runner(_GROUP, i));
			if (!(_tickBox == null || _tickBox.disabled)) {
				_selected = _tickBox.checked;
				if (!_selected) break;
			}
		}
		element(_naming.field(_GROUP)).checked = _selected;
	}
	
	this.handleRaceChange = function(element_select) {
		
		var e = element_select;
		
		//var currentEventName = setLoading(e);
		
		_updateSelectedRace();	
		
		this.resetSelections();
			
		this.refresh();
		
		//unsetLoading(e, currentEventName);
	}


	// Handle calls resulting from racecard selections
	this.handleChangeTo = function(formElement) {
		if (formElement == null) return;
		var id = formElement.id;
		var name = (id==null)? formElement.name: id;
		if (name == null) {
			return;
		}
		
		if (_naming.isNameOf_box(name)) {
			setBox(formElement.checked);

		} else if (_naming.isNameOf_flexiBet(name)) {
			setFlexi(formElement.checked);

		} else if (_naming.isNameOf_field(name)) {
			this.setField(_naming.group_field(name), formElement.checked);

		} else if (_naming.isNameOf_runner(name)) {
			var group = _naming.group_runner(name);
			var number = _naming.number_runner(name);
			var quinella = betType.of(BetType.QUINELLA);
			var selected = formElement.checked;
			
			if (betType.of(BetType.TRIWIN)
				|| (quinella && (group == 0) && selections.isBoxed()))
			{
				selections.removeAll(group);
				
				if (quinella) {
					var formElement, id;
					for (var i=_form.elements.length - 1; i>=0; --i) {
						formElement = _form.elements[i];
						id = formElement.id;
						var elem_runnerNo = _naming.number_runner(id);
						
						if (_naming.isRunnerFromGroup(id, 0) && (elem_runnerNo != number))
							formElement.checked = false;
							
						if (_naming.isRunnerFromGroup(id, 1)) {
							var _disabled = (elem_runnerNo == number) 
								&& element(_naming.runner(0, number)).checked;
							_checkStandoutQuinellaField = false;
							if (_disabled && formElement.checked) element_click(id);
							_checkStandoutQuinellaField = true;
							formElement.disabled = _disabled;
						}
					}
					if (element(_naming.field(1)).checked) this.setField(1, true);
				}
				
			} else if (quinella && (group == 1)) {
				_updateStandoutQuinellaFieldSelect(); 
							
			} else {
				var select_field = element(_naming.field(group));

				if (select_field != null && select_field.checked && !selected) {
					selections.deselectField(group);
					select_field.checked = false;
				}
			}	
			
			if (selected) {
				selections.add(group, number);
			} else {
				selections.remove(group, number);
			}

		} else if (_naming.isNameOf_eventId(name)) {
			this.handleRaceChange(formElement);

		} else if (_naming.isNameOf_allUpBetType(name)) {
			var leg = _naming.number_leg(name);
			var type = (formElement.value == "all_up_place")?
				RunnerSelection.TYPE_PLACE: RunnerSelection.TYPE_WIN;
			selections.setLegType(leg - 1, type);
		
		
		} else if (_naming.isNameOf_legSelect(name)) {
			this.handleLegChange(formElement);

		} else if (_naming.isNameOf_mysteryRace(name)) {
			var race = (formElement.value == RACENO_NEXT)
				?RacecardSelection.RACE_NEXT
				:RacecardSelection.RACE_CURRENT;
			_selectMystery(race);
		}

		updateBetCost();
	}

	this.handleLegChange = function(formElement)
	{
		var leg = _naming.number_leg(formElement.name);
		var legIndex = leg - 1;
		var race_current = selections.getRaceNumber(legIndex);
		var race_selected = leg_raceNumber(formElement);
		
		if ((leg > 1) && (selections.getRaceNumber(legIndex - 1) < 1)) {
			formElement.selectedIndex = 0;
			_displayMessage(MSG_ALLUP_SELECTLEGSINORDER);
		
		} else if ((leg > 1) 
			&& (selections.getRaceNumber(legIndex - 1) >= race_selected)
		) {
			setRaceNumber(leg, race_current);
			_displayMessage(MSG_ALLUP_CHOOSERACEAFTER + legIndex);
		
		} else if ((leg < 4) && (selections.getRaceNumber(leg) > 0) 
			&& (selections.getRaceNumber(leg) <= race_selected)
		) {
			setRaceNumber(leg, race_current);
			_displayMessage(MSG_ALLUP_CHOOSERACEBEFORE + (leg + 1));

		} else if (race_selected == RACE_NONE) {
			// User has selected "select an event"
			setRaceNumber(leg, race_current);
			
		} else {
			selections.setRaceNumber(legIndex, race_selected);
			selections.removeAll(legIndex);
			this.refresh();
		}
	}
	
	this.setField = function(group, selected) {
		
		_updateBetCost=false;
		
		var formElement;

		if (!(selections.isBoxed() && betType.of(BetType.QUINELLA))) {
			if (selected) {
				selections.selectField(group);
			} else {
				selections.removeAll(group);
			}
		}
		
		for (var i=_form.elements.length - 1; i>=0; --i) {
			formElement = _form.elements[i];
			if (!formElement.disabled 
				&& _naming.isRunnerFromGroup(formElement.id, group) 
				&& (formElement.checked != selected)) 
			{
				formElement.checked = selected;
				this.handleChangeTo(formElement);
			}
		}
		_updateBetCost=true;
	}


	var setRaceNumber = function(leg, race) {
		var _set = false;
		var e = element(_naming.legSelect(leg));
		if (e != null && !(_set = leg_raceNumber(e) == race)) {
			var opt;
			for (var i=0; i<e.options.length; ++i) {
				opt = e.options[i];
				if (leg_raceNumber(opt) == race) {
					opt.selected = true;
					_set = true;
					break;
				}
			}
		}
		return _set;
	}
	
	var _event_raceNumber = function(eventOption) {
		var _DEFAULT_RACENO = "1";
		var rn = eventOption.text.split(' ');

		if (rn.length > 0) 
		{
			rn = rn[1].split(String.fromCharCode(160));
			if (rn.length > 0) rn = rn[0];
			var _rnl = rn.length - 1;
			if (rn.charAt(_rnl) == ':') 
				rn = (_rnl > 0) ?rn.substr(0, _rnl) :_DEFAULT_RACENO;
		} 
		else 
		{
			rn = _DEFAULT_RACENO;
		}
		return rn;
	}
	
	var _getBetType = function(betString) {
		return selectionsTranslator.betType(betString);
	}
	
	var _getRacecardSelection = function(betString) {
		return selectionsTranslator.selections(betString);
	}
	
	var _getWagerAmount = function(betString) {
		return selectionsTranslator.wagerAmount(betString);
	}
	
	this.loadSelections = function(betString) {
		var t = _getBetType(betString);
		var s = _getRacecardSelection(betString);
		var w = _getWagerAmount(betString);
		this.applySelections(t, w, s);
	}

	this.applySelections = function(betTypeObject, wagerAmountObject, selectionObject) {
		var t = betTypeObject;
		var s = selectionObject;
		var w = wagerAmountObject;
			
		var boxed = s.isBoxed();
		var flexiBet = betType.of(BetType.FIRSTFOUR)? s.isFlexiBet(): false;
		var selectionElement;
	
		_updateBetCost = false;
	
		setBetType(t.selected());
	
		this.zeroPlaceBet();
		this.zeroWinBet();
		this.addToWinBet(w.toWin());
		this.addToPlaceBet(w.toPlace());
		
		var _boxedQuinella = betType.of(BetType.QUINELLA) && boxed;
		
		selections.clear();
				
		if (s.isMystery()) {
			selections.shroud();
			selectionElement 
				= _document.getElementsByName(_naming.mysteryRace());
			var index;
			if (selectionElement != null && selectionElement.length > 0) {
				var raceSelection = s.getRace();
				selectionElement[((raceSelection == RacecardSelection.RACE_NEXT)? 1: 0)].checked = true;
				_selectMystery(raceSelection);
			}
			index = (boxed)? 1: 0;
			selectionElement 
				= _document.getElementsByName(_naming.mysteryAmount());
			selectionElement[index].checked = true;
			if (boxed) this.mysteryBoxed(); else this.mysterySingle();
		} else {
			var fc = s.fieldCount();
			var needsRefresh = false;
			var racesToSet = new Array();
			
			var e = element(_naming.eventId());
			for (var i=0; i<fc; ++i) {
				
				var rs = s.getRunnerSelection(i);
				var race = rs.getRaceNumber();

				if (race > 0) {
					var leg = i + 1;
					selectionElement = _form.elements[_naming.allUpBetType(leg)];
					if (selectionElement != null) {
						var _type = rs.getType();
						selectionElement[((_type == RunnerSelection.TYPE_PLACE)? 1: 0)].checked = true;
						selections.setLegType(i, _type);
		
						var _set = (leg_raceNumber(element(_naming.legSelect(leg)))
							== race);
						needsRefresh = !_set && ((i == 0) || (racesToSet[i-1] < race));
						racesToSet[i] = (_set || needsRefresh)? race: 0;
					} else if (e != null) {
						if (i == 0) {
							var o = e.options[e.selectedIndex];
							var race_selected = _event_raceNumber(o);

							if (race == race_selected) {
								if (o.className == "open") {
									selections.setRaceNumber(i, race);
								} else {
									s.clear();
									selections.clear();
									break;
								}
								
							} else {
								for (var j=e.options.length-1; j>=0; --j) {
									if (race == _event_raceNumber
										(e.options[j]))
									{
										o = e.options[j];
										if (o.className == "open") {
											e.options[j].selected = true;
											this.handleRaceChange(e);
										}
										break;
									}
								}
							}
						}
					}	
				} 
				if (i==0) {
					if (boxed) 
					{
						var _boxBox = element(_naming.box());
						if (boxed = (_boxBox != null)) _boxBox.checked = true;
					} 
					var _flexiBox = element(_naming.flexiBet());
					if (_flexiBox != null)
					{
						_flexiBox.checked = flexiBet;
					}
					setBox(boxed);
					setFlexi(flexiBet);
				}
			
				if (!_boxedQuinella && rs.fieldSelected()) {
					var _fieldTickbox = element(_naming.field(i));
					if (_fieldTickbox != null && !_fieldTickbox.disabled) {
						_fieldTickbox.checked = true;
						this.setField
							(_naming.group_field(_fieldTickbox.id), true);
					}
				} else {
					var numbers = rs.combination().elements();
					for (var j=numbers.length-1; j>=0; --j) {
						var _tickBox = element(_naming.runner(i, numbers[j]));
						if (_tickBox != null && !_tickBox.disabled) {
							if (t.of(BetType.TRIWIN)) {
								_tickBox.click();
							} else {
								_tickBox.checked = true;
							}
						}
						this.handleChangeTo(_tickBox);
					}
				}
			}
			
			for (var i=racesToSet.length - 1; i>=0; --i) {
				var race = racesToSet[i];
				if ((race > 0) && setRaceNumber(i + 1, race)) 
					selections.setRaceNumber(i, race);
			}
			
			if (needsRefresh) this.refresh();
		}
		if ((selections.getRaceNumber(0) < 1)
			&& 
			(t.singleLeg() 
			|| t.of(BetType.MYSTERYTRIFECTA) 
			|| t.of(BetType.RUNNINGDOUBLE))) 
		{
			setRaceNumberToDisplayed();
		}
		_updateBetCost = true;
		updateBetCost();
	}

	this.removeLeg = function(leg) {
		var legIndex = leg - 1;
		if (legIndex > 1) {
			for (var i=selections.fieldCount()-1; i>=legIndex; --i)
				selections.removeLeg(i);
			this.refresh();
		}
	}

	// Sets the current bet type
	var _setBetTypeElement = function(typeCode, state) {
		var e = element(typeCode);
		if (e != null) SetElementClass(e, "betTypeSelected", state);
	}
	
	var setBetType = function(type) {
		setBetTypeByCode(betType.codeFor(type));
	}

	var setBetTypeByCode = function(typeCode) {
		_setBetTypeElement(betType.selectedCode(), false);
		betType.selectByCode(typeCode);
		_setBetTypeElement(betType.selectedCode(), true);
	}
	
	var _change_meeting = function(meetingId) {
		var e = _form.meetingID;
		e.value = meetingId;
		if (e.selectedIndex == -1) e.selectedIndex = 0;
		_meetingId = e.value;
		if (betType.singleLeg() || betType.of(BetType.RUNNINGDOUBLE)) {
			showEvents();
		}
	}
	

	this.change_meeting = function(obj) {
		var currentMeetingName = setLoading(obj);
		_change_meeting(obj.value);
		unsetLoading(obj,currentMeetingName);
		this.resetSelections();
		this.refresh();
	}


	// Changes display of card to results mode if necessary
	this.check_results = function() {
		var _raceStatus 
			= _form.raceStatus == null ? null : _form.raceStatus.value;
		var _runningDouble = betType.of(BetType.RUNNINGDOUBLE);
		var runnerData = element("runnerData");
		
		var _doZeRejiggery = !betType.multiLeg() || _runningDouble;
		var bResults = _raceStatus == "DA" 
			|| _raceStatus == "DE" 
			|| _raceStatus == "AB";

		var changingToSelect 
			= (!bResults && this.mode() == Racecard.MODE_RESULTS);
		
		if (bResults) {
			this.setMode(Racecard.MODE_RESULTS);
		
			if (_doZeRejiggery) {
				var oRequest = new XmlHttp(SERVICE_GETRESULTS);
				oRequest.addParam("MeetingId", _meetingId);
				oRequest.addParam("eventId_local", currentEventId_local);
				oRequest.send();

				var sHtml = "<div align='center'>";
				sHtml += "<span class='sectionTitle'>" 
				sHtml += _raceStatus == "DA" ? "Final" : "Interim";
				sHtml += "</span>";
				sHtml += oRequest.responseText;
				sHtml += "</div>";
				
				runnerData.innerHTML =  oRequest.responseText;
			}
		} else {
			this.setMode(Racecard.MODE_SELECTION);
		}
		
		var instruction01 = element("instruction01");
		var instructionsVisible = instruction01.className.indexOf("hide") < 0;

		
		if ((bResults && instructionsVisible) 
			|| (!bResults && !instructionsVisible)) 
		{
			SetElementClass(instruction01, "hide", bResults);
			SetElementClass(element("selectAmount"), "hide", bResults);
			SetElementClass(element("submitbet"), "hide", bResults);
			SetElementClass(element("submitbet2"), "hide", bResults);
			if (_doZeRejiggery) {
				SetElementClass(element("betTypes"), "hide", bResults);
				SetElementClass(element("betTypes2"), "hide", bResults);
			}
			SetElementClass(element("instruction4"), "hide", bResults);
			element("instruction5").style.width = bResults ? '100%' : '430px';
			element("instruction02number").innerHTML = bResults ? '1' : '2';
			element("helpCurrent").style.display = bResults ? 'none' : 'block';
			element("helpPast").style.display = bResults ? 'block' : 'none';
		}
		
		if (_doZeRejiggery)
			if (bResults)
				runnerData.innerHTML += this.refreshRunnersSingle();
			else if (changingToSelect && !_runningDouble)
				runnerData.innerHTML = this.refreshRunnersSingle();
		
		if (changingToSelect) updateRefreshTime();
	}

	this.selectionString = function() {
		return selectionsTranslator.betString(selections, betType, wager);
	}
		
	this.refresh = function() {
		window.status = MSG_STATUS_REFRESHING;

		var multiLeg = betType.multiLeg();

		// Save selections
		element("bet").value = this.selectionString();

		var eventId = (multiLeg)
		    ? this.refreshMultiLegs()
		    : currentEventId_local;
		
		showRaceInfo(eventId, (multiLeg)? "true": "false");
		refreshPoolData(eventId);
	
		if (!multiLeg)
		    element("runnerData").innerHTML = this.refreshRunnersSingle();
		
		this.loadSelections(element("bet").value);
		window.status = MSG_STATUS_COMPLETE;
		
		// In case race status has changed
		this.check_results();
	}


	function refreshPoolData(eventId) {
		var html;
		var request = new XmlHttp(SERVICE_GETPOOLS);
		request.addParam("EventId", eventId);
		request.send();

		if (emptyResponse(request)) {
			
			// Handle the case where no pools data is available
			var poolMsg = "<table cellspacing=0 id=PoolTotals style=\"margin-top:3px;\">"
				+ "<tr><td>" + MSG_NOPOOLDATA + "</td></tr></table>";
			
			html = poolMsg;
			
			// Pools are assumed to be unavailable in this case
			pool_exacta = false;
			pool_first4 = false;
			pool_quinella = false;
						
		} else {
			var doc_pools = request.responseDocument.documentElement;
			var node_html = xmlSelectSingleNode(doc_pools, "html");
			
			html = getInnerXml(node_html);
			
			var node_poolCodes = xmlSelectSingleNode(doc_pools, "poolCodes");
			var poolCodesXml = getInnerXml(node_poolCodes);
			
			pool_exacta = hasPool("ex", poolCodesXml);
			pool_first4 = hasPool("ff", poolCodesXml);
			pool_quinella = hasPool("qn", poolCodesXml);
		}
		element("poolData_aus").innerHTML = html;
	}

	this.change_betType = function(typeCode) {

		var wasMultiLeg = betType.multiLeg();
		var wasMysteryTrifecta = betType.of(BetType.MYSTERYTRIFECTA);
		
		setBetTypeByCode(typeCode);
		
		var multiLeg = betType.multiLeg();
		
		element("runnerData").innerHTML = "";
		
		if (wasMultiLeg || wasMysteryTrifecta || multiLeg) 
			this.resetSelections();
		
		if (betType.of(BetType.MYSTERYTRIFECTA)) {
			selections.shroud();
		} else {
			selections.reveal();
		}
		
		if (multiLeg) {
			this.refreshMultiLegs();
			if (betType.of(BetType.RUNNINGDOUBLE)) showEvents(); 
		} else {
			if (wasMultiLeg) showEvents();
			element("runnerData").innerHTML = this.refreshRunnersSingle();
		}

		show_amountClass(betType.selectedCode());

		this.refresh();
		return false;
	}	

	var _getAmountEntryHtml = function(amountClass) {
		var html;
		var node = xmlSelectSingleNode
			(_xml_amountEntry, "amountClass", "id", amountClass);
		html = (node == null)? "": getInnerXml(node);
		return html;
	}
	
	var show_amountClass = function(classId) {
		if (classId == "?tf") {
		    element("amount_win").style.display = "none";
		    element("amount_mystery").style.display = "block";
		} else {
		    element("amount_win").style.display = "block";
		    element("amount_mystery").style.display = "none";
		}
		element("amount_flexiBet").style.display 
			= (classId == "ff")? "block": "none";
		element("amount_place").style.display 
			= (classId == "win_place_eachway")? "block": "none";
		element("amount_return").style.display 
			= (classId == "tw")? "block": "none";
	}

	
	var showEvents = function() {
		var oRequest = new XmlHttp(SERVICE_GETMEETINGEVENTS);
		oRequest.addParam("MeetingId", _meetingId);
		oRequest.send();
		if (oRequest.responseText == null) {
			_displayMessage (MSG_NOMEETINGDATA + _meetingId);
			return;
		}
		element("eventData").innerHTML = oRequest.responseText;
		
		_updateSelectedRace();
	}


	this.refreshRunnersSingle = function() {

		var html;
		if ((betType.of(BetType.EXACTA) && !pool_exacta) 
			|| (betType.of(BetType.QUINELLA) && !pool_quinella)
			|| (betType.of(BetType.FIRSTFOUR) && !pool_first4))
		{
			html = HTML_MSG_BETTYPE_UNAVAILABLE;
		} 
		else 
		{
			var oRequest = new XmlHttp(SERVICE_GETRUNNERS);
			oRequest.addParam("eventId_local", currentEventId_local);
			oRequest.addParam("BetType", betType.selectedCode());	
			oRequest.send();
			html = oRequest.responseText;
		}
		return html;
	}


	this.refreshMultiLegs = function() {
		var _racecardArea = element("runnerData");
		var eventId_firstLeg;
					
		var oRequest = new XmlHttp(SERVICE_GETRUNNERSMULTI);
		oRequest.addParam("MeetingId", _meetingId);
		oRequest.addParam("bet", UrlEncode(this.selectionString()));
		oRequest.addParam("eventId_local", currentEventId_local);
		oRequest.send();
		
		if (!betType.of(BetType.RUNNINGDOUBLE))
			element("eventData").innerHTML = "&nbsp;"
	
		if (emptyResponse(oRequest)) {	// Should no longer be used
			_racecardArea.innerHTML = HTML_MSG_BETTYPE_UNAVAILABLE;
			element("raceInfoData").innerHTML = "&nbsp;";
			element("raceStatusData").innerHTML = "&nbsp;"
		}
		else 
		{
			var xml = oRequest.responseDocument.documentElement;
			var events = xmlSelectSingleNode(xml, "events");		
			var oEvent = xmlSelectSingleNode(events, "eventID");
	
			if (oEvent != null && oEvent.firstChild != null) 
				eventId_firstLeg = oEvent.firstChild.nodeValue;
				
			_racecardArea.innerHTML
				= getInnerXml(xmlSelectSingleNode(xml, "content"));
		}
		return eventId_firstLeg;
	}
	
	
	this.sendform = function () {
		var _authCookieExists = AuthCookieExists();
		if (_loggedIn && _authCookieExists) {
			var allUp = betType.of(BetType.ALLUP);
			var min;
			
			try 
			{
				var meetingVenue 
					= document.getElementById("meetingVenue").value;
				var meetingType 
					= document.getElementById("meetingType").value;
			} 
			catch(e) 
			{
				_displayMessage((allUp)
					?MSG_ALLUP_LEG_MINIMUM
					:MSG_BETTYPE_UNAVAILABLE);
				return;
			}
							
			switch(betType.selected()) {
				case BetType.ALLUP:
					var c, fc = selections.fieldCount(), _min = 0.5;
					if (fc < 2) {
						_displayMessage(MSG_ALLUP_LEG_MINIMUM);
						return;
					}
					for (var i=0; i<fc; ++i) {
						if ((c = selections.getRunnerSelection(i).count()) < 1)
						{
							_displayMessage
								(MSG_ALLUP_LEG_NOSELECTIONS_PREFIX + (i + 1) 
								+ MSG_ALLUP_LEG_NOSELECTIONS_POSTFIX);
							return;
						} else {
							if (i>0) _min *= c;
						}
					}
					min = (_min < 1)? 1: _min;
					break;
				case BetType.DAILYDOUBLE:
				case BetType.FIRSTFOUR:
				case BetType.QUADRELLA:
				case BetType.RUNNINGDOUBLE:
				case BetType.WINPLACE:
					min = 0.5;
					break;								
				case BetType.MYSTERYTRIFECTA:
					this.race = selections.getRace();
				default: min = 1;
			}
			
			var meetingDate = _form.meetingDate.value.substring(0, 10);
			var cost = updateBetCost();
			var _selections = this.selectionString();
			
			var qs = "meetingVenue=" + UrlEncode(meetingVenue);
			qs += "&meetingType=" + UrlEncode(meetingType);
			qs += "&meetingDate=" + UrlEncode(meetingDate);
			qs += "&costcheck=" + cost;
			qs += "&bet=" + UrlEncode(_selections);
			qs += "&system=local";
			
			var max = WagerAmount.MAXIMUM;
			var place = wager.toPlace();
			var win = wager.toWin();	
					
			if (cost >= min && cost <= max && (!allUp || (win >= min))) {
				
				if (betType.of(BetType.TRIWIN)
					&& ((cost - Math.floor(cost)) > 0))
				{
					_displayMessage(MSG_TRIWIN_BETCOST);
					return;
				}
				
				if (selections.isFlexiBet())
				{
					// Check the flexibet verify service
					var request = new XmlHttp("services/FlexiBetVerify.aspx?" + qs); 
					request.send();
					
					var response = request.responseText;
					var _flexiVerified = false;
					
					if (response.length >= _FLEXI_VERIFYRESPONSE_OK.length)
					{
						var responseParts = response.split(" ");
												
						if (responseParts.length > 1)
						{
							if (responseParts[0] == _FLEXI_VERIFYRESPONSE_OK)
							{
								qs += "&flexiPc=" + UrlEncode(responseParts[1]);
								_flexiVerified = true;
							} 
							else if (responseParts[0] == _FLEXI_VERIFYRESPONSE_ERROR)
							{
								_displayMessage (response.substring(_FLEXI_VERIFYRESPONSE_ERROR.length + 1, response.length));
								return;
							}
						}
					}
					if (!_flexiVerified)
					{
						_displayMessage (_MSG_FLEXI_VERIFY_INVALID);
						return;
					}
				}
				
				var oDlg = new DialogWindow("confirm.aspx?" + qs);
				oDlg.Name = "confirm";	
				oDlg.Width = 570;
				oDlg.Height = 380;
				oDlg.Scroll = false;
				oDlg.Status = false;
				oDlg.Resizable = true;
				oDlg.TryModal = true;
				var iSelLength = _selections.length;
				if (iSelLength > 35) {
					oDlg.Width = ((iSelLength - 35) * 10) + oDlg.Width;
				}
				oDlg.Show();
				if (oDlg.WasModal) {
					if (typeof(handleBetAction) == "function") {
						handleBetAction(oDlg.ReturnValue); 
					}
				}
			} else if ((cost < min && win < min 
				&& (!betType.of(BetType.WINPLACE) || place < min))
				|| (allUp && (win < min)))
			{
				_displayMessage(MSG_BET_MINIMUM + min);
			} else if (cost > max) {
				_displayMessage(MSG_BET_MAXIMUM + max);
			} else {
				_displayMessage(MSG_BET_SELECTIONS);
			}
		} else {
			_displayMessage(MSG_NOTLOGGEDIN);
			if (_loggedIn && !_authCookieExists) location.href = location.href;
		}
	}

	var showRaceInfo = function(eventId, multi) {
		var sInfoHtml = "";
		var sStatusHtml = "";

		if (eventId != null && eventId != 0) {
			var _event = element(_naming.eventId());
			var _firstLeg;
			if (betType.of(BetType.RUNNINGDOUBLE)) {
				_firstLeg = _event.selectedIndex < (_event.options.length - 1);
			} else {
				_firstLeg = multi;
			}
			
			var oRequest = new XmlHttp(SERVICE_GETRACEINFO);
			oRequest.addParam("EventId", eventId);
			oRequest.addParam("FirstLeg", _firstLeg);
			oRequest.addParam("Multi", multi);
			oRequest.send();
			if (oRequest.responseDocument != null) {
				var oInfoNode = xmlSelectSingleNode
					(oRequest.responseDocument, "content", "id", "info");
				sInfoHtml = getInnerXml(oInfoNode);
				var oStatusNode = xmlSelectSingleNode
					(oRequest.responseDocument, "content", "id", "status");
				sStatusHtml = getInnerXml(oStatusNode);
			}
		}

		element("raceInfoData").innerHTML = sInfoHtml;
		element("raceStatusData").innerHTML = sStatusHtml;
	}


	var updateBetCost = function() {
		var cost = 0;
		if (_updateBetCost) {
			var displayCost;
			cost = betCoster.costBet(betType, wager, selections);

			if (cost > 0) {
				displayCost = "$" + cost;
				if (displayCost.charAt(displayCost.length-2)=='.') 
					displayCost += '0';
			} else {
				displayCost = "$0";
			}
				
			document.getElementById("submitbet").innerHTML
				= MSG_SUBMIT_BET+" - " + displayCost + " ";
			document.getElementById("submitbet2").innerHTML
				= MSG_SUBMIT_BET+" - " + displayCost + " ";
			showDollarReturn_triwin();
		}
		return cost;
	}

	var oMeetings = element("meetings");
	if (oMeetings == null || oMeetings.options.length == 0) {
		element("divNoMeetings").style.display = "";
		var oRaceDiv = element("racePage");
		if (oRaceDiv != null) oRaceDiv.style.display = "none";
	} else {
		pool_exacta = null;
		_change_meeting((meetingID > 0)? meetingID: _form.meetingID.value);
		if (eventID != 0) _setRaceByEventId(eventID);

		setBetTypeByCode(betTypeCode);
       	    	
       	if (betType.selected() == BetType.TRIWIN)
       	    element("eventData").innerHTML = "&nbsp;";
       	
		var betType_allUp = betType.selected() == BetType.ALLUP;
		
		show_amountClass(betType.selectedCode());
				
		if (!betType_allUp) this.refresh();
		
		if (betString.length > 0) this.loadSelections(betString);
		
		if (betType_allUp) this.refresh();
	}
}