function Betslip()
{

  this.bets = [];
  this.rules = [];
  
  this._status = 1;
  
  this._total_bet = 0;
  this._pay_in = 5;
  this._bonus = 0;
  this._total_rate = 0;
  this._type = 1;
  this._combination_type = 1;
  
  this._maxWinnings = 300000;
  
  this._minBet = 4.76;
  this._maxBetIndex = 1000;
  this._maxBet = 1000;
  this._systemMaxBetIndex = 1000;
  this._systemMaxBet = 1000;
  
  this.addBet = addBet;
  this.averageRate = averageRate;
  this.betPerCombination = betPerCombination;
  this.calcBonud = calcBonus;
  this.calcSystemWinnings = calcSystemWinnings
  this.changeCombinationType = changeCombinationType;
  this.changeType = changeType;
  this.checkRules = checkRules;
  this.checkCombine = checkCombine;
  this.checkCurrentBet = checkCurrentBet;
  this.formatMoney = formatMoney;
  this.getBonus = getBonus;
  this.hideMessage = hideMessage;
  this.loadRules = loadRules;
  this.markSelectedBets = markSelectedBets;
  this.maxPayin = maxPayin;
  this.minPayin = minPayin;
  this.maxRate = maxRate;
  this.minRate = minRate;
  this.maxPossibleWinnings = maxPossibleWinnings;
  this.minPossibleWinnings = minPossibleWinnings;
  this.numberOfCombinations = numberOfCombinations;
  this.print = printTicekt;
  this.readCookie = readCookie;
  this.removeAll = removeAll;
  this.removeBet = removeBet;
  this.renderBet = renderBet;
  this.renderSystemTypes = renderSystemTypes;
  this.setPayIn = setPayIn;
  this.setBet = setBet;
  this.setBetPerCombination = setBetPerCombination;
  this.setCookie = setCookie;
  this.setMessage = setMessage;
  this.setStatus = setStatus;
  this.submitTicket = submitTicket;
  this.totalFix = totalFix;
  this.totalRate = totalRate;
  this.update = update;

}

betslip = new Betslip();
  
function addBet(bet_id, type, rate, sport_id, contest_id, event_id, bettype_id, bettype, min_bet, max_bet)
{
	
	var check = this.checkRules(bet_id, type, rate, sport_id, contest_id, event_id, bettype_id, bettype, min_bet, max_bet);
	if (check != false) {
		return;
	}
	
	//	check max bet numbers
	
	if (this.bets.length == 25) {
		this.setMessage( _betslip_max_bets_.replace('{1}', 25) );
		return;
	}
	
	//	check max rate
	
	var max_rate_message = false;
	var max_payin_message = false;
	
	if ((this._type == 1) && (this._total_rate * rate * this._total_bet > this._maxWinnings)) {
		
		//	if only rate is too high even for min bet then switch to system type
		if ( (this._total_rate * rate * this._minBet > this._maxWinnings) ) {		
			this.changeType(2);
			max_rate_message = true;
		} else {
			max_payin_message = true;
		}
	}
	
	try {
		obj = document.getElementById(bet_id);
		var betData = obj.data;
	} catch (ex) {
		var betData = [];
	}

	betData['type'] = type;
	betData['rate'] = rate;
	betData['sport_id'] = sport_id;
	betData['contest_id'] = contest_id;
	betData['event_id'] = event_id;
	betData['bettype_id'] = bettype_id;
	betData['bettype'] = bettype;
	betData['min_bet'] = min_bet;
	betData['max_bet'] = max_bet;
	betData['position'] = String.fromCharCode(64+betslip.bets.length + 1);
	betData['fix'] = false;
	
	betslip.bets.push(betData);
	betslip.renderBet(betData, false);
	betslip.update(0);
	
	//	mark bet div
	
	try {
	
		var div = document.getElementById(bet_id + '_' + type);
		div.className = 'offertable_bet_rate bet_selected';
	} catch (ex) {
		
	}	
	try {
		div = document.getElementById(bet_id + '_' + type + '_extra');
		div.className = 'offertable_bet_rate bet_selected';
	} catch (ex) {
		
	}
	
	//	if number of bets is greater than 18 force system type
	/*
	if (this.bets.length > 18) {
		this.changeType(2);
	}
	*/
	//	recalculate rates / winnings
	
	if (this._type != 1) {
		this.changeCombinationType(this._combination_type);
	}
	
	if (max_rate_message) {
		
		this.setMessage( _betslip_max_rate_limit_ );
		
	}
	
	if (max_payin_message) {
		this.maxPayin();
		this.setMessage( _betslip_force_max_pay_in_ );
		
	}
	
	//	check bet min num of combinations rule
	
	if (min_bet > this.bets.length) {
		this.setMessage(_betslip_min_bet_.replace('{1}', betData['competitors']).replace('{2}', min_bet));
	}
	
	//	check bet max num of combinations rule
	/*
	if ((max_bet < this.bets.length) && (max_bet > 0)) {
		this.setMessage(_betslip_max_bet_.replace('{1}', max_bet));
	}
	*/
	//	recalculate rates / winnings
	
	this.checkCurrentBet();

}

function averageRate() {
	
	var total = 0;
	var betPerCombination = this._total_bet / this.numberOfCombinations(this._combination_type, this.bets.length - this.totalFix());
	
	var rates = [];
	var rateFix = 1;
	
	for(var i=0;i<this.bets.length;i++) {
		if (!this.bets[i]['fix']) {
			rates.push(this.bets[i]['rate']);
		} else {
			rateFix = rateFix * this.bets[i]['rate'];
		}
	}
	
	c = rates.combinate(this._combination_type);
	
	var totalRate = 0;
	
	for(var i=0;i<c.length;i++) {
		rate = rateFix;
		for(j=0;j<c[i].length;j++) {
			rate = rate * c[i][j];
		}
		totalRate += rate;
		total += rate * betPerCombination;
	}
	
	return totalRate / this.numberOfCombinations(this._combination_type, this.bets.length - this.totalFix());
	
}

function betPerCombination() {
	return parseFloat( parseFloat(this._total_bet).toFixed(2) / this.numberOfCombinations(this._combination_type, this.bets.length - this.totalFix())).toFixed(4);
}

