var maxSlips = 1000; var combinationInterfaces = new Array(); var couldSend = false; var existingOrder = new Array(); existingOrder["false"] = 0; existingOrder["event"] = 1; existingOrder["market"] = 2; existingOrder["outcome"] = 3; function setExisting(val,newVal,existingIfc,newIfc) { if(existingOrder[newVal] > existingOrder[val]) { existingIfc.value = newIfc; return newVal; } return val; } function clickCombi(combi, isScanner) { var existing = "false"; var existingIfc = new Object(); for(var i in combinationInterfaces) { var cIfc = combinationInterfaces[i]; if(getNodeContent(cIfc.access.eventId) == combi.eventId) { existing = setExisting(existing,"event",existingIfc,cIfc); if(getNodeContent(cIfc.access.outcomeId) == combi.outcomeId) existing = setExisting(existing,"outcome",existingIfc,cIfc); else if(getNodeContent(cIfc.access.marketId) == combi.marketId) existing = setExisting(existing,"market",existingIfc,cIfc); } } if(existing == "outcome") { if(isScanner) alert(message_scanner_doubleOutcome.replace(/%%/,combi.marketName)); else removeCombination(existingIfc.value); } else if(existing == "market") { existing = "false"; } else if(existing == "event") { if(confirm(message_confirm_overwrite.replace(/%%/,combi.marketName) )) { _doRemove(existingIfc.value,false); existing = "false"; } } if(existing=="false") { addCombination(combi); } calcCombiProfit(); } function reReadSlip() { for (var interfaceId in combinationInterfaces) { var ifc = combinationInterfaces[interfaceId]; var sourceElem = parent.overview.document.getElementById('table_' + getNodeContent(ifc.access.marketId) + '_' + getNodeContent(ifc.access.outcomeId)); if(sourceElem) { ifc.loadSource(sourceElem); paintedClicked(getNodeContent(ifc.access.eventId)); } } } function paintedClicked(eventId) { var aIfc = multiEventLists[eventId]; if(aIfc) for(var i=0;i < aIfc.length;i++) if(aIfc[i].sourcenode) { try { aIfc[i].sourcenode.className = multiEvents[eventId]>1 ? 'clickedMultiCombi' : 'clickedCombi'; } catch(e) {} } } function addCombination(combi) { var sourceElem = parent.overview.document.getElementById('table_' + combi.marketId + '_' + combi.outcomeId); var ifc = new Interface("combinationBets", "combinationTemplate", sourceElem, combinationInterfaces); cNode(ifc.access.marketId, combi.marketId); cNode(ifc.access.eventId, combi.eventId); cNode(ifc.access.outcomeId, combi.outcomeId); cNode(ifc.access.odds, combi.odds); cNode(ifc.access.oddsFloat, combi.oddsFloat); cNode(ifc.access.outcomeName, combi.outcomeName); cNode(ifc.access.marketName, combi.marketName); cNode(ifc.access.marketStart, combi.marketStart); cNode(ifc.access.eventShortcut, combi.eventShortcut); cNode(ifc.access.betType, combi.betType); cNode(ifc.access.expected, combi.expected); ifc.access.formField.name = 'odds('+ getNodeContent(ifc.access.outcomeId) +')'; ifc.access.formField.value = getNodeContent(ifc.access.odds); ifc.access.bankField.name = 'bank('+ getNodeContent(ifc.access.outcomeId) +')'; ifc.access.bank.style.visibility = (boolShowBank||isShop) ? "visible" : "hidden"; setBank(ifc,combi.bank?"true":"false"); checkMultiPath(); if(sourceElem) paintedClicked(combi.eventId); showSlip(); renderSystem(); } var multiEvents; var multiEventLists; var hasMultis; function fillMultiArrays() { multiEvents = new Array(); multiEventLists = new Array(); hasMultis = false; for (var interfaceId in combinationInterfaces) { var ifc = combinationInterfaces[interfaceId]; var eventId = ""+getNodeContent(ifc.access.eventId); if(multiEvents[eventId]==null) multiEvents[eventId] = 0; multiEvents[eventId]++; if(multiEvents[eventId]>=2) hasMultis = true; if(typeof(multiEventLists[eventId])=='undefined') multiEventLists[eventId] = new Array(); multiEventLists[eventId].push(ifc); } } function checkMultiPath() { fillMultiArrays(); // cleanup design for (var interfaceId in combinationInterfaces) { var ifc = combinationInterfaces[interfaceId]; ifc.access.borderRow.style.display=(document.all?"block":"table-row"); ifc.access.eventRow.style.display="block"; ifc.access.removeMulti.style.display="none"; } if(hasMultis) { setDisplay("multiPathHelp", (document.all?"block":"table-row") ); for (var eventId in multiEventLists) { if(multiEvents[eventId]<2) { continue; } var eventArray = multiEventLists[eventId]; var ifc = eventArray[0]; ifc.access.removeMulti.style.display=(document.all?"inline":"table-cell"); for(var i=1;i < eventArray.length;i++) { var ifc2 = eventArray[i]; ifc2.moveTo(ifc); ifc2.access.borderRow.style.display="none"; ifc2.access.eventRow.style.display="none"; ifc2.access.removeMulti.style.display=(document.all?"inline":"table-cell"); } } } else { setDisplay("multiPathHelp", "none"); } } function removeCombination(ifc) { try { ifc.sourcenode.className='unclickedCombi'; } catch (exception) { } var eventId = getNodeContent(ifc.access.eventId); ifc.remove(); checkMultiPath(); paintedClicked(eventId); showSlip(); renderSystem(); } function removeAll() { lastSystem = 0; if(document.getElementById('messageScanner')) { document.getElementById('messageScanner').style.display='none'; document.getElementById('errorScanner').style.display='none'; } for (var interfaceId in combinationInterfaces) { removeCombination(combinationInterfaces[interfaceId]); } renderSystem(); } function doRemove(el,onlyOutcome) { _doRemove(getInterface(el),onlyOutcome); } function _doRemove(ifc,onlyOutcome) { if(hasMultis&&!onlyOutcome) { var aIfc = multiEventLists[getNodeContent(ifc.access.eventId)]; for(var i=0;i < aIfc.length;i++) removeCombination(aIfc[i]); } else { removeCombination(ifc); } calcCombiProfit(); } function sum(a) { var sum = 0; for(var e in a) sum += a[e]; return sum; } function product(a) { var product = 1; for(var e in a) product *= a[e]; return product; } function calcPathOdds(s, a, valueArray, stake, bankOdds, aTmpPrevios, results) { if (typeof(valueArray)!='undefined' && typeof(valueArray[a[s]])!='undefined') { for(var i=0;i < valueArray[a[s]].length;i++) { var aTmp = aTmpPrevios.slice(0); aTmp.push(valueArray[a[s]][i]); if(s+1==a.length) { slipOdds = parseFloat( (product(aTmp)*bankOdds).toFixed(2) ); results.odds.push(slipOdds); results.profit.push(parseFloat( (slipOdds * stake).toFixed(2) )); } else { calcPathOdds(s+1, a, valueArray, stake, bankOdds, aTmp, results); } } } } function SystemCalculation(fn) { this.step = fn; this.calculate = function(s, aReady, permutations, valueArray, cumulated) { if(aReady.length==permutations) { this.step(aReady, valueArray, cumulated); } else { for(var i=s+1 ; i < valueArray.length && i <= valueArray.length - permutations + s + 1 ; i++) { var newArray = new Array(aReady.length+1); for(var c=0;c < aReady.length;c++) { newArray[c] = aReady[c]; } newArray[aReady.length] = i; this.calculate(i, newArray, permutations, valueArray, cumulated); } } } } function multiSystemOddsAndProfit(aMulti, bankOdds, p, stake) { var results = { "odds": [], "profit": [] }; if(p==0) { var a = new Array(aMulti.length); for(var i=0;i < aMulti.length;i++) a[i]=i; calcPathOdds(0, a, aMulti, stake, bankOdds, [], results); } else new SystemCalculation(function (a, valueArray, cumulated) { calcPathOdds(0, a, valueArray, stake, bankOdds, [], cumulated); }).calculate(-1 , [], p, aMulti, results); return { "odds": parseFloat(sum(results.odds).toFixed(2)), "profit": parseFloat(sum(results.profit).toFixed(2)) }; } function sortNumbers(a, b) { return a - b; } function elemToOdds(aElems,arr) { var a = new Array( Math.min( parseInt(getNodeContent(aElems[0].access.expected)), aElems.length ) ); for(var j=0;j < a.length;j++) a[j] = 0.0; for(var i=0;i < aElems.length;i++) { var odds = parseFloat(getNodeContent(aElems[i].access.oddsFloat)); for(var j=0;j < a.length;j++) { if(odds>=a[j]) { a[j] = odds; a.sort(sortNumbers); break; } } } arr.push(a); } function calcOdds(stake) { fillMultiArrays(); var aMulti = new Array(); var aMultiBank = new Array(); for(eventId in multiEvents) { elemToOdds(multiEventLists[eventId], (multiEventLists[eventId][0].access.bankField.value=="false")?aMulti:aMultiBank); } var oddsAndProfit = multiSystemOddsAndProfit(aMulti, product(aMultiBank), lastSystem - aMultiBank.length, stake); var el = document.getElementById("combinationOdds"); if(limit["minOdds"]!=null && oddsAndProfit.odds < limit["minOdds"]) { cNode("combinationOdds",message_min_odds); el.style.color = errorcolor; oddsAndProfit.odds = Number.NEGATIVE_INFINITY; return oddsAndProfit; } if(limit["maxOdds"]!=null && oddsAndProfit.odds > limit["maxOdds"]) { cNode("combinationOdds",message_max_odds); el.style.color = errorcolor; oddsAndProfit.odds = Number.POSITIVE_INFINITY; return oddsAndProfit; } el.style.color = "#000000"; cNode("combinationOdds",""+ oddsAndProfit.odds.toFixed(2)); return oddsAndProfit; } function checkStake() { var el = document.getElementById('combiStake'); var message=false; if(el.value.match(/,/)) el.value = el.value.replace(/,/,'.'); var nstake = (parseFloat(el.value)).toFixed(2); if(isNaN(el.value)) { message = message_invalid_stake; } else if( (limit["minStake"]!=null && nstake < limit["minStake"]) || el.value<=0) { message = message_min_stake; } else if(limit["maxStake"]!=null&&limit["maxStake"]!=0 && nstake>limit["maxStake"]) { message = message_max_stake; } if(typeof(message)=='string') { el.style.color = errorcolor; showPlaceButton(false, message); } else el.style.color = "#000000"; return message==false; } function changeStake(dir) { var stakeEl = document.getElementById('combiStake'); var stake = parseInt(stakeEl.value.indexOf('.')==0 ? '0'+stakeEl.value : stakeEl.value); var exp = (""+stake).length-2; var nstake; if(exp>=0) { if (stake < stakeEl.value && dir==-1) stake++; if(dir==1) nstake = Math.ceil(stake/Math.pow(10,exp))*Math.pow(10,exp); else nstake = Math.floor(stake/Math.pow(10,exp))*Math.pow(10,exp); if(nstake==stake) { if(stake==Math.pow(10,exp+1)&&dir==-1) exp--; if(exp<0) exp=0; nstake = dir*Math.pow(10,exp)+nstake; } } else { stake = parseFloat(stakeEl.value); if((stake<=1&&dir==-1)||(stake<1&&dir==1)) nstake=(stake+(dir*0.1)).toPrecision(2); else nstake=(stake+dir).toPrecision(2); } if(nstake<0) nstake = 0; stakeEl.value = nstake; calcCombiProfit(); } function getStake() { var stake = 0; if (checkStake()) { stake = document.getElementById('combiStake').value; } return parseFloat(stake); } function calcCombiProfit() { var stake = getStake(); if(stake==0) return; var oddsAndProfit = calcOdds(stake); var odds = oddsAndProfit.odds; var profit = oddsAndProfit.profit; if(isFinite(odds)) { cNode("combinationProfit",""+ profit.toFixed(2)); if (limit["maxWin"]!=null && profit > limit["maxWin"]) { document.getElementById("combinationProfit").style.color=errorcolor; showPlaceButton(false, message_max_winnings); } else { document.getElementById("combinationProfit").style.color="#000000"; showPlaceButton(true); } } else { validSlip(false, odds==Number.NEGATIVE_INFINITY ? message_min_odds : message_max_odds); } var cNb = getCountBank(); var count = cNb[0]; // MYBET-1042 // !hasMultis neu hinzugefuegt: if(!system && !hasMultis) { slcount = 1; } else if(hasMultis && lastSystem > 0) { slcount = multiBetsCount(lastSystem - cNb[1]); } else if (hasMultis) { slcount = multiBetsCount(count); } else { slcount = combiCount; } var totalStake = (stake * slcount).toFixed(2); if(lastSystem>0 || hasMultis || !system) cNode("totalStake", totalStake); var numberOfTips = lastSystem || count; setDisplay("absoluteStakeRow", "none"); setDisplay("billingstake210Row", "none"); setDisplay("billingstake211Row", "none"); setDisplay("billingstake212Row", "none"); setDisplay("billingstake213Row", "none"); setDisplay("absoluteProfitRow", "none"); setDisplay("billingprofit210Row", "none"); setDisplay("billingprofit211Row", "none"); setDisplay("billingprofit212Row", "none"); if(isValidSlip) { var aSystemOdds = []; for(var eventId in multiEventLists) { var minOddsInMarket = Number.MAX_VALUE; for(var i = 0; i < multiEventLists[eventId].length; i++) { var marketOdds = parseFloat(getNodeContent(multiEventLists[eventId][i].access.oddsFloat)); minOddsInMarket = Math.min(minOddsInMarket, marketOdds); } aSystemOdds.push(minOddsInMarket); } if(typeof stakeCalculator != 'undefined') { var tollsTax = stakeCalculator.calculate(totalStake, numberOfTips, aSystemOdds); setDisplay("absoluteStakeRow", document.all?"block":"table-row"); cNode("absoluteStakeResult", tollsTax.result); for(var type in tollsTax.results) { if(!isShop && type == 213) continue; cNode("billingstake"+type+"Value", tollsTax.values[type]) cNode("billingstake"+type+"Result", tollsTax.results[type]); setDisplay("billingstake"+type+"Row", document.all?"block":"table-row"); } } if(typeof profitCalculator != 'undefined') { var tollsTax = profitCalculator.calculate(profit, numberOfTips, aSystemOdds); setDisplay("absoluteProfitRow", document.all?"block":"table-row"); cNode("absoluteProfitResult", tollsTax.result); for(var type in tollsTax.results) { cNode("billingprofit"+type+"Value", tollsTax.values[type]) cNode("billingprofit"+type+"Result", tollsTax.results[type]); setDisplay("billingprofit"+type+"Row", document.all?"block":"table-row"); } } } cNode("titleStake" ,titleStake [ (lastSystem==0 && !hasMultis) ? 0 : 1 ]); cNode("titleProfit",titleProfit[ (lastSystem==0 && !hasMultis) ? 0 : 1 ]); setDisplay("totalStakeRow", (lastSystem!=0||hasMultis)&&isValidSlip ? (document.all?"block":"table-row") : "none"); setDisplay("oddsRow", (lastSystem==0 && !hasMultis && isValidSlip) ? (document.all?"block":"table-row") : "none"); } function showSlip() { for (var interfaceId in combinationInterfaces) { setDisplay("combinationSlip","block"); setDisplay("helpBox","none"); return; } setDisplay("combinationSlip","none"); setDisplay("helpBox","block"); } function clearOverview(shop) { if(shop && parent.overview) { for (var interfaceId in combinationInterfaces) { ifc = combinationInterfaces[interfaceId]; try { ifc.sourcenode.className='unclickedCombi'; } catch (exception) { } } } } var allreadySended = false; function sendForm(shop) { if(couldSend && !allreadySended) { clearOverview(shop); allreadySended = true; return true; } else { return false; } } var system = false; var systemInputs; function showSystem(show) { var tmpShowBank = boolShowBank; if(!show) showBank(false); if(show && boolShowBank) showBank(true); boolShowBank = tmpShowBank; setClass("combiMenuCombi", show?"combiMenuInactive":"combiMenuActive" ); setClass("combiMenuSystem", show?"combiMenuActive":"combiMenuInactive" ); setDisplay("showBankRow", show ? "block" : "none"); setDisplay("showBankRowHelp", !show ? "block" : "none"); system = show; //setDisplay("oddsRow", show ? "none" : (document.all?"block":"table-row")) ; setDisplay("oddsRow", (document.all?"block":"table-row")) ; if(!show) lastSystem = 0; renderSystem(); //rg } var boolShowBank = false; function showBank(show) { boolShowBank = show; var checkbox = document.getElementById("showBankCheckbox"); if(checkbox) checkbox.checked = show; for (var interfaceId in combinationInterfaces) { ifc = combinationInterfaces[interfaceId]; ifc.access.bank.style.visibility = show ? "visible" : "hidden"; if(!show) { setBank(ifc,"false") } } } function getCountBank() { var ret = new Array(0,0,0,0); for(var a in multiEventLists) { ret[0]++; ret[3]+=multiEvents[a]; if(multiEventLists[a][0].access.bankField.value=="true") ret[1]++; else ret[2]++; } return ret; } function multiSystemCount(aMulti, p) { var count = new Object; count.value = 0; new SystemCalculation(function (a, valueArray, cumulated) { var start = 1; for(var i=0;i < a.length;i++) { start*= valueArray[a[i]]; } cumulated.value += start; } ).calculate(-1 , new Array(), p, aMulti, count); return count.value; } function multiBetsCount(k) { var aMulti = new Array(); var aMultiBank = new Array(); var n = 0; for(eventId in multiEvents) { var aIfc = multiEventLists[eventId]; if(multiEvents[eventId]<2) { if(aIfc[0].access.bankField.value=="false") n++; continue; } if(aIfc[0].access.bankField.value=="false") aMulti[aMulti.length] = multiEvents[eventId]; else aMultiBank[aMultiBank.length] = multiEvents[eventId]; } var count = 0; for(var i=0;i<=k;i++) { count+=binom(n,i)*multiSystemCount(aMulti,k-i); } return count*multiSystemCount(aMultiBank,aMultiBank.length); } var systemTemplates = new Array(); var lastSystem = 0; var isValidSlip = false; var combiCount = 1; function renderSystem() { var cNb = getCountBank(); var count = cNb[0]; cNode("systemEnter",""); if(system) { setDisplay("systemRow", document.all?"block":"table-row") ; var bank = cNb[1]; for(var a in systemTemplates) systemTemplates[a].remove(); var start = Math.max( (limit["minSystem"]!=null ? limit["minSystem"] : 1) - bank, 1 ); var end = (limit["maxSystem"]!=null ? Math.min(limit["maxSystem"] + 1, count) : count) - bank if(!isShop && limit["minBets"]!=null && count < limit["minBets"]) { cNode("systemEnter",message_not_enough_bets); validSlip(false, message_invalid_slip); } else if(limit["maxSystem"]!=null && lastSystem > limit["maxSystem"] && lastSystem!=0) { cNode("systemEnter",message_system_too_high); validSlip(false, message_invalid_slip); } else if(!isShop && end <= start) { cNode("systemEnter",message_system_too_low); validSlip(false, message_invalid_slip); } else { if(bank==0) { var tmpl = new Template("systemEnter", "systemSelectorTemplate", systemTemplates); cNode(tmpl.template.radio,0); cNode(tmpl.template.text, hasMultis ? (multiPathCombiBet+" ("+ multiBetsCount(end) + " " + titleBets + ") ") : standardCombiBet); } for(var i=start ; i < end; i++) { var numOfBets = (hasMultis) ? multiBetsCount(i) : binom(count - bank, i); if (numOfBets <= maxSlips) { var tmpl = new Template("systemEnter", "systemSelectorTemplate", systemTemplates); cNode(tmpl.template.radio, (i+bank)); var systemInfoText = (i+bank)+" "+combinationsDelimiter+" "+(count) + ( (bank>0) ? " / "+bank+" "+ ((bank>1)?titleBanks:titleBank) : "" ) + " ("; systemInfoText += numOfBets; systemInfoText += " " + titleBets + ") " + ""; cNode(tmpl.template.text, systemInfoText); } } var radios = document.slipCombinationForm.system; var found = false; for(var i=0 ; i < radios.length ; i++) { var radioVal = parseInt(radios[i].value); if( radioVal == lastSystem) { radios[i].checked = true; found = true; combiCount = binom( end , radioVal - bank) validSlip(true); break; } } if(!found) validSlip(false, message_choose_system); else calcCombiProfit(); } } else { var ok = true; if(count < (limit["minBets"]!=null ? limit["minBets"] : 1)) { cNode("systemEnter",message_not_enough_bets); ok = false; } validSlip(ok, message_invalid_slip); if(!ok) cNode("systemEnter", message_choose_system); else calcCombiProfit(); setDisplay("systemRow", ok ? "none" : document.all?"block":"table-row") ; } } function clickBank(el) { var ifc = getInterface(el); var wasBank = ifc.access.bankField.value == "true"; if(hasMultis) { var aIfc = multiEventLists[getNodeContent(ifc.access.eventId)]; for(var i=0;i < aIfc.length;i++) { setBank(aIfc[i], wasBank ? "false" : "true"); } } else setBank(ifc, wasBank ? "false" : "true"); renderSystem(); } function setBank(ifc,bool) { cNode(ifc.access.bankField, bool); ifc.access.bank.src = bool=="true" ? "http://static.mybet.com/images/bankActive.gif" : "http://static.mybet.com/images/bankInactive.gif"; //setClass(ifc.access.row, bool=="true" ? "combiTableRowBank" : "combiTableRowLight"); renderSystem(); } function clickSystem(el) { lastSystem = parseInt(el.value); renderSystem(); validSlip(true); var cNb = getCountBank(); combiCount = binom( cNb[2] , lastSystem - cNb[1]); calcCombiProfit(); } function validSlip(bool,message) { isValidSlip = bool; setDisplay("profitRow", bool ? (document.all?"block":"table-row") : "none") ; showPlaceButton(bool,message); } function showPlaceButton(bool,message) { couldSend = bool && isValidSlip; if(couldSend) { setDisplay("placeButtonMessage","none"); setDisplay("buttonPlaceId","inline"); } else { setDisplay("buttonPlaceId","none"); if(typeof(message)!='undefined') cNode("placeButtonMessage",message); setDisplay("placeButtonMessage","inline"); } } function binom(n, k) { if (k + k > n) { k = n - k; } if (k < 0) { return 0; } else { var ret = 1; for (i=0;i < k;) { ret *= (n-i)/++i; } return ret.toFixed(0); } } function fillLimit(maxOdds,maxStake,minStake,maxSystem,maxWin,minBets,minOdds,minSystem,limitFactor) { var limit = new Array(); limit["maxOdds"] = maxOdds; limit["maxStake"] = maxStake; limit["minStake"] = minStake; if(maxStake!=null&&limitFactor!=null) limit["maxStake"]*=limitFactor; limit["maxSystem"] = maxSystem; limit["maxWin"] = maxWin; limit["minBets"] = minBets; limit["minOdds"] = minOdds; limit["minSystem"] = minSystem; return limit; }