﻿///
///	HACK ONLY
///
/// will become coupon2.js in core and be removed
///

/*
 * RULES FOR COUPON CREATION
 * 
 * outer container (div/table/etc) must have ID = "{couponID}"
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 */

GWCORE.Coupon = (function(GWCORE, $, _)
{
	"use strict";

	var Coupon = {};

	Coupon.CouponModes =
	{
		Edit: 1,
		Confirm: 2,
		Receipt: 3
	};

	Coupon.BenefitModes =
	{
		None: 0,
		BonusBet: 1,
		DivBoostToken: 2,
		DivBoostWallet: 3
	};

	// private variables
	var mainCouponID = "CouponBlock";
	var quickCouponID = "CouponQuick";
	var activeCoupons = {}; //Coupon
	var currentLegHashes = {};
	var currentLegCounts = {};
	var mostRecentTransactionIDs = [];
	var pageTransactionIDs = [];
	var useBettingPanel = false;

	Coupon.MIN_NORMAL_BETAMT = 1;
	Coupon.MIN_NORMAL_BETUNIT = 0.5;
	Coupon.MIN_EXOTIC_BETAMT1 = 1;   //Exactas and Quinellas
	Coupon.MIN_EXOTIC_BETAMT2 = 0.5;   //Trifecta, FFour, Quadrella
	Coupon.MIN_EXOTIC_BETUNIT = 0.01;  //must not be < 0.01m
	Coupon.applyAllBetAmountToMultis = false;
	Coupon.ewEWShowName = "EachWay";
	Coupon.ewWPShowName = "Win / Place";
	Coupon.boostName = "Boost";
	Coupon.inputType = "numeric";
	Coupon.inputMode = "decimal";
	Coupon.forceSingleBoostMode = false;
	Coupon.showEmptyCoupon = false;
	Coupon.showAllBetsAmount = false;
	Coupon.showCouponRetain = false;
	Coupon.userInputDelay = 750;
	Coupon.linkHistEvent = false;

	Coupon.respGamblingMesg = "What are you really gambling with?";
	Coupon.respGamblingCall = "For free and confidential support call 1800&nbsp;858&nbsp;858 or visit <a href='gamblinghelponline.org.au'>gamblinghelponline.org.au</a>";


	//whether parlay option are toggleable and whether default to showing or not
	//		undefined : feature disabled
	//		true	: enabled and default to showing
	//		false	: enabled and default to hidden
	Coupon.toggleParlay = undefined;

	//whether to reverse the parlay options
	Coupon.reverseParlay = false;

	Coupon.allowRaceExoticSels = false; // EXPERIMENTAL - DO NOT ENABLE //2.5hrs dev so far

	//new
	Coupon.GetMainCouponID = function()
	{
		return mainCouponID;
	};

	//new
	Coupon.GetQuickCouponID = function()
	{
		return quickCouponID;
	};

	//orig
	Coupon.isPrimaryCoupon = function(coupon)
	{
		return (coupon.couponID === undefined || coupon.couponID === mainCouponID);
	};

	Coupon.isQuickBetCoupon = function(coupon)
	{
		return (coupon.couponID === quickCouponID);
	};

	Coupon.ToggleConfirmSubmitButtons = function(elID, coupTtl, coupon)
	{
		if(GWCORE.AccountPrefs.HasOneClick)
		{
			$(elID + '_CouponConfirm').toggle(false);
			$(elID + '_CouponSubmit').toggle(false);

			var enableOneClick = false;
			if(coupTtl <= GWCORE.AccountPrefs.OneClickAmount)
			{
				if(Coupon.isPrimaryCoupon(coupon))
					enableOneClick = GWCORE.AccountPrefs.UseOneClick(GWCORE.AccountPrefs.OneClickModes.Primary);
				else if(Coupon.isQuickBetCoupon(coupon))
					enableOneClick = GWCORE.AccountPrefs.UseOneClick(GWCORE.AccountPrefs.OneClickModes.Quick);
			}

			if(enableOneClick || coupon.currentMode == GWCORE.Coupon.CouponModes.Confirm)
				$(elID + '_CouponSubmit').toggle(true);
			else
				$(elID + '_CouponConfirm').toggle(true);
		}
	};

	//orig
	Coupon.ShowCoupon = function()
	{
		if(!GWCORE.getSiteSetting("isMobileSite"))
		{
			GWCORE.PageManager.LoadDynPage("/Coupon", "#CouponBlock", true);
		}
	};

	//orig
	Coupon.ProcessCouponCounts = function(newCountObject)
	{
		//TODO: needed? was this jsut to sync the Session coupon with front ends?

		// does this just get called on add/del/clear for a coupon?

	};

	//orig
	Coupon.GetCouponLegCount = function(couponID)
	{
		var coup = activeCoupons[couponID];

		var rtn = 0;

		if(coup !== undefined)
		{
			rtn = coup.LegCount();
		}

		return rtn;
	};

	//orig - no longer needed
	Coupon.ProcessLegHashes = function(newHashArray, couponID)
	{
		//if(undefined === couponID)
		//	couponID = 0;

		//if(!(_.isEqual(_.sortBy(currentLegHashes), _.sortBy(newHashArray))))
		//{
		//	currentLegHashes = newHashArray;

		//	//try
		//	//{
		//	//	if(undefined !== couponID)
		//	//	{
		//	//		$(GWCORE).trigger($.Event("CouponLegHashesUpdated.Coupon.GWCORE", {
		//	//			couponLegHashes: currentLegHashes[couponID],
		//	//			couponID: couponID
		//	//		}));
		//	//	}
		//	//	$(GWCORE).trigger($.Event("AllCouponsLegHashesUpdated.Coupon.GWCORE", {
		//	//		couponLegHashes: currentLegHashes
		//	//	}));
		//	//}
		//	//catch(err)
		//	//{
		//	//	console.error(err.message);
		//	//}
		//}
	};

	//orig
	Coupon.ProcessNewTransactionIDs = function(newTransArray)
	{
		pageTransactionIDs = _.union(pageTransactionIDs, newTransArray);
		mostRecentTransactionIDs = newTransArray;
	};

	//orig
	Coupon.GetCurrentLegHashes = function(couponID)
	{
		if(couponID === undefined)
		{
			couponID = GWCORE.Coupon.GetMainCouponID();
		}

		var coup = activeCoupons[couponID];
		if(coup !== undefined)
		{
			return coup.GetLegHashes();
		}
		else
			return [];
	};

	//orig
	Coupon.GetCurrentLegCounts = function()
	{
		return currentLegCounts;
	};

	//orig
	Coupon.GetAllSubmittedBetslipTransactionIDs = function()
	{
		return pageTransactionIDs;
	};

	//orig
	Coupon.GetMostRecentSubmittedBetslipTransactionIDs = function()
	{
		return mostRecentTransactionIDs;
	};

	//orig
	Coupon.LiveBettingMessage = function(btn, mtype, eid, cid, betType, special, price, mod1, mod2, couponID)
	{
		try
		{
			$(GWCORE).trigger($.Event("LiveBettingMessage.Coupon.GWCORE", {btn: btn, couponID: couponID}));
		}
		catch(err)
		{
			console.error(err.message);
		}
	};

	function CreateBlankCoupon(couponID)
	{
		ClearDeadCoupons();

		if($('#' + couponID)[0] === undefined)
		{
			$('#dynamicCoupons').append("<div id='" + couponID + "' data-template='bettingPanel_" + couponID.toLowerCase().replace("coupon", "") + ".html?ts=" + Math.random() + "' data-forcesingleitem='" + (couponID == quickCouponID) + "'></div>");
		}

		var newcoup = jQuery.extend({}, GWCORE.CouponStore);
		newcoup.Initialise(couponID);
		activeCoupons[couponID] = newcoup;

		return newcoup;
	}

	//orig
	Coupon.AddBetToCoupon = function(btn, mtype, eid, cid, betType, special, price, mod1, mod2, exoticCombos, couponID, legHash)
	{
		if(couponID === undefined) //if not specified - try to find an appriate coupon
		{
			if(GWCORE.isLoggedInClient)
			{
				var mainLegs = 0;
				if(activeCoupons[mainCouponID] !== undefined)
					mainLegs = activeCoupons[mainCouponID].LegCount();

				if(GWCORE.AccountPrefs.UseQuickBet(mainLegs))
				{
					couponID = quickCouponID;
					this.ClearCoupon(couponID);
				}
			}
		}

		if(couponID === undefined) //if still not specified - send to main
		{
			couponID = mainCouponID;
		}

		//check if coupon store exists else create
		var coup = activeCoupons[couponID];

		if(coup === undefined)
		{
			coup = CreateBlankCoupon(couponID);
		}
		else if(coup.forceSingleItem)
		{
			RemoveAllLegs(coup);
		}

		coup.currentMode = GWCORE.Coupon.CouponModes.Edit;

		if(legHash === undefined || !coup.HasHash(legHash)) //load details
		{
			var postJSON = JSON.stringify({
				marketType: mtype, eventID: eid, compID: cid, bettype: betType, special: special
			});

			$.ajax({
				type: 'POST',
				url: '/Process/CouponLegDetails',
				cache: false,
				data: postJSON,
				success: function(reply)
				{
					var returndata = reply.payload;

					var newLeg = jQuery.extend({}, GWCORE.CouponLeg);
					newLeg.Initialise();

					if(!coup.HasHash(returndata.legHash) || betType.toLowerCase() === "exotic")
					{
						newLeg.legHash = returndata.legHash;
						newLeg.eventID = returndata.eventID;
						newLeg.competitorID = returndata.competitorID;
						newLeg.selections = returndata.selections;
						newLeg.eventType = mtype;
						newLeg.betType = betType;
						newLeg.special = special;
						newLeg.price = GWCORE.Utils.GetDecimalOrZero(price);

						newLeg.exoticLegs = 0;
						if(betType.toLowerCase() === "exotic")
						{
							newLeg.unitAmount = mod1;
							newLeg.totalAmount = mod2;
							newLeg.comboCount = exoticCombos;
							newLeg.modifier1 = 0;
							newLeg.modifier2 = 0;
							newLeg.price = GWCORE.Utils.GetDecimalOrZero(returndata.currentDividend); //for SRM

							var exotictype = newLeg.special.toLowerCase();
							newLeg.exoticIsBoxed = (exotictype.substr(0, 3) === "box");
							switch(exotictype)
							{
								case "boxquinella":
								case "quinella":
									newLeg.exoticLegs = 2;
									break;
								case "boxexacta":
								case "exacta":
									newLeg.exoticLegs = 2;
									break;
								case "boxtrifecta":
								case "trifecta":
									newLeg.exoticLegs = 3;
									break;
								case "boxfirstfour":
								case "firstfour":
									newLeg.exoticLegs = 4;
									break;
								case "quadrella":
									newLeg.exoticLegs = 4;
									break;
							}
						}
						else
						{
							newLeg.unitAmount = 0;
							newLeg.totalAmount = 0;
							newLeg.comboCount = 1;
							newLeg.modifier1 = GWCORE.Utils.GetDecimalOrZero(mod1);
							newLeg.modifier2 = GWCORE.Utils.GetDecimalOrZero(mod2);
						}
						newLeg.sportCode = returndata.sportCode;
						newLeg.navSport = returndata.navSport;
						newLeg.eventName = returndata.eventName;
						newLeg.teamA = returndata.teamA;
						newLeg.teamB = returndata.teamB;
						newLeg.runnerName = returndata.runnerName;
						newLeg.runnerNum = returndata.runnerNum;
						newLeg.outcome = returndata.outcome;
						newLeg.spShortDesc = returndata.spShortDesc;
						newLeg.spFullDesc = returndata.spFullDesc;
						newLeg.isToteProduct = returndata.isToteProduct;
						newLeg.currentDividend = returndata.currentDividend;
						newLeg.currentMod1 = GWCORE.Utils.GetDecimalOrZero(returndata.currentMod1);
						newLeg.currentMod2 = GWCORE.Utils.GetDecimalOrZero(returndata.currentMod2);
						newLeg.currentModiferDisp = returndata.currentModiferDisp;
						newLeg.currentOutcome = returndata.runnerName;

						newLeg.currentEWProduct = GWCORE.Utils.GetStringOrEmpty(returndata.currentEWProduct);

						if(returndata.currentEWProduct === null || returndata.currentEWProduct === "EW")
						{
							newLeg.currentEWDividend = 1;
							newLeg.currentEWShortDesc = "";
							newLeg.currentEWFullDesc = "";
							newLeg.currentEWIsToteProduct = false;
						}
						else
						{
							newLeg.currentEWDividend = returndata.currentEWDividend;
							newLeg.currentEWShortDesc = GWCORE.Utils.GetStringOrEmpty(returndata.currentEWShortDesc);
							newLeg.currentEWFullDesc = GWCORE.Utils.GetStringOrEmpty(returndata.currentEWFullDesc);
							newLeg.currentEWIsToteProduct = returndata.currentEWIsToteProduct;
						}

						if(newLeg.modiferDisp == "")
							newLeg.modiferDisp = returndata.currentModiferDisp;

						if(returndata.availableRaceProds !== undefined)
							newLeg.availableRaceProds = returndata.availableRaceProds;
						else
							newLeg.availableRaceProds = {};

						newLeg.currentRaceProdKey = newLeg.betType + "#" + newLeg.special;
						newLeg.ewIsToteProduct = true;
						newLeg.ewProduct = "";
						newLeg.ewShortDesc = "";
						newLeg.ewFullDesc = "";
						newLeg.ewDividend = 0;
						newLeg.ewDisp = "-";

						newLeg.allowEachWay = returndata.allowEachWay;

						if(newLeg.allowEachWay)
						{
							newLeg.ewProduct = returndata.currentEWProduct;
							newLeg.ewDividend = newLeg.currentEWDividend;
							newLeg.ewShortDesc = newLeg.currentEWShortDesc;
							newLeg.ewFullDesc = newLeg.currentEWFullDesc;
							newLeg.ewIsToteProduct = newLeg.currentEWIsToteProduct;
							UpdateEWDisplay(coup, newLeg);
						}

						newLeg.priceDisp = MakePriceDisplay(newLeg);

						coup.InsertLeg(returndata.legHash, newLeg);

						VerifyCoupon(coup, returndata.legHash, btn);
					}
					else
					{
						CouponStoreRemoveLeg(coup, returndata.legHash);
					}

					Event_CouponLegCountUpdated(coup);
				}
			});
		}
		else //remove from coupon
		{
			CouponStoreRemoveLeg(coup, legHash);
		}

		Event_CouponLegCountUpdated(coup);

		//stop event bubbling further
		event.stopPropagation();
	};

	function UpdateEWDisplay(coup, leg)
	{
		$(coup.GetPageElementID() + "_EachWayMsg" + leg.legHash).toggle(leg.isEachWay);

		if(!leg.isEachWay || GWCORE.Utils.IsEmptyString(leg.ewProduct) || leg.ewProduct === "EW")
		{
			leg.ewDisp = "";
			$(coup.GetPageElementID() + "_ShowEWProd" + leg.legHash).html("");
			$(coup.GetPageElementID() + "_ShowEWDivi" + leg.legHash).html("");

			var hasEW = false;
			jQuery.each(coup.legs, function(key, leg)
			{
				hasEW = hasEW || leg.isEachWay;
			});
			if(!hasEW)
				$(coup.GetPageElementID() + "_multiSection").toggle(true);
		}
		else
		{
			if(leg.ewIsToteProduct)
				leg.ewDisp = leg.ewShortDesc;
			else
				leg.ewDisp = FormatDividend(leg.ewDividend, leg.ewShortDesc, 10);

			$(coup.GetPageElementID() + "_ShowEWProd" + leg.legHash).html(" / " + leg.ewFullDesc);
			$(coup.GetPageElementID() + "_ShowEWDivi" + leg.legHash).html(" / " + leg.ewDisp);

			$(coup.GetPageElementID() + "_multiSection").toggle(false);
		}
	}

	function TruncateDecimal(amount)
	{
		var numval = GWCORE.Utils.GetDecimalOrZero(amount);

		var stringVal = numval.toString();

		if(stringVal.indexOf('.') >= 0)
		{
			stringVal += "00";
		}
		else
		{
			stringVal = numval.toString() + ".00";
		}

		return stringVal.substr(0, stringVal.toString().indexOf('.') + 3);
	}

	//TOOD: move to utils?? or fix the one there - NEEDS TO TRUNCATE AND NOT ROUND THE VALUE!!!
	function FormatCurrency(amount)
	{
		var numval = GWCORE.Utils.GetDecimalOrZero(amount);

		var stringVal = numval.toString();

		if(stringVal.indexOf('.') >= 0)
		{
			stringVal += "00";
		}
		else
		{
			stringVal = numval.toString() + ".00";
		}

		return stringVal.substr(0, stringVal.toString().indexOf('.') + 3);
	}

	function FormatDividend(divi, noNum, threshold)
	{
		return GWCORE.Utils.FormatDividend(divi, noNum, threshold);

	}

	//TOOD: move to utils??
	//TODO: need option to set threshold
	function FormatModifier(modi, noNum, threshold)
	{
		if(threshold === undefined)
			threshold = 10;
		if(noNum === undefined)
			noNum = "??";

		var rtn = noNum;

		if(modi === null || modi === undefined || modi.length === 0 || isNaN(modi))
		{
			rtn = noNum;
		}
		else
		{
			var m = parseFloat(modi);

			rtn = FormatDecimal(m, threshold);

			if(m > 0)
				rtn = "+" + rtn;

		}

		return rtn;
	}

	//TOOD: move to utils??
	function FormatDecimal(num, threshold)
	{
		if(threshold === undefined)
			threshold = 0;

		var numval = GWCORE.Utils.GetDecimalOrZero(num);

		numval = parseFloat(numval).toPrecision(12); //stop floating point to decimal issues (try numval = 1.2 * 6)

		if(numval !== 0)
		{
			if(numval.toString().indexOf('.') >= 0)
			{
				var stringVal = numval.toString();
				var truncval = stringVal.substr(0, stringVal.toString().indexOf('.') + 3);
				numval = GWCORE.Utils.GetDecimalOrZero(truncval);
			}
		}

		return numval;
	}

	//TODO: move to utils??
	Coupon.GetIntegerWord = function(number)
	{
		var rtn = "";
		var units = ["", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"];
		var teens = ["Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eightteen", "Nineteen"];
		var tens = ["", "", "Twenty", "Thirty", "Fourty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"];

		var compare = GWCORE.Utils.GetIntOrZero(number);
		var tenOrder = GWCORE.Utils.GetIntOrZero(compare / 10);

		if(compare === 0)
		{
			rtn = "Zero";
		}
		else if(compare >= 1000000000)
		{
			rtn = compare;
		}
		else if(compare >= 1000000)
		{
			rtn = GetIntegerWord(GWCORE.Utils.GetIntOrZero(number / 1000000)) + " Million";
			if(number % 1000000 > 100000)
			{
				rtn += ", " + GetIntegerWord(GWCORE.Utils.GetIntOrZero(number % 1000000));
			}
			else if(number % 1000000 > 0)
			{
				rtn += " and " + GetIntegerWord(GWCORE.Utils.GetIntOrZero(number % 1000000));
			}
		}
		else if(compare >= 1000)
		{
			rtn = GetIntegerWord(GWCORE.Utils.GetIntOrZero(number / 1000)) + " Thousand";
			if(number % 1000 > 100)
			{
				rtn += ", " + GetIntegerWord(GWCORE.Utils.GetIntOrZero(number % 1000));
			}
			else if(number % 1000 > 0)
			{
				rtn += " and " + GetIntegerWord(GWCORE.Utils.GetIntOrZero(number % 1000));
			}
		}
		else if(compare >= 100)
		{
			rtn = GetIntegerWord(GWCORE.Utils.GetIntOrZero(number / 100)) + " Hundred";
			if(number % 100 > 0)
				rtn += " and " + GetIntegerWord(GWCORE.Utils.GetIntOrZero(number % 100));
		}
		else if(tenOrder === 0)
		{
			rtn = units[compare];
		}
		else if(tenOrder === 1)
		{
			rtn = teens[compare % 10];
		}
		else
		{
			rtn = tens[tenOrder] + " " + units[compare % 10];
		}

		//rtn = "[" + number + "]" + rtn.toString().trim() + "[" + tenOrder + "]";

		return rtn.toString().trim();
	}

	function FormatBenefitMessage(couponID, leg)
	{
		var boostedDiv = 0;
		var benefitMode = GWCORE.Coupon.BenefitModes.None;
		var showDiv = "";

		if(leg.isDivBoostToken)
			benefitMode = GWCORE.Coupon.BenefitModes.DivBoostToken;
		else if(leg.isDivBoostWallet)
			benefitMode = GWCORE.Coupon.BenefitModes.DivBoostWallet;

		if(leg.availableDivBoosts[benefitMode] !== undefined)
		{
			boostedDiv = leg.availableDivBoosts[benefitMode].boostedDiv;
			if(leg.isToteProduct)
			{
				showDiv += leg.priceDisp + " ";

				var boostAmt = leg.availableDivBoosts[benefitMode].boostedAmount;
				if(boostAmt > 100)
					showDiv += " +" + FormatDividend((boostAmt - 100), "0") + "%";
				else
					showDiv += " +" + FormatDividend(boostAmt, "0") + "rolls";
			}
			else if(leg.betType.toLowerCase() === "exotic" && leg.availableDivBoosts[benefitMode].boostedDiv <= 1)
			{
				var boostAmtEx = leg.availableDivBoosts[benefitMode].boostedAmount;
				showDiv = leg.priceDisp;
				if(boostAmtEx > 100)
					showDiv += " +" + FormatDividend((boostAmtEx - 100), "0") + "%";
				else
					showDiv += " +" + FormatDividend(boostAmtEx, "0") + "rolls";
			}
			else
			{
				showDiv += FormatDividend(leg.availableDivBoosts[benefitMode].boostedDiv, "0");
			}
		}

		if(boostedDiv >= 1)
		{
			$(couponID + "_BoostDivi" + leg.legHash).html(showDiv);
			$(couponID + "_BoostDivi" + leg.legHash).toggle(true);
			$(couponID + '_ShowDivi' + leg.legHash).addClass("boosted");
			$(couponID + '_ShowPAY' + leg.legHash).addClass("boosted");
			$(couponID + "_DivBoostMsg" + leg.legHash).toggle(true);
			$(couponID + '_DivBoostMsg' + leg.legHash + ' .normalDivi').html(leg.priceDisp);
			$(couponID + '_DivBoostMsg' + leg.legHash + ' .boostedDivi').html(showDiv);
			$(couponID + "_BonusBetMsg" + leg.legHash).toggle(false);
		}
		else
		{
			$(couponID + "_BoostDivi" + leg.legHash).html("");
			$(couponID + "_BoostDivi" + leg.legHash).toggle(false);
			$(couponID + '_ShowDivi' + leg.legHash).removeClass("boosted");
			$(couponID + '_ShowPAY' + leg.legHash).removeClass("boosted");
			$(couponID + "_DivBoostMsg" + leg.legHash).toggle(false);
			$(couponID + '_DivBoostMsg' + leg.legHash + ' .normalDivi').html("-");
			$(couponID + '_DivBoostMsg' + leg.legHash + ' .boostedDivi').html("-");

			if(leg.isFreeBet)
			{
				$(couponID + "_BonusBetMsg" + leg.legHash).toggle(true);
			}
			else
			{
				$(couponID + "_BonusBetMsg" + leg.legHash).toggle(false);
			}
		}

		var coup = activeCoupons[couponID];
		UpdateTotals(coup);
	}

	function MakePriceDisplay(leg)
	{
		var rtn = leg.special;

		var desc = leg.special;

		if(!GWCORE.Utils.IsEmptyString(leg.spShortDesc)) //TODO: optional switch to long??
			desc = leg.spShortDesc;

		if(leg.betType.toLowerCase() === "exotic")
		{
			rtn = leg.special;
			if(leg.special.toLowerCase() === "sameracemulti")
				rtn = FormatDividend(leg.price, "-", 10);
		}
		else if(leg.special === "" || leg.special === "FWIN" || leg.special === "FPLC" || leg.special === "FVF" || leg.special === "OVE")
		{
			rtn = FormatDividend(leg.price, "-", 10);
		}
		else if(leg.special === "CompHandicap")
		{
			rtn = FormatModifier(leg.modifier1, "-", 1) + "@" + FormatDividend(leg.price, "-", 10);
		}
		else if(leg.special === "CompTotal")
		{
			if(leg.modifier2 === 9999)
				rtn = "Over " + FormatDecimal(leg.modifier1, 1) + "@" + FormatDividend(leg.price, "-", 10);
			else if(leg.modifier1 === -9999)
				rtn = "Under " + FormatDecimal(leg.modifier2, 1) + "@" + FormatDividend(leg.price, "-", 10);
			else
				rtn = FormatDividend(leg.modifier1, "-", 1) + "-" + FormatDividend(leg.modifier2, "-", 10) + "@" + FormatDividend(leg.price, "-", 10);
		}
		else if(_.last(leg.special) === "G")
		{
			rtn = FormatDividend(leg.price, "??") + "(" + desc.substr(0, desc.length - 1) + ")";
		}
		else
		{
			rtn = desc;
		}
		return rtn;
	}

	//orig
	Coupon.RemoveLeg = function(couponID, legHash)
	{
		var coup = activeCoupons[couponID];
		CouponStoreRemoveLeg(coup, legHash);
	};

	function RemoveAllLegs(coup)
	{
		if(coup !== undefined)
		{
			jQuery.each(coup.legs, function(key, leg)
			{
				Event_LegRemoved(coup.couponID, leg.legHash);
			});
			Event_CouponCleared(coup.couponID);
			coup.RemoveAllLegs();
			delete currentLegHashes[coup.couponID];
		}
	}

	//new
	function CouponStoreRemoveLeg(coup, legHash)
	{
		if(coup !== undefined)
		{
			coup.RemoveLeg(legHash);

			Event_LegRemoved(coup.couponID, legHash);
			Event_CouponLegCountUpdated(coup);

			//if no legs left then remove
			if(coup.LegCount() === 0)
			{
				Event_CouponCleared(coup.couponID);
				RemoveCouponStore(coup.couponID);
				delete currentLegHashes[coup.couponID];
			}
			else
			{
				currentLegCounts[coup.couponID] = coup.LegCount();
				currentLegHashes[coup.couponID] = coup.GetLegHashes();
				VerifyCoupon(coup, 0, undefined);
			}
		}
	}

	//new
	// Remove a coupon from the array and from the page
	function RemoveCouponStore(couponID)
	{
		if(couponID === undefined)
		{
			couponID = mainCouponID;
		}
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			coup.RemoveAllLegs();
			var template = coup.GetTemplate();
			var elID = coup.GetPageElementID();
			delete activeCoupons[couponID];
			delete currentLegCounts[couponID];
			delete currentLegHashes[coup.couponID];

			if(!Coupon.isPrimaryCoupon(coup)) // && coupID !== quickCouponID)
			{
				$("#dynamicCoupons").toggle(false);
			}
		}

		Event_CouponLegCountUpdated(coup);
		Event_CouponCleared(couponID);
		DisplayCoupon(undefined, template, elID);
		UpdateCouponSession();
	}

	//new
	//TODO:
	Coupon.TransferLeg = function(srcCouponID, destCouponID, legHash)
	{
		if(destCouponID === undefined)
		{
			destCouponID = mainCouponID;
		}

		if(srcCouponID !== destCouponID)
		{
			var srcCoup = activeCoupons[srcCouponID];
			var dstCoup = activeCoupons[destCouponID];

			if(dstCoup === undefined)
			{
				dstCoup = CreateBlankCoupon(destCouponID);
			}

			if(srcCoup !== undefined && dstCoup !== undefined)
			{
				if(legHash !== undefined)
				{
					if(srcCoup.HasHash(legHash))
					{
						var legData = srcCoup.legs[legHash];
						srcCoup.RemoveLeg(legHash);
						dstCoup.InsertLeg(legHash, legData);

						if(srcCoup.LegCount() === 0)
						{
							RemoveCouponStore(srcCouponID);
						}
						else
						{
							currentLegCounts[srcCouponID] = srcCoup.LegCount();
							currentLegHashes[srcCouponID] = srcCoup.GetLegHashes();
							VerifyCoupon(srcCoup, 0, undefined);
						}
					}
				}
				else //move all legs
				{
					dstCoup.legs = $.extend(true, dstCoup.legs, srcCoup.legs);

					//currentLegHashes[dstCoup] = $.merge(currentLegHashes[destCouponID], currentLegHashes[srcCouponID]);

					currentLegHashes[destCouponID] = dstCoup.GetLegHashes();

					RemoveCouponStore(srcCouponID);
				}
				currentLegCounts[destCouponID] = dstCoup.LegCount();

				dstCoup.currentMode = GWCORE.Coupon.CouponModes.Edit;

				VerifyCoupon(dstCoup, legHash, undefined);

				UpdateCouponSession();
			}

			if(Coupon.isPrimaryCoupon(srcCoup))
				Event_CouponLegCountUpdated(srcCoup);
			if(Coupon.isPrimaryCoupon(dstCoup))
				Event_CouponLegCountUpdated(dstCoup);
		}
	};

	Coupon.ClearQuickCoupons = function()
	{
		jQuery.each(activeCoupons, function(coupID, coup)
		{
			if(!Coupon.isPrimaryCoupon(coup)) // && coupID !== quickCouponID)
			{
				$(coup.GetPageElementID()).html('');
				RemoveCouponStore(coupID);
			}
		});
		ClearDeadCoupons();
	}

	function ClearDeadCoupons()
	{
		jQuery.each(activeCoupons, function(coupID, coup)
		{
			if(!Coupon.isPrimaryCoupon(coup)) // && coupID !== quickCouponID)
			{
				if($(coup.GetPageElementID()).length === 0)
				{
					RemoveCouponStore(coupID);
				}
			}
			$("#dynamicCoupons").toggle(false);
		});
	}
	//orig
	Coupon.ClearCoupon = function(couponID)
	{
		Event_CouponCleared(couponID);
		RemoveCouponStore(couponID);
	};

	//orig - but not required
	Coupon.ConfirmCoupon = function(couponID)
	{
		console.error("ConfirmCoupon must be called via RequestConfirmCoupon");
	};

	//orig
	//TODO: complete rewrite
	Coupon.EditCoupon = function(couponID)
	{
		var coup = activeCoupons[couponID];

		if(coup === undefined && GWCORE.Coupon.showEmptyCoupon)
		{
			if(GWCORE.Utils.IsEmptyString(couponID))
				coup = CreateBlankCoupon(GWCORE.Coupon.GetMainCouponID());
			else
				coup = CreateBlankCoupon(couponID);
		}
		if(coup !== undefined)
		{
			coup.currentMode = GWCORE.Coupon.CouponModes.Edit;
			VerifyCoupon(coup, 0, undefined);
		}
	};

	//orig - but not required
	Coupon.SubmitCoupon = function(couponID)
	{
		console.error("SubmitCoupon must be called via RequestSubmitCoupon");
	};

	//orig but moved to CouponStore (might move back but will be private)
	//Coupon.MakeCouponPostData = function(couponID)


	//new
	function ChangeBenefitOption(newMode, couponID, el)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var legHash = GetElementLegHash(el);
			if(legHash !== undefined)
			{
				var coupLeg = coup.legs[legHash];

				if(coupLeg !== undefined)
				{
					var divModeChanged = false;
					switch(newMode)
					{
						case Coupon.BenefitModes.BonusBet:
							if(coupLeg.isFreeBet)
							{
								coupLeg.isFreeBet = false;
							}
							else
							{
								coupLeg.isFreeBet = true;
							}
							coupLeg.isDivBoostToken = false;
							coupLeg.isDivBoostWallet = false;
							break;
						case Coupon.BenefitModes.DivBoostToken:
							if(coupLeg.isDivBoostToken)
							{
								coupLeg.isDivBoostToken = false;
								divModeChanged = true;
							}
							else
							{
								var allowToken = true;
								if(Coupon.forceSingleBoostMode)
								{
									jQuery.each(coup.legs, function(legHash, leg)
									{
										if(leg.isDivBoostToken)
										{
											allowToken = false;
										}
									});
								}
								coupLeg.isDivBoostToken = allowToken;
								divModeChanged = allowToken;
							}
							if(divModeChanged)
							{
								coupLeg.isFreeBet = false;
								coupLeg.isDivBoostWallet = false;
							}
							break;
						case Coupon.BenefitModes.DivBoostWallet:
							if(coupLeg.isDivBoostWallet)
							{
								coupLeg.isDivBoostWallet = false;
								divModeChanged = true;
							}
							else
							{
								var allowWallet = true;
								if(Coupon.forceSingleBoostMode)
								{
									jQuery.each(coup.legs, function(legHash, leg)
									{
										if(leg.isDivBoostWallet)
										{
											allowWallet = false;
										}
									});
								}
								coupLeg.isDivBoostWallet = allowWallet;
								divModeChanged = allowWallet;
							}
							if(divModeChanged)
							{
								coupLeg.isFreeBet = false;
								coupLeg.isDivBoostToken = false;
							}
							break;
					}

					//incase benefit button hit before the input delay triggers - evaluate the current text
					var btn = $("#" + couponID + "_BetTtl" + legHash)[0];
					if(btn === undefined)
						btn = $("#" + couponID + "_BetAmt" + legHash)[0];
					GWCORE.Coupon.CouponUpdateLeg(couponID, btn);

					FormatBenefitMessage('#' + coup.GetCouponID(), coupLeg);
					$('#' + coup.GetCouponID() + '_BetUFB' + legHash).prop("checked", (coupLeg.isFreeBet ? "checked" : ""));
					$('#' + coup.GetCouponID() + '_BetDBT' + legHash).prop("checked", (coupLeg.isDivBoostToken ? "checked" : ""));
					$('#' + coup.GetCouponID() + '_BetDBW' + legHash).prop("checked", (coupLeg.isDivBoostWallet ? "checked" : ""));

					ValidateBoostOption(coup, coupLeg);
				}
			}
		}

		GWCORE.Coupon.CouponUpdateLeg(couponID, this);
	}

	function UpdateMultiBenefit(newMode, couponID)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			//var divModeChanged = false;
			switch(newMode)
			{
				case Coupon.BenefitModes.BonusBet:
					if(coup.isMultiBonusBet)
					{
						coup.isMultiBonusBet = false;
					}
					else
					{
						coup.isMultiBonusBet = true;
					}
					coup.isMultiBoostToken = false;
					coup.isMultiBoostWallet = false;
					break;
				case Coupon.BenefitModes.DivBoostToken:
					if(coup.isMultiBoostToken)
					{
						coup.isMultiBoostToken = false;
					}
					else
					{
						coup.isMultiBoostToken = true;
					}
					coup.isMultiBonusBet = false;
					coup.isMultiBoostWallet = false;
					break;
				case Coupon.BenefitModes.DivBoostWallet:
					if(coup.isMultiBoostWallet)
					{
						coup.isMultiBoostWallet = false;
					}
					else
					{
						coup.isMultiBoostWallet = true;
					}
					coup.isMultiBonusBet = false;
					coup.isMultiBoostToken = false;
					break;
			}

			//FormatBenefitMessage('#' + coup.GetCouponID(), coupLeg);

			$('#' + coup.GetCouponID() + '_multiUFB').prop("checked", (coup.isMultiBonusBet ? "checked" : ""));
			$('#' + coup.GetCouponID() + '_multiDBT').prop("checked", (coup.isMultiBoostToken ? "checked" : ""));
			$('#' + coup.GetCouponID() + '_multiDBW').prop("checked", (coup.isMultiBoostWallet ? "checked" : ""));

			if(coup.isMultiBoostToken || coup.isMultiBoostWallet)
			{
				var multiPayPrice = coup.multiDivi;
				var boostPercent = 100;
				var boostDivi = 'TBD';

				if(coup.isMultiBoostToken)
				{
					boostDivi = coup.multiAvailableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostToken].boostedDiv;
					boostPercent = coup.multiAvailableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostToken].boostedAmount;
				}
				else if(coup.isMultiBoostWallet)
				{
					boostDivi = coup.multiAvailableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostWallet].boostedDiv;
					boostPercent = coup.multiAvailableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostWallet].boostedAmount;
				}

				if(multiPayPrice > 1)
				{
					//var multiPayDivi = multiPayPrice * (boostPercent / 100.0);
					var multiPayDivi = boostDivi;
					if(boostDivi === undefined)
						multiPayDivi = (((multiPayPrice - 1) * (boostPercent / 100.0)) + 1);

					$('#' + coup.GetCouponID() + '_multi-DIV').html(FormatDividend(coup.multiDivi, "Multi"));
					$('#' + coup.GetCouponID() + '_multi-DIV').toggle(false);
					$('#' + coup.GetCouponID() + '_multi-DIVBOOST').html(FormatDividend(multiPayDivi, "Multi+"));
					$('#' + coup.GetCouponID() + '_multi-DIVBOOST').toggle(true);


					$('#' + coup.GetCouponID() + '_MultiDivBoostMsg .normalDivi').html(FormatDividend(coup.multiDivi, "Multi"));
					$('#' + coup.GetCouponID() + '_MultiDivBoostMsg .boostedDivi').html(FormatDividend(multiPayDivi, "Multi+"));
				}
				else
				{
					$('#' + coup.GetCouponID() + '_multi-DIV').html(FormatDividend(coup.multiDivi));
					$('#' + coup.GetCouponID() + '_multi-DIVBOOST').html(" +" + FormatDividend((boostPercent - 100), "0") + "%");
					$('#' + coup.GetCouponID() + '_multi-DIVBOOST').toggle(true);

					$('#' + coup.GetCouponID() + '_MultiDivBoostMsg .normalDivi').html("Multi Div");
					$('#' + coup.GetCouponID() + '_MultiDivBoostMsg .boostedDivi').html("Multi Div +" + FormatDividend((boostPercent - 100), "0") + "%");
				}
			}
			else
			{
				$('#' + coup.GetCouponID() + '_multi-DIV').html(FormatDividend(coup.multiDivi));
				$('#' + coup.GetCouponID() + '_multi-DIV').toggle(true);
				$('#' + coup.GetCouponID() + '_multi-DIVBOOST').html('##');
				$('#' + coup.GetCouponID() + '_multi-DIVBOOST').toggle(false);
			}
			$('#' + coup.GetCouponID() + "_MultiBonusBetMsg").toggle(coup.isMultiBonusBet);
			$('#' + coup.GetCouponID() + "_MultiDivBoostMsg").toggle(coup.isMultiBoostToken || coup.isMultiBoostWallet);

			UpdateTotals(coup);
			UpdateCouponSession();
		}
	}

	function UpdateBoostDisplay(coup)
	{
		var hashToken = "#";
		var hashWallet = "#";
		jQuery.each(coup.legs, function(legHash, leg)
		{
			if(leg.isDivBoostToken)
				hashToken = leg.legHash;
			if(leg.isDivBoostWallet)
				hashWallet = leg.legHash;

			if(leg.isDivBoostToken || leg.isDivBoostWallet)
			{
				$('#' + coup.GetCouponID() + '_ShowDivi' + leg.legHash).addClass("boosted");
				$('#' + coup.GetCouponID() + '_ShowPAY' + leg.legHash).addClass("boosted");
			}
			else
			{
				$('#' + coup.GetCouponID() + '_ShowDivi' + leg.legHash).removeClass("boosted");
				$('#' + coup.GetCouponID() + '_ShowPAY' + leg.legHash).removeClass("boosted");
			}
		});

		if(Coupon.forceSingleBoostMode)
		{
			jQuery.each(coup.legs, function(legHash, leg)
			{
				if(hashToken === "#" || leg.legHash === hashToken)
				{
					//$('#' + coup.GetCouponID() + "_BetDBT" + legHash + ' + label').css('outline', 'solid 3px lime');
					$('#' + coup.GetCouponID() + "_BlockDBT" + legHash).removeClass("disabled");
				}
				else
				{
					//$('#' + coup.GetCouponID() + "_BetDBT" + legHash + ' + label').css('outline', 'solid 3px red');
					$('#' + coup.GetCouponID() + "_BlockDBT" + legHash).addClass("disabled");
				}

				if(hashWallet === "#" || leg.legHash === hashWallet)
				{
					//$('#' + coup.GetCouponID() + "_BetDBW" + legHash + ' + label').css('outline', 'solid 3px lime');
					$('#' + coup.GetCouponID() + "_BlockDBW" + legHash).removeClass("disabled");
				}
				else
				{
					//$('#' + coup.GetCouponID() + "_BetDBW" + legHash + ' + label').css('outline', 'solid 3px red');
					$('#' + coup.GetCouponID() + "_BlockDBW" + legHash).addClass("disabled");
				}
			});
		}
	}

	function ValidateBoostOption(coup, coupLeg)
	{
		if(coupLeg.isDivBoostToken || coupLeg.isDivBoostWallet)
		{
			var maxDBAmount = 9999999;
			if(coupLeg.isDivBoostToken)
				maxDBAmount = coupLeg.availableDivBoosts[Coupon.BenefitModes.DivBoostToken].maxBet;
			else if(coupLeg.isDivBoostWallet)
				maxDBAmount = coupLeg.availableDivBoosts[Coupon.BenefitModes.DivBoostWallet].maxBet;
			if(coupLeg.totalAmount > maxDBAmount)
			{
				coupLeg.errCode = 38;
				DisplayCouponLegError(coup.GetCouponID(), coupLeg);
			}
		}

		UpdateBoostDisplay(coup);
	}

	//orig
	//TODO: need rewrite to look at objects
	function GetElementLegHash(el)
	{
		var rtn = undefined;

		$(el).parents().each(function(i)
		{
			//console.log($(el).attr("id"));
			if(rtn === undefined)
			{
				rtn = $(this).data("leghash");
			}
		});

		return rtn;
	}

	Coupon.CouponAmountPreParse = function(couponID, el, isMultiAmt)
	{
		var deci = GWCORE.Utils.GetDecimalOrZero($(el).val());
		var newStr = FormatDecimal(deci, 2);
		if($(el).val().substr($(el).val().length - 1, 1) === '.')
		{
			newStr += ".";
		}
		GWCORE.Coupon.CouponUpdateLeg(couponID, (isMultiAmt ? undefined : el));
		$(el).val(newStr);
	}

	var blockExoticUpdates = false;
	Coupon.CouponUpdateLeg = function(couponID, el, newDivi)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			if(el !== undefined)
			{
				var clickedID = $(el).attr("id");
				var clickedMode = "??";

				if(clickedID.indexOf("BetAmt") > 0)
				{
					clickedMode = "BetAmt";
				}
				else if(clickedID.indexOf("BetFlex") > 0)
				{
					clickedMode = "BetFlex";
				}
				else if(clickedID.indexOf("BetTtl") > 0)
				{
					clickedMode = "BetTtl";
				}

				var legHash = GetElementLegHash(el);

				if(legHash !== undefined)
				{
					var coupLeg = coup.legs[legHash];
					if(coupLeg !== undefined)
					{
						coupLeg.unitAmount = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_BetAmt" + legHash).val());
						coupLeg.totalAmount = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_BetTtl" + legHash).val());
						coupLeg.isEachWay = false;
						coupLeg.isFreeBet = false;
						coupLeg.isDivBoostToken = false;
						coupLeg.isDivBoostWallet = false;

						if(coupLeg.betType.toLowerCase() === "exotic")
						{
							if(!blockExoticUpdates)
							{
								blockExoticUpdates = true;
								try
								{
									if(clickedMode === "BetFlex")
									{
										var flxVal = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_BetFlex" + legHash).val());
										coupLeg.unitAmount = flxVal / 100;
										coupLeg.totalAmount = flxVal / 100 * coupLeg.comboCount;
										$(coup.GetPageElementID() + "_BetAmt" + legHash).val((coupLeg.totalAmount <= 0 ? "" : FormatDecimal(coupLeg.unitAmount)));
										$(coup.GetPageElementID() + "_BetTtl" + legHash).val((coupLeg.totalAmount <= 0 ? "" : FormatDecimal(coupLeg.totalAmount)));
									}
									if(clickedMode === "BetAmt")
									{
										coupLeg.totalAmount = coupLeg.comboCount * coupLeg.unitAmount;
										$(coup.GetPageElementID() + "_BetFlex" + legHash).val((coupLeg.totalAmount <= 0 ? "" : FormatDecimal((coupLeg.unitAmount * 100))));
										$(coup.GetPageElementID() + "_BetTtl" + legHash).val((coupLeg.totalAmount <= 0 ? "" : FormatDecimal(coupLeg.totalAmount)));
									}
									else
									{
										coupLeg.unitAmount = coupLeg.totalAmount / coupLeg.comboCount;
										$(coup.GetPageElementID() + "_BetFlex" + legHash).val((coupLeg.totalAmount <= 0 ? "" : FormatDecimal((coupLeg.unitAmount * 100))));
										$(coup.GetPageElementID() + "_BetAmt" + legHash).val((coupLeg.unitAmount <= 0 ? "" : FormatDecimal(coupLeg.unitAmount)));
									}
								}
								catch(err)
								{
									//do nothing
								}
								finally
								{
									blockExoticUpdates = false;
								}
							}
						}
						else
						{
							coupLeg.totalAmount = coupLeg.unitAmount;
							if($(coup.GetPageElementID() + "_BetUEW" + legHash).prop("checked"))
							{
								coupLeg.isEachWay = true;

								coupLeg.totalAmount = coupLeg.unitAmount * 2;
							}
							else
							{
								coupLeg.isEachWay = false;
								coupLeg.totalAmount = coupLeg.unitAmount;
							}
							SetEWValuesToCurrent(coup, coupLeg);
						}

						if($(coup.GetPageElementID() + "_BetUFB" + legHash).prop("checked"))
						{
							coupLeg.isFreeBet = true;
						}

						if($(coup.GetPageElementID() + "_BetDBT" + legHash).prop("checked"))
						{
							coupLeg.isDivBoostToken = true;
						}

						if($(coup.GetPageElementID() + "_BetDBW" + legHash).prop("checked"))
						{
							coupLeg.isDivBoostWallet = true;
						}

					}
				}
			}
			else if(coup.LegCount() <= 1)
			{
				coup.parlay2 = 0;
				$(coup.GetPageElementID() + "_parlay2-AMT").val(0);
				coup.parlay3 = 0;
				$(coup.GetPageElementID() + "_parlay3-AMT").val(0);
				coup.parlay4 = 0;
				$(coup.GetPageElementID() + "_parlay4-AMT").val(0);
				coup.parlay5 = 0;
				$(coup.GetPageElementID() + "_parlay5-AMT").val(0);
				coup.parlay6 = 0;
				$(coup.GetPageElementID() + "_parlay6-AMT").val(0);
				coup.parlay7 = 0;
				$(coup.GetPageElementID() + "_parlay7-AMT").val(0);
				coup.parlay8 = 0;
				$(coup.GetPageElementID() + "_parlay8-AMT").val(0);
				coup.parlay9 = 0;
				$(coup.GetPageElementID() + "_parlay9-AMT").val(0);
				coup.multiAmt = 0;
				$(coup.GetPageElementID() + "_multi-AMT").val(0);
			}
			else
			{
				coup.parlay2 = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_parlay2-AMT").val());
				if(coup.parlay2 <= 0)
				{
					$(coup.GetPageElementID() + "_parlay2-AMT").val('');
					coup.parlay2 = 0;
				}

				coup.parlay3 = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_parlay3-AMT").val());
				if(coup.parlay3 <= 0)
				{
					$(coup.GetPageElementID() + "_parlay3-AMT").val('');
					coup.parlay3 = 0;
				}

				coup.parlay4 = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_parlay4-AMT").val());
				if(coup.parlay4 <= 0)
				{
					$(coup.GetPageElementID() + "_parlay4-AMT").val('');
					coup.parlay4 = 0;
				}

				coup.parlay5 = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_parlay5-AMT").val());
				if(coup.parlay5 <= 0)
				{
					$(coup.GetPageElementID() + "_parlay5-AMT").val('');
					coup.parlay5 = 0;
				}

				coup.parlay6 = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_parlay6-AMT").val());
				if(coup.parlay6 <= 0)
				{
					$(coup.GetPageElementID() + "_parlay6-AMT").val('');
					coup.parlay6 = 0;
				}

				coup.parlay7 = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_parlay7-AMT").val());
				if(coup.parlay7 <= 0)
				{
					$(coup.GetPageElementID() + "_parlay7-AMT").val('');
					coup.parlay7 = 0;
				}

				coup.parlay8 = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_parlay8-AMT").val());
				if(coup.parlay8 <= 0)
				{
					$(coup.GetPageElementID() + "_parlay8-AMT").val('');
					coup.parlay8 = 0;
				}

				coup.parlay9 = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_parlay9-AMT").val());
				if(coup.parlay9 <= 0)
				{
					$(coup.GetPageElementID() + "_parlay9-AMT").val('');
					coup.parlay9 = 0;
				}

				coup.multiAmt = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_multi-AMT").val());
				if(coup.multiAmt <= 0)
				{
					$(coup.GetPageElementID() + "_multi-AMT").val('');
					coup.multiAmt = 0;
				}
			}
		}

		UpdateTotals(coup);
		UpdateCouponSession();
	};

	//orig - but not required
	Coupon.UpdateTotal = function(couponID)
	{
		console.error("UpdateTotal no longer required???");
	};

	//new (based on Coupon.UpdateTotal)
	//TODO: need rewrite to look at objects
	function UpdateTotals(coup)
	{
		var coupTtl = 0; //total amount of all bets
		var coupSpend = 0; //total amount user is spending (ie total - bonusbets)

		if(coup !== undefined)
		{
			var elID = coup.GetPageElementID();
			var couponID = coup.GetCouponID();
			var coupPayShow = true;
			var coupPay = 0;
			var legCount = 0;
			var legEWCount = 0;
			var hasError = false;

			jQuery.each(coup.legs, function(legHash, leg)
			{
				//$(elID + "_BetAmt" + legHash).val(FormatDecimal(leg.unitAmount));
				$(elID + "_BetAmt" + legHash).val((leg.unitAmount <= 0 ? "" : FormatDecimal(leg.unitAmount)));
				//$(elID + "_BetTtl" + legHash).val(FormatDecimal(leg.totalAmount));
				$(elID + "_BetTtl" + legHash).val((leg.totalAmount <= 0 ? "" : FormatDecimal(leg.totalAmount)));

				coupTtl += leg.totalAmount;

				if(!leg.isFreeBet)
					coupSpend += leg.totalAmount;

				leg.priceDisp = MakePriceDisplay(leg);
				$(elID + "_ShowDivi" + legHash).val(leg.priceDisp);

				if(leg.errCode > 0)
					hasError = true;

				leg.payout = "TBD";
				if(leg.isToteProduct)
				{
					coupPayShow = false;
					leg.payout = "TBD";
				}
				else if(leg.price > 1)
				{
					if(leg.totalAmount > 0)
					{
						var legPayPrice = leg.price;

						ValidateBoostOption(coup, leg);

						if(leg.isDivBoostToken)
							legPayPrice = leg.availableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostToken].boostedDiv;
						else if(leg.isDivBoostWallet)
							legPayPrice = leg.availableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostWallet].boostedDiv;

						if(leg.isEachWay)
						{
							if(leg.ewIsToteProduct)
							{
								leg.payout = "TBD";
								coupPayShow = false;
							}
							else
							{
								var legPayEW = legPayPrice * leg.unitAmount + leg.ewDividend * leg.unitAmount;


								if(leg.isFreeBet)
									legPayEW = legPayEW - (leg.unitAmount * 2);


								coupPay += legPayEW;
								leg.payout = GWCORE.Utils.FormatMoney(legPayEW);
							}
						}
						else
						{
							var legPay = legPayPrice * leg.totalAmount;

							if(leg.isFreeBet)
								legPay = legPay - leg.unitAmount;

							coupPay += legPay;
							leg.payout = GWCORE.Utils.FormatMoney(legPay);
						}
						UpdateEWDisplay(coup, leg);
					}
					else
						leg.payout = "0.00";
				}
				else
				{
					coupPayShow = false;
					if(leg.betType.toLowerCase() === "exotic")
					{
						var pay = leg.totalAmount / leg.comboCount * 100;
						leg.payout = FormatDividend(pay, "0") + "% of Dividend";

						var boostAmt = 0;
						if(leg.isDivBoostToken)
							boostAmt = leg.availableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostToken].boostedAmount;
						else if(leg.isDivBoostWallet)
							boostAmt = leg.availableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostWallet].boostedAmount;

						if(boostAmt > 0)
						{
							if(boostAmt > 100)
								leg.payout += " +" + FormatDividend((boostAmt - 100), "0") + "%";
							else
								leg.payout += " +" + FormatDividend(boostAmt, "0") + "rolls";
						}
					}
					else
					{
						leg.payout = "TBD";
					}
				}

				$(elID + "_ShowPAY" + legHash).html(leg.payout);
			});

			//$(elID + '_parlay2-TTL').html("TBD");
			//$(elID + '_parlay2-PAY').html("TBD");
			//$(elID + '_parlay3-TTL').html("TBD");
			//$(elID + '_parlay3-PAY').html("TBD");
			//$(elID + '_parlay4-TTL').html("TBD");
			//$(elID + '_parlay4-PAY').html("TBD");
			for(var i = 2; i < 10; i++)
			{
				$(elID + '_parlay' + i + '-TTL').html("TBD");
				$(elID + '_parlay' + i + '-PAY').html("TBD");
			}
			$(elID + '_multi-TTL').html("TBD");
			$(elID + '_multi-PAY').html("TBD");

			if(coup.allowMultiBet)
			{
				if(legEWCount > 0)//TODO:count how many combos have each way and add thier amounts again
				{
					coupPayShow = false;
					//var pewc = GWCORE.Coupon.GetParlayEWCount($(couponEl).find('[id^=CoupLeg]').length, legs, legEWCount);
					$(elID + '_parlay2-TTL').html("???");
					//$(elID + ' #parlay2-0PAY' + couponID).html("TBD");
					$(elID + '_parlay3-TTL').html("???");
					//$(elID + ' #parlay3-0PAY' + couponID).html("TBD");
					$(elID + '_parlay4-TTL').html("???");
					//$(elID + ' #parlay4-0PAY' + couponID).html("TBD");
					$(elID + '_multi-TTL').html("???");
					//$(elID + ' #multiAmt-0PAY' + couponID).html("TBD");
				}
				else
				{
					for(var pi = 2; pi < 10; pi++)
					{
						var parlayAmt = 0;
						switch(pi)
						{
							case 2: parlayAmt = coup.parlay2; break;
							case 3: parlayAmt = coup.parlay3; break;
							case 4: parlayAmt = coup.parlay4; break;
							case 5: parlayAmt = coup.parlay5; break;
							case 6: parlayAmt = coup.parlay6; break;
							case 7: parlayAmt = coup.parlay7; break;
							case 8: parlayAmt = coup.parlay8; break;
							case 9: parlayAmt = coup.parlay9; break;
						}
						if(coup.parlayOpts["" + pi] !== undefined)
						{
							if(parlayAmt <= 0)
							{
								$(elID + '_parlay' + pi + '-AMT').val('');
								$(elID + '_parlay' + pi + '-TTL').html('');
							}
							else
							{
								$(elID + '_parlay' + pi + '-AMT').val(FormatDecimal(parlayAmt));
								$(elID + '_parlay' + pi + '-TTL').html(FormatDecimal(parlayAmt * coup.parlayOpts["" + pi].combos));

								hasError = hasError || (coup.parlayOpts["" + pi].errCode > 0);
							}
							$(elID + '_parlay' + pi + '-DIV').html(FormatDividend(coup.parlayOpts["" + pi].divi, "TBD"));
							if(coup.parlayOpts["" + pi].divi > 1)
							{
								//$(elID + '_parlay' + pi + '-PAY').html((parlayAmt * coup.parlayOpts["" + pi].divi).toFixed(2));
								$(elID + '_parlay' + pi + '-PAY').html(FormatCurrency(parlayAmt * coup.parlayOpts["" + pi].divi));
								coupPay += parlayAmt * coup.parlayOpts["" + pi].divi;
							}
							else
							{
								coupPayShow = false;
							}
							coupTtl += parlayAmt * coup.parlayOpts["" + pi].combos;
							coupSpend += parlayAmt * coup.parlayOpts["" + pi].combos;
						}
					}
					if(coup.multiAmt <= 0)
					{
						$(elID + '_multi-AMT').val('');
						$(elID + '_multi-TTL').html('');
					}
					else
					{
						$(elID + '_multi-AMT').val(FormatDecimal(coup.multiAmt));
						$(elID + '_multi-TTL').html(FormatDecimal(coup.multiAmt));
						hasError = hasError || (GWCORE.Utils.GetStringOrEmpty(coup.multiErrMsg).length > 3);
					}
					$(elID + '_multi-DIV').html(FormatDividend(coup.multiDivi, "TBD"));
					if(coup.multiDivi > 1)
					{
						var multiPayDiv = coup.multiDivi;
						var multiBoostAmt = undefined;
						var multiBoostDiv = undefined;
						if(coup.isMultiBoostToken)
						{
							multiBoostDiv = coup.multiAvailableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostToken].boostedDiv;
							multiBoostAmt = coup.multiAvailableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostToken].boostedAmount;
						}
						else if(coup.isMultiBoostWallet)
						{
							multiBoostDiv = coup.multiAvailableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostWallet].boostedDiv;
							multiBoostAmt = coup.multiAvailableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostWallet].boostedAmount;
						}

						if(multiBoostAmt === undefined) //no boost
						{
							multiBoostAmt = 1;
						}
						else if(multiBoostAmt > 100) //precentage boost
						{
							multiBoostAmt = multiBoostAmt / 100.0;
						}
						else if(multiBoostAmt < 100) //rolls boost
						{
							multiBoostAmt = -1;
						}
						else //shoudl not happen but need a value
						{
							multiBoostAmt = 1;
						}

						if(multiBoostAmt > 0)
						{
							var multiPay = 0;
							if(multiBoostDiv === undefined) //legacy calc
								multiPay = coup.multiAmt * (((multiPayDiv - 1) * multiBoostAmt) + 1);
							else
								multiPay = coup.multiAmt * multiBoostDiv;

							if(coup.isMultiBonusBet)
							{
								multiPay -= coup.multiAmt;
							}
							$(elID + '_multi-PAY').html(FormatDividend(multiPay, "TBD"));
							coupPay += multiPay;
						}
						else
						{
							$(elID + '_multi-PAY').html(FormatDividend(coup.multiAmt * coup.multiDivi, "TBD"));
						}

						$(GWCORE).trigger($.Event("CouponMultiDiviUpdated.Coupon.GWCORE", {
							legCount: coup.LegCount(),
							multiDiv: coup.multiDivi
						}));
					}
					else
					{
						coupPayShow = false;
					}

					if(coup.allowMultiBonusBet)
					{
						$(elID + '_multiAllowUFB').toggle(true);
					}
					else
					{
						coup.isMultiBonusBet = false;
						$(elID + '_multiAllowUFB').toggle(false);
					}

					if(coup.hasMultiBoostToken)
					{
						$(elID + '_multiAllowDBT').toggle(true);
					}
					else
					{
						coup.isMultiBoostToken = false;
						$(elID + '_multiAllowDBT').toggle(false);
					}

					if(coup.hasMultiBoostWallet)
					{
						$(elID + '_multiAllowDBW').toggle(true);
					}
					else
					{
						coup.isMultiBoostWallet = false;
						$(elID + '_multiAllowDBW').toggle(false);
					}

					coupTtl += coup.multiAmt;
					if(!coup.isMultiBonusBet)
						coupSpend += coup.multiAmt;
				}
			}

			var coupPayText = (coupPayShow ? FormatCurrency(coupPay) : "TBD");

			$(elID + '_couponTotal').html(FormatCurrency(coupTtl));
			$(elID + '_couponSpend').html(FormatCurrency(coupSpend));
			$(elID + '_couponPayout').html(coupPayText);

			try
			{
				$(GWCORE).trigger($.Event("TotalUpdated.Coupon.GWCORE", {
					couponTotal: coupTtl,
					couponID: couponID,
					couponEl: elID
				}));
			}
			catch(err)
			{
				console.error(err.message);
			}

			if(coupTtl <= 0 || hasError)
			{
				coup.totalAmount = 0;
				coup.spendAmount = 0;
				coup.totalPayout = "0.00";
				$(elID + '_CouponConfirm').addClass("disabled");
				$(elID + '_CouponSubmit').addClass("disabled");
				$(elID + '_CouponConfirm').prop('disabled', true);
				$(elID + '_CouponSubmit').prop('disabled', true);

				Coupon.ToggleConfirmSubmitButtons(elID, coupTtl, coup);
			}
			else
			{
				coup.totalAmount = coupTtl;
				coup.spendAmount = coupSpend;
				coup.totalPayout = coupPayText;
				$(elID + "_CouponConfirm").removeClass("disabled");
				$(elID + "_CouponSubmit").removeClass("disabled");
				$(elID + '_CouponConfirm').prop('disabled', false);
				$(elID + '_CouponSubmit').prop('disabled', false);

				Coupon.ToggleConfirmSubmitButtons(elID, coupTtl, coup);
			}

			UpdateBoostDisplay(coup);
		}

		return coupTtl;
	}

	//orig
	Coupon.GetParlayCount = function(coupLegs, parlayLegs)
	{
		switch(coupLegs)
		{
			case 3:
				switch(parlayLegs)
				{
					case 2:
						return 3;
				}
				break;
			case 4:
				switch(parlayLegs)
				{
					case 2:
						return 6;
					case 3:
						return 4;
				}
				break;
			case 5:
				switch(parlayLegs)
				{
					case 2:
						return 10;
					case 3:
						return 10;
					case 4:
						return 5;
				}
				break;
			case 6:
			case 7:
			case 8:
			case 9:
			case 10:
				if((coupLegs - 1) === parlayLegs)
					return coupLegs;
				break;
		}

		return 0;
	};

	//orig
	Coupon.GetParlayEWCount = function(coupLegs, parlayLegs, eachwayLegs)
	{
		if(eachwayLegs === 0)
			return 0;
		if(eachwayLegs === coupLegs)
			return coupLegs;

		switch(coupLegs)
		{
			case 3:
				switch(parlayLegs)
				{
					case 2:
						switch(eachwayLegs)
						{
							case 1: return 2;
							case 2: return 3;
						}
				}
				break;
			case 4:
				switch(parlayLegs)
				{
					case 2:
						switch(eachwayLegs)
						{
							case 1: return 3;
							case 2: return 5;
							case 3: return 6;
						}
						break;
					case 3:
						switch(eachwayLegs)
						{
							case 1: return 2;
							case 2: return 3;
							case 3: return 3;
						}
						break;
				}
				break;
			case 5:
				switch(parlayLegs)
				{
					case 2:
						switch(eachwayLegs)
						{
							case 1: return 4;
							case 2: return 7;
							case 3: return 9;
							case 4: return 10;
						}
						break;
					case 3:
						switch(eachwayLegs)
						{
							case 1: return 3;
							case 2: return 5;
							case 3: return 6;
							case 4: return 6;
						}
						break;
					case 4:
						switch(eachwayLegs)
						{
							case 1: return 2;
							case 2: return 3;
							case 3: return 3;
							case 4: return 3;
						}
						break;
				}
				break;
			case 6:
			case 7:
			case 8:
			case 9:
			case 10:
				if((coupLegs - 1) === parlayLegs)
					return coupLegs * eachwayLegs;
				break;
		}

		return 0;
	};

	//orig
	Coupon.RequestSubmitCoupon = function(el, couponID)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			if(!coup.isSubmitting) //$(el).hasClass("disabled"))
			{
				if(GWCORE.isLoggedInClient)
				{
					//alert("Submit Coupon");
					SubmitCoupon(coup);
				}
				else
				{
					if(typeof (GWCUSTOM.Coupon.VisitorBetSubmit) === 'function')
						GWCUSTOM.Coupon.VisitorBetSubmit();
					else
						alert('You must be logged in to submit bets.');
				}
			}
		}
	};

	//new (as private)
	function SubmitCoupon(coup)
	{
		if(coup !== undefined && !coup.isSubmitting && !$(coup.GetPageElementID() + '_CouponSubmit').prop('disabled'))
		{
			coup.isSubmitting = true;
			$(coup.GetPageElementID() + '_CouponSubmit').addClass("isActive");

			$(coup.GetPageElementID() + "  .CouponSubmit").css("opacity", "0.6").addClass("disabled");

			var postJSON = coup.MakeCouponPostData();

			var hasCouponErr = false; //whole coupon or multi error
			$.ajax({
				type: 'POST',
				url: '/Process/CouponBetRequest',
				contentType: "application/json",
				cache: false,
				data: postJSON,
				success: function(returndata)
				{
					var requestReply = returndata.payload.requestReply;

					if(requestReply !== undefined)
					{
						var retainLegs = coup.retainLegs;
						var newTransIDs = [];
						var newLegHashes = [];
						var hasLegErr = false;

						if(requestReply.couponErrCode > 0)
						{
							coup.errMsg = requestReply.couponErrDescription;
							hasCouponErr = true;
							DisplayCouponGlobalError(coup.GetCouponID(), requestReply.couponErrCode, requestReply.couponErrDescription);
						}

						jQuery.each(requestReply.legs, function(key, leg)
						{
							var coupleg = coup.legs[leg.clientLegID];
							coupleg.currentDividend = leg.currentDividend;
							coupleg.currentEWDividend = leg.currentEWDividend;
							coupleg.currentEWProduct = leg.currentEWProduct;

							if(leg.transactionID > 0) //success
							{
								newTransIDs.push(leg.transactionID);
								newLegHashes.push(leg.clientLegID);

								coupleg.status = leg.status;
								coupleg.requestedTotal = coupleg.totalAmount;
								coupleg.requestedDivi = coupleg.price;

								coupleg.unitAmount = 0;
								coupleg.totalAmount = 0;

								coupleg.transactionID = leg.transactionID;
								coupleg.ticketNumber = leg.ticketNumber;
								coupleg.acceptedTotal = leg.amount;
								coupleg.acceptedDivi = leg.currentDividend;
								coupleg.legValid = false;

								coupleg.specialDisplay = leg.specialDisplay;
								coupleg.betType = leg.betType;
								coupleg.boostAmount = leg.boostAmount;

								leg.errorCode = 0;
							}
							else if(leg.errorCode !== 0)
							{
								switch(leg.errorCode)
								{
									case 24: //NoTotalAmount
										//multi leg only - ignore
										break;
									default:
										//######## handle error
										coupleg.legValid = false;
										coupleg.errMsg = leg.errorMessage;
										coupleg.errCode = leg.errorCode;

										DisplayCouponLegError(coup.couponID, coupleg);

										hasLegErr = true;
										break;
								}
							}
							else if(!retainLegs && coupleg.totalAmount === 0 && coup.multiAmt === 0)
							{
								CouponStoreRemoveLeg(coup, legHash);
							}
						});

						if(undefined !== requestReply.multiTransID)
						{
							if(requestReply.multiTransID > 0) //success
							{
								newTransIDs.push(requestReply.multiTransID);
							}
						}

						if(undefined !== requestReply.parlayTrans && requestReply.parlayTrans !== null)
						{
							jQuery.each(requestReply.parlayTrans, function(key, leg)
							{
								if(leg.transactionID > 0) //success
								{
									newTransIDs.push(leg.transactionID);
								}
								else
								{
									retainLegs = true;
									hasCouponErr = true;
								}
							});
						}


						if(newTransIDs.length > 0)
						{
							Coupon.ProcessNewTransactionIDs(newTransIDs);
						}

						var legsData = {};
						legsData["legs"] = {};
						var counts =
						{
							"total": 0,
							"approved": 0,
							"processing": 0,
							"rejected": 0
						};

						//add stubs to alerts
						if(newLegHashes.length > 0)
						{
							jQuery.each(newLegHashes, function(key, legHash)
							{
								var leg = coup.legs[legHash];

								var alertDivi = leg.acceptedDivi;
								var alertBoostAmount = 0;
								if(leg.isDivBoostToken)
								{
									alertDivi = leg.availableDivBoosts[Coupon.BenefitModes.DivBoostToken].boostedDiv;
									alertBoostAmount = leg.availableDivBoosts[Coupon.BenefitModes.DivBoostToken].boostedAmount;
								}
								else if(leg.isDivBoostWallet)
								{
									alertDivi = leg.availableDivBoosts[Coupon.BenefitModes.DivBoostWallet].boostedDiv;
									alertBoostAmount = leg.availableDivBoosts[Coupon.BenefitModes.DivBoostWallet].boostedAmount;
								}

								if(alertDivi === 1)
								{
									alertDivi = leg.spFullDesc;
									if(alertBoostAmount > 100)
										alertDivi = alertDivi + " +" + (alertBoostAmount - 100) + "%";
									else if(alertBoostAmount > 0)
										alertDivi = alertDivi + " +" + alertBoostAmount + "rolls";
								}
								else
								{
									alertDivi = TruncateDecimal(alertDivi);
								}

								var data = {
									"couponLegID": 0,
									"ticketNumber": leg.ticketNumber,
									"submittedAt": "0001-01-01T00:00:00",
									"status": leg.status,
									"sportCode": leg.sportCode,
									"navSport": leg.navSport,
									"eventID": leg.eventID,
									"description": leg.eventName,
									"teamA": leg.teamA,
									"teamB": leg.teamB,
									"outcome": leg.outcome,
									"type": "",
									"reason": leg.errMsg,
									"dividend": alertDivi,
									"balEffect": leg.requestedTotal,
									"unitAmount": (leg.requestedTotal / leg.comboCount),
									"totalAmount": leg.requestedTotal,
									"isEachWay": leg.isEachWay,
									"ewShortDesc": leg.ewShortDesc,
									"ewFullDesc": leg.ewFullDesc,
									"ewDividend": leg.ewDividend,
									"ewDisp": leg.ewDisp,
									"isFreeBet": leg.isFreeBet,
									"isBetApproval": false,


									"requestedDividend": TruncateDecimal(leg.currentDividend),
									"specialShort": (leg.betType.toLowerCase() === "exotic" ? leg.priceDisp : leg.spShortDesc),
									"betType": leg.betType,
									"special": leg.special,
									"specialDisplay": leg.specialDisplay,
									"boostAmount": alertBoostAmount,

									//extra not coming from normal alert
									"selections": leg.selections,
									"priceDisp": leg.priceDisp,

									"showUntil": "2050-01-01T00:00:00"
								};

								legsData["legs"][leg.transactionID] = data;
								counts.total = counts.total + 1;
								counts.processing = counts.processing + 1;
							});
						}

						//add multi stub to alerts
						if(requestReply.multiTransID > 0) //success
						{
							newTransIDs.push(requestReply.multiTransID);

							var multiDesc = "";
							var multiOutcome = "";
							jQuery.each(coup.legs, function(legHash, leg)
							{
								multiDesc += " / " + leg.eventName;
								multiOutcome += " / " + leg.outcome;
							});
							multiDesc = multiDesc.substr(3);
							multiOutcome = multiOutcome.substr(3);

							var multiDivi = coup.multiDivi;
							var multiBoostAmount = 0;
							if(coup.isMultiBoostToken)
							{
								multiDivi = coup.multiAvailableDivBoosts[Coupon.BenefitModes.DivBoostToken].boostedDiv;
								multiBoostAmount = coup.multiAvailableDivBoosts[Coupon.BenefitModes.DivBoostToken].boostedAmount;
							}
							else if(coup.isMultiBoostWallet)
							{
								multiDivi = coup.multiAvailableDivBoosts[Coupon.BenefitModes.DivBoostWallet].boostedDiv;
								multiBoostAmount = coup.multiAvailableDivBoosts[Coupon.BenefitModes.DivBoostWallet].boostedAmount;
							}

							if(coup.multiDivi <= 1)
							{
								multiDivi = "Multi Div";
								if(multiBoostAmount > 100)
									multiDivi = multiDivi + " +" + (multiBoostAmount - 100) + "%";
								else if(multiBoostAmount > 0)
									multiDivi = multiDivi + " +" + multiBoostAmount + "rolls";
							}
							else
							{
								multiDivi = TruncateDecimal(multiDivi);
							}


							var data = {
								"couponLegID": 9999,
								"ticketNumber": requestReply.multiTicketNum,
								"submittedAt": "0001-01-01T00:00:00",
								"status": requestReply.multiStatus,
								"sportCode": "MIX",
								"navSport": "MultiBet",
								"description": multiDesc,
								"teamA": "",
								"teamB": "",
								"outcome": multiOutcome,
								"type": "",
								"reason": requestReply.multiErrDescription,
								"dividend": multiDivi,
								"balEffect": 0 - coup.multiAmt,
								"unitAmount": coup.multiAmt,
								"totalAmount": coup.multiAmt,
								"isEachWay": false,
								"isFreeBet": coup.isMultiBonusBet,
								"isBetApproval": false,

								"requestedDividend": TruncateDecimal(coup.multiDivi),
								"specialShort": "MultiBet",
								"betType": "Multi",
								"boostAmount": multiBoostAmount,

								//extra not coming from normal alert
								"selections": "",
								"priceDisp": multiDivi,
								"showUntil": "2050-01-01T00:00:00"
							};

							legsData["legs"][requestReply.multiTransID] = data;
							counts.total = counts.total + 1;
							counts.processing = counts.processing + 1;

							coup.multiAmt = 0;
							coup.isMultiBonusBet = false;
							coup.isMultiBoostToken = false;
							coup.isMultiBoostWallet = false;
						}
						else if(requestReply.multiErrCode !== 0)
						{
							//######## handle multi error
							retainLegs = true;

							coup.parlayOpts[0].valid = false;
							coup.parlayOpts[0].errMsg = requestReply.multiErrDescription;
							coup.parlayOpts[0].errCode = requestReply.multiErrCode;

							DisplayCouponMultiError(coup.couponID, 0);

							hasCouponErr = true;
						}

						if(requestReply.parlayTrans !== null)
						{
							jQuery.each(requestReply.parlayTrans, function(key, parlayOpt)
							{
								if(parlayOpt.transactionID > 0) //success
								{
									newTransIDs.push(parlayOpt.transactionID);

									//add parlay stub to alerts
									var pAmt = 0;
									switch(parlayOpt.clientAppLegIDs.length)
									{
										case 2: pAmt = coup.parlay2; break;
										case 3: pAmt = coup.parlay3; break;
										case 4: pAmt = coup.parlay4; break;
										case 5: pAmt = coup.parlay5; break;
										case 6: pAmt = coup.parlay6; break;
										case 7: pAmt = coup.parlay7; break;
										case 8: pAmt = coup.parlay8; break;
										case 9: pAmt = coup.parlay9; break;
									}

									var pData = AddParlayAlertStubs(coup, pAmt, parlayOpt);
									if(pData !== undefined)
									{
										legsData["legs"][parlayOpt.transactionID] = pData;
										counts.total = counts.total + 1;
										counts.processing = counts.processing + 1;
									}
								}
								//else if(requestReply.multiErrCode !== 0) -- cant happen because multi/parlay are all in
								//{
								//	//######## handle multi error
								//}
							});

							if(!hasCouponErr)
							{
								coup.parlay2 = 0;
								coup.parlay3 = 0;
								coup.parlay4 = 0;
								coup.parlay5 = 0;
								coup.parlay6 = 0;
								coup.parlay7 = 0;
								coup.parlay8 = 0;
								coup.parlay9 = 0;
							}
						}

						GWCORE.Alerts.ProcessAlerts(legsData, counts);

						GWCORE.ForceHeartbeat();

						if(hasCouponErr)
						{
							//do not remove any legs
							DisplayCouponMultiError(coup.couponID, 0);
						}
						else if(!retainLegs)
						{
							if(hasLegErr)
							{
								jQuery.each(coup.legs, function(key, leg)
								{
									if(leg.errCode === 0)
									{
										coup.RemoveLeg(leg.legHash);
									}
								});
							}
							else
							{
								RemoveAllLegs(coup);
								coup.trackingCode = undefined;
							}

							Event_CouponHasSubmitted(coup, legsData);
						}
						else
						{
							if(!hasCouponErr)
								coup.currentMode = GWCORE.Coupon.CouponModes.Edit;
						}
					}
					else
					{
						//major issue
						//need to handle by ????
						GWCORE.Dialogs.Push(new GWCORE.Dialogs.AlertDialog({
							title: "Coupon Error",
							message: returndata.message,
							type: "error"
						}));
					}
				},
				complete: function(request, status)
				{
					$(coup.GetPageElementID() + '_CouponSubmit').removeClass("isActive");
					coup.isSubmitting = false;
					$(coup.GetPageElementID() + "  .CouponSubmit").css("opacity", "1").removeClass("disabled");

					if(!hasCouponErr)
					{
						UpdateTotals();
						if(coup.LegCount() > 0)
						{
							VerifyCoupon(coup, 0, undefined);
						}
						else
						{
							DisplayCoupon(coup);
						}
						UpdateCouponSession();

						Event_CouponLegCountUpdated(coup);
					}
				}
			});
		}
	}

	function AddParlayAlertStubs(coup, parlayAmount, parlayOpt) //legsArray, transID, status)
	{
		if(parlayAmount <= 0)
		{
			return undefined;
		}
		else
		{
			var multiDesc = "";
			var multiOutcome = "";
			jQuery.each(parlayOpt.clientAppLegIDs, function(legHash, legID)
			{
				var plegData = coup.legs[legID];
				if(plegData !== undefined)
				{
					multiDesc += " / " + plegData.eventName;
					multiOutcome += " / " + plegData.outcome;
				}
				else
				{
					multiDesc += " / ???";
					multiOutcome += " / ???";
				}
			});
			multiDesc = multiDesc.substr(3);
			multiOutcome = multiOutcome.substr(3);

			var data = {
				"couponLegID": 0 - parlayOpt.transactionID,
				"ticketNumber": parlayOpt.ticketNumber,
				"submittedAt": "0001-01-01T00:00:00",
				"status": parlayOpt.status,
				"sportCode": "MIX",
				"navSport": "MultiBet",
				"description": multiDesc,
				"teamA": "",
				"teamB": "",
				"outcome": multiOutcome,
				"type": "",
				"reason": parlayOpt.errorMessage,
				"dividend": 0,
				"balEffect": 0 - parlayAmount,
				"unitAmount": parlayAmount,
				"totalAmount": parlayAmount,
				"isEachWay": false,
				"isFreeBet": false,
				"isBetApproval": false,

				"requestedDividend": 0,
				"specialShort": "MultiBet",
				"betType": "Multi",
				"boostAmount": 0,

				"selections": "",
				"priceDisp": "",

				"showUntil": "2050-01-01T00:00:00"
			};

			return data;
		}
	}


	//orig
	Coupon.RequestConfirmCoupon = function(el, couponID)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			if(GWCORE.isLoggedInClient)
			{
				if(coup.totalAmount > 0)
				{
					coup.currentMode = GWCORE.Coupon.CouponModes.Confirm;
					VerifyCoupon(coup, 0, undefined);
				}
			}
			else
			{
				if(typeof (GWCUSTOM.Coupon.VisitorBetSubmit) === 'function')
					GWCUSTOM.Coupon.VisitorBetSubmit();
				else
					alert('You must be logged in to submit bets.');
			}
		}
	};

	//new (as private)
	function VerifyCoupon(coup, lastHashAdded, clickedElement)
	{
		if(coup !== undefined && !coup.isSubmitting)
		{
			coup.isSubmitting = true;

			if(coup.LegCount() <= 0)
			{
				DisplayCoupon(coup);
				coup.isSubmitting = false;
			}
			else
			{
				try
				{
					var postJSON = coup.MakeCouponPostData();

					$.ajax({
						type: 'POST',
						url: '/Process/CouponBetVerify',
						contentType: "application/json",
						cache: false,
						data: postJSON,
						success: function(returndata)
						{
							// update coupon data
							var couponValid = true;
							var veriReply = returndata.payload.veriReply;

							if(veriReply !== undefined)
							{
								coup.trackingCode = veriReply.trackingCode;

								coup.errCode = veriReply.errCode;
								coup.errMsg = veriReply.errMsg;

								if(coup.LegCount() <= 1)
								{
									coup.parlay2 = 0;
									coup.parlay3 = 0;
									coup.parlay4 = 0;
									coup.parlay5 = 0;
									coup.parlay6 = 0;
									coup.parlay7 = 0;
									coup.parlay8 = 0;
									coup.parlay9 = 0;
									coup.multiAmt = 0;
									coup.allowMultiBet = false;
									coup.allowMultiBonusBet = false;
									coup.multiBonusBetLimit = 0;
								}
								else
								{
									coup.allowMultiBet = veriReply.allowMulti;
									coup.allowMultiBonusBet = veriReply.allowMultiBonusBet;
									coup.multiBonusBetLimit = veriReply.multiBonusBetLimit;
								}
								coup.multiAvailableDivBoosts = {};
								coup.hasMultiBoostToken = false;
								coup.hasMultiBoostWallet = false;

								if(veriReply.multiAvailableDivBoosts !== undefined && veriReply.multiAvailableDivBoosts !== null)
								{
									jQuery.each(veriReply.multiAvailableDivBoosts, function(counter, boostLeg)
									{
										var boostDetails = {
											boostedDiv: boostLeg.boostedDiv,
											boostedAmount: boostLeg.boostedAmount,
											maxBet: boostLeg.maxBet,
											voucherID: boostLeg.voucherID
										};

										switch(boostLeg.boostMode)
										{
											case 1:
												coup.hasMultiBoostToken = true;
												coup.multiAvailableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostToken] = boostDetails;
												break;
											case 2:
												coup.hasMultiBoostWallet = true;
												coup.multiAvailableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostWallet] = boostDetails;
												break;
										}
									});
								}

								if(coup.isMultiBoostToken && !coup.hasMultiBoostToken)
									coup.isMultiBoostToken = false;

								if(coup.isMultiBoostWallet && !coup.hasMultiBoostWallet)
									coup.isMultiBoostWallet = false;

								coup.multiErrMsg = veriReply.multiErr;
								coup.multiDivi = veriReply.multiDivi;
								coup.multiMaxDivi = veriReply.multiMaxDivi;
								coup.parlayOpts = {};

								if(coup.allowMultiBet)
								{
									coup.parlayOpts["0"] = {combos: 1, divi: veriReply.multiDivi};
									if(veriReply.parlayOpts !== undefined)
									{
										jQuery.each(veriReply.parlayOpts, function(key, parlay)
										{
											coup.parlayOpts["" + parlay.legs] = {combos: parlay.combos, divi: parlay.divi, errCode: parlay.errCode};
										});
									}
								}

								jQuery.each(veriReply.legs, function(key, veriLeg)
								{
									var leg = coup.legs[veriLeg.clientLegID];

									if(leg !== undefined)
									{
										leg.currentDividend = veriLeg.currentDividend;
										leg.currentMod1 = veriLeg.currentModifier1;
										leg.currentMod2 = veriLeg.currentModifier2;
										leg.currentOutcome = veriLeg.currentOutcome;
										leg.currentModiferDisp = veriLeg.currentModiferDisp;

										leg.currentEWDividend = veriLeg.currentEWDividend;
										leg.currentEWProduct = veriLeg.currentEWProduct;
										leg.freeBetLimit = veriLeg.freeBetLimit;
										leg.maxbetLimit = veriLeg.maxTotalLimit;

										leg.allowEachWay = veriLeg.allowEachWay;
										leg.currentEWProduct = GWCORE.Utils.GetStringOrEmpty(veriLeg.currentEWProduct);
										leg.currentEWDividend = veriLeg.currentEWDividend;
										leg.currentEWShortDesc = GWCORE.Utils.GetStringOrEmpty(veriLeg.currentEWShortDesc);
										leg.currentEWFullDesc = GWCORE.Utils.GetStringOrEmpty(veriLeg.currentEWFullDesc);
										leg.currentEWIsToteProduct = veriLeg.currentEWIsToteProduct;

										leg.availableDivBoosts = {};
										leg.hasDivBoostToken = false;
										leg.hasDivBoostWallet = false;

										if(veriLeg.availableDivBoosts !== undefined && veriLeg.availableDivBoosts !== null)
										{
											jQuery.each(veriLeg.availableDivBoosts, function(counter, boostLeg)
											{
												var boostDetails = {
													boostedDiv: boostLeg.boostedDiv,
													boostedAmount: boostLeg.boostedAmount,
													maxBet: boostLeg.maxBet,
													voucherID: boostLeg.voucherID
												};
												switch(boostLeg.boostMode)
												{
													case 1:
														leg.hasDivBoostToken = true;
														leg.availableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostToken] = boostDetails;
														break;
													case 2:
														leg.hasDivBoostWallet = true;
														leg.availableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostWallet] = boostDetails;
														break;
												}
											});
										}

										if(leg.isDivBoostToken && !leg.hasDivBoostToken)
											leg.isDivBoostToken = false;

										if(leg.hasDivBoostWallet && !leg.hasDivBoostWallet)
											leg.hasDivBoostWallet = false;

										leg.legValid = veriLeg.legValid;
										leg.errMsg = veriLeg.errorMessage;
										leg.errCode = veriLeg.errorCode;

										couponValid = couponValid && leg.legValid;
									}
								});
							}
							else
							{
								//major issue
								//need to handle by ????
								GWCORE.Dialogs.Push(new GWCORE.Dialogs.AlertDialog({
									title: "Coupon Error",
									message: returndata.message,
									type: "error"
								}));
							}
						},
						complete: function(request, status)
						{
							coup.isSubmitting = false;
							UpdateTotals();
							DisplayCoupon(coup, undefined, undefined, clickedElement);
							UpdateCouponSession();

							if(lastHashAdded !== 0)
							{
								Event_LegAdded(coup.GetCouponID(), lastHashAdded, clickedElement);
							}
						}
					});
				}
				catch(err)
				{
					coup.isSubmitting = false;
				}
				finally
				{
					//nothing
				}
			}
		}
	}

	//orig
	Coupon.InitDisplay = function(shouldDisplay, currState, couponID)
	{
		console.error("InitDisplay no longer required???");
	};

	//new
	function BindDisplay(coup)
	{
		var couponID = coup.GetCouponID();
		var elID = coup.GetPageElementID();
		var $el = $(elID);
		if($el.length)
		{
			$(elID + "_RetainLegs").each(function()
			{
				$(this).change(function()
				{
					var coup = activeCoupons[couponID];

					if(coup !== undefined)
					{
						if($(this).prop("checked"))
						{
							coup.retainLegs = true;
						}
						else
						{
							coup.retainLegs = false;
						}
					}
				});
			});

			if(coup.currentMode === GWCORE.Coupon.CouponModes.Edit)
			{
				$el.find('input[type="text"], input[type="number"]').each(function()
				{
					var val = GWCORE.Utils.GetDecimalOrZero($(this).val());
					if(val <= 0)
					{
						$(this).val('');
					}
				});
				$el.find("[id*='_BetAmt']").each(function()
				{
					$(this).keyup(function()
					{
						var _this = this;
						GWCORE.Utils.delay(function()
						{
							GWCORE.Coupon.CouponAmountPreParse(couponID, _this);
						}, GWCORE.Coupon.userInputDelay);
					});
					$(this).change(function()
					{
						var _this = this;
						GWCORE.Utils.delay(function()
						{
							GWCORE.Coupon.CouponUpdateLeg(couponID, _this);
						}, 0);
					});

					if(Coupon.isPrimaryCoupon(coup))
					{
						$(this).click(function()
						{
							$(this).closest(".controls").data("quickFocus", "AMT");
							$("#" + couponID).find(".quickAmounts").toggle(false);
							$(this).closest(".controls").find(".quickAmounts").toggle(true);
						});
					}
				});
				$el.find("[id*='_BetTtl']").each(function()
				{
					$(this).keyup(function()
					{
						var _this = this;
						GWCORE.Utils.delay(function()
						{
							GWCORE.Coupon.CouponAmountPreParse(couponID, _this);
							//GWCORE.Coupon.CouponUpdateLeg(couponID, _this);
						}, GWCORE.Coupon.userInputDelay);
					});
					$(this).change(function()
					{
						var _this = this;
						GWCORE.Utils.delay(function()
						{
							GWCORE.Coupon.CouponUpdateLeg(couponID, _this);
						}, 0);
					});

					if(Coupon.isPrimaryCoupon(coup))
					{
						$(this).click(function()
						{
							$(this).closest(".controls").data("quickFocus", "TTL");
							$("#" + couponID).find(".quickAmounts").toggle(false);
							$(this).closest(".controls").find(".quickAmounts").toggle(true);
						});

						//$(this).blur(function()
						//{
						//	$(this).closest(".controls").find(".quickAmounts").toggle(false);
						//});
					}
				});
				$el.find("[id*='_BetFlex']").each(function()
				{
					$(this).keyup(function()
					{
						var _this = this;
						GWCORE.Utils.delay(function()
						{
							GWCORE.Coupon.CouponAmountPreParse(couponID, _this);
						}, GWCORE.Coupon.userInputDelay);
					});
					$(this).change(function()
					{
						var _this = this;
						GWCORE.Utils.delay(function()
						{
							GWCORE.Coupon.CouponUpdateLeg(couponID, _this);
						}, 0);
					});

					if(Coupon.isPrimaryCoupon(coup))
					{
						$(this).click(function()
						{
							$(this).closest(".controls").data("quickFocus", "FLEX");
							$("#" + couponID).find(".quickAmounts").toggle(false);
							$(this).closest(".controls").find(".quickAmounts").toggle(true);
						});
					}
				});
				$el.find("[id*='_BetUEW']").each(function()
				{
					$(this).change(function()
					{
						GWCORE.Coupon.CouponUpdateLeg(couponID, this);
					});
				});

				$el.find("[id*='_BetUFB']").each(function()
				{
					$(this).change(function()
					{
						ChangeBenefitOption(Coupon.BenefitModes.BonusBet, couponID, this);
					});
				});
				$el.find("[id*='_BetDBT']").each(function()
				{
					$(this).change(function()
					{
						ChangeBenefitOption(Coupon.BenefitModes.DivBoostToken, couponID, this);
					});
				});
				$el.find("[id*='_BetDBW']").each(function()
				{
					$(this).change(function()
					{
						ChangeBenefitOption(Coupon.BenefitModes.DivBoostWallet, couponID, this);
					});
				});

				$el.find("[id*='_multiUFB']").each(function()
				{
					$(this).change(function()
					{
						UpdateMultiBenefit(Coupon.BenefitModes.BonusBet, couponID);
					});
				});
				$el.find("[id*='_multiDBT']").each(function()
				{
					$(this).change(function()
					{
						UpdateMultiBenefit(Coupon.BenefitModes.DivBoostToken, couponID);
					});
				});
				$el.find("[id*='_multiDBW']").each(function()
				{
					$(this).change(function()
					{
						UpdateMultiBenefit(Coupon.BenefitModes.DivBoostWallet, couponID);
					});
				});

				if(Coupon.reverseParlay === true)
				{
					var header = $(coup.GetPageElementID() + "_multiSection .asH4");
					var titles = $(coup.GetPageElementID() + "_multiSection .bettingLeg.multiBet.titles");
					var allopts = $(coup.GetPageElementID() + "_multiSection .bettingLeg.multiBet.alloptions");
					var poptList = $(coup.GetPageElementID() + "_multiSection").children(".bettingLeg.parlayOption");

					$(coup.GetPageElementID() + "_multiSection").empty();
					$(coup.GetPageElementID() + "_multiSection").append(header);
					$(coup.GetPageElementID() + "_multiSection").append(titles);
					$(coup.GetPageElementID() + "_multiSection").append(allopts);
					$(coup.GetPageElementID() + "_multiSection").append(poptList.get().reverse());
				}

				if(GWCORE.Coupon.toggleParlay !== undefined)
				{
					$(coup.GetPageElementID() + "_multiSection .bettingLeg.parlayOption").toggle(GWCORE.Coupon.toggleParlay);

					$el.find("[id*='_parlayToggle']").each(function()
					{
						if(GWCORE.Coupon.toggleParlay)
							$(this).addClass('selected');

						$(this).click(function()
						{
							if($(this).hasClass('selected'))
							{
								$(this).removeClass('selected')
								$(coup.GetPageElementID() + "_multiSection .bettingLeg.parlayOption").toggle(false);
							}
							else
							{
								$(this).addClass('selected')
								$(coup.GetPageElementID() + "_multiSection .bettingLeg.parlayOption").toggle(true);
							}
						});
					});
				}

				$el.find("[id*='_parlay']").each(function()
				{
					if($(this).attr('id').match(/-AMT$/))
					{
						$(this).keyup(function()
						{
							var _this = this;
							GWCORE.Utils.delay(function()
							{
								GWCORE.Coupon.CouponAmountPreParse(couponID, _this, true);
							}, GWCORE.Coupon.userInputDelay);
						});
						$(this).change(function()
						{
							var _this = this;
							GWCORE.Utils.delay(function()
							{
								GWCORE.Coupon.CouponUpdateLeg(couponID, undefined);
							}, 0);
						});

						if(Coupon.isPrimaryCoupon(coup))
						{
							$(this).click(function()
							{
								$(this).closest(".bettingLeg.parlayOption").data("quickFocus", "AMT");
								$("#" + couponID).find(".quickAmounts").toggle(false);
								$(this).closest(".bettingLeg.parlayOption").find(".quickAmounts").toggle(true);
							});
						}
					}
				});

				$(elID + "_multi-AMT").each(function()
				{
					$(this).keyup(function()
					{
						var _this = this;
						GWCORE.Utils.delay(function()
						{
							GWCORE.Coupon.CouponAmountPreParse(couponID, _this, true);
						}, GWCORE.Coupon.userInputDelay);
					});
					$(this).change(function()
					{
						//var _this = this;
						GWCORE.Utils.delay(function()
						{
							GWCORE.Coupon.CouponUpdateLeg(couponID, undefined);
						}, 0);
					});

					if(Coupon.isPrimaryCoupon(coup))
					{
						$(this).click(function()
						{
							$(this).closest(".bettingLeg.multiBet").data("quickFocus", "AMT");
							$("#" + couponID).find(".quickAmounts").toggle(false);
							$(this).closest(".bettingLeg.multiBet").find(".quickAmounts").toggle(true);
						});
					}
				});

				$el.find("[id*='_RaceProdSwap']").each(function()
				{
					$(this).change(function()
					{
						GWCORE.Coupon.ChangeRaceProduct(couponID, this);
					});
				});

				$(elID + "_AllSinglesAmt").each(function()
				{
					$(this).keyup(function()
					{
						var _this = this;
						GWCORE.Utils.delay(function()
						{
							GWCORE.Coupon.UpdateAllBetLegAmounts(couponID, true);
						}, GWCORE.Coupon.userInputDelay);
					});
					$(this).change(function()
					{
						var _this = this;
						GWCORE.Utils.delay(function()
						{
							GWCORE.Coupon.UpdateAllBetLegAmounts(couponID, false);
						}, 0);
					});
				});
				$(elID + '_AllBetLegsAmount').toggle(GWCORE.Coupon.showAllBetsAmount && coup.LegCount() > 1);

				$el.find(".controls .quickAmounts .quickAmount").each(function()
				{
					var val = GWCORE.Utils.GetDecimalOrZero($(this).data("amount"));
					var leghash = $(this).parent().data("leghash");
					if(val > 0)
						$(this).click(function()
						{
							GWCORE.Coupon.AddCouponLegAmount(val, leghash, coup.couponID);
						});
					else
						$(this).click(function()
						{
							GWCORE.Coupon.SetCouponLegAmount(0, leghash, coup.couponID);
						});
				});

				if(Coupon.isPrimaryCoupon(coup) && GWCORE.AccountPrefs.HasQuickAmounts())
				{
					$el.find(".controls .quickAmounts").each(function()
					{
						$(this).toggle(false);
					});
				}
			}
			else
			{
				$(elID + " .quickAmountButtons a.button").addClass("disabled");
				$(elID + '_AllBetLegsAmount').toggle(false);
			}

			$(elID + '_RetainLegsBlock').toggle(GWCORE.Coupon.showCouponRetain);

			Event_CouponLoaded(coup.couponID);
		}
	}

	//orig - but not required
	Coupon.TransferCoupons = function()
	{
		console.error("TransferCoupons no longer avail - use TransferLeg");
	};

	//orig
	Coupon.SetCouponLegAmount = function(val, legHash, couponID)
	{
		UpdateCouponLegAmount(false, val, legHash, couponID);
	};

	//orig
	Coupon.AddCouponLegAmount = function(val, legHash, couponID)
	{
		UpdateCouponLegAmount(true, val, legHash, couponID);
	};

	function UpdateCouponLegAmount(isAddValue, val, legHash, couponID)
	{
		if(couponID === undefined)
		{
			couponID = mainCouponID;
		}
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var el = undefined;
			var isMulti = false;

			if(legHash === "multi")
			{
				el = $("#" + couponID + "_multi-AMT")[0];
				isMulti = true;
			}
			else if(("" + legHash).substr(0, 6) === "parlay")
			{
				el = $("#" + couponID + "_" + legHash + "-AMT")[0];
				isMulti = true;
			}
			else
			{
				var elTtl = $("#" + couponID + "_BetTtl" + legHash)[0];
				var elAmt = $("#" + couponID + "_BetAmt" + legHash)[0];

				el = elTtl;
				if(elAmt !== undefined)
				{
					if(elTtl !== undefined) //both exists
					{
						if($(elAmt).closest(".controls").data("quickFocus") === "AMT")
							el = elAmt;
					}
					else
					{
						el = elAmt;
					}
				}
			}

			if(el !== undefined)
			{
				var curVal = GWCORE.Utils.GetDecimalOrZero($(el).val());
				var newVal = val;
				if(isAddValue)
					newVal = val + curVal;

				$(el).val(newVal);

				if(isMulti)
					GWCORE.Coupon.CouponUpdateLeg(couponID, undefined);
				else
					GWCORE.Coupon.CouponUpdateLeg(couponID, $(el));

				UpdateCouponSession();
			}
		}
	};

	//new
	Coupon.UpdateAllBetLegAmounts = function(couponID, isBlur)
	{
		if(couponID === undefined)
		{
			couponID = mainCouponID;
		}
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var couponElID = "#" + couponID;
			var amt = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_AllSinglesAmt").val());

			if(!isBlur)
			{
				$(coup.GetPageElementID() + "_AllSinglesAmt").val(FormatDecimal(amt, 2));
			}
			var $el = $(couponElID);

			if(amt > 0)
			{
				$el.find("[id*='_BetAmt']").each(function()
				{
					if(!$(this).hasClass("exotic"))
					{
						var curAmt = GWCORE.Utils.GetDecimalOrZero($(this).val());
						if(curAmt !== amt)
						{
							$(this).val(amt);
							Coupon.CouponUpdateLeg(couponID, this);
						}
					}
				});
				$el.find("[id*='_BetTtl']").each(function()
				{
					if($(this).hasClass("exotic"))
					{
						var curAmt = GWCORE.Utils.GetDecimalOrZero($(this).val());
						if(curAmt !== amt)
						{
							$(this).val(amt);
							Coupon.CouponUpdateLeg(couponID, this);
						}
					}
				});

				if(this.applyAllBetAmountToMultis)
				{
					var doUpdate = false;

					for(var pi = 2; pi < 10; pi++)
					{
						var parlayAmt = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_parlay" + pi + "-AMT").val());
						if(parlayAmt !== amt && $(coup.GetPageElementID() + "_parlay" + pi + "-AMT").length)
						{
							$(coup.GetPageElementID() + "_parlay" + pi + "-AMT").val(amt <= 0 ? "" : amt);
							doUpdate = true;
						}
					}

					var multiAmt = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_multi-AMT").val());
					if(multiAmt !== amt && $(coup.GetPageElementID() + "_multi-AMT").length)
					{
						$(coup.GetPageElementID() + "_multi-AMT").val(amt <= 0 ? "" : amt);
						doUpdate = true;
					}

					if(doUpdate)
						Coupon.CouponUpdateLeg(couponID, undefined);
				}
			}
			UpdateCouponSession();
		}
	};

	//new
	/// template and elID must be passed if no coup exists (ie to show an empty coupon)
	function DisplayCoupon(coup, template, elID, clickedID)
	{
		if(coup !== undefined)
		{
			if(template === undefined || template === '')
			{
				template = coup.GetTemplate();
			}
			if(elID === undefined || elID === '')
			{
				elID = coup.GetPageElementID();
			}
		}

		if(coup !== undefined && GWCORE.Coupon.isQuickBetCoupon(coup) && coup.LegCount() === 0)
		{
			GWCORE.Coupon.ClearQuickCoupons();
		}
		else
		{
			if(!GWCORE.Coupon.showEmptyCoupon)
			{
				if(coup === undefined || coup.LegCount() === 0)
					$(elID).addClass("couponEmpty");
				else
					$(elID).removeClass("couponEmpty");
			}

			if(template !== undefined && elID !== undefined)
			{
				$(elID).html("LOADING");

				//TODO: switch by ??couponID?? for each template
				var couponTemplateHtml = GWCORE.Utils.FetchTemplate(template);

				if(couponTemplateHtml !== 'undefined')
				{
					switch(GWCORE.Coupon.inputMode)
					{
						case "decimal":
						case "numeric":
							GWCORE.Coupon.inputType = "numeric";
						default:
							GWCORE.Coupon.inputType = "text";
					}

					var couponTemplate = _.template(couponTemplateHtml);

					var couponContent = couponTemplate({coupon: coup});

					$(elID).html(couponContent);

					if(coup !== undefined)
					{
						var errData = jQuery.extend({}, GWCORE.CouponErrorData);
						errData.couponID = coup.GetCouponID();
						errData.legHash = 'CoupErr';
						errData.errMessage = "ERROR";
						errData.acceptAction = "";
						errData.declineMessage = 'Clear';
						errData.declineAction = "GWCORE.Coupon.ClearCoupon('" + coup.GetCouponID() + "')";

						var couponErrContent = undefined;

						if(coup.currentMode !== GWCORE.Coupon.CouponModes.Edit)
						{
							if(coup.errCode > 0)
							{
								errData.errMessage = coup.errMsg;
								errData.acceptMessage = "Edit";
								errData.acceptAction = "GWCORE.Coupon.AcceptEditCoupon('" + coup.GetCouponID() + "', 'CoupErr')";
								couponErrContent = FormatErrorMessage(coup, errData);
							}
						}
						else if(!GWCORE.isLoggedInClient)
						{
							errData.acceptAction = "";
							errData.declineAction = "";
							errData.errMessage = "You must be logged in to submit bets.";
							couponErrContent = FormatErrorMessage(coup, errData);
						}

						if(coup.isMultiBonusBet && coup.multiAmt > coup.multiBonusBetLimit)
						{
							coup.parlayOpts[0] = (jQuery.extend({}, GWCORE.CouponParlayOpt));
							coup.parlayOpts[0].valid = false;
							coup.parlayOpts[0].errMsg = "BonusBet over limit";
							coup.parlayOpts[0].errCode = 21;
							DisplayCouponMultiError(coup.couponID, 0);
						}

						if(couponErrContent !== undefined)
						{
							$(elID + "_CouponError").html(couponErrContent);
							$(elID + "_CouponError").toggle(true);
							$(elID + "_CouponButtons").toggle(false);
						}
						else
						{
							$(elID + "_CouponError").html("ERROR");
							$(elID + "_CouponError").toggle(false);
							$(elID + "_CouponButtons").toggle(true);
						}

						jQuery.each(coup.legs, function(legHash, leg)
						{
							DisplayCouponLegError(coup.GetCouponID(), leg);

							$(elID + '_QuickAmounts' + legHash).click(function()
							{
								Coupon.AddCouponLegAmount
							});

							$(elID + '_BetUEW' + legHash).prop("checked", (leg.allowEachWay && leg.isEachWay ? "checked" : ""));
							$(elID + '_BlockUEW' + legHash).toggle(leg.allowEachWay || leg.isEachWay);
							$(elID + '_BlockDBT' + legHash).toggle(leg.hasDivBoostToken || leg.isDivBoostToken);
							$(elID + '_BlockDBW' + legHash).toggle(leg.hasDivBoostWallet || leg.isDivBoostWallet);

							if(!leg.allowEachWay || leg.currentEWProduct === "EW")
							{
								$(elID + "_UEWProd" + legHash).html(this.ewEWShowName);
							}
							else
							{
								$(elID + "_UEWProd" + legHash).html(this.ewWPShowName);
							}

							UpdateEWDisplay(coup, leg);

							$(elID + '_BetUFB' + legHash).prop("checked", (leg.freeBetLimit > 0 && leg.isFreeBet ? "checked" : ""));
							$(elID + '_BlockUFB' + legHash).toggle(leg.freeBetLimit > 0 || leg.isFreeBet);


							$(elID + '_BetDBT' + legHash).prop("checked", (leg.hasDivBoostToken && leg.isDivBoostToken ? "checked" : ""));
							$(elID + '_BlockDBT' + legHash).toggle(leg.hasDivBoostToken || leg.isDivBoostToken);

							$(elID + '_BetDBW' + legHash).prop("checked", (leg.hasDivBoostWallet && leg.isDivBoostWallet ? "checked" : ""));
							$(elID + '_BlockDBW' + legHash).toggle(leg.hasDivBoostWallet || leg.isDivBoostWallet);

							if(coupon.currentMode !== GWCORE.Coupon.CouponModes.Edit)
							{
								$(elID + '_BetUEW' + legHash).prop("disabled", 'disabled');
								$(elID + '_BetUFB' + legHash).prop("disabled", 'disabled');
								$(elID + '_BetDBT' + legHash).prop("disabled", 'disabled');
								$(elID + '_BetDBW' + legHash).prop("disabled", 'disabled');
							}

							FormatBenefitMessage(elID, leg);
						});

						$(elID + '_RetainLegs').prop("checked", (coup.retainLegs ? "checked" : ""));

						$(elID + '_multiUFB').prop("checked", (coup.isMultiBonusBet ? "checked" : ""));
						$(elID + '_multiAllowUFB').toggle(coup.allowMultiBonusBet || coup.isMultiBonusBet);

						$(elID + '_multiDBT').prop("checked", (coup.isMultiBoostToken ? "checked" : ""));
						$(elID + '_multiAllowDBT').toggle(coup.hasMultiBoostToken || coup.isMultiBoostToken);

						$(elID + '_multiDBW').prop("checked", (coup.isMultiBoostWallet ? "checked" : ""));
						$(elID + '_multiAllowDBW').toggle(coup.hasMultiBoostWallet || coup.isMultiBoostWallet);

						$(elID + '_multiAllowEWBB').toggle(coup.allowMultiBonusBet || coup.isMultiBonusBet || coup.hasMultiBoostToken || coup.isMultiBoostToken || coup.hasMultiBoostWallet || coup.isMultiBoostWallet);

						if(coupon.currentMode !== GWCORE.Coupon.CouponModes.Edit)
						{
							$(elID + '_multiUFB').prop("disabled", 'disabled');
							$(elID + '_multiDBT').prop("disabled", 'disabled');
							$(elID + '_multiDBW').prop("disabled", 'disabled');
						}

						UpdateMultiBenefit(-1, coup.GetCouponID());

						var pOpt = 2;
						while(pOpt <= 9)
						{
							DisplayCouponMultiError(coup.GetCouponID(), pOpt);
							pOpt++;
						}
						DisplayCouponMultiError(coup.GetCouponID(), 0);

						ToggleRaceExoticSels(coup);

						BindDisplay(coup);

						UpdateTotals(coup);

						GWCORE.setAnchorClickAction(coup.GetCouponID());

						Event_CouponRefreshed(coup.GetCouponID());
					}

					//HACK: need to store the changes and replay them each time the coupon displays when no clickedID
					if(clickedID === undefined)
					{
						switch(elID)
						{
							case ("#" + quickCouponID):
								var legID = $("#" + quickCouponID + " .bettingLegs .bettingLeg").data("leghash");
								clickedID = $('*[data-hash="' + legID + '"]')[0];
								break;
						}
					}

					if(clickedID !== undefined)
					{
						switch(elID)
						{
							case ("#" + quickCouponID):
								GWCORE.PositionPopup(clickedID, "#dynamicCoupons", elID);
								break;
						}
					}

					$(elID).toggle(true);
				}
				else
				{
					$(elID).html("ERROR LOADING TEMPLATES");
				}
			}
		}
	}

	//new - no longer needed (handled by UpdateAllBetLegAmounts)
	//Coupon.SetAllSingles = function(couponID)
	//{
	//	var coup = activeCoupons[couponID];

	//	if(coup !== undefined)
	//	{
	//		var value = GWCORE.Utils.GetDecimalOrZero($(coup.GetPageElementID() + "_AllSinglesAmt").val());

	//		if(value > 0)
	//		{
	//			jQuery.each(coup.legs, function(legHash, leg)
	//			{
	//				if(leg.betType.toLowerCase() === "exotic")
	//				{
	//					leg.unitAmount = value / leg.comboCount;
	//					leg.totalAmount = value;
	//					$(coup.GetPageElementID() + "_BetAmt" + legHash).val(leg.unitAmount);
	//					$(coup.GetPageElementID() + "_BetTtl" + legHash).val(leg.totalAmount);
	//				}
	//				else
	//				{
	//					leg.unitAmount = value;
	//					leg.totalAmount = value;
	//					if(leg.isEachWay)
	//						leg.totalAmount = value * 2;
	//					$(coup.GetPageElementID() + "_BetAmt" + legHash).val(leg.unitAmount);
	//				}
	//			});

	//			UpdateTotals(coup);
	//		}
	//	}
	//};

	//new
	Coupon.AmountAddChar = function(couponID, legHash, newChar, whichBtn)
	{
		var coup = activeCoupons[couponID];
		if(whichBtn === undefined)
			whichBtn = "BetAmt";

		if(coup !== undefined)
		{
			var cur = $(coup.GetPageElementID() + "_" + whichBtn + legHash).val();

			if(cur !== undefined && coup.currentMode === GWCORE.Coupon.CouponModes.Edit)
			{
				if(cur === '0')
					cur = '';
				var newval = cur + '' + newChar;

				//coup.legs[legHash].unitAmount += GWCORE.Utils.GetDecimalOrZero(newval);
				$(coup.GetPageElementID() + "_" + whichBtn + legHash).val(newval);
				GWCORE.Utils.delay(function()
				{
					var deci = GWCORE.Utils.GetDecimalOrZero(newval);
					deci = Math.floor(deci * 100) / 100;
					$(coup.GetPageElementID() + "_" + whichBtn + legHash).val(deci);
					GWCORE.Coupon.CouponUpdateLeg(couponID, $(coup.GetPageElementID() + "_" + whichBtn + legHash));
				}, 500);
			}
		}
	};

	//new
	Coupon.AmountClear = function(couponID, legHash)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			if(coup.legs[legHash] !== undefined)
			{
				coup.legs[legHash].unitAmount = 0;
				coup.legs[legHash].totalAmount = 0;
				$(coup.GetPageElementID() + "_BetAmt" + legHash).val("");
				$(coup.GetPageElementID() + "_BetTtl" + legHash).val("");
				$(coup.GetPageElementID() + "_BetFlex" + legHash).val("");
				UpdateTotals(coup);
			}
		}
	};

	//new
	Coupon.AmountAddAmt = function(couponID, legHash, value, whichBtn)
	{
		var coup = activeCoupons[couponID];
		if(whichBtn === undefined)
			whichBtn = "BetAmt";

		if(coup !== undefined)
		{
			if(coup.legs[legHash] !== undefined)
			{
				if(GWCORE.Utils.GetDecimalOrZero(value) > 0)
				{
					if(whichBtn === "BetTtl")
					{
						coup.legs[legHash].totalAmount += value;
						coup.legs[legHash].unitAmount = coup.legs[legHash].totalAmount / coup.legs[legHash].comboCount;
					}
					else
					{
						coup.legs[legHash].unitAmount += value;
						coup.legs[legHash].totalAmount += value * coup.legs[legHash].comboCount;
					}
					$(coup.GetPageElementID() + "_" + whichBtn + legHash).val(coup.legs[legHash].unitAmount);
					UpdateTotals(coup);
				}
			}
		}
	};

	Coupon.ChangeRaceProduct = function(couponID, selectList)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var selVal = $(selectList).val();

			var legHash = GetElementLegHash(selectList);

			var leg = coup.legs[legHash];

			if(leg !== undefined)
			{
				var newProd = leg.availableRaceProds[selVal];

				if(newProd !== undefined)
				{
					leg.betType = newProd.betType;
					leg.special = newProd.special;
					leg.price = newProd.dividend;
					leg.currentRaceProdKey = selVal;
					leg.spShortDesc = newProd.shortDesc;
					leg.spFullDesc = newProd.fullDesc;
					leg.isToteProduct = newProd.isToteProduct;
					leg.priceDisp = newProd.priceDisplay;

					//if(leg.betType !== "Win")
					//{
					leg.isEachWay = false;
					//}

					VerifyCoupon(coup, 0, undefined);
					//DisplayCoupon(coup, '', '');
				}
			}
		}
	};

	function ToggleRaceExoticSels(coup)
	{
		if(GWCORE.Coupon.allowRaceExoticSels)
		{
			var raceExoticEID = -1;
			var raceExoticCount = 0;
			var raceExoticSels = '';
			var raceExoticName = '';

			jQuery.each(coup.legs, function(key, leg)
			{
				if((leg.sportCode === "HORS" || leg.sportCode === "HARN" || leg.sportCode === "GREY")
					&& leg.betType.toLowerCase() !== "exotic"
					&& leg.errCode === 0
					&& (raceExoticEID === -1 || raceExoticEID === leg.eventID)
				)
				{
					raceExoticEID = leg.eventID;
					raceExoticCount++;
					raceExoticSels += "," + leg.runnerNum;
					raceExoticName = leg.eventName;
				}
				else
				{
					raceExoticEID = 0;
				}
			});

			var coupID = coup.GetCouponID();
			if(raceExoticCount >= 2 && raceExoticEID > 0 && raceExoticSels.length > 3)
			{
				if(raceExoticSels.substr(0, 1) === ",")
					raceExoticSels = raceExoticSels.substr(1);

				$('#' + coupID + '_RaceExoticSelRaceName').html(raceExoticName);
				$('#' + coupID + '_RaceExoticSelRaceSels').html(raceExoticSels);

				ShowRaceExoticSel(coupID, 'EX');
				ShowRaceExoticSel(coupID, 'QN');

				if(raceExoticCount >= 3)
				{
					ShowRaceExoticSel(coupID, 'TR');
				}
				else
				{
					HideRaceExoticSel(coupID, 'TR');
				}

				if(raceExoticCount >= 4)
				{
					ShowRaceExoticSel(coupID, 'TR');
				}
				else
				{
					HideRaceExoticSel(coupID, 'FF');
				}

				$('#' + coupID + '_RaceExoticSels').toggle(true);
			}
			else
			{
				HideRaceExoticSel(coupID, 'QN');
				HideRaceExoticSel(coupID, 'EX');
				HideRaceExoticSel(coupID, 'TR');
				HideRaceExoticSel(coupID, 'FF');

				$('#' + coupID + '_RaceExoticSels').toggle(false);
			}
		}
	};

	function ShowRaceExoticSel(coupID, exoticCode)
	{
		$('#' + coupID + '_RaceExoticSel' + exoticCode).css("opacity", "1");
	}
	function HideRaceExoticSel(coupID, exoticCode)
	{
		$('#' + coupID + '_RaceExoticSel' + exoticCode).css("opacity", "0.3");
		//$('#' + coupID + '_RaceExoticSel' + exoticCode).toggle(false);
		$('#' + coupID + '_RaceExoticSel' + exoticCode + '_BetAmt').val(0);
		$('#' + coupID + '_RaceExoticSel' + exoticCode + '_BetTtl').val(0);
	}

	//#######################################
	//##
	//##	Bet Leg Error Handling
	//##
	//#######################################

	function DisplayCouponLegError(couponID, leg)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var showError = false;
			var elID = coup.GetPageElementID();

			var errData = jQuery.extend({}, GWCORE.CouponErrorData);
			errData.couponID = couponID;
			errData.legHash = leg.legHash;
			errData.errMessage = "ERROR";
			errData.acceptMessage = 'Accept';
			errData.acceptAction = "";
			errData.declineMessage = 'Decline';
			errData.declineAction = "GWCORE.Coupon.RemoveLeg('" + couponID + "', '" + leg.legHash + "')";

			if(leg.errCode > 0)
			{
				showError = true;

				switch(leg.errCode)
				{
					case 2: //InvalidBetUnit
						if(leg.betType.toLowerCase() === "exotic")
						{
							var err2unit = Coupon.MIN_EXOTIC_BETUNIT;
							var err2ttl = (Math.ceil(err2unit * leg.comboCount * 100)) / 100; //set total to nearest cent above
							errData.errMessage = "Minimum Unit Stake is " + GWCORE.Utils.FormatMoney(err2unit);
							errData.acceptAction = "GWCORE.Coupon.AcceptTotalSet('" + couponID + "', '" + leg.legHash + "', " + err2ttl + ")";
						}
						else
						{
							var err2amt = Coupon.MIN_NORMAL_BETAMT;
							errData.errMessage = "Minimum Stake is " + GWCORE.Utils.FormatMoney(err2amt);
							errData.acceptAction = "GWCORE.Coupon.AcceptAmountSet('" + couponID + "', '" + leg.legHash + "', " + err2amt + ")";
						}
						break;
					case 3: //InvalidBetIncrement
						var err3ttl = Coupon.MIN_NORMAL_BETUNIT;
						if(leg.betType.toLowerCase() === "exotic")
						{
							err3ttl = Coupon.MIN_EXOTIC_BETAMT1;
							switch(leg.special.toLowerCase())
							{
								case "boxtrifecta":
								case "trifecta":
								case "boxfirstfour":
								case "firstfour":
								case "quadrella":
									err3ttl = Coupon.MIN_EXOTIC_BETAMT2;
									break;
							}
						}
						var err3ttlNew = (Math.floor(leg.totalAmount / err3ttl) * err3ttl); //set total to nearest increment below
						if(err3ttlNew === 0)
							err3ttlNew = err3ttl;

						errData.errMessage = "Minimum bet increment is " + GWCORE.Utils.FormatMoney(err3ttl);
						errData.acceptAction = "GWCORE.Coupon.AcceptTotalSet('" + couponID + "', '" + leg.legHash + "', " + err3ttlNew + ")";
						break;
					case 5: //EachwayNotAvail
						errData.errMessage = leg.errMsg;
						errData.acceptMessage = 'Win Only';
						errData.declineMessage = 'Remove';
						errData.acceptAction = "GWCORE.Coupon.DeclineEachWayChange('" + couponID + "', '" + leg.legHash + "')";
						break;
					case 18: //FreeBetNoMatchVoucher
						if(coup.currentMode !== GWCORE.Coupon.CouponModes.Edit) //err should only be return post submit
						{
							errData.errMessage = leg.errMsg;
							errData.acceptAction = "GWCORE.Coupon.AcceptEditCoupon('" + couponID + "', '" + leg.legHash + "')";
						}
						break;
					case 21: //BonusBet over limit
						errData.errMessage = "Maximum bonus bet voucher amount is " + GWCORE.Utils.FormatMoney(leg.freeBetLimit);
						errData.acceptAction = "GWCORE.Coupon.AcceptAmountSet('" + couponID + "', '" + leg.legHash + "'," + leg.freeBetLimit + ")";
						break;
					case 23: //AmountOverLimit
						errData.errMessage = leg.errMsg;
						if(leg.maxbetLimit > 0)
							errData.acceptAction = "GWCORE.Coupon.AcceptAmountSet('" + couponID + "', '" + leg.legHash + "'," + leg.maxbetLimit + ")";
						break;
					case 27: //DividendChanged
						errData.errMessage = "Price has changed from " + FormatDividend(leg.price, leg.currentEWShortDesc, 10) + " to " + FormatDividend(leg.currentDividend, leg.currentEWShortDesc, 10);
						errData.acceptAction = "GWCORE.Coupon.AcceptPriceChange('" + couponID + "', '" + leg.legHash + "');";

						if(leg.modifier1 != leg.currentMod1 || leg.modifier2 != leg.currentMod2)
						{
							if(leg.betType.substr(1, 4) == "Line")
							{
								errData.errMessage = "Line has changed from " + FormatDividend(leg.price, "-", 10) + "@" + leg.modiferDisp + " to " + FormatDividend(leg.currentDividend, "-", 10) + "@" + leg.currentModiferDisp;
							}
							else if(leg.betType.substr(0, 5) == "Total")
							{
								errData.errMessage = "Total has changed from " + FormatDividend(leg.price, "-", 10) + "@" + leg.modiferDisp + " to " + FormatDividend(leg.currentDividend, "-", 10) + "@" + leg.currentModiferDisp;
								if(leg.betType == "TotalOver" && leg.currentMod1 <= 0 || leg.betType == "TotalUnder" && leg.currentMod2 <= 0)
								{
									errData.errMessage = "Total product is no longer available";
									errData.acceptAction = "";
								}
							}
						}

						break;
					case 35: //UnitTotalMismatch
						if(coup.currentMode === GWCORE.Coupon.CouponModes.Edit)
							showError = false;
						else
							errData.errMessage = leg.errMsg;
						errData.acceptAction = "GWCORE.Coupon.AcceptAmountReset('" + couponID + "', '" + leg.legHash + "');";
						break;
					case 36: //NoBonusWithBoost
						errData.errMessage = "BonusBets cannot be used with " + GWCORE.Coupon.boostName + " Bets";
						errData.acceptAction = "GWCORE.Coupon.AcceptBoostRemoveChange('" + couponID + "', '" + leg.legHash + "');";
						break;
					case 37: //BoostNotValid
						errData.errMessage = GWCORE.Coupon.boostName + " option is no longer valid";
						errData.acceptAction = "GWCORE.Coupon.AcceptBoostRemoveChange('" + couponID + "', '" + leg.legHash + "');";
						break;
					case 38: //BoostOverVoucherLimit
						var limit = 0;
						if(leg.isDivBoostToken)
							limit = leg.availableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostToken].maxBet;
						else if(leg.isDivBoostWallet)
							limit = leg.availableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostWallet].maxBet;

						errData.errMessage = "Maximum " + GWCORE.Coupon.boostName + " bet amount is " + GWCORE.Utils.FormatMoney(limit);
						errData.acceptAction = "GWCORE.Coupon.AcceptAmountSet('" + couponID + "', '" + leg.legHash + "'," + limit + ")";
						errData.declineAction = "GWCORE.Coupon.AcceptBoostRemoveChange('" + couponID + "', '" + leg.legHash + "'," + limit + ")";
						break;
					//case 36: //EachwayChanged
					//	errMessage = "EW Price has changed from " + leg.ewDividend + " to " + leg.currentEWDividend;
					//	acceptAction = "GWCORE.Coupon.AcceptPriceChange('" + couponID + "', '" + legHash + "');";
					//	break;
					case 28: //ModifierChanged
					case 29: //MatchLineChanged
					case 30: //MatchPointsChanged
					case 34: //MatchTotalChanged
						var modifierValid = false;
						switch(leg.errCode)
						{
							case 28: //ModifierChanged
							case 29: //MatchLineChanged
							case 30: //MatchPointsChanged
								errData.errMessage = "Line";
								modifierValid = true;
								break;
							case 34: //MatchTotalChanged
								errData.errMessage = "Total";
								if(leg.betType == "TotalOver" && leg.currentMod1 > 0)
									modifierValid = true;
								else if(leg.betType == "TotalUnder" && leg.currentMod2 > 0)
									modifierValid = true;
								break;
						}
						if(modifierValid)
						{
							errData.errMessage += " has changed from " + leg.modiferDisp + " to " + leg.currentModiferDisp;
							errData.acceptAction = "GWCORE.Coupon.AcceptPriceChange('" + couponID + "', '" + leg.legHash + "')";
						}
						else
						{
							errData.errMessage += " product is no longer available";
							//errData.acceptAction = "GWCORE.Coupon.AcceptPriceChange('" + couponID + "', '" + leg.legHash + "')";
						}
						break;
					case 31: //MatchMarginChanged
						errData.errMessage += "Margin has changed from " + leg.modiferDisp + " to " + leg.currentModiferDisp;
						errData.acceptAction = "GWCORE.Coupon.AcceptPriceChange('" + couponID + "', '" + leg.legHash + "')";
						break;
					case 11: //EventClosed
					case 13: //CouponException
					default:
						errData.errMessage = leg.errMsg; //+ "#" + leg.errCode;
						errData.declineMessage = 'Remove';
						errData.acceptAction = "";
						break;
				}
			}

			if(errData.acceptAction === "")
				errData.declineMessage = 'Remove';

			if(!showError
				&& coup.currentMode !== GWCORE.Coupon.CouponModes.Receipt
				&& leg.isEachWay
				&& (leg.ewProduct !== leg.currentEWProduct
					|| leg.ewDividend > leg.currentEWDividend
				)
				&& leg.currentEWDividend > 0
			)
			{
				if(leg.ewProduct !== leg.currentEWProduct)
				{
					errData.errMessage = "Place Product Has Changed From <b>" + leg.ewFullDesc + "</b> to <b>" + leg.currentEWFullDesc + "</b>";
				}
				else //just price change
				{
					errData.errMessage = "Place Dividend Has Changed From " + FormatDividend((leg.ewIsToteProduct ? 1 : leg.ewDividend), leg.ewProduct, 10) + " to " + FormatDividend((leg.currentEWIsToteProduct ? 1 : leg.currentEWDividend), leg.currentEWProduct, 10);
				}
				errData.acceptAction = "GWCORE.Coupon.AcceptEachWayChange('" + couponID + "', '" + leg.legHash + "');";
				errData.declineAction = "GWCORE.Coupon.DeclineEachWayChange('" + couponID + "', '" + leg.legHash + "')";
				errData.declineMessage = 'Win Only';
				showError = true;
			}

			if(showError)
			{
				var couponContent = FormatErrorMessage(coup, errData);

				if(couponContent !== 'undefined')
				{
					$(elID + "_BlockBetErr" + leg.legHash).html(couponContent);
					$(elID + "_BlockBetErr" + leg.legHash).toggle(true);
					$(elID + "_BlockBetControls" + leg.legHash).toggle(false);
				}
			}
			else
			{
				$(elID + "_BlockBetErr" + leg.legHash).html("EMPTY");
				$(elID + "_BlockBetErr" + leg.legHash).toggle(false);
				$(elID + "_BlockBetControls" + leg.legHash).toggle(true);
			}
		}
	}

	function DisplayCouponMultiError(couponID, parlayOpt) // 0 = full multi
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var showError = false;
			var elID = coup.GetPageElementID();

			var errData = jQuery.extend({}, GWCORE.CouponErrorData);
			errData.couponID = couponID;
			errData.legHash = 'parlay' + parlayOpt;
			errData.errMessage = "ERROR";
			errData.acceptMessage = 'Accept';
			errData.acceptAction = "";
			errData.declineMessage = 'Decline';
			errData.declineAction = "GWCORE.Coupon.ClearMultiAmount('" + couponID + "', " + parlayOpt + ")";

			var pOpt = coup.parlayOpts[parlayOpt];

			if(pOpt !== undefined)
			{
				var parlayBetAmt = 0;
				switch(parlayOpt)
				{
					case 0: parlayBetAmt = coup.multiAmt; break;
					case 2: parlayBetAmt = coup.parlay2; break;
					case 3: parlayBetAmt = coup.parlay3; break;
					case 4: parlayBetAmt = coup.parlay4; break;
					case 5: parlayBetAmt = coup.parlay5; break;
					case 6: parlayBetAmt = coup.parlay6; break;
					case 7: parlayBetAmt = coup.parlay7; break;
					case 8: parlayBetAmt = coup.parlay8; break;
					case 9: parlayBetAmt = coup.parlay9; break;
				}
				if(parlayBetAmt > 0 && GWCORE.Utils.GetIntOrZero(pOpt.errCode) === 0)
				{
					if(parlayBetAmt < Coupon.MIN_NORMAL_BETAMT)
						pOpt.errCode = 355; //InvalidBetAmount
					//else if(((parlayBetAmt - Coupon.MIN_NORMAL_BETAMT) * 100) % (Coupon.MIN_NORMAL_BETUNIT * 100) !== 0) //need *100 cause js only deals in floats
					else if((((parlayBetAmt * 100) - (Coupon.MIN_NORMAL_BETAMT * 100)) % (Coupon.MIN_NORMAL_BETUNIT * 100)) !== 0) //need *100 cause js only deals in floats
						pOpt.errCode = 358; //InvalidBetUnit
				}
			}

			if(pOpt !== undefined && pOpt.errCode > 0)
			{
				showError = true;

				switch(pOpt.errCode)
				{
					case 355: //InvalidBetAmount
						var err355amt = Coupon.MIN_NORMAL_BETAMT;
						errData.errMessage = "Minimum Multi Stake is " + GWCORE.Utils.FormatMoney(err355amt);
						errData.acceptAction = "GWCORE.Coupon.AcceptParlayAmountSet('" + couponID + "', " + parlayOpt + ", " + err355amt + ")";
						break;
					case 358: //InvalidBetUnit
						var err358amt = Coupon.MIN_NORMAL_BETUNIT;
						var err358amtNew = Math.floor(parlayBetAmt / err358amt) * err358amt; //set total to nearest increment below
						err358amtNew = GWCORE.Utils.TruncateDecimal(err358amtNew, 2);
						errData.errMessage = "Minimum Multi Stake Increment is " + GWCORE.Utils.FormatMoney(err358amt);
						errData.acceptAction = "GWCORE.Coupon.AcceptParlayAmountSet('" + couponID + "', " + parlayOpt + ", " + err358amtNew + ")";
						break;
					case 18: //FreeBetNoMatchVoucher
						if(coup.currentMode !== GWCORE.Coupon.CouponModes.Edit) //err should only be return post submit
						{
							errData.errMessage = leg.errMsg;
							errData.acceptAction = "GWCORE.Coupon.AcceptEditCoupon('" + couponID + "', 'parlay0')";
							errData.declineAction = "GWCORE.Coupon.ClearMultiBenefits('" + couponID + "', " + parlayOpt + ")";
						}
						break;
					case 21: //BonusBet over limit
						errData.errMessage = "Maximum bonus bet voucher amount is " + GWCORE.Utils.FormatMoney(coup.multiBonusBetLimit);
						errData.acceptAction = "GWCORE.Coupon.AcceptParlayAmountSet('" + couponID + "'," + parlayOpt + "," + coup.multiBonusBetLimit + ")";
						errData.declineAction = "GWCORE.Coupon.ClearMultiBenefits('" + couponID + "', " + parlayOpt + ")";
						break;
					//case 23: //AmountOverLimit
					//	errData.errMessage = leg.errMsg;
					//	if(leg.maxbetLimit > 0)
					//		errData.acceptAction = "GWCORE.Coupon.AcceptAmountSet('" + couponID + "', '" + leg.legHash + "'," + leg.maxbetLimit + ")";
					//	break;
					//case 27: //DividendChanged
					//	errData.errMessage = "Price has changed from " + FormatDividend(leg.price, leg.currentEWShortDesc, 10) + " to " + FormatDividend(leg.currentDividend, leg.currentEWShortDesc, 10);
					//	errData.acceptAction = "GWCORE.Coupon.AcceptPriceChange('" + couponID + "', '" + leg.legHash + "');";
					//	break;
					//case 35: //UnitTotalMismatch
					//	if(coup.currentMode === GWCORE.Coupon.CouponModes.Edit)
					//		showError = false;
					//	else
					//		errData.errMessage = leg.errMsg;
					//	errData.acceptAction = "GWCORE.Coupon.AcceptAmountReset('" + couponID + "', '" + leg.legHash + "');";
					//	break;
					//case 36: //NoBonusWithBoost
					//	errData.errMessage = "BonusBets cannot be used with " + GWCORE.Coupon.boostName + " Bets";
					//	errData.acceptAction = "GWCORE.Coupon.AcceptBoostRemoveChange('" + couponID + "', '" + leg.legHash + "');";
					//	break;
					//case 37: //BoostNotValid
					//	errData.errMessage = GWCORE.Coupon.boostName + " option is no longer valid";
					//	errData.acceptAction = "GWCORE.Coupon.AcceptBoostRemoveChange('" + couponID + "', '" + leg.legHash + "');";
					//	break;
					case 314: //ErrCodes.COUPON_BONUSBETINVALID
						errData.errMessage = "Bonus Bet no longer available";
						errData.declineAction = "GWCORE.Coupon.ClearMultiBenefits('" + couponID + "', " + parlayOpt + ")";
						break;
					case 357: //ErrCodes.COUPON_DIVBOOSTINVALID
						var limit = 0;
						if(coup.isMultiBoostToken)
							limit = coup.multiAvailableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostToken].maxBet;
						else if(coup.isMultiBoostWallet)
							limit = coup.multiAvailableDivBoosts[GWCORE.Coupon.BenefitModes.DivBoostWallet].maxBet;
						if(limit > 0)
						{
							errData.errMessage = "Maximum " + GWCORE.Coupon.boostName + " bet amount is " + GWCORE.Utils.FormatMoney(limit);
							errData.acceptAction = "GWCORE.Coupon.AcceptParlayAmountSet('" + couponID + "'," + parlayOpt + "," + limit + ")";
							errData.declineAction = "GWCORE.Coupon.ClearMultiBenefits('" + couponID + "', " + parlayOpt + ")";
						}
						break;

					case 300: //COUPON_EXCEPTION
						errData.errMessage = "Multibet No Longer Valid. Please Review All Items in Betslip.";
						break;

					////case 36: //EachwayChanged
					////	errMessage = "EW Price has changed from " + leg.ewDividend + " to " + leg.currentEWDividend;
					////	acceptAction = "GWCORE.Coupon.AcceptPriceChange('" + couponID + "', '" + legHash + "');";
					////	break;
					//case 28: //ModifierChanged
					//case 29: //MatchLineChanged
					//case 30: //MatchPointsChanged
					//case 34: //MatchTotalChanged
					//	switch(leg.errCode)
					//	{
					//		case 28: //ModifierChanged
					//		case 29: //MatchLineChanged
					//		case 30: //MatchPointsChanged
					//			errData.errMessage = "Line Amount";
					//			break;
					//		case 34: //MatchTotalChanged
					//			errData.errMessage = "Total";
					//			break;
					//	}
					//	errData.errMessage += " has changed from " + leg.modiferDisp + " to " + leg.currentModiferDisp;
					//	errData.acceptAction = "GWCORE.Coupon.AcceptPriceChange('" + couponID + "', '" + leg.legHash + "')";
					//	break;
					//case 31: //MatchMarginChanged
					//	errData.errMessage += "Margin has changed from " + leg.modiferDisp + " to " + leg.currentModiferDisp;
					//	errData.acceptAction = "GWCORE.Coupon.AcceptPriceChange('" + couponID + "', '" + leg.legHash + "')";
					//	break;
					//case 11: //EventClosed
					//case 13: //CouponException
					default:
						errData.errMessage = pOpt.errMsg; //+ "#" + pOpt.errCode;
						errData.declineMessage = 'Remove';
						errData.acceptAction = "";
						break;
				}
			}

			if(errData.acceptAction === "")
				errData.declineMessage = 'Remove';

			if(showError)
			{
				var couponContent = FormatErrorMessage(coup, errData);

				if(couponContent !== 'undefined')
				{
					if(parlayOpt === 0)
					{
						$(elID + "_multi-AMT").prop("readonly", true);
						$(elID + "_multi-AMT").prop("background-color", "transparent");
					}
					else
					{
						$(elID + "_parlay" + parlayOpt + "-AMT").prop("readonly", true);
						$(elID + "_parlay" + parlayOpt + "-AMT").prop("background-color", "transparent");
					}
					$(elID + "_ParlayErr" + parlayOpt).html(couponContent);
					$(elID + "_ParlayErr" + parlayOpt).toggle(true);
					$(elID + "_ParlayControls" + parlayOpt).toggle(false);
				}
			}
			else
			{
				if(parlayOpt === 0)
				{
					$(elID + "_multi-AMT").prop("readonly", false);
					$(elID + "_multi-AMT").prop("background-color", "inherit");
				}
				else
				{
					$(elID + "_parlay" + parlayOpt + "-AMT").prop("readonly", false);
					$(elID + "_parlay" + parlayOpt + "-AMT").prop("background-color", "inherit");
				}
				$(elID + "_ParlayErr" + parlayOpt).html("EMPTY");
				$(elID + "_ParlayErr" + parlayOpt).toggle(false);
				$(elID + "_ParlayControls" + parlayOpt).toggle(true);
			}
		}
	}

	function DisplayCouponGlobalError(couponID, errCode, errMessage)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var showError = false;
			var elID = coup.GetPageElementID();

			var errData = jQuery.extend({}, GWCORE.CouponErrorData);
			errData.couponID = couponID;
			errData.legHash = -1;
			errData.errMessage = "ERROR";
			errData.acceptMessage = 'Accept';
			errData.acceptAction = "";
			errData.declineMessage = 'Clear';
			errData.declineAction = "GWCORE.Coupon.RemoveAllLegs('" + couponID + "')";


			$(elID + "_CouponError").html(errMessage);
			$(elID + "_CouponError").toggle(true);
		}
	}

	function FormatErrorMessage(coup, errData)
	{
		var couponContent = undefined;

		var couponTemplateHtml = GWCORE.Utils.FetchTemplate(coup.GetErrorTemplate());

		if(couponTemplateHtml !== 'undefined')
		{
			var couponTemplate = _.template(couponTemplateHtml);
			couponContent = couponTemplate({errData: errData});
		}

		return couponContent;
	}

	//new
	function ClearLegError(coup, leg)
	{
		leg.errCode = 0;
		leg.errMsg = "";

		VerifyCoupon(coup, 0, undefined);
		//DisplayCoupon(coup);
	}

	function IsEmptyString(s)
	{
		if(s === undefined || s === null || s.length === 0)
			return true;
		else
			return false;
	}
	//orig
	Coupon.AcceptPriceChange = function(couponID, legHash)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var leg = coup.legs[legHash];

			if(leg !== undefined)
			{
				leg.price = leg.currentDividend;
				leg.modifier1 = leg.currentMod1;
				leg.modifier2 = leg.currentMod2;
				if(!IsEmptyString(leg.currentModiferDisp))
				{
					leg.modiferDisp = leg.currentModiferDisp;
				}
				if(!IsEmptyString(leg.currentOutcome))
				{
					leg.outcome = leg.currentOutcome;
				}

				leg.priceDisp = MakePriceDisplay(leg);

				ClearLegError(coup, leg);

				_.defer(function()
				{
					try
					{
						$(GWCORE).trigger($.Event("PriceChangeAccepted.Coupon.GWCORE", {
							couponRootElement: couponID,
							time: new Date()
						}));
					}
					catch(err)
					{
						console.error(err.message);
					}
				});
			}
		}
	};

	function SetEWValuesToCurrent(coup, leg)
	{
		leg.ewProduct = leg.currentEWProduct;
		leg.ewDividend = leg.currentEWDividend;
		leg.ewShortDesc = leg.currentEWShortDesc;
		leg.ewFullDesc = leg.currentEWFullDesc;
		leg.ewIsToteProduct = leg.currentEWIsToteProduct;
		UpdateEWDisplay(coup, leg);
	}

	//new
	Coupon.AcceptEachWayChange = function(couponID, legHash)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var leg = coup.legs[legHash];

			if(leg !== undefined)
			{
				SetEWValuesToCurrent(coup, leg);

				ClearLegError(coup, leg);

				_.defer(function()
				{
					try
					{
						$(GWCORE).trigger($.Event("EachWayChangeAccepted.Coupon.GWCORE", {
							couponRootElement: couponID,
							time: new Date()
						}));
					}
					catch(err)
					{
						console.error(err.message);
					}
				});
			}
		}
	};

	Coupon.DeclineEachWayChange = function(couponID, legHash)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var leg = coup.legs[legHash];

			if(leg !== undefined)
			{
				SetEWValuesToCurrent(coup, leg);
				leg.isEachWay = false;
				leg.totalAmount = leg.unitAmount;
				ClearLegError(coup, leg);
			}
		}
	};

	//orig
	Coupon.AcceptAmountReset = function(couponID, legHash)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var leg = coup.legs[legHash];
			if(leg !== undefined)
			{
				leg.unitAmount = 0;
				leg.totalAmount = 0;
				leg.priceDisp = MakePriceDisplay(leg);

				ClearLegError(coup, leg);
			}
		}
	};

	//orig
	Coupon.AcceptAmountSet = function(couponID, legHash, forceAmount)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var leg = coup.legs[legHash];
			if(leg !== undefined)
			{
				leg.unitAmount = forceAmount;

				if(leg.isEachWay)
					leg.totalAmount = forceAmount * 2;
				else
					leg.totalAmount = forceAmount * leg.comboCount;

				leg.priceDisp = MakePriceDisplay(leg);
				ClearLegError(coup, leg);
			}
		}
	};

	//orig
	Coupon.AcceptTotalSet = function(couponID, legHash, forceAmount)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var leg = coup.legs[legHash];
			if(leg !== undefined)
			{
				leg.unitAmount = forceAmount / leg.comboCount;
				leg.totalAmount = forceAmount;
				leg.priceDisp = MakePriceDisplay(leg);
				ClearLegError(coup, leg);
			}
		}
	};

	//orig
	Coupon.AcceptRemoveBonusBet = function(couponID, legHash)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var leg = coup.legs[legHash];
			if(leg !== undefined)
			{
				leg.isFreeBet = false;
				ClearLegError(coup, leg);
			}
		}
	};

	//orig
	Coupon.AcceptEditCoupon = function(couponID, legHash)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			coup.currentMode = GWCORE.Coupon.CouponModes.Edit;
			var leg = coup.legs[legHash];
			if(leg !== undefined)
			{
				ClearLegError(coup, leg);
			}
			else
			{
				VerifyCoupon(coup, 0, undefined);
			}
		}
	};

	//orig
	Coupon.AcceptBoostRemoveChange = function(couponID, legHash)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			var leg = coup.legs[legHash];
			if(leg !== undefined)
			{
				leg.isFreeBet = false;
				leg.isDivBoostToken = false;
				leg.isDivBoostWallet = false;
				ClearLegError(coup, leg);
			}
		}
	};

	//Multi/Parlay Error Handlers
	Coupon.ClearMultiAmount = function(couponID, parlayID)
	{
		this.AcceptParlayAmountSet(couponID, parlayID, 0);
	};

	Coupon.ClearMultiBenefits = function(couponID, parlayID)
	{
		//this.AcceptParlayAmountSet(couponID, parlayID, 0);
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			switch(parlayID)
			{
				case 0:
					coup.isMultiBonusBet = false;
					coup.isMultiBoostToken = false;
					coup.isMultiBoostWallet = false;
					break;
				//other cases not relevant
			}
			VerifyCoupon(coup, 0, undefined);
		}
	};

	Coupon.AcceptParlayAmountSet = function(couponID, parlayID, forceAmount)
	{
		var coup = activeCoupons[couponID];

		if(coup !== undefined)
		{
			switch(parlayID)
			{
				case 0:
					coup.multiAmt = forceAmount;
					if(forceAmount <= 0)
					{
						coup.isMultiBonusBet = false;
						coup.isMultiBoostToken = false;
						coup.isMultiBoostWallet = false;
					}
					break;
				case 2: coup.parlay2 = forceAmount; break;
				case 3: coup.parlay3 = forceAmount; break;
				case 4: coup.parlay4 = forceAmount; break;
				case 5: coup.parlay5 = forceAmount; break;
				case 6: coup.parlay6 = forceAmount; break;
				case 7: coup.parlay7 = forceAmount; break;
				case 8: coup.parlay8 = forceAmount; break;
				case 9: coup.parlay9 = forceAmount; break;
			}
			//TODO: if forceAmount > 0 then should just clear error rather than a full verify.....
			VerifyCoupon(coup, 0, undefined);
		}
	};


	//#######\\Bet Leg Error Handling

	//new
	/// store the coupon
	function UpdateCouponSession()
	{
		_.defer(function()
		{
			var storeData = JSON.stringify(activeCoupons);
			sessionStorage.setItem("activeCoupons", storeData); //activeCoupons);
		});
	}

	Coupon.LoadCouponSession = function(createMainIfNone)
	{
		_.defer(function()
		{
			try
			{
				var storeData = sessionStorage.getItem("activeCoupons");
				var haveLoadedMain = false;

				if(storeData !== undefined && storeData !== null)
				{
					var activeData = JSON.parse(storeData);

					jQuery.each(activeData, function(couponID, storecoup)
					{
						var coup = jQuery.extend({}, GWCORE.CouponStore);
						coup.Initialise(couponID);

						coup.currentMode = storecoup["currentMode"];
						coup.couponID = storecoup["couponID"];
						coup.trackingCode = storecoup["trackingCode"];
						coup.legHashes = storecoup["legHashes"];
						coup.legs = storecoup["legs"];
						coup.isSubmitting = false; //storecoup["isSubmitting"];

						coup.allowMultiBet = storecoup["allowMultiBet"];
						coup.allowMultiBonusBet = storecoup["allowMultiBonusBet"];
						coup.multiBonusBetLimit = storecoup["multiBonusBetLimit"];
						coup.multiAvailableDivBoosts = storecoup["multiAvailableDivBoosts"];
						coup.hasMultiBoostToken = storecoup["hasMultiBoostToken"];
						coup.hasMultiBoostWallet = storecoup["hasMultiBoostWallet"];
						coup.multiErrMsg = storecoup["multiErrMsg"];
						coup.multiDivi = storecoup["multiDivi"];
						coup.multiMaxDivi = storecoup["multiMaxDivi"];

						coup.retainLegs = storecoup["retainLegs"];

						coup.totalAmount = storecoup["totalAmount"];
						coup.parlay2 = storecoup["parlay2"];
						coup.parlay3 = storecoup["parlay3"];
						coup.parlay4 = storecoup["parlay4"];
						coup.parlay5 = storecoup["parlay5"];
						coup.parlay6 = storecoup["parlay6"];
						coup.parlay7 = storecoup["parlay7"];
						coup.parlay8 = storecoup["parlay8"];
						coup.parlay9 = storecoup["parlay9"];
						coup.multiAmt = storecoup["multiAmt"];
						coup.isMultiBonusBet = storecoup["isMultiBonusBet"];
						coup.isMultiBoostToken = storecoup["isMultiBoostToken"];
						coup.isMultiBoostWallet = storecoup["isMultiBoostWallet"];
						coup.hasMultiBet = storecoup["hasMultiBet"];
						coup.parlayOpts = storecoup["parlayOpts"];

						coup.ewIsToteProduct = storecoup["ewIsToteProduct"];
						coup.ewProduct = storecoup["ewProduct"];
						coup.ewDesc = storecoup["ewDesc"];
						coup.ewDividend = storecoup["ewDividend"];
						coup.ewDisp = storecoup["ewDisp"];

						activeCoupons[couponID] = coup;

						currentLegHashes[couponID] = coup.GetLegHashes();
						currentLegCounts[couponID] = coup.LegCount();

						VerifyCoupon(coup, 0, undefined);

						Event_CouponLoaded(coup.couponID);

						Event_CouponLegCountUpdated(coup);

						if(coup.couponID === mainCouponID)
						{
							haveLoadedMain = true;
						}
					});
				}

				if(createMainIfNone && !haveLoadedMain)
				{
					CreateBlankCoupon(mainCouponID);
					var coup = activeCoupons[mainCouponID];
					DisplayCoupon(coup);
					Event_CouponLoaded(mainCouponID);
					haveLoadedMain = true;
				}

				//if(haveLoadedMain && (location.host.indexOf("localhost") >= 0 || location.host.indexOf("stagewww") >= 0 || location.host.indexOf("stagem") >= 0))
				//{
				//	DoPreFlightChecks(mainCouponID);
				//}
			}
			catch(err)
			{
				activeCoupons = {}; //Coupon
				currentLegHashes = [];
				currentLegCounts = {};
				mostRecentTransactionIDs = [];
				pageTransactionIDs = [];
			}
		});
	};

	//Obselete - ALL systems MUST have the same template now
	//function DoPreFlightChecks(couponID)
	//{
	//	var templateErrors = "";
	//	var coup = activeCoupons[couponID];
	//	try
	//	{
	//		var mainTemplateHtml = GWCORE.Utils.FetchTemplate(coup.GetTemplate());

	//		var mainTemplateChecks = [

	//			// single legs
	//			"coupon.GetElementID('BlockBetErr', legHash)",
	//			"coupon.GetElementID('BlockBetControls', legHash)",
	//			"coupon.GetElementID('BlockBetAmt', legHash)",
	//			"coupon.GetElementID('ShowDivi', legHash)",
	//			"coupon.GetElementID('ShowEWProd', legHash)",
	//			"coupon.GetElementID('ShowEWDivi', legHash)",
	//			"coupon.GetElementID('BetAmt', legHash)",
	//			"coupon.GetElementID('BetTtl', legHash)",

	//			"coupon.GetElementID('BlockUEW', legHash)",
	//			"coupon.GetElementID('BetUEW', legHash)",

	//			"coupon.GetElementID('parlay' + i + '-DIV')",
	//			"coupon.GetElementID('parlay' + i + '-AMT')",
	//			"coupon.GetElementID('parlay' + i + '-TTL')",
	//			"coupon.GetElementID('parlay' + i + '-PAY')",
	//			"coupon.GetElementID('ParlayErr' + i)",
	//			"coupon.GetElementID('ParlayErr0')",

	//			"coupon.GetElementID('multiSection')",
	//			"coupon.GetElementID('multi-DIV')",
	//			"coupon.GetElementID('multi-AMT')",
	//			"coupon.GetElementID('multi-TTL')",
	//			"coupon.GetElementID('multi-PAY')",

	//			"coupon.GetElementID('couponTotal')",
	//			"coupon.GetElementID('couponPayout')",


	//			//'#' + coup.GetCouponID() + '_AllSinglesAmt',
	//			"coupon.GetElementID('CouponError')", //'#' + coup.GetCouponID() + '_CouponError',
	//			"coupon.GetElementID('CouponButtons')",
	//			"coupon.GetElementID('CouponConfirm')",

	//			[ //bonusGroup
	//				"#SINGLE BONUS GROUP",
	//				"coupon.GetElementID('BlockUFB', legHash)",
	//				"coupon.GetElementID('BetUFB', legHash)",
	//				"coupon.GetElementID('BonusBetMsg', legHash)",
	//			],

	//			[ //boostGroup
	//				"#SINGLE BOOST GROUP",
	//				"coupon.GetElementID('BoostDivi', legHash)",
	//				"coupon.GetElementID('BlockDBT', legHash)",
	//				"coupon.GetElementID('BetDBT', legHash)",
	//				"coupon.GetElementID('BlockDBW', legHash)",
	//				"coupon.GetElementID('BetDBW', legHash)",
	//				"coupon.GetElementID('DivBoostMsg', legHash)",
	//			],

	//			[ //multi bonus group
	//				"#MULTIBONUS GROUP",
	//				"coupon.GetElementID('_multiUFB')",
	//				"coupon.GetElementID('_MultiBonusBetMsg')",
	//			],

	//			[ //multi boost group
	//				"#MULTIBOOST GROUP",
	//				"coupon.GetElementID('multiAllowUFB')",
	//				"coupon.GetElementID('multiUFB')",
	//				"coupon.GetElementID('multiAllowDBT')",
	//				"coupon.GetElementID('multiDBT')",
	//				"coupon.GetElementID('multiAllowDBW')",
	//				"coupon.GetElementID('multiDBW')",
	//				"coupon.GetElementID('multi-DIVBOOST')",
	//				"coupon.GetElementID('MultiDivBoostMsg')",
	//			]
	//		];

	//		jQuery.each(mainTemplateChecks, function(key, value)
	//		{
	//			if(jQuery.isArray(value))
	//			{
	//				var foundOne = false;
	//				var arayTemplateErrors = "";
	//				var arayTemplateHeader = "";
	//				jQuery.each(value, function(araykey, arayvalue)
	//				{
	//					if(arayvalue.indexOf('#') === 0)
	//					{
	//						arayTemplateHeader += "<hr>" + arayvalue + " ERROR<br>";
	//					}
	//					else if(mainTemplateHtml.indexOf(arayvalue) < 0)
	//					{
	//						arayTemplateErrors += arayvalue + " not found<br/>";
	//						//templateErrors += "NOT FOUND: " + arayvalue + "<br/>";
	//					}
	//					else
	//					{
	//						foundOne = true;
	//						//templateErrors += "FOUND: " + arayvalue + "<br/>";
	//					}
	//				});
	//				if(foundOne && arayTemplateErrors.length > 0)
	//				{
	//					templateErrors += arayTemplateHeader + arayTemplateErrors;
	//				}
	//			}
	//			else if(mainTemplateHtml.indexOf(value) < 0)
	//			{
	//				templateErrors += value + " not found<br/>";
	//			}
	//		});

	//		var errorTemplateHtml = GWCORE.Utils.FetchTemplate(coup.GetErrorTemplate());
	//	}
	//	catch(err)
	//	{
	//		templateErrors += "EXCEPTION: " + err;
	//	}

	//	try
	//	{
	//		if(templateErrors.length > 0)
	//		{
	//			$("<div id='#" + couponID + "PreFlight' class='staticMessage errorText'>" + templateErrors + "</div>").insertBefore('#' + coup.GetCouponID());
	//		}
	//	}
	//	catch(err)
	//	{
	//		console.log("ERROR in Coupon.PreFlightChecks and unable to add messages: EXCEPTION: " + err);
	//	}
	//}

	//####### Event Triggers
	function Event_CouponLoaded(couponID)
	{
		_.defer(function()
		{
			try
			{
				$(GWCORE).trigger($.Event("CouponLoaded.Coupon.GWCORE", {
					couponID: couponID
				}));
			}
			catch(err)
			{
				console.error(err.message);
			}
		});
	}
	function Event_CouponRefreshed(couponID)
	{
		_.defer(function()
		{
			try
			{
				$(GWCORE).trigger($.Event("CouponRefreshed.Coupon.GWCORE", {
					couponID: couponID
				}));
			}
			catch(err)
			{
				console.error(err.message);
			}
		});
	}
	function Event_CouponCleared(couponID)
	{
		_.defer(function()
		{
			try
			{
				$(GWCORE).trigger($.Event("CouponCleared.Coupon.GWCORE", {
					couponID: couponID
				}));
			}
			catch(err)
			{
				console.error(err.message);
			}
		});
	}
	function Event_LegAdded(couponID, legHash, clickedElement)
	{
		_.defer(function()
		{
			try
			{
				$(GWCORE).trigger($.Event("LegAdded.Coupon.GWCORE", {
					couponID: couponID,
					legHash: legHash,
					clickedElement: clickedElement
				}));
			}
			catch(err)
			{
				console.error(err.message);
			}
		});
	}
	function Event_LegRemoved(couponID, legHash)
	{
		_.defer(function()
		{
			try
			{
				$(GWCORE).trigger($.Event("LegRemoved.Coupon.GWCORE", {
					couponID: couponID,
					legHash: legHash
				}));
			}
			catch(err)
			{
				console.error(err.message);
			}
		});
	}
	function Event_CouponAmountFocused(couponID, inputID, legHash)
	{
		_.defer(function()
		{
			try
			{
				$(GWCORE).trigger($.Event("CouponAmountFocused.Coupon.GWCORE", {
					couponID: couponID,
					inputID: inputID,
					legHash: legHash
				}));
			}
			catch(err)
			{
				console.error(err.message);
			}
		});
	}
	function Event_CouponAmountUnfocused(couponID, inputID, legHash)
	{
		_.defer(function()
		{
			try
			{
				$(GWCORE).trigger($.Event("CouponAmountUnfocused.Coupon.GWCORE", {
					couponID: couponID,
					inputID: inputID,
					legHash: legHash
				}));
			}
			catch(err)
			{
				console.error(err.message);
			}
		});
	}

	function Event_CouponLegCountUpdated(coup)
	{
		_.defer(function()
		{
			try
			{
				$(GWCORE).trigger($.Event("CouponLegCountUpdated.Coupon.GWCORE", {
					couponLegCount: (coup !== undefined ? coup.LegCount() : 0),
					couponID: (coup !== undefined ? coup.couponID : undefined),
					isPrimary: (coup !== undefined ? Coupon.isPrimaryCoupon(coup) : undefined),
				}));
			}
			catch(err)
			{
				console.error(err.message);
			}
		});
	}

	function Event_CouponHasSubmitted(coup, legsData)
	{
		_.defer(function()
		{
			try
			{
				$(GWCORE).trigger($.Event("CouponHasSubmitted.Coupon.GWCORE", {
					couponLegCount: coup.LegCount(),
					couponID: coup.couponID,
					legs: legsData
				}));
			}
			catch(err)
			{
				console.error(err.message);
			}
		});
	}
	//#######\\Event Triggers


	Coupon.DEBUG_TestCouponAlert = function(count, useBetslip)
	{
		//var legsData = { "legs": { "32115": { "couponLegID": 0, "ticketNumber": 32115, "submittedAt": "0001-01-01T00:00:00", "status": 2, "sportCode": "OTHS", "navSport": "DEMO Test", "description": "Xyz Match", "teamA": "AAAAzAAAAzAAAAz AAAAz AAAAz", "teamB": "BBBBz", "outcome": "AAAAzAAAAzAAAAz AAAAz AAAAz", "type": "", "reason": "", "dividend": 1.02, "balEffect": 1, "unitAmount": 1, "totalAmount": 1, "isEachWay": false, "ewShortDesc": "", "ewFullDesc": "", "ewDividend": 0, "ewDisp": "", "isFreeBet": false, "isBetApproval": false, "requestedDividend": 1.02, "betType": "AWin", "boostAmount": 0, "selections": "", "priceDisp": "1.02", "showUntil": "2050-01-01T00:00:00" } } };
		//var counts = { "total": 2, "approved": 0, "processing": 2, "rejected": 0 };
		//var newTransIDs = [];
		//newTransIDs.push(32115);
		//Coupon.ProcessNewTransactionIDs(newTransIDs);
		//GWCORE.Alerts.ProcessAlerts(legsData, counts);
		//GWCORE.ForceHeartbeat();



		if(count === undefined)
			count = 1;
		if(useBetslip === undefined)
			useBetslip = true;

		var alertData = {};

		var legsData = {};
		legsData["legs"] = {};
		var newTransIDs = [];
		for(let x = 0; x < count; x++)
		{
			var legID = (useBetslip ? 1000 : 2000) + x;
			var ticket = "" + legID;

			switch(x)
			{
				case 2:
					legsData["legs"][legID] = {"couponLegID": 0, "ticketNumber": ticket, "submittedAt": "0001-01-01T00:00:00", "status": 2, "sportCode": "HORS", "navSport": "Horse Racing", "description": "Racing Exotic Race", "teamA": "", "teamB": "", "outcome": "Trifecta", "type": "", "reason": "", "dividend": 1, "balEffect": 1, "unitAmount": 1, "totalAmount": 12, "isEachWay": false, "ewShortDesc": "", "ewFullDesc": "", "ewDividend": 0, "ewDisp": "", "isFreeBet": false, "isBetApproval": false, "requestedDividend": 1.02, "betType": "Exotic", "boostAmount": 0, "selections": "1,2/3,4/5,6,7", "runnerName": "1,2/3,4/5,6,7", "priceDisp": "1.02", "showUntil": "2050-01-01T00:00:00"};
					break;
				case 3:
					legsData["legs"][legID] = {"couponLegID": 0, "ticketNumber": ticket, "submittedAt": "0001-01-01T00:00:00", "status": 2, "sportCode": "OTHS", "navSport": "DEMO Test", "description": "Xyz Match", "teamA": "AAAAzAAAAzAAAAz AAAAz AAAAz", "teamB": "BBBBz", "outcome": "AAAAzAAAAzAAAAz AAAAz AAAAz", "type": "", "reason": "", "dividend": 1.02, "balEffect": 1, "unitAmount": 1, "totalAmount": 1, "isEachWay": false, "ewShortDesc": "", "ewFullDesc": "", "ewDividend": 0, "ewDisp": "", "isFreeBet": false, "isBetApproval": false, "requestedDividend": 1.02, "betType": "AWin", "boostAmount": 115, "selections": "", "priceDisp": "1.02", "showUntil": "2050-01-01T00:00:00"};
					break;
				case 4:
					legsData["legs"][legID] = {"couponLegID": 0, "ticketNumber": ticket, "submittedAt": "0001-01-01T00:00:00", "status": 2, "sportCode": "HORS", "navSport": "Thoroughbred Racing", "description": "Hastings Race 6", "outcome": "1. Lincoln Raider", "type": "", "reason": "", "dividend": "3.70", "balEffect": 2, "unitAmount": 2, "totalAmount": 2, "isEachWay": true, "ewShortDesc": "FPlc", "ewFullDesc": "Fixed Place", "ewDividend": 1.6, "ewDisp": "1.60", "isFreeBet": false, "isBetApproval": false, "requestedDividend": "3.70", "specialShort": "FWin", "betType": "EachWay", "boostAmount": 0, "selections": "", "priceDisp": "3.70", "showUntil": "2050-01-01T00:00:00"};
					break;
				case 5:
					legsData["legs"][legID] = {"couponLegID": 0, "ticketNumber": ticket, "submittedAt": "0001-01-01T00:00:00", "status": 2, "sportCode": "HORS", "navSport": "Thoroughbred Racing", "description": "Hastings Race 6", "outcome": "1. Lincoln Raider", "type": "", "reason": "", "dividend": "Best of The Best", "balEffect": 2, "unitAmount": 2, "totalAmount": 2, "isEachWay": true, "ewShortDesc": "BP3", "ewFullDesc": "Best of 3 Totes (Place)", "ewDividend": 2.5, "ewDisp": "BP3", "isFreeBet": false, "isBetApproval": false, "requestedDividend": "1.00", "specialShort": "BoB", "betType": "EachWay", "boostAmount": 0, "selections": "", "priceDisp": "BoB", "showUntil": "2050-01-01T00:00:00"};
					break;
				default:
					legsData["legs"][legID] = {"couponLegID": 0, "ticketNumber": ticket, "submittedAt": "0001-01-01T00:00:00", "status": 2, "sportCode": "OTHS", "navSport": "DEMO Test", "description": "Xyz Match", "teamA": "AAAAzAAAAzAAAAz AAAAz AAAAz", "teamB": "BBBBz", "outcome": "AAAAzAAAAzAAAAz AAAAz AAAAz", "type": "", "reason": "", "dividend": 1.02, "balEffect": 1, "unitAmount": 1, "totalAmount": 1, "isEachWay": false, "ewShortDesc": "", "ewFullDesc": "", "ewDividend": 0, "ewDisp": "", "isFreeBet": false, "isBetApproval": false, "requestedDividend": 1.02, "betType": "AWin", "boostAmount": 0, "selections": "", "priceDisp": "1.02", "showUntil": "2050-01-01T00:00:00"};
					break;
			}



			if(useBetslip)
				newTransIDs.push(legID);
		}
		var counts = {"total": count, "approved": 0, "processing": count, "rejected": 0};
		Coupon.ProcessNewTransactionIDs(newTransIDs);
		GWCORE.Alerts.ProcessAlerts(legsData, counts);
		GWCORE.ForceHeartbeat();
	};

	return Coupon;
}(GWCORE, jQuery, _));

