/**
 * Chrome TransformAndUpdate Fix
 * Works around the lack of xsl:import support in Google Chrome
 *
 * -kmackay
 */
if (window.jQuery && (navigator.userAgent.toLowerCase().indexOf('chrome') > -1 || navigator.userAgent.toLowerCase().indexOf('safari') > -1)) {
	Framework.XMLUtils.transformAndUpdateFirefox = (function(base) {
		return function(contentDocument, xsltDocument, parametersMap, domElementId, domElement, inMemoryProcessingCallback) {
			var xmlParser = new DOMParser();
			
			var xsltString = jQuery.ajax({
				url: xsltDocument.URL,
				async: false
			}).responseText;
			
			var importMatches = xsltString.match(/<xsl:(?:include|import)(?=[^>]*href\s*=\s*"([^"]*)")[^>]*>/i);
			if (importMatches != null && importMatches[1]) {
				var importXsltString = jQuery.ajax({
					url: importMatches[1],
					async: false
				}).responseText;
				importXsltString = importXsltString.replace(/<\/?xsl:(?:stylesheet|output)[^>]*>/ig, '');
				
				xsltString = xsltString.replace(
					importMatches[0],
					importXsltString
				);
			}
			
			xsltDocument = xmlParser.parseFromString(xsltString, 'text/xml');

			base(contentDocument, xsltDocument, parametersMap, domElementId, domElement, inMemoryProcessingCallback);
		};
	})(Framework.XMLUtils.transformAndUpdateFirefox);
}

/**
 * Add new price type so that bets can be placed for US racing markets 
 *
 * -wmuller
 */
FixedOddsBettingService.PriceType._validPriceTypesForSingle = [ 'AP', 'EP', 'BP', 'CP', 'SC', 'SP', 'WPD', 'SPD' ];

/**
 * RegistrationComponent Close Fix
 * Causes close button on registration component to send user to SportsHome
 *
 * -kmackay
 */
BoyleSportsAbstractComponents.BoyleSportsRegistrationComponent.BoyleSportsAbstractRegistrationComponent.prototype.closeBehaviorEventHandler = (function(base) {
	return function(sender, e) {
		window.event.returnValue = false;

		var filter = this._navigationService.getPageFilter();
		if (this._webSection$2 === 'Casino') {
			filter['action'] = this._navigateAfterRegistrationAction;
			delete filter.registationProgress;
			this._navigationService.setPageFilter(filter);
		} else {
			this._navigationService.goTo('SportsHome', {
				navigationtypes: 'HOME'
			});
		}
		
		//base.call(this, sender, e);
	};
})(BoyleSportsAbstractComponents.BoyleSportsRegistrationComponent.BoyleSportsAbstractRegistrationComponent.prototype.closeBehaviorEventHandler);

/**
 * RegistrationComponent Validation Fix
 * Prevents error when fields with no validation lose focus
 *
 * -kmackay
 */
Framework.Validation.ValidationManager.prototype.validateSingleInput = (function(base) {
	return function(input) {
		if (this._validators[input.id.trim()] == null) {
			return true;
		}

		base.call(this, input);
	};
})(Framework.Validation.ValidationManager.prototype.validateSingleInput);

/**
 * RegistrationComponent Focus Fix
 * Prevents error when field cannot accept focus
 *
 * -kmackay
 */
BoyleSportsAbstractComponents.BoyleSportsRegistrationComponent.BoyleSportsAbstractRegistrationComponent.prototype.nextBehaviorEventHandler = (function(base) {
	return function(sender, e) {
		this.moveToPreferences();
		
		try {
			document.getElementById(this._domElementId + '.UserName').focus();
		} catch (ex) {
		}

		//base.call(this, sender, e);
	};
})(BoyleSportsAbstractComponents.BoyleSportsRegistrationComponent.BoyleSportsAbstractRegistrationComponent.prototype.nextBehaviorEventHandler);

/**
 * NavigationComponent First-Child Fix
 * Prevents nodes collapsing when they shouldn't by preventing any action being taken when the same node is clicked twice
 *
 * -kmackay
 */
