
function createRequestObject()
{
	SlipClass.showLoading();

	if (window.XMLHttpRequest)
	{
		try
		{
			return new XMLHttpRequest();
		}
		catch (e)
		{
		}
	}
	else if (window.ActiveXObject)
	{
		try
		{
			return new ActiveXObject('Msxml2.XMLHTTP');
		}
		catch (e)
		{
			try
			{
				return new ActiveXObject('Microsoft.XMLHTTP');
			}
			catch (e)
			{
			}
		}
	}

	return null;
};

var SlipToolsClass =
{
	clearZeros : function(object)
	{
		if (object.attr("value") == 0)
			object.attr("value", "");
	},
	
	formatNumber : function(num, decplaces)
	{
		num = parseFloat(num);
		
		if (!isNaN(num))
		{
			var str = "" + Math.round(num * Math.pow(10, decplaces));
			
			if (str.indexOf("e") != -1)
				return "Out of Range";
				
			while (str.length <= decplaces)
				str = "0" + str;
				
			var decpoint = str.length - decplaces;
			
			return str.substring(0, decpoint) + "." + str.substring(decpoint, str.length);
		}
		else
		{
			return "NaN";
		}
	},
	
	getCombination : function(list, indexes)
	{
		var ret = new Array();
		
		for (var i = 0; i < indexes.length; i++)
		{
			ret[i] = list[indexes[i]];
		}
		
		return ret;
	},
	
	getCombinations : function(list, amount)
	{
		if (list.length < 1)      return new Array();
		if (amount < 1)           return new Array();
		if (list.length < amount) return new Array();

		var combinations = new Array();

		var numbers = new Array();
		
		for (var i = 0; i < amount; i++)
		{
			numbers[i] = i;
		}

		combinations.push( SlipToolsClass.getCombination(list, numbers) );

		while (1)
		{
			var i = amount - 1;
			
			while (numbers[i] == list.length - amount + i)
			{
				i--;
			}

			if (i < 0)
				break;

			numbers[i] = numbers[i] + 1;
			
			for (var j = i + 1; j < amount; j++)
			{
				numbers[j] = numbers[i] + j - i;
			}
			
			combinations.push( SlipToolsClass.getCombination(list, numbers) );
		}

		return combinations;
	},

	getComboOdd : function(combo)
	{
		var odd = 1;
		
		for (var i = 0; i < combo.length; i++)
		{
			odd *= combo[i].odd;
		}
		
		return odd;
	},

	countCountBets : function()
	{
		var count = 0;
		var stakeSum = 0;

		for (var i = 0; i < variants.length; i++)
		{
			var variant = variants[i];
			var field = $(document).find("#bet" + variant.id);

			if (field.attr("value") > 0)
			{
				count++;
				stakeSum += field.attr("value") * 1;
			}
		}

		if (variants.length > 1 && canCombo)
		{
			for (var i = 1; i < variants.length + 1; i++)
			{
				var field = $(document).find("#s" + i);
				
				if (field.attr("value") > 0)
				{
					var combo_count = SlipToolsClass.getCombinations(variants, i).length;
					
					count += combo_count;

					stakeSum += field.attr("value") * combo_count;
				}
			}
		}
		else if (variants.length > 1)
		{
			var field = $(document).find("#s1");
			
			if (field.attr("value") > 0)
			{
				var combo_count = SlipToolsClass.getCombinations(variants, 1).length;
				
				count += combo_count;
				stakeSum += field.attr("value") * combo_count;
			}
		}

		betscount = count;
		betssum = SlipToolsClass.formatNumber(stakeSum, 2);

		if (variants.length > 0)
		{
			$(document).find("#count_bets").html(betscount);
			
			if (stakeSum > user_balance)
			{
				$(document).find("#amount_bets").html("<div><font color=red>" + betssum + "</font>");
			}
			else
			{
				$(document).find("#amount_bets").html(betssum);
			}
		}

		return betssum;
	},

	saveBetValuesToSlipCode : function ()
	{
		betsText = $(document).find("#slip_body").html();
		for (var i = 0; i < variants.length; i++)
		{
			var variant = variants[i];
			var field = $(document).find("#bet" + variant.id);
			var re = new RegExp('<input class="betinp" name="bet' + variant.id + '" id="bet' + variant.id + '" value=".*?"');
			betsText = betsText.replace(re, '<input class="betinp" name="bet' + variant.id + '" id="bet' + variant.id + '" value="' + field.attr("value") + '"');
		}

		if (variants.length > 1 && canCombo)
		{
			for (var i = 1; i < variants.length + 1; i++)
			{
				var field = $(document).find("#s" + i);
				var re = new RegExp('<input name="s' + i + '" id="s' + i + '" class="betinp" value=".*?"');
				betsText = betsText.replace(re, '<input name="s' + i + '" id="s' + i + '" class="betinp" value="' + field.attr("value") + '"');
			}
		}
		else if (variants.length > 1)
		{
			var i = 1;
			var field = $(document).find("#s" + i);
			var re = new RegExp('<input name="s' + i + '" id="s' + i + '" class="betinp" value=".*?"');
			betsText = betsText.replace(re, '<input name="s' + i + '" id="s' + i + '" class="betinp" value="' + field.attr("value") + '"');
		}
	},

	checkClosed : function()
	{
		var haveClosed = 0;
		
		for (var i = 0; i < variants.length; i++)
		{
			var variant = variants[i];

			if (variant.isclosed || variant.closetime < SlipToolsClass.getServerTime())
			{
				haveClosed = 1;

				$(document).find("#div_" + variant.id).css({"textDecoration": "line-through", "color": "red"});
			}
			else
			{
				$(document).find("#div_" + variant.id).css({"textDecoration": "", "color": ""});
			}
		}

		return haveClosed ? false : true;
	},
	
	checkCanBet : function()
	{
		if (!user_id)
		{
			showMessageRandom(translates["Bet"], translates['Need auth'], 250, 250);
			return false;
		}

		if (!SlipToolsClass.checkClosed())
		{
			showMessageRandom(translates["Bet"], translates['Some events closed'], 200, 150);
			return false;
		}

		if (betssum > user_balance)
		{
			showMessageRandom(translates["Bet"], translates['Insufficient money2'], 200, 150);
			return false;
		}

		if (betssum < 0.01)
		{
			showMessageRandom(translates["Bet"], translates['Need one stake'], 200, 150);
			return false;
		}

		return true;
	},

	saveValuesToCookies : function()
	{
		var odinars = new Array();
		var combos  = new Array();

		for (var i = 0; i < variants.length; i++)
		{
			var variant = variants[i];
			var field = $(document).find("#bet" + variant.id);
			odinars.push(field.attr("value"));
		}

		if (variants.length > 1 && canCombo)
		{
			for (var i = 1; i < variants.length + 1; i++)
			{
				var field = $(document).find("#s" + i);
				combos.push(field.attr("value"));
			}
		}
		else if (variants.length > 1)
		{
			var i = 1;
			var field = $(document).find("#s" + i);
			combos.push(field.attr("value"));
		}
		else
		{
			combos.push(0);
		}

		setCookie('slip_odinars', odinars.join('|'), 10);
		setCookie('slip_combos', combos.join('|'), 10);
	},

	addToSlip : function(id)
	{
		var combos_cookie = new String(getCookie('slip_combos'));
		var arr_combos = combos_cookie.split('|');
		if (arr_combos.length > 0)
		{
			arr_combos.push(arr_combos[arr_combos.length - 1]);
			arr_combos[arr_combos.length - 2] = 0;
		}
		
		setCookie('slip_combos', arr_combos.join('|'), 10);
	},

	delFromSlip : function(id)
	{
		var combos_cookie = getCookie('slip_combos');
		var arr_combos = combos_cookie.split('|');

		if (arr_combos.length > 2)
		{
			arr_combos[arr_combos.length - 2] = arr_combos[arr_combos.length - 1];

			arr_combos.length = arr_combos.length - 1;
		}
		else if (arr_combos.length > 1)
		{
			arr_combos.length = 0;
			arr_combos.push('0.00');
		}
		else if (arr_combos.length > 0)
		{
			arr_combos.length = 0;
		}

		setCookie('slip_combos', arr_combos.join('|'), 10);

		var odinars_cookie = getCookie('slip_odinars');
		var arr_odinars = odinars_cookie.split('|');
		var result_odinars = new Array();

		for (var i = 0; i < arr_odinars.length; i++)
		{
			if (variants[i].id != id)
				result_odinars.push(arr_odinars[i]);
		}

		setCookie('slip_odinars', result_odinars.join('|'));
	},
	
	showBets : function()
	{
		$(document).find("#slip_body").animate( { opacity: 'hide' }, 'slow', function()
		{
			document.getElementById("slip_body").innerHTML = betsText;
			$(document).find("#left_placebet").html('');
			$(document).find("#right_placebet").html('<img src="/images/buttons/' + lang + '/placebet.png" id="placebet_button" name="placebet_button" onclick="SlipClass.submit();">');
			$(document).find("#slip_body").animate( { opacity: 'show' }, 'slow' );
			$(document).find("#slip_clear_button").show();

			SlipClass.hideLoading();

			$(document).find("#slip_body").animate( { opacity: '1' }, 'slow' );
			$(document).find("#slip_summary").animate( { opacity: '1' }, 'slow' );
		});
		
	},
	
	showConfirm : function()
	{
		betsText = $(document).find("#slip_body").html();

		odinars = new Array();
		combos  = new Array();
		
		for (var i = 0; i < variants.length; i++)
		{
			var variant = variants[i];
			var field = $(document).find("#bet" + variant.id);
			odinars.push(field.attr("value"));
		}

		$(document).find("#slip_clear_button").hide();

		if (variants.length > 1 && canCombo)
		{
			for (var i = 1; i < variants.length + 1; i++)
			{
				var field = $(document).find("#s" + i);
				combos.push(field.attr("value"));
			}
		}
		else if (variants.length > 1)
		{
			var field = $(document).find("#s1");
			combos.push(field.attr("value"));
		}
		else
		{
			combos.push(0);
		}

		$(document).find("#slip_body").animate( { opacity: 'hide' }, 'slow', function()
		{
			for (var i = 0; i< variants.length; i++  )
			{
				var variant = variants[i];
				var value_bet = $('#bet' + variant.id).attr("value");
				$('#bet' + variant.id).remove();
				$('#div_lock_' + variant.id).hide();
				$('#td_delete_' + variant.id).remove();

				if(value_bet > 0)
					$('#div_lock_' + variant.id).text(value_bet).show();
				else
					$('#div_lock_' + variant.id).text("n/a").show();
			}
			
			if (variants.length > 1 && canCombo)
			{
				for(var i = 1; i <= variants.length; i++)
				{
					var value_s = $(document).find("#s" + i).attr("value");
					
					$(document).find("#s" + i).remove();

					if(value_s > 0)
						$(document).find("#div_lock_s_" + i).html('<span id="span_s_input_' + i + '" class="span_slip">' + value_s + '</span>');
					else
						$(document).find("#div_lock_s_" + i).html('<span id="span_s_input_' + i + '" class="span_slip">n/a</span>');
				}
			}
			else if(variants.length > 1)
			{
				for(var i = 1; i < variants.length; i++)
				{
					var value_s = $(document).find("#s" + i).attr("value");
					
					$(document).find("#s" + i).remove();

					if(value_s > 0)
						$(document).find("#div_lock_s_" + i).html('<span id="span_s_input_' + i + '" class="span_slip">' + value_s + '</span>');
					else
						$(document).find("#div_lock_s_" + i).html('<span id="span_s_input_' + i + '" class="span_slip">n/a</span>');
				}
			}
			
			$(document).find("#slip_body").animate( { opacity: 'show' }, 'slow' );
		});

		$(document).find("#left_placebet").html('<img src="/images/buttons/' + lang + '/editslip.png" id="editslip_button" name="editslip_button" onclick="SlipToolsClass.showBets(); CssExtClass.clickButton($(this));">');
		$(document).find("#right_placebet").html('<img src="/images/buttons/' + lang + '/confirm.png" id="confirm_button" name="confirm_button" onclick="SlipClass.confirm(); CssExtClass.clickButton($(this));">');
	},

	prepareFields : function()
	{
		for (var i = 0; i < variants.length; i++)
		{
			var variant = variants[i];
			var field = $(document).find("#bet" + variant.id);
			if (field.attr("value") != SlipToolsClass.getValue(field.attr("value")))
			{
				field.attr("value", SlipToolsClass.getValue(field.attr("value")));
			}
		}

		if (variants.length > 1 && canCombo)
		{
			for (var i = 1; i < variants.length + 1; i++)
			{
				var field = $(document).find("#s" + i);
				if (field.attr("value") != SlipToolsClass.getValue(field.attr("value")))
				{
					field.attr("value", SlipToolsClass.getValue(field.attr("value")));
				}
			}
		}
		else if (variants.length > 1)
		{
			var field = $(document).find("#s1");
			if (field.attr("value") != SlipToolsClass.getValue(field.attr("value")))
				field.attr("value", SlipToolsClass.getValue(field.attr("value")));
		}
	},

	countWinBets : function()
	{
		var win = 0;
		for (var i = 0; i < variants.length; i++)
		{
			var variant = variants[i];
			var field = $(document).find("#bet" + variant.id);
			if (field.attr("value") > 0)
			{
				win += field.attr("value") * variant.odd;
			}
		}

		if (variants.length > 1 && canCombo)
		{
			for (var i = 1; i < variants.length + 1; i++)
			{
				var field = $(document).find("#s" + i);
				if (field.attr("value") > 0)
				{
					var combos = SlipToolsClass.getCombinations(variants, i);
					for (var j = 0; j < combos.length; j++)
					{
						win += SlipToolsClass.getComboOdd(combos[j]) * field.attr("value");
					}
				}
			}
		}
		else if (variants.length > 1)
		{
			var field = $(document).find("#s1");
			
			if (field.attr("value") > 0)
			{
				var combos = SlipToolsClass.getCombinations(variants, 1);
				for (var j = 0; j < combos.length; j++)
				{
					win += SlipToolsClass.getComboOdd(combos[j]) * field.attr("value");
				}
			}
		}

		betswin = SlipToolsClass.formatNumber(win, 2);

		if (variants.length > 0)
		{
			$(document).find("#amount_win").html(betswin);
		}

		return betswin;
	},

	countBets : function()
	{
		SlipToolsClass.countCountBets();
		SlipToolsClass.countWinBets();
	},
	
	getServerDateTime : function()
	{
		var theYear = ( server_time.getYear() % 100 ) + ( ( ( server_time.getYear() % 100 ) < 39 ) ? 2000 : 1900 );
		var temp = new Date(theYear, server_time.getMonth(), server_time.getDate(), server_time.getHours(), server_time.getMinutes(), server_time.getSeconds() + (parseInt((new Date()).getTime() / 1000) - start_time));
		return temp;
	},

	getServerTime : function()
	{
		return parseInt((new Date()).getTime() / 1000) + time_diff;
	},
	
	checkSelected : function()
	{
		for (var i = 0; i < variants.length; i++)
		{
			var variant = variants[i];
			
			CssExtClass.clickButton($(document).find("#but_bet_" + variant.variant_id));
			CssExtClass.clickButton($(document).find("#a_bet_" + variant.variant_id));
		}
	},
	
	getValue : function(value)
	{
		if(value)
		{
			value = value.replace(/,/, '.');

			value = value.replace(/[^\d\.]/, '');

			var value_arr = value.split('.');

			if (value_arr.length > 2)
				value_arr.length = 2;
			value = value_arr.join('.');

			if (value >= 0.01 && value < minimum_bet) return minimum_bet;
			if (value < 0.01) return '0.00';

			return value;
		}
		
		return '0.00';
	},
	
	slip_error : function(req)
	{
		var content = req.responseXML.getElementsByTagName('content').item(0).firstChild.nodeValue;
		var error_code = content.substr(content.indexOf(' ') + 1);
		showMessage(translates["Bet"], response_error[error_code]);

		SlipClass.hideLoading();

		$(document).find("#slip_body").animate( { opacity: '1' }, 'slow' );
		$(document).find("#slip_summary").animate( { opacity: '1' }, 'slow' );

		SlipClass.get();
	}
};