function calcBonus(totalRate) {
	
	switch(true)
	{
		case (totalRate < 50):
			return 0;
		case (totalRate < 100):
			return 5;
		case (totalRate < 200):
			return 10;
		case (totalRate < 500):
			return 15;
		case (totalRate < 1000):
			return 20;
		case (totalRate < 2000):
			return 25;
		case (totalRate < 5000):
			return 30;
		case (totalRate < 10000):
			return 35;
		case (totalRate < 20000):
			return 40;
		case (totalRate < 50000):
			return 45;
		default:
			return 50;
	}
	
}

function calcSystemWinnings() {

	this.update(1);

}

function changeCombinationType(num) {
	
	if (num == 0) {
		this.changeType(1);
	} else {
		this._combination_type = num;
		this.changeType(2);
	}
	
	this.update(0);
	
}

function changeType(type, print) {

	if (this._type == type) return;
	
	switch (type) {
		
		case 1:
			
			/*
			if (this.bets.length > 17) {
				this.setMessage(_betslip_force_system_.replace('{1}', 17));
				return;
			}
			*/
			
			//	if max rate is exceeded only system is allowed
			if (this.totalRate() * this._minBet > this._maxWinnings) {
				
				this.setMessage( _betslip_max_rate_limit_ );
				return;
				
			}
			
			
			this._type = 1;

			document.getElementById('betslip_header').className = 'betslip_header';
			document.getElementById('betslip_header_total_fix').style.visibility = 'hidden';
			document.getElementById('betslip_select_system').style.color = 'black';
			document.getElementById('betslip_select_regular').style.color = 'white';
			
			//	hide fix checkboxes
			
			for(var i=0;i<this.bets.length;i++) {
				document.getElementById('bet_' + this.bets[i]['id'] + '_fix').style.visibility = 'hidden';
			}
			
			//	hide system combinations type selector
			
			//document.getElementById('betslip_system_type').style.display = 'none';
			
			//	show bonus
			
			//document.getElementById('betslip_bonus_wrapper').style.display = 'block';
			
			//	hide system rates / winnings
			
			document.getElementById('betslip_rates_winnings_system').style.display = 'none';
			
			//	show regular rates / winnings
			
			document.getElementById('betslip_rates_winnings_regular').style.display = 'block';

			//	hide bet per combination
			
			document.getElementById('betslip_bet_per_combination_wrapper').style.display = 'none';
			
			this.update(0);
			
			//	set total bet to maximum amount allowed if greater than maxBet
			if (this._total_rate * this._total_bet > this._maxWinnings) {
				
				this.setMessage( _betslip_max_rate_limit_ );
				this.maxPayin();
				
			}

			break;
			
		case 2:
		
			if (this.bets.length < 2) {
				
				this.setMessage(_betslip_forbid_system_);
				return;
				
			}

			this._type = 2;
			document.getElementById('betslip_header').className = 'betslip_header type_system';
			document.getElementById('betslip_header_total_fix').style.visibility = 'visible';
			document.getElementById('betslip_select_system').style.color = 'white';
			document.getElementById('betslip_select_regular').style.color = 'black';
			
			//	show fix checkboxes
			
			for(var i=0;i<this.bets.length;i++) {
				document.getElementById('bet_' + this.bets[i]['id'] + '_fix').style.visibility = 'visible';
			}
			
			//	show system combinations type selector
			
			//document.getElementById('betslip_system_type').style.display = 'block';
			
			//	hide bonus
			
			//document.getElementById('betslip_bonus_wrapper').style.display = 'none';
			
			//	hide regular rates / winnings
			
			document.getElementById('betslip_rates_winnings_regular').style.display = 'none';
			
			//	show system rates / winnings
			
			document.getElementById('betslip_rates_winnings_system').style.display = 'block';
			
			//	recalculate bet per combination
			
			this.changeCombinationType(this._combination_type);
			
			//	show bet per combination
			
			document.getElementById('betslip_bet_per_combination_wrapper').style.display = 'block';
			
			this.update(0);
			
			break;
		
	}

}

function checkCombine(bet_id, type, rate) {
	
}

function checkCurrentBet() {
	
	//	recalculate rates / winnings
	
	if (this._total_bet < this._minBet) {
		this.minPayin();
		return;
	}
	
	if (this._type == 2) {
		
		var maxBet = this._systemMaxBetIndex * this.averageRate();
		maxBet = (maxBet < this._systemMaxBet)?maxBet:this._systemMaxBet;

		if (this._total_bet > maxBet) {
			this.maxPayin();
		}
		
	} else {
	
		//	check if bet is regular after removal
		
		var maxBet = this._maxBetIndex * this.totalRate();
		maxBet = (maxBet < this._maxBet)?maxBet:this._maxBet;
		
		if ((this._total_bet > maxBet) || (this._total_bet * this.totalRate() > this._maxWinnings)) {
			this.maxPayin();
		}
		
	}
	
}