AbstractWarpComponents.AbstractNavigationComponent.prototype.setPageFilter = (function(base) {
	return function(liElement, area, preserveQueryString) {
		if (!this._activeElement) {
			base.call(this, liElement, area, preserveQueryString);
		} else {
			if (this._activeElement.attributes.getNamedItem('action').value != liElement.attributes.getNamedItem('action').value)
			{
				base.call(this, liElement, area, preserveQueryString);
			}
		}

		return false;
	};
})(AbstractWarpComponents.AbstractNavigationComponent.prototype.setPageFilter);

/**
 * ForgottenPasswordComponent Close Fix
 * Forces 'Cancel' button on NavigationComponent to return user to SportsHome
 *
 * -kmackay
 */
if (window.ForgottenPasswordComponent)
{
	ForgottenPasswordComponent.ForgottenPasswordComponent.prototype.closeForgottenPasswordEventHandler = (function(base) {
		return function(sender, eventArgs) {
			if (this._navigationService$1.isEmpty()) {
				var pageFilter = this._navigationService$1.getPageFilter();
				pageFilter['action'] = this._cancelPageAction$1;
				this._navigationService$1.goTo(this._cancelPageArea$1, pageFilter);
			}
			else {
				this._navigationService$1.goBack();
			}
			
			return false;
		};
	})(ForgottenPasswordComponent.ForgottenPasswordComponent.prototype.closeForgottenPasswordEventHandler);
}

/**
 * Poker client fix
 * Delegate callback on SCRIPT based ajax calls wasn't always firing under the poker client
 *
 * -wmuller
 */
ScriptFX.Net.ScriptTransport.prototype.invoke = (function(base) {
	return function () {
        	Debug.assert(this.getMethod() === 'GET');
	        Debug.assert(!this.get_request().get_hasHeaders());
	        Debug.assert(!this.get_request().get_hasCredentials());
	        var callbackParam = null;
	        var parameters = this.get_parameters();
	        if (parameters) {
	            callbackParam = parameters['callbackParameterName'];
	        }
	        if (!callbackParam) {
	            callbackParam = 'callback';
	        }
        var callback = Delegate.create(this, this._onDataAvailable$1);
        this._callbackExport$1 = Delegate.createExport(callback);
        var callbackCode = callbackParam + '=if(Delegate.' + this._callbackExport$1 + ') Delegate.' + this._callbackExport$1 + '';
        var url = this.get_request().get_URI();
        if (url.indexOf('?') >= 0) {
            url += '&' + callbackCode;
        }
        else {
            url += '?' + callbackCode;
        }
        this._scriptElement$1 = document.createElement('SCRIPT');
        this._scriptElement$1.type = 'text/javascript';
        this._scriptElement$1.src = url;
        document.body.appendChild(this._scriptElement$1);
    };
})(ScriptFX.Net.ScriptTransport.prototype.invoke);


/**
 * TreeNav Top Level Collapsing Fix
 * Prevents user collapsing top level navigation items
 *
 * -kmackay
 */
BoyleSportsAbstractComponents.BoyleSportsTreeNavigationComponent.BoyleSportsAbstractTreeNavigationComponent.prototype.onElementClickedEventHandler = (function(base) {
	return function(sender, clickArgs) {
		var linkElement = this.getPrivateDomElement('link-' + clickArgs.parameters.getAsString('targetidfwbonavigation'));
		if (linkElement != undefined && ScriptFX.UI.Element.containsCSSClass(linkElement, 'level0')) {
			if (ScriptFX.UI.Element.containsCSSClass(linkElement, 'expanded')) {
				window.event.returnValue = false;
				return;
			}
		}
		base.call(this, sender, clickArgs);
	};
})(BoyleSportsAbstractComponents.BoyleSportsTreeNavigationComponent.BoyleSportsAbstractTreeNavigationComponent.prototype.onElementClickedEventHandler);

/**
 * IE Title Fix
 * Fixes hash tags showing up in document title
 *
 * -kmackay
 */
if (window.jQuery) {
	jQuery(function() {
		document.onpropertychange = function() {
			var newTitle = document.title + '';
			if(newTitle.indexOf('#') != -1) {
				document.title = newTitle.substring(0, newTitle.indexOf('#'));
				return false;
			}
		}
	});
}

/**
 * Browser Class
 * Adds a class to the body tag reflecting the current browser
 *
 * -kmackay
 */
