{"version":3,"file":"prodbase.js","mappings":"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","sources":["webpack://gbet.exchange.website/webpack/bootstrap","webpack://gbet.exchange.website/webpack/runtime/global","webpack://gbet.exchange.website/./libs/gbe.gec/gbe.base.js","webpack://gbet.exchange.website/./libs/gbe.gec/gbe.base.exchange.unlinted.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","/*\r\nThis file should be included before all other GBE js file libraries such as\r\ngbe.gec.common.js\r\ngbe.gec.pools.js\r\netc.\r\n*/\r\n\r\nif (com === null || typeof (com) != \"object\") { var com = {}; }\r\nif (com.globalbettingexchange === null || typeof (com.globalbettingexchange) != \"object\") { com.globalbettingexchange = {}; }\r\nif (com.globalbettingexchange.base === null || typeof (com.globalbettingexchange.base) != \"object\") { com.globalbettingexchange.base = {}; }\r\n\r\n// all the functions in the com.gbeFragment namespace will go in this block\r\ncom.globalbettingexchange.base = {\r\n //wrapper method used for backward compatibility.\r\n //if no local storage then use cookies. cookies are prefixed with gep_\r\n\r\n inArray: function (value, array) {\r\n if (!array) {\r\n return -1;\r\n }\r\n return array.indexOf(value);\r\n },\r\n\r\n trimString: function (str) {\r\n if (!str) {\r\n return \"\";\r\n }\r\n return str.trim();\r\n },\r\n clone: function(obj) {\r\n if (Object.prototype.toString.apply(obj) === '[object Array]') {\r\n return obj.slice();\r\n }\r\n\r\n var cloned = {};\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n cloned[prop] = obj[prop];\r\n }\r\n }\r\n\r\n return cloned;\r\n },\r\n extend: function(obj1, obj2) {\r\n var result = {};\r\n for (var key in obj1) {\r\n if (obj1.hasOwnProperty(key)) {\r\n result[key] = obj1[key];\r\n }\r\n }\r\n for (var key in obj2) {\r\n if (obj2.hasOwnProperty(key)) {\r\n result[key] = obj2[key];\r\n }\r\n }\r\n return result;\r\n },\r\n localStorage: {\r\n \"set\": function (name, value) {\r\n if (com.globalbettingexchange.base.supportLS) {\r\n localStorage[name] = value;\r\n } else {\r\n com.globalbettingexchange.base.setCookie(name, value, 365);\r\n }\r\n },\r\n \"get\": function (name) {\r\n if (com.globalbettingexchange.base.supportLS) {\r\n return localStorage[name];\r\n } else {\r\n return com.globalbettingexchange.base.getCookie(name);\r\n }\r\n }\r\n },\r\n createUUID: function () {\r\n // Function found here: https://gist.github.com/jed/982883\r\n\r\n var a = \"\";\r\n\r\n function b(a) {\r\n\r\n // Need to create variables x and y to keep JSLint happy\r\n var x = a ^ Math.random() * 16 >> a / 4;\r\n var y = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\r\n\r\n return a\r\n ? (x).toString(16)\r\n : (y).replace(/[018]/g, b);\r\n }\r\n return b(a);\r\n },\r\n log: function (data, e) {\r\n e = (e != null) ? \":\" + e : \"\";\r\n\r\n if (typeof console === \"undefined\" || typeof console.log === \"undefined\") {\r\n window.status = data + e;\r\n } else {\r\n\r\n console.log(data + e);\r\n }\r\n },\r\n\r\n // Returns HTML markup containing formatted amounts within with appropriate class\r\n // depending on whether number of positive/negative/neutral\r\n GBEFormatter: function (state) {\r\n\r\n var currentState = state;\r\n\r\n /**\r\n * Format the specified amount as currency\r\n * @param {Number} amt\r\n * @param {Number} decimals (optional) if === 0, show no decimal places,\r\n * otherwise always show 2 decimal places\r\n * @param {boolean} showCommas (optional) if true, show commas for thousands\r\n * @param {Number} max (optional) if true, if amt exceeds max, return max instead\r\n * @return {String} formatted string\r\n */\r\n this.formatCurrency = function (amt, decimals, showCommas, max) {\r\n var num = (isNaN(max)) ? amt : Math.min(max, amt);\r\n return this.formatDecimal(num, decimals, showCommas);\r\n }\r\n\r\n /**\r\n * Format the specified amount as a number (with no currency symbol)\r\n * @param {Number} amt\r\n * @param {Number} decimals (optional) if === 0, show no decimal places,\r\n * otherwise always show 2 decimal places\r\n * @param {boolean} showCommas (optional) if true, show commas for thousands\r\n * @return {String} formatted string\r\n */\r\n this.formatNumber = function (amt, decimals, showCommas) {\r\n var currencySymbol = '';\r\n var formattedAmount = com.globalbettingexchange.base.formatDecimal(amt, decimals, currencySymbol, showCommas);\r\n var className = (amt == 0) ? 'gep-neutral' : ((amt < 0) ? 'gep-negative' : 'gep-positive');\r\n return String.format(\"{1}\", className, formattedAmount);\r\n }\r\n\r\n /**\r\n * Format the specified amount as a number, with parentheses when negative (with no currency symbol)\r\n * @param {Number} amt\r\n * @param {Number} decimals (optional) if === 0, show no decimal places,\r\n * otherwise always show 2 decimal places\r\n * @param {boolean} showCommas (optional) if true, show commas for thousands\r\n * @return {String} formatted string\r\n */\r\n this.formatNumberParentheses = function (amt, decimals, showCommas) {\r\n var currencySymbol = '';\r\n var formattedAmount = com.globalbettingexchange.base.formatDecimal(amt, decimals, currencySymbol, showCommas);\r\n var className = (amt == 0) ? 'gep-neutral' : ((amt < 0) ? 'gep-negative' : 'gep-positive');\r\n formattedAmount = amt < 0 ? '(' + formattedAmount.substring(1) + ')' : formattedAmount;\r\n return String.format(\"{1}\", className, formattedAmount);\r\n }\r\n\r\n /**\r\n * Format the specified amount as currency\r\n * @param {Number} amt\r\n * @param {Number} decimals (optional) if === 0, show no decimal places,\r\n * otherwise always show 2 decimal places\r\n * @param {boolean} showCommas (optional) if true, show commas for thousands\r\n * @return {String} formatted string\r\n */\r\n this.formatDecimal = function (amt, decimals, showCommas) {\r\n var currencySymbol = currentState.ccSymbol;\r\n var formattedAmount = com.globalbettingexchange.base.formatDecimal(amt, decimals, currencySymbol, showCommas);\r\n var className = (amt == 0) ? 'gep-neutral' : ((amt < 0) ? 'gep-negative' : 'gep-positive');\r\n return String.format(\"{1}\", className, formattedAmount);\r\n }\r\n },\r\n\r\n OddsLadder: function (prices) {\r\n var tolerancePercent = 0.0001; // (= .01%)\r\n\r\n // Reset odds ladder and recreate hash indexes of prices\r\n function _reIndex(newprices, that) {\r\n that.priceArray = newprices;\r\n that.hashPriceArray = {};\r\n that.hashRepresentationArray = {};\r\n for (var i = 0; i < that.priceArray.length; i++) {\r\n that.hashPriceArray[that.priceArray[i].price] = that.priceArray[i];\r\n that.hashRepresentationArray[that.priceArray[i].representation] = that.priceArray[i];\r\n }\r\n }\r\n\r\n this.priceArray = prices; // Array of prices on odds ladder\r\n this.hashPriceArray = {}; // Array of prices, indexed by decimal price\r\n this.hashRepresentationArray = {}; // Array of prices, indexed by respresentation\r\n this.hashArray = [{ p: 2, r: 4 }, { p: 2, r: 4 }, { p: 2, r: 4 }, { p: 2, r: 4 }]; // NOT USED - CAN BE REMOVED?!\r\n\r\n this.getPercentage = function (representation, format) {\r\n var result = 0;\r\n if (format === 3) {\r\n representation = parseFloat(representation);\r\n if (representation > 0) {\r\n result = 100 / (1 * representation + 100);\r\n } else {\r\n result = (-1 * representation) / (-1 * representation + 100);\r\n }\r\n } else if (format === 2) {\r\n var arr = representation.split(\"/\");\r\n var num1 = arr[0] * 1;\r\n var num2 = arr[1] * 1;\r\n result = num2 / (num1 + num2);\r\n } else {\r\n result = 1 / (1 * representation);\r\n }\r\n result = (((result * 100).toFixed(2)) * 1).toString() + \"%\";\r\n return result;\r\n }\r\n\r\n // Return the N'th price in the ladder\r\n this.getItem = function (i) {\r\n return this.priceArray[i];\r\n };\r\n\r\n // Recreate hash indexes of prices, given the supplied odds ladder\r\n this.reIndex = function (newprices) {\r\n _reIndex(newprices, this);\r\n };\r\n\r\n // Band the specified decimal price to the equivalent price on the odds ladder (decimal/fractional/american)\r\n this.band = function (\r\n\r\n decimalPrice, // decimal price to be banded\r\n\r\n direction, // (optional) direction to go on ladder when looking for match\r\n // -1 for BACK bet, +1 for LAY bet\r\n // To step to the next odds: -2 for BACK, -2 for LAY\r\n // If not supplied, then we return nearest matching odds on the ladder\r\n\r\n showRelative, // (optional) if true, show odds as relative to a point on the odds ladder,\r\n // e.g. >3/1, <5/2\r\n // Only applies to Fractional/American odds. If odds ladder is Decimal, a\r\n // value of true is ignored.\r\n\r\n isMultiple, // (optional) if true, odds are for a Multiple bet. If odds ladder is decimal,\r\n // don't band the odds, and instead return a price object containing the\r\n // supplied odds (rounded to 2 decimal places)\r\n\r\n mustBand // (optional) if NOT set to true, and odds ladder is decimal, then\r\n // decimal odds can be returned \"as is\", without banding to the decimal ladder\r\n ) {\r\n var above, below, delta, nextItem;\r\n\r\n\r\n // If its exactly on price ladder, then return price from hash (indexed) table\r\n if (this.hashPriceArray[decimalPrice] != null) return this.hashPriceArray[decimalPrice];\r\n\r\n var isDecimal = (this.priceArray[0].representation == \"1.01\"); // Does the table map to decimal (rather than fractional) notation?\r\n\r\n if (isMultiple) {\r\n if (isDecimal) { // Don't use the odds ladder for decimal multiples bets - just format the amount to 2 dec. places\r\n var multipleDecimal = com.globalbettingexchange.base.formatDecimal(decimalPrice, 2, '', false);\r\n return { price: decimalPrice, representation: com.globalbettingexchange.base.removeTrailingZeros(multipleDecimal) + \"\" };\r\n }\r\n }\r\n if (mustBand == null) mustBand = false; // Default\r\n if (isDecimal)\r\n showRelative = false; // 'showRelative' only applies when mapping to fractional odds\r\n if (decimalPrice == 0) return { price: 0, representation: '' };\r\n\r\n\r\n // if (direction == null) direction = 1;\r\n /*\r\n * We no longer set a default for direction. If this function is called with\r\n * direction = null (or 0) then we let the function select the nearest matching\r\n * odds in the ladder. (This is how the Betdaq site behaves in Bet History, etc.)\r\n * If showRelative is true then we return either a '<' or a '>' symbol to show\r\n * that the true odds are less than or greater than the value being returned.\r\n *\r\n */\r\n var high = this.priceArray.length - 1;\r\n var low = 0;\r\n var mid = 0;\r\n\r\n while (low <= high) {\r\n mid = parseInt((low + high) / 2);\r\n delta = this.priceArray[mid].price - decimalPrice;\r\n\r\n if (Math.abs(delta) <= (this.priceArray[mid].price * tolerancePercent)) {\r\n\r\n\r\n if ((direction != -2) // If we were called from the step function then we do\r\n && (direction != 2)) { // not want to find a match here. Instead we want to step\r\n return this.priceArray[mid]; // forward/backward to the next/previous value in the ladder\r\n }\r\n else {\r\n break;\r\n }\r\n\r\n } else {\r\n if (delta > 0) {\r\n high = mid - 1;\r\n }\r\n else if (delta < 0) {\r\n low = mid + 1;\r\n }\r\n else {\r\n return this.priceArray[mid];\r\n }\r\n }\r\n\r\n }\r\n\r\n if (!mustBand && isDecimal) {\r\n var offLadderDecimal = com.globalbettingexchange.base.formatDecimal(decimalPrice, 2, '', false);\r\n return { price: decimalPrice, representation: com.globalbettingexchange.base.removeTrailingZeros(offLadderDecimal) + \"\" };\r\n }\r\n\r\n if ((direction == -2) || (direction == 2)) {//only if not stepping(function below) using wheel or arrows, these would be +2 -2,\r\n direction = direction / 2;\r\n }\r\n\r\n if (direction) { // If specified and non-zero then value of direction is either +1 or -1\r\n if ((direction == -1) && (decimalPrice < this.priceArray[mid].price)) {\r\n nextItem = mid + direction;\r\n } else if ((direction == 1) && (decimalPrice > this.priceArray[mid].price)) {\r\n nextItem = mid + direction;\r\n } else {\r\n nextItem = mid;\r\n }\r\n nextItem = (nextItem < this.priceArray.length) ? nextItem : this.priceArray.length - 1;\r\n nextItem = (nextItem < 0) ? 0 : nextItem;\r\n\r\n if (showRelative) {\r\n return { price: this.priceArray[nextItem].price, representation: '>' + this.priceArray[nextItem].representation }\r\n }\r\n else { // Don't say whether it's greater or less than our Best Found\r\n return this.priceArray[nextItem];\r\n }\r\n }\r\n else { // No direction specified - choose whichever is nearer (above or below)\r\n if (decimalPrice > this.priceArray[mid].price) { // Our search item is located between the closest match...\r\n below = mid; // ... and the array entry above it\r\n above = mid + 1;\r\n if (above > this.priceArray.length - 1) {\r\n above = this.priceArray.length - 1;\r\n below = this.priceArray.length - 2;\r\n }\r\n }\r\n else {\r\n below = mid - 1; // ... and the array entry below it\r\n above = mid;\r\n if (below < 0) {\r\n below = 0;\r\n above = 1;\r\n }\r\n }\r\n\r\n if (Math.abs(decimalPrice - this.priceArray[below].price) < Math.abs(this.priceArray[above].price - decimalPrice)) {\r\n // It's closer to the item below it. Return this amount as our Best Found...\r\n if (showRelative) { // ... and say it's greater than this amount\r\n return { price: this.priceArray[mid].price, representation: '>' + this.priceArray[below].representation };\r\n }\r\n else { // ... we don't want to say whether it's greater or less than our Best Found\r\n return this.priceArray[mid];\r\n }\r\n }\r\n else {\r\n // It's closer to the item above it. Return this amount as our Best Found...\r\n if (showRelative) { // ... and say it's less than this amount\r\n return { price: this.priceArray[above].price, representation: '<' + this.priceArray[above].representation };\r\n }\r\n else { // ... we don't want to say whether it's greater or less than our Best Found\r\n return this.priceArray[mid + 1];\r\n }\r\n }\r\n }\r\n\r\n };\r\n\r\n // Return the odds ladder\r\n this.returnPriceArray = function () {\r\n return this.priceArray;\r\n }\r\n\r\n this.step = function (decimalPrice, direction) {\r\n decimalPrice = decimalPrice * (1 + (.00000001 * direction));\r\n direction = (direction) * 2;\r\n\r\n return this.band(decimalPrice, direction, false, false, true);\r\n };\r\n\r\n // Get the entry on the odds ladder corresponding to the given representation\r\n // Returns undefined if no corresponding entry.\r\n this.getFromRepresentation = function (representation) {\r\n return this.hashRepresentationArray[representation];\r\n };\r\n\r\n this.getFromDecimal = function (decimalValue) {\r\n if (this.hashPriceArray[decimalValue] != null)\r\n return this.hashPriceArray[decimalValue];\r\n else {\r\n return { price: 0, representation: \"\" };\r\n }\r\n };\r\n _reIndex(prices, this);\r\n return this;\r\n\r\n },\r\n formatDecimal: function (number, places, currencySymbol, showCommas) {\r\n\r\n var showZeros = (currencySymbol != null);\r\n if (currencySymbol == null) currencySymbol = '';\r\n if ((isNaN(number) || number == \"\") && (!showZeros)) {\r\n if (places == 0)\r\n return \"\";\r\n else\r\n return currencySymbol + \"0.00\";\r\n }\r\n\r\n //round to 2 decimal places\r\n number = Math.round(number * 100) / 100;\r\n\r\n //convert to string and add trailing zeroes if required\r\n var numberStr = (showCommas == true) ? com.globalbettingexchange.base.addCommas(number.toString()) : number.toString();\r\n var decimalIndex = numberStr.indexOf(\".\");\r\n\r\n if (decimalIndex == -1) { numberStr += \".00\"; }\r\n //only one decimal place, add trailing 0\r\n else if ((numberStr.length - 2) == decimalIndex) { numberStr += \"0\"; }\r\n\r\n if (currencySymbol != null) {\r\n // Insert currency symbol, after \"-\" if amount is negative\r\n if (numberStr.substring(0, 1) == \"-\")\r\n numberStr = \"-\" + currencySymbol + numberStr.substring(1);\r\n else\r\n numberStr = currencySymbol + numberStr;\r\n }\r\n if (places == 0)\r\n numberStr = numberStr.split('.')[0];\r\n return numberStr;\r\n },\r\n removeTrailingZeros: function (x) {\r\n var decPos = x.indexOf(\".\")\r\n if (decPos > -1) {\r\n first = x.substring(0, decPos);\r\n second = x.substring(decPos, x.length);\r\n while (second.charAt(second.length - 1) == \"0\")\r\n second = second.substring(0, second.length - 1);\r\n if (second.length > 1)\r\n return first + second;\r\n else\r\n return first;\r\n }\r\n return x;\r\n },\r\n\r\n // Return just the name of the function passed in\r\n getFunctionName: function (funct) {\r\n\r\n var ownName = funct.toString();\r\n ownName = ownName.substr('function '.length); // trim off \"function \"\r\n ownName = ownName.substr(0, ownName.indexOf('(')); // trim off everything after the function name\r\n return ownName;\r\n },\r\n\r\n // Takes a number in the form of a string (with or without decimal places)\r\n // and inserts commas for thousands\r\n addCommas: function (numberStr) {\r\n numberStr += '';\r\n var x = numberStr.split('.');\r\n var x1 = x[0];\r\n var x2 = x.length > 1 ? '.' + x[1] : '';\r\n var rgx = /(\\d+)(\\d{3})/;\r\n while (rgx.test(x1)) {\r\n x1 = x1.replace(rgx, '$1' + ',' + '$2');\r\n }\r\n return x1 + x2;\r\n },\r\n parseFromSelectionBlurb: function (itemName, blurb) {\r\n // Parse the selected item value from the selection blurb\r\n // Blurb format is \"name=value~name=value~name=value\"\r\n\r\n var value = \"\";\r\n\r\n if (blurb != null) {\r\n var namePosition = blurb.indexOf(itemName + \"=\");\r\n if (namePosition > -1) {\r\n var valuePosition = namePosition + itemName.length + 1;\r\n var value = blurb.substring(valuePosition);\r\n var endValuePosition = value.indexOf(\"~\");\r\n if (endValuePosition > -1) {\r\n value = value.substring(0, endValuePosition);\r\n }\r\n }\r\n }\r\n\r\n return value;\r\n },\r\n\r\n /***********************\r\n preventBubble stops the click on price bubbling up to parent elements\r\n ************************/\r\n preventBubble: function (e) {\r\n if (!e) var e = window.event;\r\n e.cancelBubble = true;\r\n if (e.stopPropagation) e.stopPropagation();\r\n },\r\n\r\n // Returns the currency symbol for a given 3-letter currency code\r\n getCurrencySymbol: function (code, symbol) {\r\n\t\tif (symbol === undefined) {\r\n\t\t\tsymbol = false;\r\n\t\t}\r\n var currencySymbol = \"\";\r\n switch (code) {\r\n case 'AUD': currencySymbol = \"$\"; break;\r\n case 'CAD': currencySymbol = \"$\"; break;\r\n case 'CEU': currencySymbol = \"\"; break;\r\n case 'CNY': currencySymbol = \"Y\"; break;\r\n case 'EUR': currencySymbol = symbol ? \"€\" : \"€\"; break;\r\n case 'GBP': currencySymbol = symbol ? \"£\" : \"£\"; break;\r\n case 'HKD': currencySymbol = \"$\"; break;\r\n case 'INR': currencySymbol = symbol ? \"₹\" : \"₹\"; break;\r\n case 'MYR': currencySymbol = \"MYR\"; break;\r\n case 'PEU': currencySymbol = symbol ? \"€\" : \"€\"; break;\r\n case 'PGB': currencySymbol = symbol ? \"£\" : \"£\"; break;\r\n case 'PHP': currencySymbol = \"P\"; break;\r\n case 'PIN': currencySymbol = \"R\"; break;\r\n case 'PUS': currencySymbol = \"$\"; break;\r\n case 'RMB': currencySymbol = \"RMB\"; break;\r\n case 'RUB': currencySymbol = \"\"; break;\r\n case 'SGD': currencySymbol = \"$\"; break;\r\n case 'TWD': currencySymbol = \"$\"; break;\r\n case 'UAH': currencySymbol = \"\"; break;\r\n case 'USD': currencySymbol = \"$\"; break;\r\n case 'THB': currencySymbol = \"THB\"; break;\r\n }\r\n return currencySymbol;\r\n },\r\n\r\n // Only called from Exchange.Tablet - remove from base?\r\n getMinimumStake: function (code) {\r\n var minimumStakes = { EUR: .5, GBP: .5, INR: 50, USD: 1, RMB: 1, SGD: 1, MYR: 1, VND: 1000, THB: 50, IDR: 1000, KRW: 1000, HKD: 5 };\r\n return minimumStakes[code] || 1;\r\n },\r\n\r\n // Accesses global variable - remove or rewrite?!\r\n minimumStake: function () {//probably obsolete\r\n return clientObject.minimumStakes[clientObject.state.currency];\r\n },\r\n\r\n // Calculate the overround for a given market object\r\n // Param 'forExchange' is not used!\r\n getOverRound: function (marketObj, forExchange) {\r\n var forOverround = 0;\r\n var againstOverround = 0;\r\n for (selCount in marketObj.selections) {\r\n if (marketObj.selections[selCount].selectionStatusId == 2) {//Active\r\n\r\n if ((marketObj.selections[selCount].forExchangePrices[0] != null) && (forOverround != 9999))\r\n forOverround += (1 / marketObj.selections[selCount].forExchangePrices[0].price);\r\n else { forOverround = 9999; }\r\n\r\n\r\n if ((marketObj.selections[selCount].againstExchangePrices[0] != null) && (againstOverround != 9999))\r\n againstOverround += (1 / marketObj.selections[selCount].againstExchangePrices[0].price);\r\n else { againstOverround = 9999; }\r\n if ((againstOverround == 9999) && (forOverround == 9999))\r\n break;\r\n }\r\n }\r\n\r\n forOverround = (forOverround == 9999) ? \"\" : this.formatDecimal(forOverround * 100, 2, '') + \"%\";\r\n againstOverround = (againstOverround == 9999) ? \"\" : this.formatDecimal(againstOverround * 100, 2, '') + \"%\";\r\n\r\n return { forOverround: forOverround, againstOverround: againstOverround };\r\n },\r\n getSubscribedOverround: function (marketObj, selectionIndex, oddsladder) {\r\n\r\n var forOverround = 0;\r\n var againstOverround = 0;\r\n var tempPrice = 0;\r\n for (selCount in marketObj.selections) {\r\n var thisSelection = marketObj.selections[selCount];\r\n var thisSubscribedSelection = selectionIndex[thisSelection.selectionId];\r\n if ((thisSubscribedSelection != null) && (thisSubscribedSelection.status == 2)) {//Active\r\n\r\n if (thisSubscribedSelection.backPrices\r\n && (thisSubscribedSelection.backPrices[0] != null)\r\n && (thisSubscribedSelection.backPrices[0].displayPrice != \"\")\r\n && (forOverround != 9999)) {\r\n\r\n var priceObj = oddsladder.getFromRepresentation(thisSubscribedSelection.backPrices[0].displayPrice);\r\n if (priceObj == null) break;\r\n tempPrice = priceObj.price;\r\n forOverround += (1 / tempPrice);\r\n\r\n } else {\r\n forOverround = 9999;\r\n }\r\n\r\n if (thisSubscribedSelection.layPrices\r\n && (thisSubscribedSelection.layPrices[0] != null)\r\n && (thisSubscribedSelection.layPrices[0].displayPrice != \"\")\r\n && (againstOverround != 9999)) {\r\n\r\n var priceObj = oddsladder.getFromRepresentation(thisSubscribedSelection.layPrices[0].displayPrice);\r\n if (priceObj == null) break;\r\n tempPrice = priceObj.price;\r\n againstOverround += (1 / tempPrice);\r\n\r\n } else {\r\n againstOverround = 9999;\r\n }\r\n\r\n if ((againstOverround == 9999) && (forOverround == 9999))\r\n break;\r\n }\r\n }\r\n\r\n forOverround = (forOverround == 9999) ? \"\" : this.formatDecimal(forOverround * 100, 2, '') + \"%\";\r\n againstOverround = (againstOverround == 9999) ? \"\" : this.formatDecimal(againstOverround * 100, 2, '') + \"%\";\r\n\r\n return { forOverround: forOverround, againstOverround: againstOverround };\r\n },\r\n\r\n getUIDate: function (dateObject) {\r\n var monthArray = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\r\n newDate = new Date(dateObject),\r\n year = newDate.getFullYear(),\r\n month = newDate.getMonth(),\r\n day = newDate.getDate(),\r\n resultDate;\r\n if (day === 1 || day === 21 || day === 31) {\r\n day = day + 'st';\r\n } else if (day === 2 || day === 22) {\r\n day = day + 'nd';\r\n } else if (day === 3 || day === 23) {\r\n day = day + 'rd';\r\n } else {\r\n day = day + 'th';\r\n }\r\n resultDate = day + ' ' + monthArray[month] + ' ' + year;\r\n return resultDate;\r\n },\r\n jsDate: function (utc) {\r\n\r\n if (!(typeof utc == \"string\")) {\r\n return utc;\r\n }\r\n //\"2012-04-04T14:17:57.396Z\"(UTC)\r\n //or \"2012-04-04T14:17:57.396\"(without Z. assuming it as UTC)\r\n //or \"2012-03-30T15:23:00.93+01:00\" (Local with offset)\r\n var d, _hours = \"00\", _minutes = \"00\", _seconds = \"00\", _milliseconds = \"00\", _year, _month, _day, _zoneDiff = 0,\r\n _datepart, _timePart;\r\n\r\n //first check is it a localised date.2011-03-31T18:15:00\r\n _timePart = utc.split(\"T\")[1];\r\n if (_timePart && !/(Z|\\.|\\+|\\-)/i.test(_timePart)) {//\"2013-07-16T14:00:00\"\r\n _datepart = utc.split(\"T\")[0];\r\n _year = _datepart.split(\"-\")[0];\r\n _month = (_datepart.split(\"-\")[1] * 1) - 1;\r\n _day = _datepart.split(\"-\")[2];\r\n _timePart = utc.split(\"T\")[1];\r\n if (_timePart) {\r\n _timePart = _timePart.split(\":\");\r\n if (_timePart.length) {\r\n _hours = _timePart[0];\r\n _minutes = _timePart[1];\r\n _seconds = _timePart[2];\r\n return new Date(_year, _month, _day, _hours, _minutes, _seconds);\r\n }\r\n }\r\n }\r\n\r\n d = new Date(utc);\r\n if (isNaN(d)) {\r\n _datepart = utc.split(\"T\")[0];\r\n _year = _datepart.split(\"-\")[0];\r\n _month = (_datepart.split(\"-\")[1] * 1) - 1;\r\n _day = _datepart.split(\"-\")[2];\r\n _timePart = utc.split(\"T\")[1];\r\n\r\n if (_timePart) {//15:23:00.93+01:00 or 14:17:57.396Z or 14:17:57.396 (without Z. assuming it as UTC)\r\n if (_timePart.match(/[+-]/) === null) {//if timezone offset not present\r\n if (_timePart.match(/[Z]/) === null) {\r\n _timePart += \"Z\"; //work around if utc date without trailing 'Z'\r\n }\r\n }\r\n //15:23:00.93+01:00 or 14:17:57.396Z\r\n _timePart = _timePart.split(\":\");\r\n _hours = _timePart[0];\r\n _minutes = _timePart[1];\r\n if (_timePart[2]) {//00.93+01:00 or 57.396Z\r\n _seconds = _timePart[2].substr(0, 2);\r\n _temp = _timePart[2];\r\n if (_timePart[3]) {\r\n _temp += \":\" + _timePart[3];\r\n } //00.93+01:00 or 57.396Z\r\n _seconds = _temp.substr(0, 2);\r\n _timePart = _temp.split(\".\");\r\n _milliseconds = _timePart[1] ? _timePart[1] : \"00\";\r\n _timePart = _timePart[1] ? _timePart[1] : _timePart[0];\r\n }\r\n if (_timePart.match(/[+-]/) !== null) {//if timezone offset present.//93+01:00\r\n var _months = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\r\n _days = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\r\n if (_timePart.match(/[+]/) !== null) { //+\r\n _milliseconds = _milliseconds.substr(0, _timePart.lastIndexOf(\"+\"));\r\n _zoneDiff = _timePart.substring(_timePart.indexOf(\"+\"));\r\n } else { //-\r\n _milliseconds = _timePart.substr(0, _timePart.lastIndexOf(\"-\"));\r\n _zoneDiff = _timePart.substring(_timePart.indexOf(\"-\"));\r\n }\r\n _zoneDiff = _zoneDiff.split(\":\").join(\"\");\r\n d = new Date(_year, _month, _day);\r\n d = new Date(_days[d.getDay()] + \" \" + _months[d.getMonth()] + \" \" + d.getDate() + \" \" + d.getFullYear() + \" \" + _hours + \":\" + _minutes + \":\" + _seconds + \" UTC\" + _zoneDiff);\r\n d.setMilliseconds(_milliseconds);\r\n return d;\r\n }\r\n //396Z\r\n _milliseconds = _timePart.substr(0, _timePart.lastIndexOf(\"Z\"));\r\n _zoneDiff = new Date(_year, _month, _day).getTimezoneOffset();\r\n }\r\n d = new Date(_year, _month, _day, _hours, _minutes, _seconds, _milliseconds);\r\n if (_zoneDiff) {//reduce offset if UTC time as input(Z) to make it local.\r\n d = new Date(d.getTime() - (_zoneDiff * 60000));\r\n }\r\n }\r\n return d;\r\n },\r\n\r\n setCookie: function (c_name, value, expiredays, sameSite) {\r\n\r\n var exdate = new Date();\r\n var domain = this.getTopDomain();\r\n\r\n if (domain.indexOf('.') > -1) domain = \";domain=.\" + domain; else domain = \"\"; //to support non localhost\r\n\r\n exdate.setTime(exdate.getTime() + (60000 * 60 * 24 * expiredays));\r\n\r\n var expiry = ((expiredays == null) ? \"\" : \";expires=\" + exdate.toGMTString());\r\n\r\n var sameSiteFlag = \"\";\r\n if (sameSite !== undefined) {\r\n sameSiteFlag = \"SameSite=\" + sameSite + \";\";\r\n }\r\n\r\n try {\r\n document.cookie = c_name + \"=\" + escape(value) + expiry + domain + ';secure;path=/;' + sameSiteFlag;\r\n } catch (ex) {\r\n console.warn(\"Error setting cookie: \" + c_name + \"=\" + escape(value) + expiry + domain + ';secure;path=/;' + sameSiteFlag);\r\n console.warn(ex);\r\n }\r\n\r\n if (sameSite === \"None\"\r\n && com.globalbettingexchange.base.getCookie(c_name) !== value) {\r\n\r\n console.warn(\"Cookie \" + c_name + \" was not created (with SameSite=None), this can happen in some legacy browsers, trying again without SameSite=None\");\r\n // Setting cookie with \"SameSite=None\" can fail in some legacy browsers.\r\n // So if cookie is not set, then try again without \"SameSite=None\".\r\n\r\n try {\r\n document.cookie = c_name + \"=\" + escape(value) + expiry + domain + ';secure;path=/;';\r\n } catch (ex) {\r\n console.warn(\"Error setting cookie: \" + c_name + \"=\" + escape(value) + expiry + domain + ';secure;path=/;');\r\n console.warn(ex);\r\n }\r\n\r\n if (com.globalbettingexchange.base.getCookie(c_name) !== value) {\r\n console.warn(\"Cookie \" + c_name + \" was not created (without SameSite=None)\");\r\n }\r\n }\r\n },\r\n getCookie: function (c_name) {\r\n if (document.cookie.length > 0) {\r\n c_start = document.cookie.indexOf(c_name + \"=\");\r\n if (c_start != -1) {\r\n c_start = c_start + c_name.length + 1;\r\n c_end = document.cookie.indexOf(\";\", c_start);\r\n if (c_end == -1) c_end = document.cookie.length;\r\n return unescape(document.cookie.substring(c_start, c_end));\r\n }\r\n }\r\n return \"\";\r\n },\r\n deleteCookie: function (c_name) {\r\n var exdate = new Date();\r\n var domain = this.getTopDomain();\r\n\r\n if (domain.indexOf('.') > -1) domain = \";domain=.\" + domain; else domain = \"\"; //to support non localhost\r\n\r\n exdate.setDate(exdate.getDate() - 1);\r\n\r\n try {\r\n document.cookie = c_name + \"=\" + \";expires=\" + exdate.toGMTString() + domain + ';secure;path=/;';\r\n } catch (ex) {\r\n console.warn(\"Error deleting cookie: \" + c_name);\r\n console.warn(ex);\r\n }\r\n\r\n if (com.globalbettingexchange.base.getCookie(c_name) !== \"\") {\r\n\r\n console.warn(\"Cookie was not deleted. Trying again with \\\"SameSite=None\\\"\");\r\n\r\n try {\r\n document.cookie = c_name + \"=\" + \";expires=\" + exdate.toGMTString() + domain + ';secure;path=/;SameSite=None';\r\n } catch (ex) {\r\n console.warn(\"Error deleting cookie: \" + c_name + \" (with SameSite=None)\");\r\n console.warn(ex);\r\n }\r\n\r\n if (com.globalbettingexchange.base.getCookie(c_name) !== \"\") {\r\n console.warn(\"Cookie was not deleted (with \\\"SameSite=None\\\")\");\r\n }\r\n }\r\n\r\n },\r\n\r\n // Date object has it's own getFullYear() method, which seems to be what we use everywhere\r\n // I don't think this function is ever called from any component, but difficult to be 100% sure\r\n getFullYear: function (d) //returns the correct year for any year after 1000\r\n {\r\n console.log(\"gbe.base.js: getFullYear() function is deprecated and will be deleted.\"\r\n + \"Use getFullYear() method on Date object instead\");\r\n\r\n var y = d.getYear();\r\n if (y < 1000) y += 1900;\r\n return y;\r\n },\r\n\r\n // Returns last element from string delimited with '~' character\r\n getEventName: function (fullName) {\r\n return fullName.substring(fullName.lastIndexOf('~') + 1);\r\n },\r\n\r\n // Follows event tree towards root, via getParent() for each event,\r\n // until it reaches the top-level event (i.e. the one under the root)\r\n getTopLevelEvent: function (ev) {\r\n\r\n var parent = ev.getParent();\r\n\r\n if (parent == null)\r\n return ev;\r\n else\r\n return this.getTopLevelEvent(parent);\r\n\r\n },\r\n\r\n\r\n // If 'ev' is a descendent event of any of the events in 'ar',\r\n // then this function returns the event that it is a descendent of.\r\n // As it traverses the tree towards the root, it will return the\r\n // FIRST ancestor event of 'ev' that it encounters that is in 'ar'.\r\n // The order of the events in 'ar' is not important.\r\n // If 'ev' is NOT a descendent event of the any of the events in 'ar', then boolean false is returned.\r\n // 'ar' is an associative array (i.e. an object) indexed by eventClassifierId\r\n isDescendantOf: function (ev, ar) {\r\n\r\n if (ar == null) return false;\r\n\r\n if (ar[ev.eventClassifierId] != null) return ar[ev.eventClassifierId];\r\n\r\n var parent = ev.getParent();\r\n if (parent == null) {\r\n if (ar[1] != null)\r\n return ar[1];\r\n else\r\n return false;\r\n } else\r\n return this.isDescendantOf(parent, ar);\r\n },\r\n\r\n // Returns the whole setting object as opposed to boolean\r\n isDescendantOfObject: function (ev, ar) {\r\n\r\n if (ar == null) return null;\r\n\r\n if (ar[ev.eventClassifierId] != null) return ar[ev.eventClassifierId];\r\n\r\n var parent = ev.getParent();\r\n if (parent == null) {\r\n if (ar[1] != null)\r\n return ar[1];\r\n else\r\n return null;\r\n } else\r\n return this.isDescendantOfObject(parent, ar);\r\n },\r\n\r\n // Returns true if 'ancestor' is an ancestor event of event 'node'\r\n hasAncestor: function (node, ancestor) {\r\n\r\n var parent;\r\n\r\n if (node == null || ancestor == null) {\r\n return false;\r\n }\r\n if (node.eventClassifierId == ancestor.eventClassifierId) {\r\n return true;\r\n }\r\n else {\r\n if ((parent = node.getParent()) == null) {\r\n return false;\r\n } else {\r\n return this.hasAncestor(parent, ancestor);\r\n }\r\n }\r\n },\r\n\r\n // Gets the number of levels deep of event root is 0, top level is 1\r\n getEventLevel: function (ev) {\r\n var parent = ev.getParent();\r\n if (parent == null)\r\n return 1;\r\n else\r\n return this.getEventLevel(parent) + 1;\r\n\r\n },\r\n\r\n // Returns an array of ids from array of objects\r\n toPropArray: function (ar, prop) {\r\n var newAr = [];\r\n for (var i = 0; i < ar.length; i++) {\r\n newAr[i] = ar[i][prop];\r\n }\r\n\r\n return newAr;\r\n },\r\n\r\n toArrayFromIndex: function (ar) {\r\n var newAr = [];\r\n for (i in ar) {\r\n newAr.push(i);\r\n }\r\n\r\n return newAr;\r\n },\r\n\r\n /**\r\n * Capitalise only the first letter of each word\r\n * @param {string} str - string to capitalize\r\n * @return {string} – string that has been capitilized\r\n */\r\n toTitleCase: function (str) {\r\n \"use strict\";\r\n if (str !== undefined && str !== null) {\r\n return str.replace(/\\w\\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); });\r\n } else {\r\n return \"\";\r\n }\r\n\r\n },\r\n\r\n getRefreshRate: function (markets, forLoggedInUser, rates) {\r\n\r\n if (markets.length == 0) {\r\n return 120000;\r\n }\r\n\r\n var market, i, startTime, forInRunningMarketOnly, currentTime, diffMinutes, rateObject;\r\n\r\n for (i = 0; i < markets.length; i = i + 1) {\r\n if (markets[i].startTime != null) {\r\n market = markets[i];\r\n break;\r\n }\r\n }\r\n\r\n if (market == null) {\r\n return 120000;\r\n }\r\n\r\n startTime = this.jsDate(market.startTime);\r\n forInRunningMarketOnly = market.isCurrentlyInRunning;\r\n\r\n currentTime = new Date();\r\n rate = 100000;\r\n diffMinutes = (startTime.getTime() - currentTime.getTime()) / 1000; //result in minutes\r\n\r\n rateObject = {\r\n forLoggedInUser: false,\r\n from: 86400,\r\n to: 0,\r\n forInRunningMarketOnly: false,\r\n rate: 3600\r\n };\r\n\r\n for (refreshI in rates.RefreshRates) {\r\n rateObject = rates.RefreshRates[refreshI];\r\n\r\n if ((rateObject.forLoggedInUser == forLoggedInUser) && (rateObject.forInRunningMarketOnly == forInRunningMarketOnly)) {\r\n if ((rateObject.from <= diffMinutes || rateObject.from === 0) && ((diffMinutes < rateObject.to) || rateObject.to === 0)) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (rates.RefreshRateLimits.enabled) {\r\n var numMarketsInView = markets.length;\r\n var selectionsLimit = {};\r\n var marketsLimit = {};\r\n var numSelectionsInView = 0;\r\n\r\n for (rateI in rates.RefreshRateLimits.RefreshRates) {\r\n if ((rates.RefreshRateLimits.RefreshRates[rateI].numberOfMarkets > 0) && (rates.RefreshRateLimits.RefreshRates[rateI].enabled)) {\r\n marketsLimit = rates.RefreshRateLimits.RefreshRates[rateI];\r\n if ((numMarketsInView >= marketsLimit.numberOfMarkets) && (marketsLimit.rate > rateObject.rate))\r\n return marketsLimit.rate * 1000;\r\n }\r\n\r\n if ((rates.RefreshRateLimits.RefreshRates[rateI].numberOfSelections > 0) && (rates.RefreshRateLimits.RefreshRates[rateI].enabled)) {\r\n selectionsLimit = rates.RefreshRateLimits.RefreshRates[rateI];\r\n for (marketI in markets) {\r\n numSelectionsInView += markets[marketI].selections.length;\r\n }\r\n if ((numSelectionsInView >= selectionsLimit.numberOfSelections) && (selectionsLimit.rate > rateObject.rate))\r\n return selectionsLimit.rate * 1000;\r\n }\r\n }\r\n\r\n }\r\n\r\n return rateObject.rate * 1000;\r\n },\r\n\r\n // Returns URL-encoded version of the specified string\r\n urlencode: function (str) {\r\n\r\n // Bug: for characters '*' and '@', only the first instance is replaced\r\n // Bug: for space characters, the first is replaced by \"+\", the rest by \"%20\"\r\n\r\n str = escape(str);\r\n str = str.replace(/\\+/g, \"%2B\");\r\n str = str.replace('%20', '+');\r\n str = str.replace('*', '%2A');\r\n str = str.replace(/\\'/g, '%27');\r\n str = str.replace('@', '%40');\r\n return str;\r\n },\r\n\r\n marketTypeName: function (id) {\r\n var returnVal = 'Unknown';\r\n switch (id) {\r\n case 1: returnVal = 'Win'; break;\r\n case 2: returnVal = 'Place'; break;\r\n case 3: returnVal = 'Match Odds'; break;\r\n case 4: returnVal = 'OverUnder'; break;\r\n case 10: returnVal = 'AsianHandicap'; break;\r\n case 11: returnVal = 'TwoBall'; break;\r\n case 12: returnVal = 'Three Ball'; break;\r\n case 13: returnVal = ''; break;\r\n case 14: returnVal = 'Match'; break;\r\n case 15: returnVal = 'Set'; break;\r\n case 16: returnVal = 'Moneyline'; break;\r\n case 17: returnVal = 'Total'; break;\r\n case 18: returnVal = 'Handicap'; break;\r\n case 19: returnVal = 'EachWay NonHandicap'; break;\r\n case 20: returnVal = 'EachWay Handicap'; break;\r\n case 21: returnVal = 'EachWay Tournament'; break;\r\n case 22: returnVal = 'Running Ball'; break;\r\n case 23: returnVal = 'Match Betting'; break;\r\n case 24: returnVal = 'Match Betting Incl Draw'; break;\r\n case 25: returnVal = 'CorrectScore'; break;\r\n case 26: returnVal = 'HalfTime FullTime'; break;\r\n case 27: returnVal = 'Total Goals'; break;\r\n case 28: returnVal = 'Goals Scored'; break;\r\n case 29: returnVal = 'Corners'; break;\r\n case 30: returnVal = 'OddsOrEvens'; break;\r\n case 31: returnVal = 'HalfTime Result'; break;\r\n case 32: returnVal = 'HalfTime Score'; break;\r\n case 33: returnVal = 'Match Odds ExtraTime'; break;\r\n case 34: returnVal = 'Correct Score ExtraTime'; break;\r\n case 35: returnVal = 'Over Under Extra Time'; break;\r\n case 36: returnVal = 'To Qualify'; break;\r\n case 37: returnVal = 'Draw NoBet'; break;\r\n case 39: returnVal = 'Halftime AsianHcp'; break;\r\n case 40: returnVal = 'Halftime OverUnder'; break;\r\n case 41: returnVal = 'Next Goal'; break;\r\n case 42: returnVal = 'First Goalscorer'; break;\r\n case 43: returnVal = 'Last Goalscorer'; break;\r\n case 44: returnVal = 'Player To Score'; break;\r\n case 45: returnVal = 'FirstHalf Handicap'; break;\r\n case 46: returnVal = 'FirstHalf Total'; break;\r\n case 47: returnVal = 'Set Betting'; break;\r\n case 48: returnVal = 'Group Betting'; break;\r\n case 49: returnVal = 'Matchplay Single'; break;\r\n case 50: returnVal = 'Matchplay Fourball'; break;\r\n case 51: returnVal = 'Matchplay Foursome'; break;\r\n case 52: returnVal = 'Tied Match'; break;\r\n case 53: returnVal = 'Top Batsman'; break;\r\n case 54: returnVal = 'Innings Runs'; break;\r\n case 55: returnVal = 'Total Tries'; break;\r\n case 56: returnVal = 'Total Points'; break;\r\n case 57: returnVal = 'Frame Betting'; break;\r\n case 58: returnVal = 'To Score First'; break;\r\n case 59: returnVal = 'To Score Last'; break;\r\n case 60: returnVal = 'First Scoring Play'; break;\r\n case 61: returnVal = 'Last Scoring Play'; break;\r\n case 62: returnVal = 'Highest Scoring Qtr'; break;\r\n case 63: returnVal = 'RunLine'; break;\r\n case 64: returnVal = 'Round Betting'; break;\r\n default: returnVal = 'type ' + id; break;\r\n }\r\n return returnVal;\r\n\r\n },\r\n\r\n calcPnLs: function (markets, orders) {\r\n if (orders == null)\r\n orders = [];\r\n var marketTotals = []; //Array to hold total PL for each market\r\n var selectionTotals = []; //Array to hold total PL for each selection\r\n var marketTotals1 = []; //Indexed Array to hold total PL for each market\r\n var selectionTotals1 = []; //Indexed Array to hold total PL for each selection\r\n var _markets = {};\r\n for (var m = 0; m < markets.length; m++) {\r\n _markets[markets[m].marketId] = markets[m];\r\n }\r\n\r\n for (var i = 0; i < orders.length; i++) {\r\n var o = orders[i];\r\n if (marketTotals1[o.marketId()] == null) {\r\n marketTotals1[o.marketId()] = {};\r\n marketTotals1[o.marketId()].allSelectionsLosePnL = 0;\r\n }\r\n\r\n if (selectionTotals1[o.selectionId()] == null) {\r\n selectionTotals1[o.selectionId()] = {};\r\n selectionTotals1[o.selectionId()].selectionPnL = 0;\r\n selectionTotals1[o.selectionId()].selectionPnL1 = 0;\r\n selectionTotals1[o.selectionId()].selectionPnL2 = 0;\r\n selectionTotals1[o.selectionId()].selectionPnL3 = 0;\r\n }\r\n\r\n var m = _markets[o.marketId()];\r\n var polMultiple = (o.polarityId == 1) ? 1 : -1;\r\n\r\n if (![19, 20, 21].includes(m.marketTypeId)) {//not eachway\r\n\r\n marketTotals1[o.marketId()].allSelectionsLosePnL -= polMultiple * (o.matchedStake);\r\n selectionTotals1[o.selectionId()].selectionPnL += polMultiple * (o.averageMatchedPrice * o.matchedStake);\r\n selectionTotals1[o.selectionId()].selectionPnL1 += polMultiple * ((o.averageMatchedPrice - 1) * o.matchedStake);\r\n selectionTotals1[o.selectionId()].selectionPnL2 -= polMultiple * o.matchedStake;\r\n }\r\n else {\r\n var p = o.placePayout();\r\n\r\n selectionTotals1[o.selectionId()].selectionPnL1 += polMultiple * o.averageMatchedPrice * (o.matchedStake / 2);\r\n selectionTotals1[o.selectionId()].selectionPnL2 -= polMultiple * (o.averageMatchedPrice * -1) * (o.matchedStake / 2) - (o.matchedStake / 2);\r\n selectionTotals1[o.selectionId()].selectionPnL3 -= polMultiple * o.matchedStake;\r\n }\r\n }\r\n\r\n for (var marketCount in _markets) {\r\n m = _markets[marketCount];\r\n if (m.numberOfWinningSelections == 1) {\r\n // Market has only one winner\r\n\r\n // For each selection in the market, calculate P&L\r\n for (var selection in m.selections) {\r\n var s = m.selections[selection];\r\n\r\n var marketPnL = (marketTotals1[m.marketId] == null) ? 0 : marketTotals1[m.marketId].allSelectionsLosePnL;\r\n var selectionPnL = (selectionTotals1[s.selectionId] == null) ? 0 : selectionTotals1[s.selectionId].selectionPnL;\r\n\r\n selectionTotals[s.selectionId] = {};\r\n selectionTotals[s.selectionId].PnL1 = marketPnL + selectionPnL;\r\n selectionTotals[s.selectionId].PnL2 = -999999; // special value meaning there is no P&L figure\r\n selectionTotals[s.selectionId].PnL3 = -999999; // special value meaning there is no P&L figure\r\n }\r\n }\r\n else {\r\n\r\n if (![19, 20, 21].includes(m.marketTypeId)) {\r\n // number of winners not equal to 1, therefore show 2 P&L figures\r\n\r\n // For each selection in the market, calculate P&L\r\n for (selectionCount in m.selections) {\r\n var s = m.selections[selectionCount];\r\n\r\n var selectionPnL1 = (selectionTotals1[s.selectionId] == null) ? 0 : selectionTotals1[s.selectionId].selectionPnL1;\r\n var selectionPnL2 = (selectionTotals1[s.selectionId] == null) ? 0 : selectionTotals1[s.selectionId].selectionPnL2;\r\n\r\n selectionTotals[s.selectionId] = {};\r\n selectionTotals[s.selectionId].PnL1 = selectionPnL1;\r\n selectionTotals[s.selectionId].PnL2 = selectionPnL2;\r\n selectionTotals[s.selectionId].PnL3 = -999999; // special value meaning there is no P&L figure\r\n }\r\n } else {//eachway\r\n for (selectionCount in m.selections) {\r\n var s = m.selections[selectionCount];\r\n\r\n var selectionPnL1 = (selectionTotals1[s.selectionId] == null) ? 0 : selectionTotals1[s.selectionId].selectionPnL1;\r\n var selectionPnL2 = (selectionTotals1[s.selectionId] == null) ? 0 : selectionTotals1[s.selectionId].selectionPnL2;\r\n var selectionPnL3 = (selectionTotals1[s.selectionId] == null) ? 0 : selectionTotals1[s.selectionId].selectionPnL2;\r\n\r\n selectionTotals[s.selectionId] = {};\r\n selectionTotals[s.selectionId].PnL1 = selectionPnL1;\r\n selectionTotals[s.selectionId].PnL2 = selectionPnL1;\r\n selectionTotals[s.selectionId].PnL3 = selectionPnL2;\r\n }\r\n\r\n }\r\n }\r\n }\r\n return selectionTotals;\r\n },\r\n calcPushPnLs: function (markets, orders) {\r\n if (orders == null)\r\n orders = [];\r\n var marketTotals = {}; //Array to hold total PL for each market\r\n var selectionTotals = {}; //Array to hold total PL for each selection\r\n var marketTotals1 = {}; //Indexed Array to hold total PL for each market\r\n var selectionTotals1 = {}; //Indexed Array to hold total PL for each selection\r\n\r\n for (var i = 0; i < orders.length; i++) {\r\n var o = orders[i];\r\n if (marketTotals1[o.marketId()] == null) {\r\n marketTotals1[o.marketId()] = {};\r\n marketTotals1[o.marketId()].allSelectionsLosePnL = 0;\r\n }\r\n\r\n if (selectionTotals1[o.selectionId()] == null) {\r\n selectionTotals1[o.selectionId()] = {};\r\n selectionTotals1[o.selectionId()].selectionPnL = 0;\r\n selectionTotals1[o.selectionId()].selectionPnL1 = 0;\r\n selectionTotals1[o.selectionId()].selectionPnL2 = 0;\r\n }\r\n\r\n if (orders[i].polarity == 1) {\r\n marketTotals1[o.marketId()].allSelectionsLosePnL -= o.matchedStake;\r\n selectionTotals1[o.selectionId()].selectionPnL += (o.averageMatchedPrice) * o.matchedStake;\r\n selectionTotals1[o.selectionId()].selectionPnL1 += (o.averageMatchedPrice - 1) * o.matchedStake;\r\n selectionTotals1[o.selectionId()].selectionPnL2 -= o.matchedStake;\r\n } else {\r\n marketTotals1[o.marketId()].allSelectionsLosePnL += o.matchedStake;\r\n selectionTotals1[o.selectionId()].selectionPnL -= (o.averageMatchedPrice) * o.matchedStake;\r\n selectionTotals1[o.selectionId()].selectionPnL1 -= (o.averageMatchedPrice - 1) * o.matchedStake;\r\n selectionTotals1[o.selectionId()].selectionPnL2 += o.matchedStake;\r\n }\r\n }\r\n\r\n for (var marketCount in markets) {\r\n m = markets[marketCount];\r\n if (m.numberOfWinningSelections == 1) {\r\n // Market has only one winner\r\n\r\n // For each selection in the market, calculate P&L\r\n for (var selection in m.selections) {\r\n var s = m.selections[selection];\r\n\r\n var marketPnL = (marketTotals1[m.marketId] == null) ? 0 : marketTotals1[m.marketId].allSelectionsLosePnL;\r\n var selectionPnL = (selectionTotals1[s.selectionId] == null) ? 0 : selectionTotals1[s.selectionId].selectionPnL;\r\n\r\n selectionTotals[s.selectionId] = {};\r\n selectionTotals[s.selectionId].PnL1 = marketPnL + selectionPnL;\r\n selectionTotals[s.selectionId].PnL2 = -999999; // special value meaning there is no P&L figure\r\n selectionTotals[s.selectionId].PnL3 = -999999; // special value meaning there is no P&L figure\r\n }\r\n }\r\n else {\r\n // number of winners not equal to 1, therefore show 2 P&L figures\r\n\r\n // For each selection in the market, calculate P&L\r\n for (selectionCount in m.selections) {\r\n var s = m.selections[selectionCount];\r\n\r\n var marketPnL = (marketTotals1[m.marketId] == null) ? 0 : marketTotals1[m.marketId].allSelectionsLosePnL;\r\n var selectionPnL1 = (selectionTotals1[s.selectionId] == null) ? 0 : selectionTotals1[s.selectionId].selectionPnL1;\r\n var selectionPnL2 = (selectionTotals1[s.selectionId] == null) ? 0 : selectionTotals1[s.selectionId].selectionPnL2;\r\n\r\n selectionTotals[s.selectionId] = {};\r\n selectionTotals[s.selectionId].PnL1 = selectionPnL1;\r\n selectionTotals[s.selectionId].PnL2 = selectionPnL2;\r\n selectionTotals[s.selectionId].PnL3 = -999999; // special value meaning there is no P&L figure\r\n }\r\n }\r\n }\r\n return selectionTotals;\r\n },\r\n getTopDomain: function () {\r\n\r\n var domain = document.domain;\r\n var domainParts = domain.split('.');\r\n var topDomain = '';\r\n i = i;\r\n var partCount = 0;\r\n for (var i = domainParts.length - 1; i >= 0; i--) {\r\n partCount++;\r\n topDomain = domainParts[i] + '.' + topDomain;\r\n if ((partCount > 1) && (domainParts[i] !== \"co\")) break;\r\n }\r\n\r\n return topDomain.substring(0, topDomain.length - 1);\r\n },\r\n\r\n // Returns object containing text and CSS class to indicate the status of an order\r\n orderStatusName: function (order) {\r\n\r\n var statusClass = '', statusText = '';\r\n\r\n if (order.requestedStake == order.matchedStake) {\r\n\r\n statusClass = 'gep-icon-matched';\r\n statusText = gep._settings.resources.OrderStatus.Matched;\r\n\r\n } else if ((order.matchedStake == 0) && (order.orderStatusId == 3)) {\r\n\r\n statusClass = 'gep-icon-unmatched';\r\n statusText = gep._settings.resources.OrderStatus.Cancelled;\r\n\r\n } else if ((order.matchedStake > 0) && (order.orderStatusId == 3)) {\r\n\r\n statusClass = 'gep-icon-matched';\r\n statusText = gep._settings.resources.OrderStatus.Matched;\r\n\r\n } else if (order.matchedStake == 0) {\r\n\r\n statusClass = 'gep-icon-unmatched';\r\n statusText = gep._settings.resources.OrderStatus.Unmatched;\r\n\r\n } else {\r\n\r\n statusClass = 'gep-icon-partmatched';\r\n statusText = gep._settings.resources.OrderStatus.PartMatched;\r\n }\r\n\r\n return { statusClass: statusClass, statusText: statusText };\r\n\r\n },\r\n\r\n BrowserDetect: {\r\n init: function () {\r\n this.browser = this.searchString(this.dataBrowser) || \"unknown\";\r\n this.version = this.searchVersion(navigator.userAgent)\r\n || this.searchVersion(navigator.appVersion)\r\n || \"unknown\";\r\n this.OS = this.searchString(this.dataOS) || \"unknown\";\r\n this.msie = (this.browser == \"Explorer\");\r\n },\r\n\r\n searchString: function (data) {\r\n for (var i = 0; i < data.length; i++) {\r\n var dataString = data[i].string;\r\n var dataProp = data[i].prop;\r\n this.versionSearchString = data[i].versionSearch || data[i].identity;\r\n if (dataString) {\r\n if (dataString.indexOf(data[i].subString) != -1)\r\n return data[i].identity;\r\n }\r\n else if (dataProp)\r\n return data[i].identity;\r\n }\r\n },\r\n searchVersion: function (dataString) {\r\n var index = dataString.indexOf(this.versionSearchString);\r\n if (index == -1) return;\r\n\r\n if ((dataString.indexOf(\"Windows NT 6.1;\") > -1) || (dataString.indexOf(\"Windows NT 6.2;\") > -1)) {\r\n return 10;\r\n }\r\n if ((dataString.indexOf(\"Windows NT 6.3;\") > -1) || (dataString.indexOf(\"Windows NT 6.4;\") > -1)) {\r\n return 11;\r\n }\r\n return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));\r\n },\r\n dataBrowser: [\r\n {\r\n string: navigator.userAgent,\r\n subString: \"Chrome\",\r\n identity: \"Chrome\"\r\n },\r\n {\r\n string: navigator.userAgent,\r\n subString: \"OmniWeb\",\r\n versionSearch: \"OmniWeb/\",\r\n identity: \"OmniWeb\"\r\n },\r\n {\r\n string: navigator.vendor,\r\n subString: \"Apple\",\r\n identity: \"Safari\",\r\n versionSearch: \"Version\"\r\n },\r\n {\r\n prop: window.opera,\r\n identity: \"Opera\",\r\n versionSearch: \"Version\"\r\n },\r\n {\r\n string: navigator.vendor,\r\n subString: \"iCab\",\r\n identity: \"iCab\"\r\n },\r\n {\r\n string: navigator.vendor,\r\n subString: \"KDE\",\r\n identity: \"Konqueror\"\r\n },\r\n {\r\n string: navigator.userAgent,\r\n subString: \"Firefox\",\r\n identity: \"Firefox\"\r\n },\r\n {\r\n string: navigator.vendor,\r\n subString: \"Camino\",\r\n identity: \"Camino\"\r\n },\r\n {\t\t// for newer Netscapes (6+)\r\n string: navigator.userAgent,\r\n subString: \"Netscape\",\r\n identity: \"Netscape\"\r\n },\r\n {\r\n string: navigator.userAgent,\r\n subString: \"MSIE\",\r\n identity: \"Explorer\",\r\n versionSearch: \"MSIE\"\r\n },\r\n {\r\n string: navigator.userAgent,\r\n subString: \"Gecko\",\r\n identity: \"Mozilla\",\r\n versionSearch: \"rv\"\r\n },\r\n { \t\t// for older Netscapes (4-)\r\n string: navigator.userAgent,\r\n subString: \"Mozilla\",\r\n identity: \"Netscape\",\r\n versionSearch: \"Mozilla\"\r\n }\r\n ],\r\n dataOS: [\r\n { string: navigator.platform, subString: \"Win\", identity: \"Windows\" },\r\n { string: navigator.platform, subString: \"Mac\", identity: \"Mac\" },\r\n { string: navigator.userAgent, subString: \"iPad\", identity: \"iPad\" },\r\n { string: navigator.userAgent, subString: \"iPhone\", identity: \"iPhone\" },\r\n { string: navigator.userAgent, subString: \"iPod\", identity: \"iPod\" },\r\n { string: navigator.platform, subString: \"Linux\", identity: \"Linux\" },\r\n { string: navigator.userAgent, subString: \"Android\", identity: \"Android\" },\r\n { string: navigator.userAgent, subString: \"Apple-iPhone\", identity: \"Apple-iPhone\" }, //\t //iPhone, 3G or 3GS with iOS 3.x\r\n { string: navigator.userAgent, subString: \"Apple-iPhone1C2\", identity: \"Apple-iPhone1C2\" }, //\t //iPhone 3G with iOS 4.x\r\n { string: navigator.userAgent, subString: \"Apple-iPhone2C1\", identity: \"Apple-iPhone2C1\" }, //\t //iPhone 3GS with iOS 4.x\r\n { string: navigator.userAgent, subString: \"Apple-iPhone3C1\", identity: \"Apple-iPhone3C1\" }, //\t //iPhone 4\r\n { string: navigator.userAgent, subString: \"Apple-iPhone3C3\", identity: \"Apple-iPhone3C3\" }, //\t //iPhone 4 CDMA\r\n { string: navigator.userAgent, subString: \"Apple-iPhone4C1\", identity: \"Apple-iPhone4C1\" }, //\t //iPhone 4S\r\n { string: navigator.userAgent, subString: \"Apple-iPhone5C1\", identity: \"Apple-iPhone5C1\" }, //\t //iPhone 5 GSM\r\n { string: navigator.userAgent, subString: \"Apple-iPhone5C2\", identity: \"Apple-iPhone5C2\" }, //\t //iPhone 5 CDMA\r\n { string: navigator.userAgent, subString: \"OS 6_0\", identity: \"OS 6_0\" }, //\t //iPhone 5S CDMA\r\n { string: navigator.userAgent, subString: \"Apple-iPod\", identity: \"Apple-iPod\" }, //\t //iPod touch 1st, 2nd or 3rd generation with iOS 3.x\r\n { string: navigator.userAgent, subString: \"Apple-iPod2C1\", identity: \"Apple-iPod2C1\" }, //\t //iPod touch 2nd generation with iOS 4.x\r\n { string: navigator.userAgent, subString: \"Apple-iPod3C1\", identity: \"Apple-iPod3C1\" }, //\t// iPod touch 3rd generation with iOS 4.x\r\n { string: navigator.userAgent, subString: \"Apple-iPod4C1\", identity: \"Apple-iPod4C1\" }, //\t //iPod touch 4th generation\r\n { string: navigator.userAgent, subString: \"Apple-iPod5C1\", identity: \"Apple-iPod5C1\" }, //\t// iPod touch 5th generation\r\n { string: navigator.userAgent, subString: \"Apple-iPad\", identity: \"Apple-iPad\" }, //\t// iPad with iOS 3.2.x\r\n { string: navigator.userAgent, subString: \"Apple-iPad1C1\", identity: \"Apple-iPad1C1\" }, //\t //iPad with iOS 4.2.x\r\n { string: navigator.userAgent, subString: \"Apple-iPad2C1\", identity: \"Apple-iPad2C1\" }, //\t //iPad 2 WiFi\r\n { string: navigator.userAgent, subString: \"Apple-iPad2C2\", identity: \"Apple-iPad2C2\" }, //\t //iPad 2 WiFi + 3G GSM\r\n { string: navigator.userAgent, subString: \"Apple-iPad2C3\", identity: \"Apple-iPad2C3\" }, //\t //iPad 2 WiFi + 3G CDMA\r\n { string: navigator.userAgent, subString: \"Apple-iPad3C1\", identity: \"Apple-iPad3C1\" }, //\t //iPad (3rd generation) WiFi\r\n { string: navigator.userAgent, subString: \"Apple-iPad3C2\", identity: \"Apple-iPad3C2\" }, //\t// iPad (3rd generation) WiFi + 4G Verizon / International\r\n { string: navigator.userAgent, subString: \"Apple-iPad3C3\", identity: \"Apple-iPad3C3\" }//\t// iPad (3rd generation) WiFi + 4G AT&T / International\r\n\r\n\r\n ]\r\n\r\n },\r\n\r\n // Move functions such as this to exchange-specific base.js?\r\n convertToOrder: function (bet) {\r\n bet.marketId = bet.marketId();\r\n bet.marketName = bet.marketName();\r\n bet.eventClassifierFullName = bet.eventClassifierFullName();\r\n bet.eventClassifierId = bet.eventClassifierId();\r\n bet.selectionName = bet.selectionName();\r\n bet.selectionId = bet.selectionId();\r\n var order = new gec.Order(bet);\r\n order.matchingTimestamp = bet.placedAt;\r\n order.issuedAt = bet.placedAt;\r\n order.isFreeBet = bet.isFreeBet;\r\n order.expiresAt = \"7000-12-31T00:00:00+00:00\";\r\n order.isSportsbook = true;\r\n order.orderId = bet.localBetId;\r\n order.averageMatchedPrice = bet.punterPrice;\r\n order.requestedPrice = bet.punterPrice;\r\n order.orderStatusId = bet.betStatusId;\r\n order.requestedStake = bet.punterGrossAmountRequested || 0;\r\n order.matchedStake = bet.punterGrossAmountPlaced || 0;\r\n order.polarityId = bet.polarityId;\r\n order.placePayout = function () { return 0; }\r\n return order;\r\n },\r\n\r\n // Converts the properties of an object into an array (in order of the properties)\r\n convertToArray: function (input) {\r\n var output = [];\r\n for (i in input) {\r\n var item = input[i];\r\n item.name = i;\r\n output.push(item);\r\n }\r\n return output;\r\n },\r\n\r\n\r\n //get querystring parameter\r\n qs: function (key) {\r\n key = key.replace(/[*+?^$.\\[\\]{}()|\\\\\\/]/g, \"\\\\$&\"); // escape RegEx meta chars\r\n var match = location.search.match(new RegExp(\"[?&]\" + key + \"=([^&]+)(&|$)\"));\r\n return match && decodeURIComponent(match[1].replace(/\\+/g, \" \"));\r\n },\r\n\r\n formatXSP: function (sp) {\r\n /*\r\n If odds less than 10 – format will be X.XX - truncate at the third decimal place.\r\n If odds between 10 & 99 – format will be XX.X - truncate at the second decimal place.\r\n If odds greater than 99 – format will be up to XXXX -- truncate decimal places.\r\n */\r\n var nmbr = \"\", decml = \"00\", arr;\r\n if (!sp) {\r\n return \" \";\r\n }\r\n sp = sp + \"\";\r\n arr = sp.split('.');\r\n nmbr = arr[0];\r\n if (arr[1]) {\r\n decml = arr[1].substr(0, 2);\r\n if (decml.length == 1) {\r\n decml += \"0\";\r\n }\r\n }\r\n sp = sp * 1;\r\n if (sp < 10) {\r\n return nmbr + \".\" + decml;\r\n } else if (sp < 100) {\r\n return nmbr + \".\" + decml.substr(0, 1);\r\n } else if (sp > 100) {\r\n return nmbr;\r\n }\r\n },\r\n\r\n calculatePtnlReturns: function (selectedOdds, decimalOdds, stake, isEW) {\r\n var ptnlReturns = 0;\r\n if (selectedOdds === \"SP\") {\r\n ptnlReturns = \"N/A\";\r\n } else if (decimalOdds > 0) {\r\n if (isEW) {\r\n stake = stake / 2;\r\n }\r\n ptnlReturns = (stake * (decimalOdds - 1) * 1) + +(stake);\r\n }\r\n return ptnlReturns;\r\n },\r\n\r\n calculatePtnlProfit: function (selectedOdds, decimalOdds, stake, isEW) {\r\n var ptnlProfit = 0;\r\n if (selectedOdds === \"SP\") {\r\n ptnlProfit = \"N/A\";\r\n } else if (decimalOdds > 0) {\r\n if (isEW) {\r\n stake = stake / 2;\r\n }\r\n ptnlProfit = (stake * (decimalOdds - 1) * 1);\r\n }\r\n return ptnlProfit;\r\n },\r\n\r\n calcEachwayWinPrize: function (stake, fraction, decimalOdds, pol) {\r\n const sign = (pol === 1) ? 1 : -1;\r\n if (decimalOdds > 0) {\r\n return (stake * (decimalOdds - 1) + (stake * (decimalOdds - 1) * fraction)) * sign;\r\n }\r\n return 0;\r\n },\r\n\r\n calcEachwayPlacedPrize: function (stake, fraction, decimalOdds, pol) {\r\n const sign = (pol === 1) ? 1 : -1;\r\n if (decimalOdds > 0) {\r\n return ((stake * (decimalOdds - 1) * fraction) - stake) * sign;\r\n }\r\n\r\n return base.formatDecimal(0, 2, \"\", false);\r\n },\r\n\r\n calcEachwayUnPlacedPrize: function (stake, fraction, decimalOdds, pol) {\r\n const sign = (pol === 1) ? 1 : -1;\r\n if (decimalOdds > 0) {\r\n return (-stake * 2) * sign;\r\n }\r\n return base.formatDecimal(0, 2, \"\", false);\r\n },\r\n\r\n truncatePrice: function (odds, polarity) {\r\n var nmbr = \"\", arr, dcml, zeroPos = -1;\r\n if (!odds) {\r\n return 0;\r\n }\r\n odds = odds + \"\";\r\n arr = odds.split('.');\r\n nmbr = arr[0];\r\n dcml = arr[1];\r\n if (dcml) {\r\n if (dcml.length > 2) {\r\n dcml = dcml.substr(0, 2);//bets truncated, applicable to BACK bets\r\n if (polarity == 2) { //if more than 3 decimal, LAY bets are rounded up\r\n zeroPos = dcml.indexOf(\"0\"); //is the first digit 0, then prepend it later\r\n dcml = dcml * 1;\r\n if (dcml > 0) {\r\n dcml += 1;\r\n if (dcml > 99) {\r\n dcml = \"0\";\r\n nmbr++;\r\n zeroPos = -1;\r\n }\r\n if (dcml < 10 && zeroPos == 0) {\r\n dcml = \"0\" + dcml;\r\n }\r\n }\r\n }\r\n }\r\n odds = nmbr + \".\" + dcml;\r\n }\r\n return odds;\r\n },\r\n\r\n // Return element from array with property with name propertyName matching propertyValue\r\n getElementMatchingPropertyFromArray: function (array, propertyName, propertyValue) {\r\n\r\n var i;\r\n\r\n for (i = 0; i < array.length; i = i + 1) {\r\n if (array[i][propertyName] === propertyValue) {\r\n return array[i];\r\n }\r\n }\r\n\r\n return undefined;\r\n },\r\n\r\n // Return last item in a string delimited by a specific character (e.g. for \"1,4,6\" return \"6\")\r\n getLastElementInSeparatedString: function (string, separatorChar) {\r\n\r\n \"use strict\";\r\n\r\n var elements = string.split(separatorChar);\r\n\r\n if (elements.length > 0) {\r\n return elements[elements.length - 1];\r\n }\r\n\r\n return \"\";\r\n },\r\n\r\n getArrayOfTaggedValueNames: function (taggedValues) {\r\n if (!taggedValues) {\r\n return [];\r\n }\r\n\r\n return taggedValues.map(function (taggedValue) {\r\n return taggedValue.name;\r\n });\r\n },\r\n\r\n // If \"Z\" or timezone indicator is not present in string, add \"Z\" to explicitly indicate UTC\r\n explictlyMarkDateStringAsUTC: function (dateString) {\r\n\r\n // Example dateStrings\r\n // \"2018-01-31T23:00:00\"\r\n // \"2018-01-31T23:00:00Z\"\r\n // \"2018-01-31T23:00:00-05:00\"\r\n\r\n var timePart = dateString.split(\"T\")[1];\r\n\r\n // If time part does not end with \"Z\" indicating UTC,\r\n // or \"+HH:MM\" or \"-HH:MM\" indicating time zone,\r\n // then add \"Z\" to explicitly indicate UTC\r\n if (!/(Z|\\+|\\-)/i.test(timePart)) {\r\n return dateString + \"Z\";\r\n }\r\n\r\n return dateString;\r\n },\r\n\r\n // Find cards for contest that is currently active, if any.\r\n // If more than one contest currently active (which shouldn't happen),\r\n // just use the first one we find.\r\n getCardsForCurrentlyActiveContest: function (contestGTVs, now) {\r\n\r\n var contestCards = [];\r\n contestGTVs.every(function (contestGTV) {\r\n\r\n var contestDetails;\r\n\r\n try {\r\n contestDetails = JSON.parse(contestGTV.value);\r\n } catch (ex) {\r\n console.error(\"Error parsing JSON from GTV '\" + contestGTV.name + \"'\");\r\n console.error(contestGTV.value);\r\n return;\r\n }\r\n\r\n var contestStartTimeInUTC = com.globalbettingexchange.base.jsDate(\r\n com.globalbettingexchange.base.explictlyMarkDateStringAsUTC(contestDetails.startTime)\r\n );\r\n\r\n var contestEndTimeInUTC = com.globalbettingexchange.base.jsDate(\r\n com.globalbettingexchange.base.explictlyMarkDateStringAsUTC(contestDetails.endTime)\r\n );\r\n\r\n if (now.getTime() >= contestStartTimeInUTC.getTime()\r\n && now.getTime() <= contestEndTimeInUTC.getTime()) {\r\n\r\n contestCards = contestDetails.cards;\r\n return false; // exit loop\r\n }\r\n return true;\r\n });\r\n\r\n return contestCards;\r\n }\r\n};\r\n\r\ncom.globalbettingexchange.base.processGTVs = function (gtvResponse, clientSettings, partner, profile, revivers) {\r\n 'use strict';\r\n var partnerIdentifier = String.format(\"GEP.I{0}P{1}.{2}.\", partner.integrationPartnerId, partner.pseudoIntegrationPartnerId, profile),\r\n whiteLabelIdentifier = String.format(\"GEP.I{0}P{1}.{2}.{3}.\", partner.integrationPartnerId, partner.pseudoIntegrationPartnerId, profile, partner.whiteLabel || ''),\r\n whiteLabelIdentifierV2 = String.format(\"GEP.I{0}P{1}-{3}.{2}.\", partner.integrationPartnerId, partner.pseudoIntegrationPartnerId, profile, partner.whiteLabel || ''),\r\n reviver, //use to store the current reviver function to call for a GTV\r\n whiteLabelSpecificTags = {}, // used to store list of GTVs specific to a white label, these overwrite other GTVs of same name\r\n whiteLabelSpecificTagsV2 = {},\r\n modeSpecificTags = {}, // used to store GTVs specific to exchange or sportsbook\r\n tagI,\r\n s,\r\n configName,\r\n configValue,\r\n mode;\r\n\r\n partner.GEPstate = partner.GEPstate || { mode: \"exchange\" };\r\n\r\n switch (partner.GEPstate.mode) {\r\n case \"sportsbook\": mode = \"Sportsbook\"; break;\r\n case \"casino\": mode = \"Casino\"; break;\r\n case \"sportspools\": mode = \"Sportspools\"; break;\r\n case \"pages\": mode = \"Pages\"; break;\r\n case \"promotions\": mode = \"Promotions\"; break;\r\n default: mode = \"Exchange\"; break;\r\n }\r\n var modeIdentifier = String.format(\"GEP.I{0}P{1}.{2}.{3}.\", partner.integrationPartnerId, partner.pseudoIntegrationPartnerId, profile, mode),\r\n //modeIdentifierV2 = String.format(\"GEP.I{0}P{1}.{2}.{3}.\", partner.integrationPartnerId, partner.pseudoIntegrationPartnerId, profile, mode),\r\n revivers = revivers || {};\r\n\r\n if (partner.gtvIndetifier !== undefined) {\r\n mode = partner.mode;\r\n partnerIdentifier = String.format(\"{0}.{1}.\", partner.gtvIndetifier, profile);\r\n whiteLabelIdentifier = String.format(\"{0}.{1}.{2}.\", partner.gtvIndetifier, profile, partner.whiteLabel || '');\r\n whiteLabelIdentifierV2 = String.format(\"{0}-{2}.{1}.\", partner.gtvIndetifier, profile, partner.whiteLabel || '');\r\n\r\n modeIdentifier = String.format(\"{0}.{1}.{2}.\", partner.gtvIndetifier, profile, mode);\r\n }\r\n\r\n function lowercaseFirstLetter(aString) {\r\n return aString.charAt(0).toLowerCase() + aString.slice(1);\r\n }\r\n function replaceWhitelabelDomain(aString) {\r\n return aString.replace(/\\[whitelabeldomain\\]/g, partner.whitelabelDomain).replace(/\\[whitelabel\\]/g, partner.whiteLabel.toLowerCase()).replace(/\\[brokerid\\]/g, partner.brokerId);\r\n }\r\n\r\n for (tagI in gtvResponse) {\r\n if (gtvResponse.hasOwnProperty(tagI)) {\r\n configName = lowercaseFirstLetter(gtvResponse[tagI].name.replace(partnerIdentifier, \"\"));\r\n\r\n try {\r\n if (gtvResponse[tagI].value !== \"\") {\r\n\r\n var value = replaceWhitelabelDomain(gtvResponse[tagI].value);\r\n if (value === \"TRUE\" || value === \"FALSE\") {\r\n configValue = value;\r\n } else {\r\n configValue = JSON.parse(value);\r\n }\r\n } else {\r\n configValue = gtvResponse[tagI].value;\r\n }\r\n\r\n\r\n } catch (ex) {\r\n\r\n configValue = gtvResponse[tagI].value;\r\n }\r\n\r\n\r\n if (gtvResponse[tagI].name.indexOf(modeIdentifier) === 0) {\r\n configName = lowercaseFirstLetter(gtvResponse[tagI].name.replace(modeIdentifier, \"\"));\r\n modeSpecificTags[configName] = configValue;\r\n\r\n if (gtvResponse[tagI].name.indexOf(modeIdentifier + partner.whiteLabel) === 0) {\r\n configName = lowercaseFirstLetter(gtvResponse[tagI].name.replace(modeIdentifier + partner.whiteLabel, \"\"));\r\n whiteLabelSpecificTags[configName] = configValue;\r\n }\r\n\r\n\r\n } else if (gtvResponse[tagI].name.indexOf(whiteLabelIdentifier) === 0) {\r\n configName = lowercaseFirstLetter(gtvResponse[tagI].name.replace(whiteLabelIdentifier, \"\"));\r\n whiteLabelSpecificTags[configName] = configValue;\r\n\r\n if (gtvResponse[tagI].name.indexOf(whiteLabelIdentifier + mode) === 0) {\r\n configName = lowercaseFirstLetter(gtvResponse[tagI].name.replace(whiteLabelIdentifier + mode, \"\"));\r\n whiteLabelSpecificTags[configName] = configValue;\r\n\r\n }\r\n } else if (gtvResponse[tagI].name.indexOf(whiteLabelIdentifierV2) === 0) {\r\n configName = lowercaseFirstLetter(gtvResponse[tagI].name.replace(whiteLabelIdentifierV2, \"\"));\r\n\r\n var whitelabelModeKey = whiteLabelIdentifierV2 + mode + \".\";\r\n if (gtvResponse[tagI].name.indexOf(whitelabelModeKey) === 0) {\r\n configName = lowercaseFirstLetter(gtvResponse[tagI].name.replace(whitelabelModeKey, \"\"));\r\n whiteLabelSpecificTagsV2[configName] = configValue;\r\n\r\n } else {\r\n whiteLabelSpecificTagsV2[configName] = configValue;\r\n }\r\n } else {\r\n reviver = revivers[configName];\r\n reviver = revivers[configName.toLowerCase()] || reviver;//if lowercase reviver then use that\r\n\r\n if (reviver !== undefined) {\r\n configValue = reviver(configValue);\r\n }\r\n\r\n clientSettings[configName] = configValue;\r\n }\r\n }\r\n\r\n }\r\n\r\n for (s in modeSpecificTags) {\r\n if (modeSpecificTags.hasOwnProperty(s)) {\r\n clientSettings[s] = modeSpecificTags[s];\r\n }\r\n }\r\n for (s in whiteLabelSpecificTags) {\r\n if (whiteLabelSpecificTags.hasOwnProperty(s)) {\r\n clientSettings[s] = whiteLabelSpecificTags[s];\r\n }\r\n }\r\n for (s in whiteLabelSpecificTagsV2) {\r\n if (whiteLabelSpecificTagsV2.hasOwnProperty(s)) {\r\n clientSettings[s] = whiteLabelSpecificTagsV2[s];\r\n }\r\n }\r\n\r\n};\r\n\r\n\r\n// Convert specified object property from a MoneyAmount {currency, amount} to MoneyValue (simple JS Number)\r\ncom.globalbettingexchange.base.convertMoneyAmountPropertyToMoneyValue = function (object, propertyName) {\r\n if (object[propertyName] !== undefined) {\r\n object[propertyName] = object[propertyName].amount;\r\n }\r\n};\r\n\r\n\r\n(function () {\r\n if (typeof (Storage) !== \"undefined\") {\r\n com.globalbettingexchange.base.supportLS = true;\r\n }\r\n})();\r\n\r\n\r\n// Replaces \"{0}\", \"{1}\", etc. in a string with supplied arguments\r\n// Note: Only replaces maximum of two instances of a each placeholder (\"{0}\" is a placeholder)\r\nString.format = function (frmt, args) {\r\n\r\n for (var x = 0; x < arguments.length; x++) {\r\n\r\n frmt = frmt.replace(\"{\" + x + \"}\", arguments[x + 1]);\r\n frmt = frmt.replace(\"{\" + x + \"}\", arguments[x + 1]);\r\n\r\n }\r\n\r\n return frmt;\r\n}\r\n\r\n// Returns a string containing a given string repeated N times\r\nString.repeat = function (chr, count) {\r\n\r\n var str = \"\";\r\n\r\n for (var x = 0; x < count; x++) {\r\n str += chr;\r\n };\r\n\r\n return str;\r\n}\r\n\r\n// Pad the string on the left with the specified 'pad' character, to get it up to the width specified\r\nString.prototype.padL = function (width, pad) {\r\n if (!width || width < 1)\r\n return this;\r\n\r\n if (!pad) pad = \" \";\r\n var length = width - this.length\r\n if (length < 1) return this.substr(0, width);\r\n\r\n return (String.repeat(pad, length) + this).substr(0, width);\r\n}\r\n\r\nString.prototype.padR = function (width, pad) {\r\n if (!width || width < 1)\r\n return this;\r\n\r\n if (!pad) pad = \" \";\r\n var length = width - this.length\r\n if (length < 1) this.substr(0, width);\r\n\r\n return (this + String.repeat(pad, length)).substr(0, width);\r\n}\r\n\r\n// Format a date object based on a given format string\r\n// Note: Including \"Z\" in format string returns UTC time, but \"Z\" is left in the string!\r\nDate.prototype.formatDate = function (format) {\r\n var date = this;\r\n if (!format)\r\n format = \"MM/dd/yyyy\";\r\n\r\n var month = date.getMonth() + 1;\r\n var year = date.getFullYear();\r\n\r\n function getMonthName(month) {\r\n var month_names_short = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n return month_names_short[month - 1];\r\n }\r\n\r\n function getFullMonthName(month) {\r\n var month_names_short = [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December'];\r\n return month_names_short[month - 1];\r\n }\r\n\r\n if (format.indexOf(\"yyyy\") > -1)\r\n format = format.replace(\"yyyy\", year.toString());\r\n else if (format.indexOf(\"yy\") > -1)\r\n format = format.replace(\"yy\", year.toString().substr(2, 2));\r\n\r\n format = format.replace(\"dd\", date.getDate().toString().padL(2, \"0\"));\r\n var hours = date.getHours();\r\n if (format.indexOf(\"Z\") > -1)\r\n hours = date.getUTCHours();\r\n if (format.indexOf(\"t\") > -1) {\r\n if (hours > 11)\r\n format = format.replace(\"t\", \"pm\")\r\n else\r\n format = format.replace(\"t\", \"am\")\r\n }\r\n if (format.indexOf(\"HH\") > -1)\r\n format = format.replace(\"HH\", hours.toString().padL(2, \"0\"));\r\n if (format.indexOf(\"hh\") > -1) {\r\n if (hours > 12) hours -= 12;\r\n if (hours == 0) hours = 12;\r\n format = format.replace(\"hh\", hours.toString().padL(0, \"0\"));\r\n }\r\n if (format.indexOf(\"mm\") > -1)\r\n format = format.replace(\"mm\", date.getMinutes().toString().padL(2, \"0\"));\r\n if (format.indexOf(\"ss\") > -1)\r\n format = format.replace(\"ss\", date.getSeconds().toString().padL(2, \"0\"));\r\n if (format.indexOf(\"SSS\") > -1)\r\n format = format.replace(\"SSS\", date.getMilliseconds().toString().padL(3, \"0\"));\r\n\r\n format = format.replace(\"MMMM\", getFullMonthName(month));\r\n format = format.replace(\"MMM\", getMonthName(month));\r\n format = format.replace(\"MM\", month.toString().padL(2, \"0\"));\r\n\r\n return format;\r\n}\r\n\r\n// Format a date object based on a given format string\r\n// Includes additional features not in formatDate\r\n// \"SFX\" -> \"rd\", \"nd\", \"st, \"th\"\r\n// \"DDD\" -> \"Mon, \"Tue\", etc.\r\n// \"DDDD\" -> \"Monday, \"Tuesday\", etc.\r\n// \"d\" -> day of the month without padding with \"0\"s\r\nDate.prototype.formatDateEnhanced = function (format) {\r\n var date = this;\r\n\r\n function getDayName(day) {\r\n var day_names_short = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\r\n return day_names_short[day];\r\n }\r\n\r\n function getFullDayName(day) {\r\n var day_names_short = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n return day_names_short[day];\r\n }\r\n\r\n function getDateSuffix(selectedDate) {\r\n switch (selectedDate) {\r\n case 3:\r\n case 23:\r\n return \"rd\";\r\n case 2:\r\n case 22:\r\n return \"nd\";\r\n case 1:\r\n case 21:\r\n case 31:\r\n return \"st\";\r\n default:\r\n return \"th\";\r\n }\r\n }\r\n\r\n format = this.formatDate(format);\r\n\r\n var weekDay = date.getDay();\r\n\r\n format = format.replace(\"d\", date.getDate())\r\n\r\n format = format.replace(\"SFX\", getDateSuffix(date.getDate()));\r\n\r\n format = format.replace(\"DDDD\", getFullDayName(weekDay));\r\n\r\n format = format.replace(\"DDD\", getDayName(weekDay));\r\n\r\n return format;\r\n}\r\n\r\n// Add specific number of hours to given time\r\nDate.prototype.addHours = function (h) {\r\n this.setHours(this.getHours() + h);\r\n return this;\r\n}\r\n\r\n// Utility for adding a method to Function\r\nFunction.prototype.method = function (name, func) {\r\n if (!this.prototype[name]) {\r\n this.prototype[name] = func;\r\n return this;\r\n }\r\n};\r\n\r\n// Return the integer part of a number (positive or negative)\r\nNumber.method('integer', function () {\r\n return Math[this < 0 ? 'ceil' : 'floor'](this);\r\n});\r\n\r\n//var InterfaceTypes = { \"Exchange\": 1, \"Sportsbook\": 2, \"Pool\": 3, \"Tote\": 4 };\r\nwindow.ModeTypes = { \"Singles\": 1, \"Multiples\": 2, \"Sportsbook\": 3 };\r\nwindow.PriceFormatTypes = { \"Decimal\": 1, \"Fractional\": 2, \"American\": 3 };\r\n//var WalletTypes = { \"SinglePurse\": 1, \"FundsTransfer\": 2 };\r\n//var PunterTypes = { \"GIS\": 1, \"Native\": 2 };\r\n\r\nfunction dateFromISO8601(isostr) {\r\n var parts = isostr.match(/\\d+/g);\r\n if (parts[0] == \"0001\") return null;\r\n var month = parts[1] - 1;\r\n var hour = parts[3] - parts[6];\r\n return new Date(parts[0], month, parts[2], parts[3], parts[4], parts[5]);\r\n}\r\n\r\nfunction isLeapYear(year) {\r\n\r\n return (year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0));\r\n}\r\n\r\nfunction goUrl(url, width, height, new_win, name, resize, scroll, menu) {\r\n\r\n if (new_win == \"Y\") {\r\n if (resize == \"N\") {\r\n resize = \"no\";\r\n } else {\r\n resize = \"yes\";\r\n }\r\n if (scroll == \"N\") {\r\n scroll = \"no\";\r\n } else {\r\n scroll = \"yes\";\r\n }\r\n if (menu == \"Y\") {\r\n menu = \"yes\";\r\n } else {\r\n menu = \"no\";\r\n }\r\n var dimensions = \"\";\r\n if (width != \"\") {\r\n dimensions += \",width=\" + width;\r\n }\r\n if (height != \"\") {\r\n dimensions += \",height=\" + height;\r\n }\r\n if (name == \"\") {\r\n name == \"helpwin\";\r\n }\r\n var newWindow = window.open(url, name, \"scrollbars=\" + scroll + \",resizable=\" + resize + \",menubar=\" + menu + dimensions);\r\n newWindow.focus();\r\n } else {\r\n document.location.href = url;\r\n }\r\n\r\n}\r\n//get querystring parameter\r\nfunction qs(key) {\r\n key = key.replace(/[*+?^$.\\[\\]{}()|\\\\\\/]/g, \"\\\\$&\"); // escape RegEx meta chars\r\n var match = location.search.match(new RegExp(\"[?&]\" + key + \"=([^&]+)(&|$)\", 'i'));\r\n return match && decodeURIComponent(match[1].replace(/\\+/g, \" \"));\r\n}\r\n\r\n// Add com to Jest global object so it can be accessed when running Jest automated tests\r\nif (typeof global !== \"undefined\") {\r\n global.com = com;\r\n}","/* This file contains utility functions for Exchange betting, that have not yet been JSLinted */\r\n\r\n/*global\r\ncom,\r\n$\r\n*/\r\n\r\n/** returns base combination of multiples based on number of selections and also considering accumulatorThreshold.\r\n Maximum 15 selections can be added for multiple bets.\r\n * @param {Object} params\r\n * @param.selLen {Object} number of selections for multiples\r\n * @param.accumulatorThreshold {Object} accumulatorThreshold\r\n * @param.includeSeperateSingles {Object} whether to return Singles\r\n * @returns {Object} base combination\r\n */\r\ncom.globalbettingexchange.base.getMultiplesBaseCombination = function (params) {\r\n var selLen = params.selLen;\r\n var accumulatorThreshold = params.accumulatorThreshold;\r\n var i, j;\r\n var includeSeperateSingles = params.includeSeperateSingles;\r\n var multipleBaseCombination;\r\n var multiplesBaseConfig = [];\r\n\r\n multiplesBaseConfig[0] = [{\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Double\",\r\n \"count\": 1,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }];\r\n multiplesBaseConfig[1] = [{\r\n \"name\": \"Treble ({0})\",\r\n \"0name\": \"{0} Treble\",\r\n \"count\": 1,\r\n \"level\": 3,\r\n \"legs\": [3]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 3,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Trixie ({0})\",\r\n \"count\": 4,\r\n \"level\": 0,\r\n \"legs\": [2, 3]\r\n }, {\r\n \"name\": \"Patent ({0})\",\r\n \"count\": 7,\r\n \"level\": 0,\r\n \"legs\": [1, 2, 3]\r\n }];\r\n multiplesBaseConfig[2] = [{\r\n \"name\": \"Four Fold ({0})\",\r\n \"0name\": \"{0} Four Fold\",\r\n \"count\": 1,\r\n \"level\": 4,\r\n \"legs\": [4]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 6,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Treble ({0})\",\r\n \"0name\": \"{0} Trebles\",\r\n \"count\": 4,\r\n \"level\": 3,\r\n \"legs\": [3]\r\n }, {\r\n \"name\": \"Yankee ({0})\",\r\n \"count\": 11,\r\n \"level\": 0,\r\n \"legs\": [2, 3, 4]\r\n }, {\r\n \"name\": \"Lucky 15 ({0})\",\r\n \"count\": 15,\r\n \"level\": 0,\r\n \"legs\": [1, 2, 3, 4]\r\n }];\r\n multiplesBaseConfig[3] = [{\r\n \"name\": \"Five Fold ({0})\",\r\n \"0name\": \"{0} Five Fold\",\r\n \"count\": 1,\r\n \"level\": 5,\r\n \"legs\": [5]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 10,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Treble ({0})\",\r\n \"0name\": \"{0} Trebles\",\r\n \"count\": 10,\r\n \"level\": 3,\r\n \"legs\": [3]\r\n }, {\r\n \"name\": \"Four Fold ({0})\",\r\n \"0name\": \"{0} Four Folds\",\r\n \"count\": 5,\r\n \"level\": 4,\r\n \"legs\": [4]\r\n }, {\r\n \"name\": \"Super Yankee ({0})\",\r\n \"count\": 26,\r\n \"level\": 0,\r\n \"legs\": [2, 3, 4, 5]\r\n }, {\r\n \"name\": \"Lucky 31 ({0})\",\r\n \"count\": 31,\r\n \"level\": 0,\r\n \"legs\": [1, 2, 3, 4, 5]\r\n }];\r\n multiplesBaseConfig[4] = [{\r\n \"name\": \"Six Fold ({0})\",\r\n \"0name\": \"{0} Six Fold\",\r\n \"count\": 1,\r\n \"level\": 6,\r\n \"legs\": [6]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 15,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Treble ({0})\",\r\n \"0name\": \"{0} Trebles\",\r\n \"count\": 20,\r\n \"level\": 3,\r\n \"legs\": [3]\r\n }, {\r\n \"name\": \"Four Fold ({0})\",\r\n \"0name\": \"{0} Four Folds\",\r\n \"count\": 15,\r\n \"level\": 4,\r\n \"legs\": [4]\r\n }, {\r\n \"name\": \"Five Folds ({0})\",\r\n \"0name\": \"{0} Five Folds\",\r\n \"count\": 6,\r\n \"level\": 5,\r\n \"legs\": [5]\r\n }, {\r\n \"name\": \"Heinz ({0})\",\r\n \"count\": 57,\r\n \"level\": 0,\r\n \"legs\": [2, 3, 4, 5, 6]\r\n }, {\r\n \"name\": \"Lucky 63 ({0})\",\r\n \"count\": 63,\r\n \"level\": 0,\r\n \"legs\": [1, 2, 3, 4, 5, 6]\r\n }];\r\n\r\n multiplesBaseConfig[5] = [{\r\n \"name\": \"Seven Fold ({0})\",\r\n \"0name\": \"{0} Seven Fold\",\r\n \"count\": 1,\r\n \"level\": 7,\r\n \"legs\": [7]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 21,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Treble ({0})\",\r\n \"0name\": \"{0} Trebles\",\r\n \"count\": 35,\r\n \"level\": 3,\r\n \"legs\": [3]\r\n }, {\r\n \"name\": \"Four Fold ({0})\",\r\n \"0name\": \"{0} Four Folds\",\r\n \"count\": 35,\r\n \"level\": 4,\r\n \"legs\": [4]\r\n }, {\r\n \"name\": \"Five Folds ({0})\",\r\n \"0name\": \"{0} Five Folds\",\r\n \"count\": 21,\r\n \"level\": 5,\r\n \"legs\": [5]\r\n }, {\r\n \"name\": \"Six Folds ({0})\",\r\n \"0name\": \"{0} Six Folds\",\r\n \"count\": 7,\r\n \"level\": 6,\r\n \"legs\": [6]\r\n }, {\r\n \"name\": \"Super Heinz ({0})\",\r\n \"count\": 120,\r\n \"level\": 0,\r\n \"legs\": [2, 3, 4, 5, 6, 7]\r\n }];\r\n\r\n multiplesBaseConfig[6] = [{\r\n \"name\": \"Eight Fold ({0})\",\r\n \"0name\": \"{0} Eight Fold\",\r\n \"count\": 1,\r\n \"level\": 8,\r\n \"legs\": [8]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 28,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Treble ({0})\",\r\n \"0name\": \"{0} Trebles\",\r\n \"count\": 56,\r\n \"level\": 3,\r\n \"legs\": [3]\r\n }, {\r\n \"name\": \"Four Fold ({0})\",\r\n \"0name\": \"{0} Four Folds\",\r\n \"count\": 70,\r\n \"level\": 4,\r\n \"legs\": [4]\r\n }, {\r\n \"name\": \"Five Folds ({0})\",\r\n \"0name\": \"{0} Five Folds\",\r\n \"count\": 56,\r\n \"level\": 5,\r\n \"legs\": [5]\r\n }, {\r\n \"name\": \"Six Folds ({0})\",\r\n \"0name\": \"{0} Six Folds\",\r\n \"count\": 28,\r\n \"level\": 6,\r\n \"legs\": [6]\r\n }, {\r\n \"name\": \"Seven Folds ({0})\",\r\n \"0name\": \"{0} Seven Folds\",\r\n \"count\": 8,\r\n \"level\": 7,\r\n \"legs\": [7]\r\n }, {\r\n \"name\": \"Goliath ({0})\",\r\n \"count\": 247,\r\n \"level\": 0,\r\n \"legs\": [2, 3, 4, 5, 6, 7, 8]\r\n }];\r\n\r\n multiplesBaseConfig[7] = [{\r\n \"name\": \"Nine Fold ({0})\",\r\n \"0name\": \"{0} Nine Fold\",\r\n \"count\": 1,\r\n \"level\": 9,\r\n \"legs\": [9]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 36,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Treble ({0})\",\r\n \"0name\": \"{0} Trebles\",\r\n \"count\": 84,\r\n \"level\": 3,\r\n \"legs\": [3]\r\n }, {\r\n \"name\": \"Four Fold ({0})\",\r\n \"0name\": \"{0} Four Folds\",\r\n \"count\": 126,\r\n \"level\": 4,\r\n \"legs\": [4]\r\n }, {\r\n \"name\": \"Five Folds ({0})\",\r\n \"0name\": \"{0} Five Folds\",\r\n \"count\": 126,\r\n \"level\": 5,\r\n \"legs\": [5]\r\n }, {\r\n \"name\": \"Six Folds ({0})\",\r\n \"0name\": \"{0} Six Folds\",\r\n \"count\": 84,\r\n \"level\": 6,\r\n \"legs\": [6]\r\n }, {\r\n \"name\": \"Seven Folds ({0})\",\r\n \"0name\": \"{0} Seven Folds\",\r\n \"count\": 36,\r\n \"level\": 7,\r\n \"legs\": [7]\r\n }, {\r\n \"name\": \"Eight Fold ({0})\",\r\n \"0name\": \"{0} Eight Fold\",\r\n \"count\": 9,\r\n \"level\": 8,\r\n \"legs\": [8]\r\n }];\r\n\r\n multiplesBaseConfig[8] = [{\r\n \"name\": \"Ten Fold ({0})\",\r\n \"0name\": \"{0} Ten Fold\",\r\n \"count\": 1,\r\n \"level\": 10,\r\n \"legs\": [10]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 45,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Treble ({0})\",\r\n \"0name\": \"{0} Trebles\",\r\n \"count\": 120,\r\n \"level\": 3,\r\n \"legs\": [3]\r\n }, {\r\n \"name\": \"Four Fold ({0})\",\r\n \"0name\": \"{0} Four Folds\",\r\n \"count\": 210,\r\n \"level\": 4,\r\n \"legs\": [4]\r\n }, {\r\n \"name\": \"Five Folds ({0})\",\r\n \"0name\": \"{0} Five Folds\",\r\n \"count\": 252,\r\n \"level\": 5,\r\n \"legs\": [5]\r\n }, {\r\n \"name\": \"Six Folds ({0})\",\r\n \"0name\": \"{0} Six Folds\",\r\n \"count\": 210,\r\n \"level\": 6,\r\n \"legs\": [6]\r\n }, {\r\n \"name\": \"Seven Folds ({0})\",\r\n \"0name\": \"{0} Seven Folds\",\r\n \"count\": 120,\r\n \"level\": 7,\r\n \"legs\": [7]\r\n }, {\r\n \"name\": \"Eight Fold ({0})\",\r\n \"0name\": \"{0} Eight Fold\",\r\n \"count\": 45,\r\n \"level\": 8,\r\n \"legs\": [8]\r\n }, {\r\n \"name\": \"Nine Fold ({0})\",\r\n \"0name\": \"{0} Nine Fold\",\r\n \"count\": 10,\r\n \"level\": 9,\r\n \"legs\": [9]\r\n }];\r\n\r\n multiplesBaseConfig[9] = [{\r\n \"name\": \"Eleven Fold ({0})\",\r\n \"0name\": \"{0} Eleven Fold\",\r\n \"count\": 1,\r\n \"level\": 11,\r\n \"legs\": [11]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 55,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Treble ({0})\",\r\n \"0name\": \"{0} Trebles\",\r\n \"count\": 165,\r\n \"level\": 3,\r\n \"legs\": [3]\r\n }, {\r\n \"name\": \"Nine Fold ({0})\",\r\n \"0name\": \"{0} Nine Fold\",\r\n \"count\": 55,\r\n \"level\": 0,\r\n \"legs\": [9]\r\n }, {\r\n \"name\": \"Ten Fold ({0})\",\r\n \"0name\": \"{0} Ten Fold\",\r\n \"count\": 11,\r\n \"level\": 0,\r\n \"legs\": [10]\r\n }];\r\n\r\n multiplesBaseConfig[10] = [{\r\n \"name\": \"Twelve Fold ({0})\",\r\n \"0name\": \"{0} Twelve Fold\",\r\n \"count\": 1,\r\n \"level\": 12,\r\n \"legs\": [12]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 66,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Treble ({0})\",\r\n \"0name\": \"{0} Trebles\",\r\n \"count\": 220,\r\n \"level\": 3,\r\n \"legs\": [3]\r\n }, {\r\n \"name\": \"Ten Fold ({0})\",\r\n \"0name\": \"{0} Ten Fold\",\r\n \"count\": 66,\r\n \"level\": 0,\r\n \"legs\": [10]\r\n }, {\r\n \"name\": \"Eleven Fold ({0})\",\r\n \"0name\": \"{0} Eleven Fold\",\r\n \"count\": 12,\r\n \"level\": 0,\r\n \"legs\": [11]\r\n }];\r\n\r\n multiplesBaseConfig[11] = [{\r\n \"name\": \"Thirteen Fold ({0})\",\r\n \"0name\": \"{0} Thirteen Fold\",\r\n \"count\": 1,\r\n \"level\": 13,\r\n \"legs\": [13]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 78,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Eleven Fold ({0})\",\r\n \"0name\": \"{0} Eleven Fold\",\r\n \"count\": 78,\r\n \"level\": 0,\r\n \"legs\": [11]\r\n }, {\r\n \"name\": \"Twelve Fold ({0})\",\r\n \"0name\": \"{0} Twelve Fold\",\r\n \"count\": 13,\r\n \"level\": 0,\r\n \"legs\": [12]\r\n }];\r\n\r\n multiplesBaseConfig[12] = [{\r\n \"name\": \"Fourteen Fold ({0})\",\r\n \"0name\": \"{0} Fourteen Fold\",\r\n \"count\": 1,\r\n \"level\": 14,\r\n \"legs\": [14]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 91,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Twelve Fold ({0})\",\r\n \"0name\": \"{0} Twelve Fold\",\r\n \"count\": 91,\r\n \"level\": 0,\r\n \"legs\": [12]\r\n }, {\r\n \"name\": \"Thirteen Fold ({0})\",\r\n \"0name\": \"{0} Thirteen Fold\",\r\n \"count\": 14,\r\n \"level\": 0,\r\n \"legs\": [13]\r\n }];\r\n\r\n multiplesBaseConfig[13] = [{\r\n \"name\": \"Fifteen Fold ({0})\",\r\n \"0name\": \"{0} Fifteen Fold\",\r\n \"count\": 1,\r\n \"level\": 15,\r\n \"legs\": [15]\r\n }, {\r\n \"name\": \"Double ({0})\",\r\n \"0name\": \"{0} Doubles\",\r\n \"count\": 105,\r\n \"level\": 2,\r\n \"legs\": [2]\r\n }, {\r\n \"name\": \"Thirteen Fold ({0})\",\r\n \"0name\": \"{0} Thirteen Fold\",\r\n \"count\": 105,\r\n \"level\": 0,\r\n \"legs\": [13]\r\n }, {\r\n \"name\": \"Fourteen Fold ({0})\",\r\n \"0name\": \"{0} Fourteen Fold\",\r\n \"count\": 15,\r\n \"level\": 0,\r\n \"legs\": [14]\r\n }];\r\n\r\n var numbers = [\"\", \"\", \"Treble ({0})\", \"Four Fold ({0})\", \"Five Fold ({0})\", \"Six Fold ({0})\", \"Seven Fold ({0})\", \"Eight Fold ({0})\", \"Nine Fold ({0})\", \"Ten Fold ({0})\", \"Eleven Fold ({0})\", \"Twelve Fold ({0})\", \"Thirteen Fold ({0})\", \"Fourteen Fold ({0})\", \"Fifteen Fold ({0})\"];\r\n var nNumbers = [\"\", \"\", \"{0} Trebles\", \"{0} Four Folds\", \"{0} Five Folds\", \"{0} Six Folds\", \"{0} Seven Fold\", \"{0} Eight Fold\", \"{0} Nine Fold\", \"{0} Ten Fold\", \"{0} Eleven Fold\", \"{0} Twelve Fold\", \"{0} Thirteen Fold\", \"{0} Fourteen Fold\", \"{0} Fifteen Fold\"];\r\n for (i = accumulatorThreshold - 2; i < 9; i += 1) {\r\n multiplesBaseConfig[i] = [{\r\n \"name\": numbers[i + 1],\r\n \"0name\": nNumbers[i + 1],\r\n \"count\": 1,\r\n \"level\": i + 2,\r\n \"legs\": multiplesBaseConfig[i][0].legs\r\n }];\r\n }\r\n\r\n for (i = 0; i < multiplesBaseConfig.length; i += 1) {\r\n for (j = 0; j < multiplesBaseConfig[i].length; j += 1) {\r\n multiplesBaseConfig[i][j].pickedCount = multiplesBaseConfig[i][j].count;\r\n }\r\n }\r\n\r\n multipleBaseCombination = multiplesBaseConfig[selLen - 2];\r\n //add singles\r\n if (includeSeperateSingles\r\n && selLen <= 6\r\n && multipleBaseCombination.length > 1) {\r\n\r\n multipleBaseCombination.splice(1, 0, {\r\n \"name\": \"Single ({0})\",\r\n \"0name\": \"{0} Single\",\r\n \"count\": selLen,\r\n \"level\": 1,\r\n \"legs\": [1]\r\n });\r\n\r\n }\r\n return multipleBaseCombination;\r\n};\r\n\r\n/** Process bet quotations and returns quotations under appropriate combination which is conveniently\r\n used later when placing bet.\r\n * @param {Object} params\r\n * @param.multiBetSlip {Object} an object with combinations and other information which is storing the state of multiples\r\n * @param.selections {Object} selections added for multiples\r\n * @param.quotations {Object} quotations returned from RequestMultipleBetQuotation.ashx\r\n * @returns {Object} modified multiBetSlip\r\n */\r\ncom.globalbettingexchange.base.processMultipleBetQuotations = function (params) {\r\n var multiBetSlip = params.multiBetSlip,\r\n quotations = params.quotations,\r\n selections = params.selections,\r\n selLen = selections.length,\r\n qLen,\r\n quotation,\r\n combination,\r\n i,\r\n j,\r\n legWiseCompositeOdds = 0,\r\n requestedLegsCount = 0,\r\n currentLeg,\r\n len = quotations.length,\r\n combinedLen = multiBetSlip.combinations.length,\r\n bestOffer,\r\n\t\tlegWiseCombination,\r\n legWiseCombinations = multiBetSlip.legWiseCombinations,\r\n multiBetSlip = multiBetSlip,\r\n cumulativeOfferPrice = function (offers, leg) {\r\n if (offers && offers[0]) {\r\n legWiseCombinations[\"leg\" + leg].compositeOdds += offers[0].offerPrice;\r\n }\r\n },\r\n inValidLeg = false,\r\n lowestPrice,\r\n maxStake,\r\n allLowestPrice = 0;\r\n\r\n /*\r\n need to process normal combinations like double,treble etc.\r\n also need to process special combinations which is a combination of normal combinations.\r\n special combination is identified by legs requested.\r\n when more than 1 leg is requested its a special combination.\r\n\r\n state\r\n compositeOdds\r\n legWiseCompositeOdds\r\n maxStake\r\n inValidLeg\r\n */\r\n\r\n /*\r\n below loops throuh quotations and set quotations to corresponding combination.\r\n since singles combination is not displayed and its used for special combinations combinations and composite odds are also\r\n save legwise so special combinations can use it when saving.\r\n */\r\n for (i = 0; i < len; i += 1) {\r\n quotation = quotations[i];\r\n if (quotation && quotation.selections) {\r\n qLen = quotation.selections.length;\r\n quotation.cherryPicked = true;\r\n combination = null;\r\n //identify combination from its legs.\r\n for (j = 0; j < combinedLen; j += 1) {\r\n if (multiBetSlip.combinations[j].legs.length === 1) {//only normal combination\r\n if (multiBetSlip.combinations[j].legs[0] === qLen) {\r\n combination = multiBetSlip.combinations[j];\r\n break;\r\n }\r\n }\r\n }\r\n if (combination) {\r\n combination.quotations.push(quotation);\r\n }\r\n\r\n if (!legWiseCombinations[\"leg\" + qLen]) {\r\n legWiseCombinations[\"leg\" + qLen] = {\r\n \"compositeOdds\": 0,\r\n \"quotations\": [],\r\n \"inValid\": false\r\n };\r\n }\r\n legWiseCombinations[\"leg\" + qLen].quotations.push(quotation);\r\n\r\n cumulativeOfferPrice(quotation.offers, qLen);\r\n }\r\n }\r\n\r\n\r\n /*as singles are not displayed as a combination but used in special combinations\r\n need to check validity and calcualte maxstake, lowestPrice etc.*/\r\n\r\n if (legWiseCombinations.leg1) {\r\n inValidLeg = false;\r\n legWiseCompositeOdds = 0;\r\n bestOffer = {\r\n \"offerPrice\": 0,\r\n \"stake\": {\r\n \"amount\": 0\r\n }\r\n };\r\n lowestPrice = 0;\r\n for (j = 0; j < legWiseCombinations.leg1.quotations.length; j += 1) {\r\n quotation = legWiseCombinations.leg1.quotations[j];\r\n if (quotation.offers && quotation.offers[0]) {\r\n\r\n if (quotation.cherryPicked) {\r\n legWiseCompositeOdds += quotation.offers[0].offerPrice;\r\n }\r\n\r\n\r\n if (quotation.offers[0].offerPrice > bestOffer.offerPrice) {\r\n bestOffer = quotation.offers[0];\r\n }\r\n if (lowestPrice === 0 || (lowestPrice > 0 && lowestPrice > quotation.offers[0].offerPrice)) {\r\n lowestPrice = quotation.offers[0].offerPrice;\r\n }\r\n } else {\r\n inValidLeg = true;\r\n }\r\n }\r\n if (allLowestPrice === 0 || (allLowestPrice > 0 && allLowestPrice > lowestPrice)) {\r\n allLowestPrice = lowestPrice;\r\n }\r\n if (legWiseCombinations.leg1.quotations.length < selLen) {\r\n inValidLeg = true;\r\n }\r\n legWiseCombinations.leg1.inValid = inValidLeg;\r\n legWiseCombinations.leg1.maxStake = bestOffer.stake.amount;\r\n legWiseCombinations.leg1.lowestPrice = lowestPrice;\r\n }\r\n\r\n if (combinedLen > 0) {\r\n\r\n len = multiBetSlip.combinations.length;\r\n\r\n for (i = 0; i < len; i += 1) {\r\n\r\n combination = multiBetSlip.combinations[i];\r\n\r\n //if combination leg included in requested leg. assume its state to 2.\r\n\r\n requestedLegsCount = 0;\r\n for (j = 0; j < combination.legs.length; j += 1) {\r\n currentLeg = combination.legs[j];\r\n if ($.inArray(currentLeg, multiBetSlip.levelsRequested) > -1) {\r\n requestedLegsCount += 1;\r\n }\r\n }\r\n\r\n if (combination.legs.length === requestedLegsCount) {\r\n combination.state = 2;\r\n }\r\n\r\n if (combination.legs.length === 1 && combination.state === 2) {//this is normal combinations\r\n inValidLeg = false;\r\n legWiseCompositeOdds = 0;\r\n bestOffer = {\r\n \"offerPrice\": 0,\r\n \"stake\": {\r\n \"amount\": 0\r\n }\r\n };\r\n lowestPrice = 0;\r\n for (j = 0; j < combination.quotations.length; j += 1) {\r\n quotation = combination.quotations[j];\r\n if (quotation.offers && quotation.offers[0]) {\r\n\r\n if (quotation.cherryPicked) {\r\n legWiseCompositeOdds += quotation.offers[0].offerPrice;\r\n }\r\n\r\n\r\n if (quotation.offers[0].offerPrice > bestOffer.offerPrice) {\r\n bestOffer = quotation.offers[0];\r\n }\r\n if (lowestPrice === 0 || (lowestPrice > 0 && lowestPrice > quotation.offers[0].offerPrice)) {\r\n lowestPrice = quotation.offers[0].offerPrice;\r\n }\r\n } else {\r\n inValidLeg = true;\r\n }\r\n }\r\n if (allLowestPrice === 0 || (allLowestPrice > 0 && allLowestPrice > lowestPrice)) {\r\n allLowestPrice = lowestPrice;\r\n }\r\n if (combination.count > combination.quotations.length) {\r\n inValidLeg = true;\r\n }\r\n combination.inValid = inValidLeg;\r\n combination.maxStake = bestOffer.stake.amount;\r\n combination.compositeOdds = legWiseCompositeOdds;\r\n combination.isDisabled = false;\r\n combination.lowestPrice = lowestPrice;\r\n //in case no ofeers returned\r\n if (!legWiseCombinations[\"leg\" + combination.legs[0]]) {\r\n legWiseCombinations[\"leg\" + combination.legs[0]] = {\r\n \"compositeOdds\": 0,\r\n \"quotations\": [],\r\n \"inValid\": false\r\n };\r\n }\r\n\r\n legWiseCombinations[\"leg\" + combination.legs[0]].inValid = inValidLeg;\r\n legWiseCombinations[\"leg\" + combination.legs[0]].maxStake = combination.maxStake;\r\n legWiseCombinations[\"leg\" + combination.legs[0]].lowestPrice = combination.lowestPrice;\r\n } else {//special combination\r\n //state\r\n //check if all levels under this combination is requested for combinations and returned.\r\n requestedLegsCount = 0;\r\n legWiseCompositeOdds = 0;\r\n inValidLeg = false;\r\n maxStake = 0;\r\n lowestPrice = 0;\r\n\r\n for (j = 0; j < combination.legs.length; j += 1) {\r\n currentLeg = combination.legs[j];\r\n if ($.inArray(currentLeg, multiBetSlip.levelsRequested) > -1) {\r\n requestedLegsCount += 1;\r\n legWiseCombination = multiBetSlip.legWiseCombinations[\"leg\" + currentLeg];\r\n legWiseCompositeOdds += legWiseCombination ? legWiseCombination.compositeOdds : 0;\r\n //if atleast one leg is invalid it invalidates the whole combination\r\n if (!legWiseCombination || multiBetSlip.legWiseCombinations[\"leg\" + currentLeg].inValid) {\r\n inValidLeg = true;\r\n }\r\n if (legWiseCombination && multiBetSlip.legWiseCombinations[\"leg\" + currentLeg].maxStake > maxStake) {\r\n maxStake = multiBetSlip.legWiseCombinations[\"leg\" + currentLeg].maxStake;\r\n }\r\n if (legWiseCombination && lowestPrice === 0 || (lowestPrice > 0 && multiBetSlip.legWiseCombinations[\"leg\" + currentLeg].lowestPrice < lowestPrice)) {\r\n lowestPrice = multiBetSlip.legWiseCombinations[\"leg\" + currentLeg].lowestPrice;\r\n }\r\n }\r\n }\r\n if (combination.legs.length === requestedLegsCount) {\r\n combination.state = 2;\r\n combination.compositeOdds = legWiseCompositeOdds;\r\n combination.maxStake = maxStake;\r\n combination.lowestPrice = lowestPrice;\r\n\r\n if (inValidLeg) {\r\n combination.inValid = inValidLeg;\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n return multiBetSlip;\r\n};\r\n"],"names":["__webpack_require__","g","globalThis","this","Function","e","window","com","_typeof","globalbettingexchange","base","inArray","value","array","indexOf","trimString","str","trim","clone","obj","Object","prototype","toString","apply","slice","cloned","prop","hasOwnProperty","extend","obj1","obj2","result","key","localStorage","name","supportLS","setCookie","getCookie","createUUID","b","a","x","Math","random","replace","log","data","console","status","GBEFormatter","state","currentState","formatCurrency","amt","decimals","showCommas","max","num","isNaN","min","formatDecimal","formatNumber","formattedAmount","className","String","format","formatNumberParentheses","substring","currencySymbol","ccSymbol","OddsLadder","prices","_reIndex","newprices","that","priceArray","hashPriceArray","hashRepresentationArray","i","length","price","representation","hashArray","p","r","getPercentage","parseFloat","arr","split","num1","num2","toFixed","getItem","reIndex","band","decimalPrice","direction","showRelative","isMultiple","mustBand","above","below","delta","nextItem","isDecimal","multipleDecimal","removeTrailingZeros","high","low","mid","parseInt","abs","offLadderDecimal","returnPriceArray","step","getFromRepresentation","getFromDecimal","decimalValue","number","places","showZeros","round","numberStr","addCommas","decimalIndex","decPos","first","second","charAt","getFunctionName","funct","ownName","substr","x1","x2","rgx","test","parseFromSelectionBlurb","itemName","blurb","namePosition","valuePosition","endValuePosition","preventBubble","event","cancelBubble","stopPropagation","getCurrencySymbol","code","symbol","undefined","getMinimumStake","EUR","GBP","INR","USD","RMB","SGD","MYR","VND","THB","IDR","KRW","HKD","minimumStake","clientObject","minimumStakes","currency","getOverRound","marketObj","forExchange","forOverround","againstOverround","selCount","selections","selectionStatusId","forExchangePrices","againstExchangePrices","getSubscribedOverround","selectionIndex","oddsladder","thisSubscribedSelection","selectionId","backPrices","displayPrice","priceObj","layPrices","getUIDate","dateObject","newDate","Date","year","getFullYear","month","getMonth","day","getDate","jsDate","utc","d","_year","_month","_day","_datepart","_timePart","_hours","_minutes","_seconds","_milliseconds","_zoneDiff","match","_temp","lastIndexOf","join","getDay","setMilliseconds","getTimezoneOffset","getTime","c_name","expiredays","sameSite","exdate","domain","getTopDomain","setTime","expiry","toGMTString","sameSiteFlag","document","cookie","escape","ex","warn","c_start","c_end","unescape","deleteCookie","setDate","y","getYear","getEventName","fullName","getTopLevelEvent","ev","parent","getParent","isDescendantOf","ar","eventClassifierId","isDescendantOfObject","hasAncestor","node","ancestor","getEventLevel","toPropArray","newAr","toArrayFromIndex","push","toTitleCase","txt","toUpperCase","toLowerCase","getRefreshRate","markets","forLoggedInUser","rates","market","startTime","forInRunningMarketOnly","currentTime","diffMinutes","rateObject","refreshI","isCurrentlyInRunning","rate","from","to","RefreshRates","RefreshRateLimits","enabled","numMarketsInView","selectionsLimit","marketsLimit","numSelectionsInView","rateI","numberOfMarkets","numberOfSelections","marketI","urlencode","marketTypeName","id","returnVal","calcPnLs","orders","selectionTotals","marketTotals1","selectionTotals1","_markets","m","marketId","o","allSelectionsLosePnL","selectionPnL","selectionPnL1","selectionPnL2","selectionPnL3","polMultiple","polarityId","includes","marketTypeId","placePayout","averageMatchedPrice","matchedStake","marketCount","numberOfWinningSelections","selection","s","marketPnL","PnL1","PnL2","PnL3","selectionCount","calcPushPnLs","polarity","domainParts","topDomain","partCount","orderStatusName","order","statusClass","statusText","requestedStake","gep","_settings","resources","OrderStatus","Matched","orderStatusId","Cancelled","Unmatched","PartMatched","BrowserDetect","init","browser","searchString","dataBrowser","version","searchVersion","navigator","userAgent","appVersion","OS","dataOS","msie","dataString","string","dataProp","versionSearchString","versionSearch","identity","subString","index","vendor","opera","platform","convertToOrder","bet","marketName","eventClassifierFullName","selectionName","gec","Order","matchingTimestamp","placedAt","issuedAt","isFreeBet","expiresAt","isSportsbook","orderId","localBetId","punterPrice","requestedPrice","betStatusId","punterGrossAmountRequested","punterGrossAmountPlaced","convertToArray","input","output","item","qs","location","search","RegExp","decodeURIComponent","formatXSP","sp","nmbr","decml","calculatePtnlReturns","selectedOdds","decimalOdds","stake","isEW","ptnlReturns","calculatePtnlProfit","ptnlProfit","calcEachwayWinPrize","fraction","pol","calcEachwayPlacedPrize","calcEachwayUnPlacedPrize","truncatePrice","odds","dcml","zeroPos","getElementMatchingPropertyFromArray","propertyName","propertyValue","getLastElementInSeparatedString","separatorChar","elements","getArrayOfTaggedValueNames","taggedValues","map","taggedValue","explictlyMarkDateStringAsUTC","dateString","timePart","getCardsForCurrentlyActiveContest","contestGTVs","now","contestCards","every","contestGTV","contestDetails","JSON","parse","error","contestStartTimeInUTC","contestEndTimeInUTC","endTime","cards","processGTVs","gtvResponse","clientSettings","partner","profile","revivers","reviver","tagI","configName","configValue","mode","partnerIdentifier","integrationPartnerId","pseudoIntegrationPartnerId","whiteLabelIdentifier","whiteLabel","whiteLabelIdentifierV2","whiteLabelSpecificTags","whiteLabelSpecificTagsV2","modeSpecificTags","GEPstate","modeIdentifier","lowercaseFirstLetter","aString","gtvIndetifier","whitelabelDomain","brokerId","whitelabelModeKey","convertMoneyAmountPropertyToMoneyValue","object","amount","Storage","frmt","args","arguments","repeat","chr","count","padL","width","pad","padR","formatDate","date","hours","getHours","getUTCHours","getMinutes","getSeconds","getMilliseconds","getFullMonthName","getMonthName","formatDateEnhanced","weekDay","selectedDate","getDateSuffix","addHours","h","setHours","method","func","Number","ModeTypes","PriceFormatTypes","global","getMultiplesBaseCombination","params","j","multipleBaseCombination","selLen","accumulatorThreshold","includeSeperateSingles","multiplesBaseConfig","numbers","nNumbers","legs","pickedCount","splice","processMultipleBetQuotations","qLen","quotation","combination","currentLeg","bestOffer","legWiseCombination","lowestPrice","maxStake","offers","leg","multiBetSlip","quotations","legWiseCompositeOdds","requestedLegsCount","len","combinedLen","combinations","legWiseCombinations","inValidLeg","allLowestPrice","cherryPicked","compositeOdds","offerPrice","leg1","inValid","$","levelsRequested","isDisabled"],"sourceRoot":""}