function checkRules(bet_id, type, rate, sport_id, contest_id, event_id, bettype_id, bettype, min_bet, max_bet) {
	
	//	check if exists
	
	for(var i=0;i<this.bets.length;i++) {
		
		//	check if same bet exists with different result
		
		if (this.bets[i]['id'] == bet_id) {
			
			//	unmark previous div

			try {
				document.getElementById(this.bets[i]['id'] + '_' + this.bets[i]['type']).className = 'offertable_bet_rate';
				document.getElementById(bet_id + '_' + type).className = 'offertable_bet_rate bet_selected';
			} catch(ex) {
				
			}
			
			try {
				document.getElementById(this.bets[i]['id'] + '_' + this.bets[i]['type'] + '_extra').className = 'offertable_bet_rate';
				document.getElementById(bet_id + '_' + type + '_extra').className = 'offertable_bet_rate bet_selected';
			} catch(ex) {
				
			}
				
			this.bets[i]['type'] = type;
			this.bets[i]['rate'] = rate;
			this.bets[i]['bettype_id'] = bettype_id;
			this.bets[i]['bettype'] = bettype;
			try {
				document.getElementById('bet_' + bet_id + '_type').innerHTML = type;
				rate = (parseFloat(rate));
				precision = (rate>=100)?1:2;
				document.getElementById('bet_' + bet_id + '_rate').innerHTML = rate.toFixed(precision);
			} catch (ex) {
				
			}

			this.update(0);
			
			this.checkCurrentBet();

			return;
			
		}
		
	}
	
	//	check if bet exists in different bettype and are they allowed to combine
		
	var remove_bets = [];
	
	for(var i=0;i<this.bets.length;i++) {
		
		if (this.bets[i]['event_id'] == event_id) {
			
			//	check if can combine bettypes
			
			var can_combine = false;
			
			for(var r=0;r<this.rules.length;r++) {

				if (
						((this.rules[r]['bettype_1_id'] == this.bets[i]['bettype_id']) && (this.rules[r]['bettype_2_id'] == bettype_id)) ||
						((this.rules[r]['bettype_2_id'] == this.bets[i]['bettype_id']) && (this.rules[r]['bettype_1_id'] == bettype_id))
					) {
					//	can combine
					can_combine = true;
				}
				
			}
			
			if (!can_combine) {
				//alert('!cancombine');
				remove_bets.push(this.bets[i]);
			}

		}
		
	}
	
	var removed_competitors_types_message = '';
	
	if (remove_bets.length > 0) {
	
		for (var i=0; i<remove_bets.length;i++) {
			
			try {
				document.getElementById(remove_bets[i]['id'] + '_' + remove_bets[i]['type']).className = 'offertable_bet_rate';
			} catch (ex) {
				
			}	
			try {
				document.getElementById(remove_bets[i]['id'] + '_' + remove_bets[i]['type'] + '_extra').className = 'offertable_bet_rate';
			} catch (ex) {
				
			}
			
			removed_competitors_types_message += ', ' + remove_bets[i]['competitors'] + ' ' + remove_bets[i]['bettype'];
			
		}

		if (remove_bets.length > 1) {
			for (var i=1; i<remove_bets.length;i++) {
				//alert('Pre Del: ' + this.bets.length);
				this.removeBet(remove_bets[i]['id'], remove_bets[i]['type']); // !OVDE JE PROBLEM!
				//alert('After Del: ' + this.bets.length);
			}
		}
		
		//	replace first bet in remove_bets array with new bet
		
			//	search for first bet in bets array, after removal of other bets
			
			var bet_index = -1;
			
			for (var i=0; i<this.bets.length;i++) {
				if (
						(this.bets[i]['event_id'] == remove_bets[0]['event_id']) &&
						(this.bets[i]['bettype_id'] == remove_bets[0]['bettype_id'])
					) bet_index = i;
			}
			
			//alert(bet_index);
	
			//	change betslip elements ids
			
			document.getElementById('bet_' + this.bets[bet_index]['id'] + '_type').id = 'bet_' + bet_id + '_type';
			document.getElementById('bet_' + this.bets[bet_index]['id'] + '_bettype').id = 'bet_' + bet_id + '_bettype';
			document.getElementById('bet_' + this.bets[bet_index]['id'] + '_fix').id = 'bet_' + bet_id + '_fix';
			document.getElementById('bet_' + this.bets[bet_index]['id'] + '_fix_checkbox').id = 'bet_' + bet_id + '_fix_checkbox';
			document.getElementById('bet_' + this.bets[bet_index]['id'] + '_rate').id = 'bet_' + bet_id + '_rate';
			document.getElementById('bet_' + this.bets[bet_index]['id']).id = 'bet_' + bet_id;
			
			document.getElementById('bet_' + bet_id + '_type').innerHTML = type;
			document.getElementById('bet_' + bet_id + '_bettype').innerHTML = '(' + bettype + ')';
			rate = (parseFloat(rate));
			precision = (rate>=100)?1:2;
			document.getElementById('bet_' + bet_id + '_rate').innerHTML = rate.toFixed(precision);
			
			//	update bets array
		
			obj = document.getElementById(bet_id);
			var betData = obj.data;
			
			this.bets[bet_index]['id'] = bet_id;
			this.bets[bet_index]['code'] = obj.data['code'];
			this.bets[bet_index]['type'] = type;
			this.bets[bet_index]['bettype_id'] = bettype_id;
			this.bets[bet_index]['bettype'] = bettype;		
			this.bets[bet_index]['rate'] = rate;
			
			document.getElementById(bet_id + '_' + type).className = 'offertable_bet_rate bet_selected';
			try {
				document.getElementById(bet_id + '_' + type + '_extra').className = 'offertable_bet_rate bet_selected';	
			} catch (exx) {
				
			}
			

		this.update(0);
				
		this.setMessage(_module_betslip_error_bet_exists_.replace('{1}', removed_competitors_types_message));
	
		return true;
		
	}
	
	//	check if hattrick special bet is combined with selected hattrick special bet
	
	if (sport_id == 1000) {
	
		for(var i=0;i<this.bets.length;i++) {
			
			if (this.bets[i]['sport_id'] == sport_id) {
				
				this.setMessage(_module_betslip_error_special_offer_combine_.replace('{1}', this.bets[i]['competitors']));
				
				return true;
			}
				
		}
		
	}
	
	//	check if bet is combined with forbiden event
	
	for(var i=0;i<this.bets.length;i++) {
		
		for(var r=0;r<this.rules.length;r++) {
				if (
						((this.rules[r]['event_1_id'] == this.bets[i]['event_id']) && (this.rules[r]['event_2_id'] == event_id)) ||
						((this.rules[r]['event_2_id'] == this.bets[i]['event_id']) && (this.rules[r]['event_1_id'] == event_id))
					) {
					
					this.setMessage(_module_betslip_error_combine_.replace('{1}', this.bets[i]['competitors'] + ' ' + this.bets[i]['bettype']));
						
					return true;
				}
			}
			
	}
	
	//	check if bet is combined with forbiden contest
	
	for(var i=0;i<this.bets.length;i++) {
		
		for(var r=0;r<this.rules.length;r++) {
				if (
						((this.rules[r]['contest_1_id'] == this.bets[i]['contest_id']) && (this.rules[r]['contest_2_id'] == contest_id)) ||
						((this.rules[r]['contest_2_id'] == this.bets[i]['contest_id']) && (this.rules[r]['contest_1_id'] == contest_id))
					) {
					
					this.setMessage(_module_betslip_error_combine_.replace('{1}', this.bets[i]['competitors'] + ' ' + this.bets[i]['bettype']));
						
					return true;
				}
			}
			
	}

	return false;
	
}