(function() {
	var browserName = '',
		userAgent = navigator.userAgent.toLowerCase();
	
	if (userAgent.indexOf('firefox') > -1) {
		browserName = 'firefox';
	} else if (userAgent.indexOf('chrome') > -1) {
		browserName = 'chrome';
	} else if (userAgent.indexOf('opera') > -1) {
		browserName = 'opera';
	} else if (userAgent.indexOf('safari') > -1) {
		browserName = 'safari';
	}
	
	document.body.className = (document.body.className + ' ' + browserName)
		.replace(/(?:^\s+|\s+$)/g, '')
		.split(' ')
		.join(' ');
})();

/**
 * Lottery Stake/Clear Fix
 * Allows Clear button to work while still allowing stake less than 1 to be entered
 *
 * -kmackay
 */
AbstractLotteryComponents.AbstractLotteryBetSlipComponent.prototype.setCalculatedFields = (function(base) {
	return function (betRow, bet, lineType) {
        var stakeInput = this._environment.getDomElement(String.format('{0}-{1}-stake-{2}', this._domElementId, lineType, betRow));
        var disableInputElements = (!bet.betTypeCode || !bet.betTypeCode.trim().length);
        if (stakeInput) {
            stakeInput.disabled = false;
            if (bet.stake && bet.stake > 0) {
                var currStake = Number.parse(stakeInput.value);
                if (isNaN(currStake)) {
                    currStake = 0;
                }
                if (currStake.toFixed(2) !== bet.stake.toFixed(2)) {
                    stakeInput.value = bet.stake.toFixed(2);
                }
            }
            else {
                if ((Framework.ScriptSharpQuirks.isNumberNull(bet.stake)) || (!bet.stake && disableInputElements)) {
                    stakeInput.value = '';
                }
                if (disableInputElements) {
                    stakeInput.disabled = true;
                }
            }
        }
        var betElement = this._environment.getDomElement(String.format('{0}-{1}-unit-count-{2}', this._domElementId, lineType, betRow));
        if (betElement) {
            if (bet.stake > 0 && bet.unitCount) {
                betElement.innerText = bet.unitCount.toString();
            }
            else {
                betElement.innerText = '';
            }
        }
        var totalstakeElement = this._environment.getDomElement(String.format('{0}-{1}-total-stake-{2}', this._domElementId, lineType, betRow));
        if (totalstakeElement) {
            if (bet.stake > 0 && bet.totalStake) {
                totalstakeElement.innerText = bet.totalStake.toFixed(2);
            }
            else {
                totalstakeElement.innerText = '';
            }
        }
        var returnElement = this._environment.getDomElement(String.format('{0}-{1}-return-{2}', this._domElementId, lineType, betRow));
        if (returnElement) {
            if (bet.stake > 0 && bet.potentialReturn) {
                returnElement.innerText = bet.potentialReturn.toFixed(2);
            }
            else {
                returnElement.innerText = '';
            }
        }
    };
})(AbstractLotteryComponents.AbstractLotteryBetSlipComponent.prototype.setCalculatedFields);

/**
 * Account - Add Payment Method
 * Displays a loading indicator while the data for the payment methods dropdown is being fetched
 *
 * -kmackay
 */