GWCORE.CouponErrorData = (function(GWCORE, $, _)
{
	var CouponErrorData = {};

	CouponErrorData.couponID = undefined;
	CouponErrorData.legHash = undefined;
	CouponErrorData.errMessage = undefined;
	CouponErrorData.acceptMessage = undefined;
	CouponErrorData.acceptAction = undefined;
	CouponErrorData.declineMessage = undefined;
	CouponErrorData.declineAction = undefined;


	return CouponErrorData;
}(GWCORE, jQuery, _));

GWCORE.CouponStore = (function(GWCORE, $, _)
{
	var CouponStore = {};

	// private variables
	//should not be any as this is just a data "struct"
	//function should be simple data manipulation - no UI

	// public variables
	CouponStore.currentMode = GWCORE.Coupon.CouponModes.Edit;
	CouponStore.couponID = undefined;
	CouponStore.forceSingleItem = false;
	CouponStore.trackingCode = undefined;
	CouponStore.legs = {}; //Dictionary of (legHash, CouponStoreLeg)
	CouponStore.isSubmitting;

	CouponStore.parlayOpts = {}; //Dictionary of (parlayID, CouponStoreParlay) where parlayID = 0 is the full multi --NB: only used for error handling at the moment
	CouponStore.allowMultiBet = false;
	CouponStore.allowMultiBonusBet = false;
	CouponStore.multiBonusBetLimit = 0;
	CouponStore.multiAvailableDivBoosts = {};
	CouponStore.hasMultiBoostToken = false;
	CouponStore.hasMultiBoostWallet = false;

	CouponStore.multiErrMsg = "";
	CouponStore.multiDivi = 99999999999;
	CouponStore.multiMaxDivi = 99999999999;

	//whether the legs should be cleared after submit
	CouponStore.retainLegs = false;

	CouponStore.totalAmount = 0;
	CouponStore.spendAmount = 0; //amount of real dollars spend (ie total - bonus amounts)
	CouponStore.totalPayout = 0;
	CouponStore.parlay2 = 0;
	CouponStore.parlay3 = 0;
	CouponStore.parlay4 = 0;
	CouponStore.parlay5 = 0;
	CouponStore.parlay6 = 0;
	CouponStore.parlay7 = 0;
	CouponStore.parlay8 = 0;
	CouponStore.parlay9 = 0;
	CouponStore.multiAmt = 0;
	CouponStore.isMultiBonusBet = false;
	CouponStore.isMultiBoostToken = false;
	CouponStore.isMultiBoostWallet = false;
	CouponStore.hasMultiBet = false;
	CouponStore.parlayOpts = {};

	CouponStore.Initialise = function(couponID)
	{
		this.couponID = couponID;
		this.legs = {};

		try
		{
			this.forceSingleItem = $("#" + this.couponID).data("forcesingleitem").toLowerCase() === "true";
		}
		catch(ex)
		{
			this.forceSingleItem = false;
		}
	};

	CouponStore.GetCouponID = function()
	{
		return this.couponID;
	};

	CouponStore.GetPageElementID = function()
	{
		//return "#Coupon-" + this.couponID;
		return "#" + this.couponID;
	};

	CouponStore.GetTemplate = function()
	{
		var template = $("#" + this.couponID).data("template");

		if(template === undefined || template.length === 0)
		{
			if(!GWCORE.Coupon.useBettingPanel)
				template = "coupon_main.html";
			else
				template = "bettingPanel_main.html";
		}

		GWCORE.Coupon.useBettingPanel = template.startsWith('bettingPanel');

		if(template.indexOf("?") < 0)
			template += "?";
		else
			template += "&";

		template += "rand=" + Number(new Date());

		return "/assets/templates/" + template;
	};

	CouponStore.GetErrorTemplate = function()
	{
		var template = $("#" + this.couponID).data("errTemplate");

		if(template === undefined || template.length === 0)
			template = "coupon_errormsg.html";

		if(template.indexOf("?") < 0)
			template += "?";
		else
			template += "&";

		template += "rand=" + Number(new Date());

		return "/assets/templates/" + template;
	};

	CouponStore.HasHash = function(legHash)
	{
		if(this.legs === undefined)
			return false;
		else
			return !(this.legs[legHash] === undefined);
	};

	CouponStore.GetLegHashes = function()
	{
		return _.keys(this.legs);
	};

	CouponStore.GetOrderedHashes = function()
	{
		var aray = {};
		var sortray = [];

		jQuery.each(this.legs, function(legHash, leg)
		{
			aray[leg.addedAt] = legHash;
		});

		var sorted = [];
		for(var key in aray)
		{
			sorted[sorted.length] = key;
		}
		sorted.sort();

		for(var sortNum in sorted)
		{
			//sortray[sortray.length] = aray[sortHash];
			sortray[sortray.length] = aray[sorted[sortNum]];
		}

		return sortray;
	};

	CouponStore.HasMultiRequest = function()
	{
		return this.multiAmt > 0
			|| this.parlay2 > 0
			|| this.parlay3 > 0
			|| this.parlay4 > 0
			|| this.parlay5 > 0
			|| this.parlay6 > 0
			|| this.parlay7 > 0
			|| this.parlay8 > 0
			|| this.parlay9 > 0;
	};

	CouponStore.InsertLeg = function(legHash, legDetails)
	{
		this.legs[legHash] = legDetails;
	};

	CouponStore.RemoveLeg = function(legHash)
	{
		delete this.legs[legHash];
	};

	CouponStore.RemoveAllLegs = function()
	{
		this.legs = {};
	};

	CouponStore.LegCount = function()
	{
		var rtn = 0;
		if(this.legs !== undefined)
		{
			rtn = _.keys(this.legs).length;
		}
		return rtn;
	};

	//TODO: need rewrite to look at objects
	CouponStore.MakeCouponPostData = function()
	{
		multiBoost = 0;
		if(this.isMultiBoostToken)
			multiBoost = "BoostToken"; //GWEnums.DivBoostPromotionType.BoostToken
		else if(this.isMultiBoostWallet)
			multiBoost = "BoostWallet"; //GWEnums.DivBoostPromotionType.BoostWallet

		var postData = {
			trackingCode: this.trackingCode,
			multibetAmt: this.multiAmt,
			multiBonus: this.isMultiBonusBet,
			multiBoost: multiBoost,
			legs: [],
			parlayopts: []
		};

		this.parlayOpts = {};
		this.parlayOpts[0] = (jQuery.extend({}, GWCORE.CouponParlayOpt));
		this.parlayOpts[2] = (jQuery.extend({}, GWCORE.CouponParlayOpt));
		this.parlayOpts[3] = (jQuery.extend({}, GWCORE.CouponParlayOpt));
		this.parlayOpts[4] = (jQuery.extend({}, GWCORE.CouponParlayOpt));
		this.parlayOpts[5] = (jQuery.extend({}, GWCORE.CouponParlayOpt));
		this.parlayOpts[6] = (jQuery.extend({}, GWCORE.CouponParlayOpt));
		this.parlayOpts[7] = (jQuery.extend({}, GWCORE.CouponParlayOpt));
		this.parlayOpts[8] = (jQuery.extend({}, GWCORE.CouponParlayOpt));
		this.parlayOpts[9] = (jQuery.extend({}, GWCORE.CouponParlayOpt));

		postData.parlayopts.push({parlayCombo: 2, parlayAmount: GWCORE.Utils.GetDecimalOrZero(this.parlay2)});
		postData.parlayopts.push({parlayCombo: 3, parlayAmount: GWCORE.Utils.GetDecimalOrZero(this.parlay3)});
		postData.parlayopts.push({parlayCombo: 4, parlayAmount: GWCORE.Utils.GetDecimalOrZero(this.parlay4)});
		postData.parlayopts.push({parlayCombo: 5, parlayAmount: GWCORE.Utils.GetDecimalOrZero(this.parlay5)});
		postData.parlayopts.push({parlayCombo: 6, parlayAmount: GWCORE.Utils.GetDecimalOrZero(this.parlay6)});
		postData.parlayopts.push({parlayCombo: 7, parlayAmount: GWCORE.Utils.GetDecimalOrZero(this.parlay7)});
		postData.parlayopts.push({parlayCombo: 8, parlayAmount: GWCORE.Utils.GetDecimalOrZero(this.parlay8)});
		postData.parlayopts.push({parlayCombo: 9, parlayAmount: GWCORE.Utils.GetDecimalOrZero(this.parlay9)});

		coupon = this;

		_(this.GetOrderedHashes()).each(function(legHash)
		{
			leg = coupon.legs[legHash];
			var sendUnitAmount = leg.unitAmount;
			var sendTotalAmount = leg.totalAmount;

			if(leg.comboCount > 1)
				sendUnitAmount = leg.totalAmount / leg.comboCount;

			var sendBetType = leg.betType;
			if(leg.betType === "Win" && leg.isEachWay)
			{
				postData.multibetAmt = 0;
				if(coupon.currentMode === GWCORE.Coupon.CouponModes.Edit) //pretend its not an eachway so multi rules dont get excluded
				{
					sendTotalAmount = sendUnitAmount;
				}
				else
				{
					sendBetType = "EachWay";
				}
			}

			var sels = leg.selections;
			var optID = GWCORE.Utils.GetIntOrZero(leg.competitorID);
			if(optID > 0)
				sels = optID;

			divBoost = 0;
			if(leg.isDivBoostToken)
				divBoost = "BoostToken"; //GWEnums.DivBoostPromotionType.BoostToken
			else if(leg.isDivBoostWallet)
				divBoost = "BoostWallet"; //GWEnums.DivBoostPromotionType.BoostWallet

			postData.legs[postData.legs.length] = {
				clientLegID: legHash,
				eventType: leg.eventType,
				eventID: leg.eventID,
				betType: sendBetType,
				specialType: leg.special,
				selections: sels,
				unitAmount: sendUnitAmount,
				totalAmount: sendTotalAmount,
				requestedDividend: leg.price,
				modifier1: leg.modifier1,
				modifier2: leg.modifier2,
				isFreeBet: leg.isFreeBet,
				boostMode: divBoost
				//TODO: DivBoostToken stuff
			};
		});

		return JSON.stringify(postData);
	};

	CouponStore.GetElementID = function(tag, legHash)
	{
		var rtn = this.couponID + "_" + tag;

		if(legHash !== undefined && legHash.length > 0)
		{
			rtn += legHash;
		}

		return rtn;
	};

	return CouponStore;
}(GWCORE, jQuery, _));