function formatMoney(nStr) {
	
	nStr = parseFloat(nStr).toFixed(2);
	
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? ',' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + '.' + '$2');
	}
	var val = x1 + x2;
	
	return val + ' kn';
	
}

function getBonus() {
	
	return (this._type==1)?this._bonus:0;
	
}

function hideMessage() {
	
	document.getElementById('betslip_message').style.display = 'none';
	
}

function loadRules(data) {
	try {
		var r = JSON.parse(data);
		r = r['rules'];
		
		if (r.length > 0) {
			if (this.rules.length == 0) {
				this.rules = r;
			} else {
				this.rules.join(r);
			}
		}
	} catch (err) {
		alert(err.name + ' - ' + err.description);
	}	
}

function markSelectedBets() {
	
	for(var i=0;i<this.bets.length;i++) {
		try {
			var div = document.getElementById(this.bets[i]['id'] + '_' + this.bets[i]['type']);
			div.className = 'offertable_bet_rate bet_selected';
		}
		catch (e) {
			
		}
		try {
			div = document.getElementById(this.bets[i]['id'] + '_' + this.bets[i]['type'] + '_extra');
			div.className = 'offertable_bet_rate bet_selected';
		}
		catch (e) {
			
		}
	}
	
}

function maxPayin() {
	
	if (this.bets.length < 1) return;
	
	if (this._type == 1) {
	
		var maxBet = this._maxBetIndex * this.totalRate();
		maxBet = (maxBet < this._maxBet)?(maxBet / 1.05):(this._maxBet / 1.05);
		
		if (this._total_rate * maxBet > this._maxWinnings) {
			maxBet = parseFloat(this._maxWinnings / (this._total_rate)).toFixed(2) - 0.01; 
		}
		
		if (maxBet < this._minBet) {
			this.changeType(2);
		}

		this.setBet(maxBet);
		
		return;
		
	}
	
	if (this._type == 2) {
		
		var maxBet = this._systemMaxBetIndex * this.averageRate();
		maxBet = (maxBet < this._systemMaxBet)?(maxBet / 1.05):(this._systemMaxBet / 1.05);

		this.setBet(maxBet);
		
		return;
		
	}

}

function minPayin() {
	
	this.setBet(this._minBet);
	
}

function maxRate() {
	
	rates = [];
	rate = 1;
	for(var i=0;i<this.bets.length;i++) {
		if (!this.bets[i]['fix']) {
			rates.push(this.bets[i]['rate']);
		} else {
			rate = rate * this.bets[i]['rate'];
		}
	}
	rates.sort();
	
	for(var i=0;i<this._combination_type;i++) {
		rate = rate * rates[rates.length - 1 - i];
	}
	
	return rate;
	
}

function minRate() {
	
	rates = [];
	rate = 1;
	
	for(var i=0;i<this.bets.length;i++) {
		if (!this.bets[i]['fix']) {
			rates.push(this.bets[i]['rate']);
		} else {
			rate = rate * this.bets[i]['rate'];
		}
	}
	rates.sort();
	
	for(var i=0;i<this._combination_type;i++) {
		rate = rate * rates[i];
	}
	
	return rate;
	
}

function minPossibleWinnings() {
	
	if (this._type == 1) {
		var result = this.minRate() * this._total_bet;
	}
	if (this._type == 2) {
		var result = this.minRate() * this.betPerCombination();
	}
	
	result = (result > this._maxWinnings)?this._maxWinnings:result;
	
	return result;
	
}

function maxPossibleWinnings() {
	
	if (this.bets.length == 0) {
		result[0] = 0;
		result[1] = 0;
	
		return result;
	}
	
	var total = 0;
	var betPerCombination = this.betPerCombination();
	
	var rates = [];
	var rateFix = 1;
	
	var minRate = 10000000;
	
	for(var i=0;i<this.bets.length;i++) {
		if (!this.bets[i]['fix']) {
			rates.push(this.bets[i]['rate']);
		} else {
			rateFix = rateFix * this.bets[i]['rate'];
		}
	}
	
	c = rates.combinate(this._combination_type);
	
	var totalRate = 0;
	
	for(var i=0;i<c.length;i++) {
		rate = rateFix;
		for(j=0;j<c[i].length;j++) {
			rate = rate * c[i][j];
		}
		totalRate += rate;
		if (minRate > rate) minRate = rate;
		total += rate * betPerCombination;
	}
	
	var result = [];
	
	total = (total > this._maxWinnings)?this._maxWinnings:total;

	result[0] = total;
	//result[1] = totalRate / c.length;
	result[1] = minRate;
	
	return result;
	
}

function numberOfCombinations(num, max) {
	
	return ( nfact(max) / ( nfact(num) * nfact(max - num) ) );
	
}

function removeAll() {
	if(confirm(_betslip_confirm_delete_)) {
		while(this.bets.length > 0) {
			this.removeBet(this.bets[0]['id'], this.bets[0]['type']);
		}
		this.changeType(1);
	this.update(0);
	}
}

function removeBet(bet_id, type) {
	
	tempArr = [];
	var j=1;
	this._total_rate = 1;
	for(var i=0;i<this.bets.length;i++) {
		if (this.bets[i]['id'] != bet_id) {
			//	reorder bets
			this.bets[i]['position'] = String.fromCharCode(64 + j);
			try {
				document.getElementById('bet_' + this.bets[i]['id'] + '_position').innerHTML = this.bets[i]['position'];
			} catch (exx) {

			}
			//	push bet to temp
			tempArr.push(this.bets[i]);
			this._total_rate *= this.bets[i]['rate'];
			j++;
		} else {
			try {
				var div = document.getElementById(bet_id + '_' + type);
				div.className = 'offertable_bet_rate';
			} catch (e) {
				
			}
			try {	
				div = document.getElementById(bet_id + '_' + type + '_extra');
				div.className = 'offertable_bet_rate';
			} catch (e) {
				
			}
			
			try {
				document.getElementById('betslip_data').removeChild(document.getElementById('bet_' + bet_id));
			} catch (e) {
				
			}
		}
	}
	this.bets = tempArr.slice();
	if (this.bets.length < 2) this.changeType(1);
	this.update(0);
	
	//	recalculate rates / winnings
	
	this.checkCurrentBet();
	
}
  