BoyleSportsAbstractComponents.BoyleSportsPaymentTransactionComponent.BoyleSportsAbstractPaymentTransactionComponent.prototype.fetchAndOutputPaymentTypesToRegisterHTML = (function() {
	return function() {
		var containerElement = this.getPrivateDomElement('links');
		var divLoader = document.createElement('DIV');
		divLoader.style.textAlign = 'center';
		divLoader.innerHTML = '<img src="/loading.gif" alt=""/>';
		containerElement.appendChild(divLoader);

		this._accountService.getAllowedPaymentTypes(Delegate.create(this, function(result) {
            var paymentTypes = result;
            paymentTypes.sort(Delegate.create(this, function(pt1, pt2) {
                return this.paymentTypesCompareCallback(pt1, pt2);
            }));
            var isCardOut = false;
            var instrumentName = '';
            var className = '';
            var instrumentValue = '';
            var aitSelect = this.getPrivateDomElement('availableinstrumenttypes');
            while (aitSelect.childNodes.length > 0) {
                aitSelect.removeChild(aitSelect.firstChild);
            }
            var optionSelect = document.createElement('option');
            optionSelect.innerHTML = 'Select';
            aitSelect.appendChild(optionSelect);
            for (var i = 0; i < paymentTypes.length; i++) {
                if (paymentTypes[i].IDMMSIClass.toUpperCase() !== 'CR' || (paymentTypes[i].IDMMSIClass.toUpperCase() === 'CR' && !isCardOut)) {
                    className = paymentTypes[i].IDMMSIType.toLowerCase();
                    instrumentName = paymentTypes[i].Name;
                    instrumentValue = paymentTypes[i].IDMMSIClass.trim() + '_' + paymentTypes[i].IDMMSIType;
                    if (paymentTypes[i].IDMMSIClass.toUpperCase() === 'CR') {
                        instrumentName = 'Credit / debit card';
                        isCardOut = true;
                    }
                    var optionPayInst = document.createElement('option');
                    optionPayInst.value = escape(instrumentValue);
                    optionPayInst.innerHTML = instrumentName;
                    aitSelect.appendChild(optionPayInst);
                }
            }
            this._environment.safelyRemoveCssClassOnElement(aitSelect, 'vh');
			containerElement.removeChild(divLoader);
			divLoader = null;
			//alert('fetchAndOutputPaymentTypesToRegisterHTML [end]');
        }), Delegate.create(this, function(exception) {
            var message = Framework.ExceptionUtil.getExceptionDetails(exception).get_message();
            if (!message) {
                message = 'Sorry, we could not get the list of available instrument types to register at this moment - please contact customer support for further help.';
            }
            this.activateFailedStatusArea(message, String.Empty, String.Empty);
            document.getElementById(this._domElementId + '-links').style.display = 'none';
			alert('fetchAndOutputPaymentTypesToRegisterHTML [error]');
        }), this._environment.getLanguage());
	};
})();

/**
 * Lottery - Sort Balls
 * Sorts balls numerically for display.
 *
 * -kmackay
 */
if (window.BoyleSportsLotteryBetSlipComponent) {
	BoyleSportsLotteryBetSlipComponent.BoyleSportsLotteryBetSlipComponent.prototype.setStraightNumbers = (function(base) {
		return function(numbers, line, type, maxnumberOfBalls, bet) {
			base.call(this, numbers.slice().sort(function(a, b) {
				return a - b;
			}), line, type, maxnumberOfBalls, bet);
		};
	})(BoyleSportsLotteryBetSlipComponent.BoyleSportsLotteryBetSlipComponent.prototype.setStraightNumbers);

	/**
	 * Lottery - Sort Balls
	 * Sorts balls numerically for display.
	 *
	 * -kmackay
	 */
	BoyleSportsLotteryBetSlipComponent.BoyleSportsLotteryBetSlipComponent.prototype.setMultipleNumbers = (function(base) {
		return function(numbers, maxnumbers, bets) {
			base.call(this, numbers.slice().sort(function(a, b) {
				return a - b;
			}), maxnumbers, bets);
		};
	})(BoyleSportsLotteryBetSlipComponent.BoyleSportsLotteryBetSlipComponent.prototype.setMultipleNumbers);
}

/**
 * Lottery - Sort Balls
 * Sorts balls numerically for display.
 *
 * -kmackay
 */
if (window.BoyleSportsLotteryPlacementComponent) {
	BoyleSportsLotteryPlacementComponent.BoyleSportsLotteryPlacementComponent.prototype.displayBetSlip = (function(base) {
		function cloneObject(source) {
			for (var key in source) {
				if (typeof source[key] == 'source') {
					this[key] = new cloneObject(source[key]);
				} else {
					this[key] = source[key];
				}
			}
		}
		
		return function(ticketRef, ticket) {
			var ticketClone = ticket.slice();
			for (var lineNumber = 0; lineNumber < ticketClone.length; lineNumber++) {
				var line = new cloneObject(ticketClone[lineNumber]);
				line.Balls = line.Balls.slice().sort(function(a,b) {
					return a.Number - b.Number;
				});
				ticketClone[lineNumber] = line;
			}

			base.call(this, ticketRef, ticketClone);
		};
	})(BoyleSportsLotteryPlacementComponent.BoyleSportsLotteryPlacementComponent.prototype.displayBetSlip);
}