var SlipClass = 
{
	AddedEvent : function(req)
	{
		try
		{
			if (req.readyState == 4)
			{
				if (req.status == 200)
				{
					if (req.responseXML)
					{
						if ($(req.responseXML).find('status').text() == 'ok')
						{
							var content = req.responseXML.getElementsByTagName('content').item(0).firstChild.nodeValue;
							$(document).find('#SlipDiv').html(content);
						}
						else if ($(req.responseXML).find('status').text() == 'error')
						{
							SlipToolsClass.slip_error(req);
						}
					}
				}
				else
				{
					showMessage(translates["Bet"], translates["Error connect to server"]);
					SlipToolsClass.showBets();
				}
			}
		}
		catch( e )
		{
			showMessage(translates["Bet"], translates["Error connect to server"]);
			SlipToolsClass.showBets();
		}
	},
	
	RemovedEvent : function(req)
	{
		try
		{
			if (req.readyState == 4)
			{
				if (req.status == 200)
				{
					if (req.responseXML)
					{
						if (req.responseXML.getElementsByTagName('status').item(0).firstChild.nodeValue == 'ok')
						{
							var content = req.responseXML.getElementsByTagName('content').item(0).firstChild.nodeValue;
							$(document).find('#SlipDiv').html(content);
						}
						else if ($(req.responseXML).find('status').text() == 'error')
						{
							SlipToolsClass.slip_error(req);
						}
					}
				}
				else
				{
					showMessage(translates["Bet"], translates["Error connect to server"]);
					SlipToolsClass.showBets();
				}
			}
		}
		catch( e )
		{
			showMessage(translates["Bet"], translates["Error connect to server"]);
			SlipToolsClass.showBets();
		}
	},
	
	SendEvent : function(req)
	{
		try
		{
			if (req.readyState == 4)
			{
				if (req.status == 200)
				{
					if (req.responseXML)
					{
						if (req.responseXML.getElementsByTagName('status').item(0).firstChild.nodeValue == 'ok')
						{
						
							for (var i = 0; i < variants.length; i++)
							{
								var variant = variants[i];

								CssExtClass.unclickButtonBet($(document).find("#but_bet_" + variant.variant_id), variant.id, variant.variant_id);
								CssExtClass.unclickButtonBet($(document).find("#a_bet_" + variant.variant_id), variant.id, variant.variant_id);
							}

							var content = req.responseXML.getElementsByTagName('content').item(0).firstChild.nodeValue;
							$(document).find('#SlipDiv').html(content);

							clearSlipCookies();
						}
						else if ($(req.responseXML).find('status').text() == 'error')
						{
							SlipToolsClass.slip_error(req);
						}
					}
				}
				else
				{
					showMessage(translates["Bet"], translates["Error connect to server"]);
					SlipToolsClass.showBets();
				}
			}
		}
		catch( e )
		{
			showMessage(translates["Bet"], translates["Error connect to server"]);
			SlipToolsClass.showBets();
		}
	},
	
	add : function(id)
	{
		var req = createRequestObject();

		SlipToolsClass.addToSlip(id);

		if (req)
		{
			req.open("POST", '/cgi-bin/slip/add.pl');
			req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
			req.send("variant_id=" + id);
			
			req.onreadystatechange = function() { SlipClass.AddedEvent(req); };
		}
	},
	
	get : function()
	{
		var req = createRequestObject();

		if (req)
		{
			req.open("POST", '/cgi-bin/slip/get.pl');
			req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
			req.send("");
			req.onreadystatechange = function() { SlipClass.AddedEvent(req); };
		}
	},
	
	remove : function(id, v_id)
	{
		var req = createRequestObject();
		
		CssExtClass.unclickButtonBet($(document).find("#but_bet_" + v_id), id, v_id);
		CssExtClass.unclickButtonBet($(document).find("#a_bet_" + v_id), id, v_id);
		
		SlipToolsClass.delFromSlip(id);
		
		if (req)
		{
			req.open("POST", '/cgi-bin/slip/del.pl');
			req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
			req.send("id=" + id);
			req.onreadystatechange = function() { SlipClass.RemovedEvent(req); };
		}
	},

	recount : function(object, odd)
	{
		if (object.attr("value") == SlipToolsClass.getValue(object.attr("value")))
		{
			SlipToolsClass.countBets();
		}
	},
	
	recountAll : function()
	{
		SlipToolsClass.prepareFields();
		SlipToolsClass.saveValuesToCookies();
		SlipToolsClass.saveBetValuesToSlipCode();
		SlipToolsClass.countBets();
		SlipToolsClass.checkClosed();
	},
	
	submit : function()
	{
		SlipClass.recountAll();

		if(SlipToolsClass.checkCanBet())
		{
			CssExtClass.clickButton($(document).find("#placebet_button"));
			SlipToolsClass.showConfirm();
			SlipClass.recountAll();
		}
	},
	
	confirm : function()
	{
		if (SlipToolsClass.checkCanBet())
		{
			var variant_ids = new Array();
			var odds = new Array();

			$(document).find("#slip_body").animate( { opacity: '0.5' }, 'slow' );
			$(document).find("#slip_summary").animate( { opacity: '0.5' }, 'slow' );

			var have_live = false;
			for (var i = 0; i < variants.length; i++)
			{
				if (variants[i].is_live)
					have_live = true;
				variant_ids.push("v" + variants[i].variant_id);

				odds.push(variants[i].odd);
			}

			CssExtClass.clickButton($(document).find("#editslip_button"));

			var req = createRequestObject();
			if (req)
			{
				req.open("POST", '/cgi-bin/slip/bet.pl');
				req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
				req.send("variants=" + variant_ids.join('|') + "&odds=" + odds.join("|") + "&odinars=" + odinars.join('|') + "&combos=" + combos.join('|'));
				req.onreadystatechange = function() { SlipClass.SendEvent(req); };
			}
		}
	},
	
	clear : function()
	{
		for (var i = 0; i < variants.length; i++)
		{
			var variant = variants[i];

			CssExtClass.unclickButtonBet($(document).find("#but_bet_" + variant.variant_id), variant.id, variant.variant_id);
			CssExtClass.unclickButtonBet($(document).find("#a_bet_" + variant.variant_id), variant.id, variant.variant_id);
		}
		
		var req = createRequestObject();
		if (req)
		{
			req.open("POST", '/cgi-bin/slip/clear.pl');
			req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
			req.send("");
			req.onreadystatechange = function() { SlipClass.RemovedEvent(req); clearSlipCookies(); };
		}
	},

	hideLoading : function()
	{
		$(document).find("#loading_bar").animate( { opacity: 'hide' }, 'slow' );
	},

	showLoading : function()
	{
		$(document).find("#loading_bar").animate( { opacity: 'show' }, 'slow' );
	}
};