function renderBet(betData, print) {
	
	//	FIRST LINE
	
	var bet_line1 = document.createElement('div');
	bet_line1.className='betslip_line1';
	
	//	bet position (order)
	
	var bet_position = document.createElement('div');
	bet_position.id = 'bet_' + betData['id'] + '_position';
	bet_position.className='betslip_position';
	bet_position.innerHTML = (print)?betData['position']+')':betData['position'];
	
	//	bet code
	
	var bet_code = document.createElement('div');
	bet_code.className='betslip_code';
	bet_code.innerHTML = betData['code'];

	//	bet competitors

	var bet_competitors = document.createElement('div');
	bet_competitors.className='betslip_competitors';
	bet_competitors.innerHTML = betData['competitors'];
	
	
	//	bet bettype
	
	var bet_bettype = document.createElement('span');
	bet_bettype.id = 'bet_' + betData['id'] + '_bettype';
	bet_bettype.className='betslip_bet_bettype';
	bet_bettype.innerHTML = '(' + betData['bettype'] + ')';
	bet_competitors.appendChild(bet_bettype);
	
	//	SECOND LINE
	
	if (print) {
		bet_line2 = bet_line1;
	} else {
		var bet_line2 = document.createElement('div');
		bet_line2.className='betslip_line2'
	}

	//	bet delete icon
	
	if (!print) {
		var bet_delete = document.createElement('a');
		bet_delete.className='betslip_delete_link';
		bet_delete.href='javascript:betslip.removeBet(\'' + betData['id'] + '\', \'' + betData['type'] + '\')';
		
		var bet_delete_image = document.createElement('img');
		bet_delete_image.className='betslip_delete_image';
		bet_delete_image.src = '/images/modules/betslip/delete_tip.gif';
		
		bet_delete.appendChild(bet_delete_image);

	}
	
	//	bet date
	
	var bet_date = document.createElement('div');
	bet_date.className='betslip_date'
	bet_date.innerHTML = betData['date'];

	//	bet type
	
	var bet_type = document.createElement('div');
	bet_type.id = 'bet_' + betData['id'] + '_type';
	bet_type.className='betslip_bet_type'
	bet_type.innerHTML = betData['type'];
	
	//	bet fix
	
	if (print) {
		
		var bet_fix = document.createElement('div');
		bet_fix.id = 'bet_' + betData['id'] + '_fix';
		bet_fix.className='betslip_fix';
		bet_fix.innerHTML = (betData['fix'])?'FIX':'&nbsp;';
		
	} else {
		var bet_fix = document.createElement('div');
		bet_fix.id = 'bet_' + betData['id'] + '_fix';
		bet_fix.className='betslip_fix';
		if (this._type==2) {
			bet_fix.style.visibility = 'visible';
		} else {
			bet_fix.style.visibility = 'hidden';
		}
		
		bet_fix_checkbox = document.createElement('input');
		bet_fix_checkbox.id = 'bet_' + betData['id'] + '_fix_checkbox';
		bet_fix_checkbox.type = 'checkbox';
		if (betData['fix']) bet_fix_checkbox.checked = true;
		bet_fix_checkbox.onclick = function() { 
										if (!this.checked || (betslip.bets.length - betslip.totalFix() > 2)) {
											params = this.id.split('_');
											for(var i=0;i<betslip.bets.length;i++) {
												if (betslip.bets[i]['id'] == params[1]) { 
													betslip.bets[i]['fix'] = this.checked;
													betslip.update(0);
													betslip.changeCombinationType(betslip._combination_type);
												}
											}
										} else {
											this.checked = false;
										}
									}; 
		
		bet_fix.appendChild(bet_fix_checkbox);
	}

	//	bet rate
	
	var bet_rate = document.createElement('div');
	bet_rate.id = 'bet_' + betData['id'] + '_rate';
	bet_rate.className='betslip_rate';
	rate = (parseFloat(betData['rate']));
	precision = (rate>=100)?1:2;
	bet_rate.innerHTML= rate.toFixed(precision);
	
	if (print) {
		
		bet_line1.appendChild(bet_position);
		bet_line1.appendChild(bet_code);
		bet_line1.appendChild(bet_date);
		bet_line1.appendChild(bet_competitors);
		
		bet_line1.appendChild(bet_rate);
		bet_line1.appendChild(bet_fix);
		bet_line1.appendChild(bet_type);
		
	} else {
		
		bet_line1.appendChild(bet_position);
		bet_line1.appendChild(bet_competitors);
		bet_line2.appendChild(bet_delete);
		bet_line2.appendChild(bet_date);
		bet_line2.appendChild(bet_type);
		bet_line2.appendChild(bet_fix);
		bet_line2.appendChild(bet_rate);
		
	}
	
	
	var bet = document.createElement('div');
	bet.className='betslip_bet';
	bet.id = 'bet_' +  betData['id'];
	
	if (!print) {
		bet.appendChild(bet_line1);
		bet.appendChild(bet_line2);
	} else {
		bet.appendChild(bet_line2);
	}
	
	document.getElementById('betslip_data').appendChild(bet);
	//document.getElementById('betslip_system_data').appendChild(bet);
	
}