GWCORE.CouponLeg = (function(GWCORE, $, _)
{
	var CouponLeg = {};
	// private variables
	//should not be any as this is just a data "struct"
	//functions should be simple data manipulation - no UI

	// public variables
	CouponLeg.legHash = undefined;
	CouponLeg.addedAt = undefined;

	CouponLeg.legValid = false;

	CouponLeg.isEachWay = false;
	CouponLeg.isFreeBet = false;
	CouponLeg.isDivBoostToken = false;
	CouponLeg.isDivBoostWallet = false;
	CouponLeg.price = 0;
	CouponLeg.priceDisp = "-";
	CouponLeg.unitAmount = 0;
	CouponLeg.totalAmount = 0;
	CouponLeg.payout = "0.00";

	CouponLeg.errMsg = "";
	CouponLeg.errCode = 0;
	CouponLeg.eventID = -1;
	CouponLeg.competitorID = -1;
	CouponLeg.selections = "";
	CouponLeg.eventType = "?";
	CouponLeg.betType = "";
	CouponLeg.special = "";
	CouponLeg.modifier1 = 0;
	CouponLeg.modifier2 = 0;
	CouponLeg.modiferDisp = "";

	CouponLeg.payoutMultiplier = 1;
	CouponLeg.allowEachWay = false;
	CouponLeg.comboCount = 1;
	CouponLeg.sportCode = "";
	CouponLeg.navSport = "";
	CouponLeg.eventName = "";
	CouponLeg.teamA = "";
	CouponLeg.teamB = "";
	CouponLeg.runnerName = "";
	CouponLeg.runnerNum = -1;
	CouponLeg.outcome = "";
	CouponLeg.rawProd = "";
	CouponLeg.freeBetLimit = 0;
	CouponLeg.maxbetLimit = 0;
	CouponLeg.isToteProduct = false;

	CouponLeg.availableRaceProds = {};
	CouponLeg.currentRaceProdKey = "-";

	CouponLeg.availableDivBoosts = {};

	CouponLeg.ewProduct = "";
	CouponLeg.ewDividend = 1;
	CouponLeg.currentEWShortDesc = "";
	CouponLeg.currentEWFullDesc = "";
	CouponLeg.ewIsToteProduct = false;

	CouponLeg.ewDisp = "-";

	CouponLeg.currentDividend;
	CouponLeg.currentMod1;
	CouponLeg.currentMod2;
	CouponLeg.currentOutcome;
	CouponLeg.currentModiferDisp;

	CouponLeg.currentEWDividend;
	CouponLeg.currentEWProduct;
	CouponLeg.currentEWDesc;
	CouponLeg.currentEWIsToteProduct;

	CouponLeg.transactionID;
	CouponLeg.ticketNumber;
	CouponLeg.status;
	CouponLeg.requestedDivi;
	CouponLeg.requestedTotal;
	CouponLeg.acceptedTotal;
	CouponLeg.acceptedDivi;

	CouponLeg.exoticIsBoxed;
	CouponLeg.exoticLegs;

	CouponLeg.specialDisplay;
	CouponLeg.betType;
	CouponLeg.boostAmount;

	CouponLeg.Initialise = function()
	{
		this.addedAt = jQuery.now();
	};

	return CouponLeg;
}(GWCORE, jQuery, _));

GWCORE.CouponParlayOpt = (function(GWCORE, $, _)
{
	var CouponParlayOpt = {};

	// private variables
	//should not be any as this is just a data "struct"
	//function should be simple data manipulation - no UI

	// public variables
	CouponParlayOpt.valid = false;
	CouponParlayOpt.errMsg = '-';
	CouponParlayOpt.errCode = 0;
	CouponParlayOpt.freeBetLimit = 0;

	return CouponParlayOpt;
}(GWCORE, jQuery, _));