function renderSystemTypes() {

	//	clear previous objects
	
	document.getElementById('betslip_system_type').removeChild( document.getElementById('betslip_system_type_items') );
	
	var betslip_system_type_items = document.createElement('div');
	betslip_system_type_items.id='betslip_system_type_items';
	
	document.getElementById('betslip_system_type').appendChild(betslip_system_type_items);
	
	var free_bets = this.bets.length - this.totalFix();
	
	if (free_bets < 2) return;
	
	if (free_bets > 18) {
		if (this._type == 2) {
			this.setMessage( _betslip_max_bets_system_.replace('{1}', 18) );
		}
		free_bets == 18;
		return;
	}
	
	//	CREATE SIMPLE TICKET COMBO
	
	//	check if simple ticekt is allowed (max rate not exceeded)
	
	if (this._total_rate * this._total_bet <= this._maxWinnings) {
	
		var betslip_system_combination=document.createElement('div');
		betslip_system_combination.className='betslip_system_combination';
	
		betslip_system_combination_text=document.createElement('span');
		betslip_system_combination_text.className = 'betslip_system_combination_text';
		betslip_system_combination_text.innerHTML= this.bets.length + '/' + this.bets.length;
		betslip_system_combination.appendChild(betslip_system_combination_text);
		
		betslip_system_combination_combo=document.createElement('input');
		betslip_system_combination_combo.ordering = i;
		betslip_system_combination_combo.type='radio';
		betslip_system_combination_combo.name='system_combination';
		if (this._type == 1) {
			betslip_system_combination_combo.checked = true;
			betslip_system_combination_combo.setAttribute('defaultChecked', 'defaultChecked');
		}
		betslip_system_combination_combo.onclick = function() {
														betslip.changeCombinationType(0);
													}; 
		betslip_system_combination.appendChild(betslip_system_combination_combo);
		
		betslip_system_combination_number_of = document.createElement('span');
		betslip_system_combination_number_of.className='betslip_system_combination_number_of'
		betslip_system_combination_number_of.innerHTML='(1)';
		betslip_system_combination.appendChild(betslip_system_combination_number_of);
		
		betslip_system_type_items.appendChild(betslip_system_combination);
		
	}

	//	CREATE OTHER SYSTEM TYPES
	
	this._combination_type = (this._combination_type<1)?1:this._combination_type;
	this._combination_type = (free_bets<=this._combination_type)?(free_bets-1):this._combination_type;
	
	for (var i=1;i<free_bets;i++) {
		
		var betslip_system_combination=document.createElement('div');
		betslip_system_combination.className='betslip_system_combination';

		betslip_system_combination_text=document.createElement('span');
		betslip_system_combination_text.className = 'betslip_system_combination_text';
		betslip_system_combination_text.innerHTML='' + i + '/' + free_bets;
		betslip_system_combination.appendChild(betslip_system_combination_text);
		
		betslip_system_combination_combo=document.createElement('input');
		betslip_system_combination_combo.ordering = i;
		betslip_system_combination_combo.type='radio';
		betslip_system_combination_combo.name='system_combination';
		if ((this._type != 1) && (i == this._combination_type)) {
			betslip_system_combination_combo.checked = true;
			betslip_system_combination_combo.setAttribute('defaultChecked', 'defaultChecked');
		}
		betslip_system_combination_combo.onclick = function() {
														betslip.changeCombinationType(this.ordering);
													}; 
		betslip_system_combination.appendChild(betslip_system_combination_combo);
		
		betslip_system_combination_number_of = document.createElement('span');
		betslip_system_combination_number_of.className='betslip_system_combination_number_of'
		betslip_system_combination_number_of.innerHTML='(' + parseFloat(this.numberOfCombinations(i, free_bets)).toFixed(0) + ')';
		betslip_system_combination.appendChild(betslip_system_combination_number_of);
		
		betslip_system_type_items.appendChild(betslip_system_combination);
		
	}

}

function setBet(amount) {
	
	totalbet = document.getElementById('betslip_totalbet');
	if (!isFloat(amount)) {
		totalbet.value = this._total_bet;
	} else {
		this._total_bet = parseFloat(amount).toFixed(2);
	}

	payin = document.getElementById('betslip_payin');
	
	//	payin.value = (this._total_bet * 1.05)/ ((100 + this.getBonus()) / 100);	//	if bonus is calculated under limit
	
	payin.value = (this._total_bet * 1.05);	//	if bonus is calculated on total possible winnings
	
	this.update(0);
	
	this.checkCurrentBet();
	
}

function setBetPerCombination(amount) {
	
	this.setBet(amount * this.numberOfCombinations(this._combination_type, this.bets.length - this.totalFix()));
	
}

function setMessage(message) {
	
	msgobj = document.getElementById('betslip_message_inner');
	
	msgobj.innerHTML = message;
	
	document.getElementById('betslip_message').style.display = 'block';
	
}

function setPayIn(amount) {

	document.getElementById('betslip_payin').value = amount;
	this.update(0);
	this.checkCurrentBet();

}

function setStatus(status) {
	
	this._status = status;
	
}

function submitTicket() {
	
	for (var i=0;i<this.bets.length;i++) {
		if (this.bets[i]['min_bet'] > this.bets.length) {
			this.setMessage(_betslip_min_bet_.replace('{1}', this.bets[i]['competitors']).replace('{2}', this.bets[i]['min_bet']));
			return false;
		}
	}
	return true;
}

function totalFix() {
	
	fix = 0;
	for (var i=0;i<this.bets.length;i++) {
		if (this.bets[i]['fix']) fix++;
	}
	return fix;
	
}

function totalRate() {
	
	rate = 1;
	for (var i=0;i<this.bets.length;i++) {
		rate *= this.bets[i]['rate'];
	}
	return rate;
	
}

function update(forceCalc) {
	
	if (this.bets.length > 0) {
		document.getElementById('betslip_play').style.display = 'block';
		document.getElementById('betslip_empty').style.display = 'none';
	} else {
		document.getElementById('betslip_play').style.display = 'none';
		document.getElementById('betslip_empty').style.display = '';
	}
	
	this.hideMessage();
	
	//	calculate total rate
	
	var totalRate = 1;
	for (var i=0;i<betslip.bets.length;i++) {
		totalRate = totalRate * betslip.bets[i]['rate'];
	}
	this._total_rate = (parseFloat(totalRate));
	document.getElementById('betslip_total_rate').innerHTML = this._total_rate.toFixed(4).replace('.', ',');
	
	//	check pay in
	
	payin = document.getElementById('betslip_payin');
	
	payin.value = payin.value.replace(',', '.');

	if (!isFloat(payin.value)) {
		payin.value = parseFloat(this._pay_in).toFixed(2);
	} else {
		this._pay_in = parseFloat(payin.value).toFixed(2);
	}
	
	payin.value = parseFloat(this._pay_in).toFixed(2);
	
	payin.value = payin.value.replace('.', ',');
	
	//	calculate manipulative costs
	
	mancosts = document.getElementById('betslip_man_costs');
	var mancosts_value = (parseFloat(this._pay_in * (1 - 1 / 1.05)));
	mancosts.innerHTML = this.formatMoney(mancosts_value.toFixed(2));

	//	calculate total bet

	totalbet = document.getElementById('betslip_totalbet');
	this._total_bet = parseFloat( this._pay_in - mancosts_value );
	totalbet.value = (this._total_bet).toFixed(2);
	totalbet.value = totalbet.value.replace('.', ',');
	
	//	calculate bet per combination
	
	betpercalculation = document.getElementById('betslip_bet_per_combination');
	betpercalculation.value = this.betPerCombination();
	betpercalculation.value = betpercalculation.value.replace('.', ',');
	
	//	calculate possible winnings
	
	var possible_winnings_value = parseFloat(this._total_bet).toFixed(2) * parseFloat(totalRate).toFixed(4);
	possible_winnings_value = (possible_winnings_value > this._maxWinnings)?this._maxWinnings:possible_winnings_value;
	
	possible_winnings = document.getElementById('betslip_possible_winnings');
	if (this.bets.length > 0) {
		possible_winnings.innerHTML = this.formatMoney((parseFloat(possible_winnings_value)).toFixed(2));
	} else {
		possible_winnings.innerHTML = this.formatMoney((parseFloat(0)).toFixed(2));
	}
	
	possible_winnings = document.getElementById('betslip_min_possible_winnings');
	possible_winnings.innerHTML = this.formatMoney( this.minPossibleWinnings() );
	
	possible_winnings = document.getElementById('betslip_max_possible_winnings');
	calculate_possible_winnings = document.getElementById('betslip_calculate');

	var bonus_rate = this._total_rate;
	
	document.getElementById('betslip_total_min_win_wrapper').style.display = 'none';
	
	//	if betslip is system calc winnings
	if (this._type == 2) {
		
		document.getElementById('betslip_total_min_win_wrapper').style.display = 'block';
	
		if ( (((this.bets.length - this.totalFix()) > 14 ) && ( forceCalc != 1 ) ) || ((this.bets.length - this.totalFix()) > 19) ) {
			
			calculate_possible_winnings.style.display = 'block';
			possible_winnings.style.display = 'none';
			document.getElementById('betslip_total_min_win_wrapper').style.display = 'none';
			
			document.getElementById('betslip_bonus').style.visibility = 'hidden';
			document.getElementById('betslip_bonus_total').style.visibility = 'hidden';
			document.getElementById('betslip_total_max_win').style.visibility = 'hidden';
			
		} else {
			
			calculate_possible_winnings.style.display = 'none';
			possible_winnings.style.display = 'block';
			
			document.getElementById('betslip_bonus').style.visibility = 'visible';
			document.getElementById('betslip_bonus_total').style.visibility = 'visible';
			document.getElementById('betslip_total_min_win').style.visibility = 'visible';
			document.getElementById('betslip_total_max_win').style.visibility = 'visible';
			var result = this.maxPossibleWinnings();
			possible_winnings.innerHTML = this.formatMoney(result[0]);
			possible_winnings_value = result[0];
			bonus_rate = result[1];
			
		}
		
	}
	
	//	calculate bonus
	
	bonus = document.getElementById('betslip_bonus');
	this._bonus = this.calcBonud(bonus_rate);
	bonus.innerHTML = this._bonus;
	
	bonus = document.getElementById('betslip_bonus_total');
	bonus_value = parseFloat( (possible_winnings_value) * ( this._bonus / 100) );
	bonus.innerHTML = this.formatMoney(bonus_value.toFixed(2));
	
	//	calculate tax
	
		//	min win tax
		
	var tax_min_wrapper = document.getElementById('betslip_total_tax_min_wrapper');
	var tax_min_label = document.getElementById('betslip_total_tax_min');
	var tax_min_percent_label = document.getElementById('betslip_tax_min');
	
	var tax_min_percent = 0;
	var tax_win_min_base = this.minPossibleWinnings() * ((100 + this._bonus) / 100);
	
	if (tax_win_min_base > 30000) tax_min_percent = 15;
	if (tax_win_min_base > 500000) tax_min_percent = 20;
	
	var tax_min_amount = tax_win_min_base * (tax_min_percent / 100);

	if (tax_min_percent == 0) {
		tax_min_wrapper.style.display = 'none';
	} else {
		tax_min_wrapper.style.display = 'block';
		tax_min_percent_label.innerHTML = tax_min_percent;
		tax_min_label.innerHTML = this.formatMoney(tax_min_amount.toFixed(2));
	}
	
		//	max win tax
	
	var tax_wrapper = document.getElementById('betslip_total_tax_wrapper');
	var tax_label = document.getElementById('betslip_total_tax');
	var tax_percent_label = document.getElementById('betslip_tax');
	
	var tax_percent = 0;
	var tax_win_base = possible_winnings_value + bonus_value;
	
	if (tax_win_base > 30000) tax_percent = 15;
	if (tax_win_base > 500000) tax_percent = 20;
	
	var tax_amount = tax_win_base * (tax_percent / 100);

	if (tax_percent == 0) {
		tax_wrapper.style.display = 'none';
	} else {
		tax_wrapper.style.display = 'block';
		tax_percent_label.innerHTML = tax_percent;
		tax_label.innerHTML = this.formatMoney(tax_amount.toFixed(2));
	}
	
	//	calculate total winnigs
	
	document.getElementById('betslip_total_min_win').innerHTML = this.formatMoney( this.minPossibleWinnings() * ((100 + this._bonus) / 100) - tax_min_amount);
	document.getElementById('betslip_total_max_win').innerHTML = this.formatMoney( possible_winnings_value + bonus_value - tax_amount );
	
	//	refresh total bets
	
	document.getElementById('betslip_header_total_bets').innerHTML = this.bets.length;
	
	//	refresh total fix
	
	document.getElementById('betslip_header_total_fix').innerHTML = this.totalFix();
	
	//	render combination selector
	
	this.renderSystemTypes();
	
	//	calculate rates
	
	document.getElementById('betslip_min_rate').innerHTML = parseFloat(this.minRate()).toFixed(4);
	document.getElementById('betslip_max_rate').innerHTML = parseFloat(this.maxRate()).toFixed(4);
	
	this.setCookie();

}

function isFloat(value){

	if(parseFloat(value)) {
    	return true;
      } else {
          return false;
      }
      
}

function nfact(n) {
	var result = 1;
	for (var i = 2; i <= n; i++) {
	    result *= i
	}
	return result;
}

Array.prototype.combinate = function( iItems, aIn ) {
    if (!aIn) {
        var aIn = new Array();
        this.combinate.aResult = new Array();
    }
    
    for(var i = 0; i < this.length; i++) {
        var a = aIn.concat(this[i]);
        var aRest = this.concat();
        aRest.splice(0, i + 1);
        
        if(iItems && iItems - 1 <= aRest.length) {
            aRest.combinate(iItems - 1, a);
            if(iItems == 1) this.combinate.aResult.push(a);
        }
    }
    
    return this.combinate.aResult;
}

function printTicekt() {

	var cookieStr = Cookies.get('betslip');
	
	try {
	
		cookieStr = cookieStr.split("|");
		
		if (cookieStr.length < 3) return false;
		
		this.setBet(cookieStr[0]);
	  	this._combination_type = cookieStr[2];
		
		var i=3;
		
		while (i<cookieStr.length) {
			
			if (i+1 < cookieStr.length) {
			
				var betData = [];
				betData['id'] = cookieStr[i];
				betData['type'] = cookieStr[i + 1];
				betData['rate'] = cookieStr[i + 2];
				betData['code'] = cookieStr[i + 3];
				betData['sport_id'] = cookieStr[i + 4];
				betData['contest_id'] = cookieStr[i + 5];
				betData['event_id'] = cookieStr[i + 6];
				betData['bettype_id'] = cookieStr[i + 7];
				betData['bettype'] = cookieStr[i + 8];
				betData['position'] = cookieStr[i + 9];
				betData['fix'] = (cookieStr[i + 10] == 'true');
				betData['competitors'] = cookieStr[i + 11];
				betData['position'] = cookieStr[i + 12];
				betData['date'] = cookieStr[i + 13];
				betData['min_bet'] = cookieStr[i + 14];
				betData['max_bet'] = cookieStr[i + 15];
				
				betslip.bets.push(betData);
				betslip.renderBet(betData, true);
				
			}
				
			i += 16;
					
		}
		
		if (cookieStr[1] == 1) {
			this.update(0);
		} else {
			this.changeType(parseFloat(cookieStr[1]));
			
			document.getElementById('betslip_ticket_type').style.display = 'block';
			if ( this.totalFix() > 0 ) {
				document.getElementById('betslip_ticket_type').innerHTML = 'Sistem ' + this._combination_type + ' od ' + (this.bets.length - this.totalFix()) + ' (+' + this.totalFix() + ' FIX)';
			} else {
				document.getElementById('betslip_ticket_type').innerHTML = 'Sistem ' + this._combination_type + ' od ' + this.bets.length;
			}
		}
		
		document.getElementById('betslip_payin_print').innerHTML = document.getElementById('betslip_payin').value;
		document.getElementById('betslip_totalbet_print').innerHTML = document.getElementById('betslip_totalbet').value;
		document.getElementById('betslip_bet_per_combination_print').innerHTML = document.getElementById('betslip_bet_per_combination').value;
	
	} catch (ex) {
		alert(ex.message + ' - ' + ex.description);
	}
	
}

function readCookie() {
	
	var cookieStr = Cookies.get('betslip');
	
	cookieStr = cookieStr.split("|");
	
	if (cookieStr.length < 3) return false;
	
	this._total_bet = cookieStr[0];
  	this._combination_type = cookieStr[2];
	
	var i=3;
	
	while (i<cookieStr.length) {
		
		if (i+1 < cookieStr.length) {
		
			var betData = [];
			betData['id'] = cookieStr[i];
			betData['type'] = cookieStr[i + 1];
			betData['rate'] = cookieStr[i + 2];
			betData['code'] = cookieStr[i + 3];
			betData['sport_id'] = cookieStr[i + 4];
			betData['contest_id'] = cookieStr[i + 5];
			betData['event_id'] = cookieStr[i + 6];
			betData['bettype_id'] = cookieStr[i + 7];
			betData['bettype'] = cookieStr[i + 8];
			betData['position'] = cookieStr[i + 9];
			betData['fix'] = (cookieStr[i + 10] == 'true');
			betData['competitors'] = cookieStr[i + 11];
			betData['position'] = cookieStr[i + 12];
			betData['date'] = cookieStr[i + 13];
			betData['min_bet'] = cookieStr[i + 14];
			betData['max_bet'] = cookieStr[i + 15];
			
			betslip.bets.push(betData);
			betslip.renderBet(betData, false);
		
		}
			
		i += 16;
				
	}
	
	if (cookieStr[1] == 1) {
		this.update(0);
	} else {
		this.changeType(parseFloat(cookieStr[1]));
	}
	
}

function setCookie() {
	
	var cookieStr = ' ';

	cookieStr += this._total_bet + '|' + this._type + '|' + this._combination_type + '|';
	
	for(var i=0;i<this.bets.length;i++) {
		
		cookieStr +=
			this.bets[i]['id'] + '|' +
			this.bets[i]['type'] + '|' + 
			this.bets[i]['rate'] + '|' +
			this.bets[i]['code'] + '|' +
			this.bets[i]['sport_id'] + '|' +
			this.bets[i]['contest_id'] + '|' +
			this.bets[i]['event_id'] + '|' +
			this.bets[i]['bettype_id'] + '|' +
			this.bets[i]['bettype'] + '|' +
			this.bets[i]['position'] + '|' +
			this.bets[i]['fix'] + '|' +
			this.bets[i]['competitors'] + '|' +
			this.bets[i]['position'] + '|' +
			this.bets[i]['date'] + '|' +
			this.bets[i]['min_bet'] + '|' +
			this.bets[i]['max_bet'] + '|';
						
	}

	Cookies.set('betslip', cookieStr, 60);
	
}