Math.factorial = (function () {
	var f = [1];
	return function( n ){
		if ( n in f ) { return f[n]; }
		var res = f[f.length-1];
		for ( var i = f.length; i <=n; i++ ) {
			res *= i;
			f[i] = res;
		}
		return res;
	};
})();

Math.combination = function( m, n ) {
	return (m <= n) ? Math.factorial(n) / (Math.factorial(m) * Math.factorial(n - m)) : 1;
};

/*
* @param type: 	EU
* 				UK
* 				US
* 				HK
* 				ID
* 				MY
*/

(function($){
	
	$.fn.qwerty = function(options) {
		
		var subsecOptions = {};
		
		var reFloat = /\d+\.?\d*/,
			reFloatQ = /\d+\.[27]5/,
			hiddenClass = window.hiddenClass || 'hide'
		;
			
		/**
		 * @param {boolean} buypoints 
		 * @param {float} buypoints_step
		 * @param {integer} buypoints_spread
		 * @param {integer} buypoints_charge
		 */
		options = $.extend(true, {}, {
			idTo: 'betcard',
			coeff: 'a.ratelink',
			sec: "placebet",
			currency: '&euro;',
			//minItems: [ 0, 2, 3, 2, 2, 2],
			//activeTab: [1, 1, 1, 0, 0, 0],
			minval: 0.1,
			maxevent: 10,
			
			validate: function ( self ) {
				return true;
			},
			
			teaser : {
				mixed: false,
				sports: {},
				table: {},
				restrictOdd: false
			},
			
			subsec: subsecOptions,
			allowConflict: false,
			conflict_mod: false,
			conflict_mod_outright: true,
			type: "EU",
			payout : false,
			resultWin : 'pure',
			buypoints: false,
			buypoints_step: 0.5,
			buypoints_spread: 3,
			buypoints_charge: 10,
			buypoints_extra : true,
			userForm: '',
			initUserForm: function() {},
			
			bankersEnabled: true,
			
			onInsert: function( $betCart, countEvents ){}
			
		}, options);
		

		options.w = [_('Single'), _('Double'), _('Treble'), _('Fourfold'), _('Fivefold'), _('Sixfold'), _('Sevenfold'), _('Eightfold'), _('Ninefold'), _('Tenfold'), _('Elevenfold'), _('Twelvefold'), _('Thirteenfold'), _('Fourteenfold'), _('Fifteenfold'), _('Sixteenfold'), _('Seventeenfold'), _('Eighteenfold'), _('Nineteenfold'), _('Twentyfold')];
		options.message = {
			minval: _("You can bet minimum ") + (options.minval) + (options.currency || "&euro;") + ".",
			maxevent: _("You can add maximum ") + (options.maxevent) + _(" picks."),
			teaser: _("Please select a teaser."),
			conflict: _("You have conflicting picks in your selection"),
			odds_changed: _("Odds were changed. Please confirm your selection."),
			trigger_limit: _("Please check your limits.")
		};
		
		var templates = window.betCartTemplates;
		
		function d2( value ){
			return  ( 1 * value ).toFixed(2);
		};
			
		var bet_cart = function(o) {
			
			var getType = (function () {
				var constType = [],
					type = {};
				for(var prop in options.subsec){
					constType.push(options.subsec[prop]);
				}
				return function( string ) {
					for( var i = 0, n = constType.length; i < n; i++ ) {
						type[constType[i]] = ( new RegExp( constType[i] ) ).test(string);
						if( type[constType[i]] ) {
							type.name = constType[i];
							try{
								type.index = document.getElementById('tab-nav-item-'+type.name).className.replace(/.*tab-nav-item-(\d+).*/, '$1') - 1;
							} catch( e ){
								type.index = -1;
							}
						}
					}
					return type;
				};

			})();

			var getEventID = (function(){
				var eventID = 0, events = {};
				return function(string) {
					if(!events[string]) {
						events[string] = ++eventID;
					}
					return ""+events[string];
				};
			})();
			
			var $betCart, $tabsNav, $betCartPane, $buttons, self, birs = {};
			
			var createButtons = function (b) {	
			
				b.clear.click(function(e) {
					if( $betCart.hasClass("post-data") ) { return false; }
					e.preventDefault();
					deinit(); 
				});
				b.send.click(function( e ) {
					
					if( $betCart.hasClass("post-data") ) { return false; }
					e.preventDefault();

					var $this = $(this), 
						context = this;

					this.$element = $("#" + $this.closest('.betcart-pane-action').attr("id").replace("-button", ""));
					this.elementName = this.$element.attr('id');
					this.elementType = getType( this.elementName );
					
					if( !o.allowConflict && $('#' + this.elementType.name + '-pane-events').hasClass('betcart-pane-event-conflict') ) {
						_alert(o.message.conflict);
						return;
					}
					this.$element.stake = this.$element.find(".betcart-pane-bottom-stake input");
					if( !this.$element.stake.size() ) {
						this.$element.stake = this.$element.find(".betcart-pane-event-stake input");
					}
					this.$element.potential = this.$element.find(".betcart-pane-bottom-potential input");
					if( this.$element.potential.attr('readonly') ) {
						this.$element.potential = this.$element.potential.addClass('read').add(this.$element.find(".betcart-pane-event-potential input"));
					}
					this.$element.close = this.$element.find("a.betcart-pane-event-remove");
					this.$element.buypoints = this.$element.find('.betcart-pane-event-coeff select');
					
					this.$element.stake.removeClass('betcart-pane-event-stake-minval').each(function(i) {
						if( parseFloat( this.value ) < o.minval ) {
							$(this).addClass('betcart-pane-event-stake-minval');
						}
						this.value = d2(this.value);
					});
					this.$element.stakeMinimalValue = this.$element.stake.filter("input.betcart-pane-event-stake-minval");
					
					if ( this.$element.stakeMinimalValue.size() ) {
						_alert(o.message.minval);
						return;
					} 
					
					this.$element.select = $("#"+this.elementType.name+"-pane-bottom>.betcart-pane-bottom-select>select");
					
					if( this.elementType.teaser ) {
						var _teaserValue =  1 * (this.$element.select.children(':selected').html() + '').replace(' pt', '');
						if( isNaN( _teaserValue ) ) {
							_alert(o.message.teaser);
							return;
						}
					}
					
					var fn = function(){
						
						if( this.elementType.teaser ) {
							this.$element.children(':first').children().find('.betcart-pane-event-pick').each(function(){
								var _html = this.innerHTML;
								var _value = _html.replace("\n",'').replace(/.*\((.+)\).*/, '$1');
								if( _value == _html ) {
									_value = _html.split(' ')[1];
									_value = parseFloat(_value) + ( _html.toUpperCase().indexOf('OVER') > -1 ? -1 : 1 ) * _teaserValue;
								} else {
									_value = parseFloat(_value)  +  _teaserValue;
								}
								var new_html = _html.replace(/(.*)\(.+\)(.*)/, '$1('+ _value +')$2');
								if( new_html == _html ) {
									var _t = _html.split(' ');
									_t[1] = _value;
									new_html = _t.join(' ');
									_t.length = 0;
								}
								this.innerHTML = new_html;
								_value = _html = null;
							});
						}
						
						this.$element.stake.attr( "readonly", "readonly" ).addClass("betcart-pane-event-stake-readonly");
						this.$element.potential.attr("readonly", "readonly").addClass("betcart-pane-event-stake-readonly").not(".read").each(function(){
							this.value = this.realValue || this.viewValue || this.value;
						});
						this.$element.buypoints.attr('disabled', "disabled");
						
						if(self.$userForm) {
							self.$userForm.addClass('betcart-pane-event-form-readonly').find('input, select, textarea').addClass('readonly').attr('readonly', true);
						}
						
						if( this.$element.select.next().is('strong') ) {
							this.$element.select.attr('disabled' , "disabled").addClass(hiddenClass).next().text( this.$element.select.children('option:selected').text() ).removeClass(hiddenClass);
						} else {
							this.$element.select.attr('disabled' , "disabled").addClass(hiddenClass).after( '<strong class="g-right" />' ).next().text( this.$element.select.children(':selected').text() );
						}
						
						this.$element.close.addClass(hiddenClass);
					
						if ( this.elementType.system || this.elementType.roundrobin ) {
							$("#"+this.elementType.name+"-pane-checkbox>.betcart-pane-checkbox-item").each(function() {
								var $self = $(this);
								if( $self.hasClass("betcart-pane-checkbox-item-active") ) {
									$self.find('a, input[type="checkbox"]').addClass(hiddenClass);
								} else {
									$self.addClass(hiddenClass);
								}
							});
							if ( o.bankersEnabled ) {
								var bankersCheck = document.getElementById("bankers-activate-checkbox");
								$(bankersCheck).closest(".betcart-pane-bankers").hide();
								if ( bankersCheck.checked ) {
									$('input:checkbox', document.getElementById(this.elementType.name + '-pane-events')).each(function(){
										if ( this.checked ) {
											this.readOnly = true;
											this.parentNode.className = $.trim(this.parentNode.className + " readonly");
										} else {
											this.parentNode.style.display = "none";
										}
									});
								}
							}
						}
						
						if( this.elementType.ifbet ) {
							this.$element.find('.betcart-pane-event-arrow').addClass(hiddenClass);
						}
						
						var _currentIndex = self.active.indexOf(this.elementType.index);
						
						for( var k in b ) {
							if( !b.hasOwnProperty(k) || !b[k].size() ) { continue; }
							if( k == 'send' || k == 'clear' ) {
								b[k].eq(_currentIndex).addClass(hiddenClass);
							} else {
								b[k].eq(_currentIndex).removeClass(hiddenClass);
							}
						}
						
						$betCart.removeClass("post-data").addClass('betcart-preview');

					};
					
					//hide navigate
					$tabsNav.addClass(hiddenClass);
					$("#betcard_error_panel").addClass(hiddenClass).empty();
					
					$betCart.addClass("post-data");
					
					var couldown = 0;
					
					for ( var oid in birs ) {
						if ( birs.hasOwnProperty(oid) ) {
							couldown = Math.max(birs[oid], couldown);
						}
					}
					
					if ( couldown ) {
						self.couldown = _addCouldown($.proxy(function(){
							fn.call(this);
							self.couldown = _addCouldown(function(){
								b.change.click();
							}, couldown, _("Offer will expired in"), "betcart-couldown-green");
						}, this), couldown, _("Selection will be confirmed in"), "betcart-couldown-orange");
					} else {
						fn.call(this);
					}
					
				});
				b.change.click(function( e ) {
					
					if( $betCart.hasClass("post-data") ) { return false; }
					e.preventDefault();
					
					if ( self.couldown ) { 
						clearInterval(self.couldown);
						 $("#betcard_couldown_panel").addClass(hiddenClass); 
					}
					
					var $this = $(this), 
						context = this;
					this.$element = $("#" + $this.closest('.betcart-pane-action').attr("id").replace("-button", ""));
									
					this.elementName = this.$element.attr('id');
					
					this.$element.stake = this.$element.find(".betcart-pane-bottom-stake input");
					if( !this.$element.stake.size() ) {
						this.$element.stake = this.$element.find(".betcart-pane-event-stake input");
					}
					this.$element.potential = this.$element.find(".betcart-pane-bottom-potential input");
					if( this.$element.potential.hasClass('read') ) {
						this.$element.potential = this.$element.potential.add( this.$element.find(".betcart-pane-event-potential input") );
					}
					this.$element.close = this.$element.find("a.betcart-pane-event-remove");
					this.$element.buypoints = this.$element.find('.betcart-pane-event-coeff select');
					
					this.elementType = getType( this.elementName );
					
					this.$element.select = $("#"+this.elementType.name+"-pane-bottom>.betcart-pane-bottom-select>select");
					
					this.$element.stake.removeAttr( "readonly" ).removeClass("betcart-pane-event-stake-readonly");
					this.$element.potential.removeAttr("readonly" ).removeClass("betcart-pane-event-stake-readonly").each(function(){
						var $this = $(this);
						if( $this.hasClass('read') ) { 
							return $this.attr('readonly', "readonly").removeClass("read");
						}
						this.value = this.viewValue || this.realValue || this.value;
					});
					this.$element.select.removeAttr('disabled').removeClass(hiddenClass).next().addClass(hiddenClass);
					this.$element.buypoints.removeAttr('disabled');
					this.$element.close.removeClass(hiddenClass);
					if(self.$userForm) {
						self.$userForm.removeClass('betcart-pane-event-form-readonly').find('.readonly').removeClass('readonly').removeAttr('readonly');
					}
					
					if ( this.elementType.system || this.elementType.roundrobin ) {
						$("#"+this.elementType.name+"-pane-checkbox>.betcart-pane-checkbox-item").each(function() {
							var $self = $(this);
							if( $self.hasClass("betcart-pane-checkbox-item-active") ) {
								$self.find('a, input[type="checkbox"]').removeClass(hiddenClass);
							} else {
								$self.removeClass(hiddenClass);
							}
						});
						if ( o.bankersEnabled ) {
							var bankersCheck = document.getElementById("bankers-activate-checkbox");
							$(bankersCheck).closest(".betcart-pane-bankers").show();
							if ( bankersCheck.checked ) {
								$('input:checkbox', document.getElementById(this.elementType.name + '-pane-events')).each(function(){
									if ( this.checked ) {
										this.readOnly = false;
										this.parentNode.className = $.trim((" " + this.parentNode.className + " ").replace(" readonly "," "));
									} else {
										this.parentNode.style.display = "block";
									}
								});
							}
						}
					}
					
					if( this.elementType.ifbet ) {
//						this.$element.find('.betcart-pane-event-potential').removeClass(hiddenClass);
						this.$element.find('.betcart-pane-event-arrow').removeClass(hiddenClass);
					}
					
					if( this.elementType.teaser ) {
						var _teaserValue =  1 * (this.$element.select.children(':selected').html() + '').replace(' pt', '');
						this.$element.children(':first').children().find('.betcart-pane-event-pick').each(function(){
							var _html = this.innerHTML;
							var _value = _html.replace("\n",'').replace(/.*\((.+)\).*/, '$1');
							if( _value == _html ) {
								_value = _html.split(' ')[1];
								_value = parseFloat(_value) + ( _html.toUpperCase().indexOf('OVER') > -1 ? 1 : -1 ) * _teaserValue;
							} else {
								_value = parseFloat(_value) - _teaserValue;
							}
							var new_html = _html.replace(/(.*)\(.+\)(.*)/, '$1('+ _value +')$2');
							if( new_html == _html ) {
								var _t = _html.split(' ');
								_t[1] = _value;
								new_html = _t.join(' ');
								_t.length = 0;
							}
							this.innerHTML = new_html;
							_value = _html = null;
						});
					}
					var _currentIndex = self.active.indexOf(this.elementType.index);
					for( var k in b ) {
						if( !b.hasOwnProperty(k) || !b[k].size() ) { continue; }
						if( k == 'send' || k == 'clear' ) {
							b[k].eq(_currentIndex).removeClass(hiddenClass);
						} else {
							b[k].eq(_currentIndex).addClass(hiddenClass);
						}
					}
					
					//show navigate and hide message box
					$tabsNav.removeClass(hiddenClass);
					
					$betCart.removeClass('betcart-preview');
					$("#betcard_error_panel").addClass(hiddenClass);
					
				});
				b.confirm.click(function( e ) {
					if( $betCart.hasClass("post-data") ) { return false; }
					e.preventDefault();
					
					if ( self.couldown ) { 
						clearInterval(self.couldown);
						 $("#betcard_couldown_panel").addClass(hiddenClass); 
					}
					
					var $this = $(this), 
						context = this;
					this.$element = $("#" + $this.closest('.betcart-pane-action').attr("id").replace("-button", ""));
					this.elementName = this.$element.attr('id');
					this.elementType = getType( this.elementName );
					this.$element.stake = this.$element.find(".betcart-pane-bottom-stake input");
					if( !this.$element.stake.size() ){
						this.$element.stake = this.$element.find(".betcart-pane-event-stake input");
					}
					this.$element.close = this.$element.find("a.betcart-pane-event-remove");
					
					this.$element.select = $("#"+this.elementType.name+"-pane-bottom>.betcart-pane-bottom-select>select");
					
					var dataPost = {
						stake: [],
						oid: [],
						odds: [],
						buypoints: [],
						live: [],
						syst: [],
						banker: [],
						push: this.$element.select.val()
					};
					// TODO: Печать купона
					this.$element.find('.betcart-pane-event').each(function(i) {
						var $self = $(this);
						if( context.elementType.single || context.elementType.ifbet ) {
							dataPost.stake.push( $self.find(".betcart-pane-event-stake input").val() );
						}
						dataPost.oid.push( $self.find("input.data-oid").val() );
						dataPost.odds.push( $self.find("input.data-odds").attr('value') );
						dataPost.buypoints.push( $self.find("input.data-buypoints").val() );
						
						if($self.find("input.data-status").val()=="inprogress") {
							dataPost.live.push( 1 );
						}
					});
					
					if( !context.elementType.single && !context.elementType.ifbet ) {
						dataPost.stake = this.$element.stake.val();
					}
					if( context.elementType.system || context.elementType.roundrobin ) {
						$("#"+this.elementType.name+"-pane-checkbox>.betcart-pane-checkbox-item").each(function() {
							dataPost.syst.push( $(this).hasClass('betcart-pane-checkbox-item-active') );
						});
						$("#"+this.elementType.name+"-pane-events .betcart-pane-event-banker label").each(function() {
							dataPost.banker.push( $(this).hasClass('checked') );
						});
					}
					this.$element.find("input.trigger_limits").removeClass("trigger_limits");	
					if(self.$userForm) {
						dataPost = [$.param(dataPost, false), self.$userForm.filter(":visible").serialize()].join('&');

					}
					$.ajax({
						type: "POST",
						url: "getdata.php?sec=" + options.sec + "&subsec=" + this.elementType.name,
						data: dataPost,
						beforeSend: function(){
							$betCart.addClass("post-data");
							$buttons.addClass('betcart-pane-action-item-disabled');
						},
						success: function(data) {
							
							$buttons.removeClass('betcart-pane-action-item-disabled');
							$betCart.removeClass("post-data");
							if (data.state == "ok") {
								debugger;
								deinit( templates.response.supplant( templates.responseData[ data.desc ] ).replace( /<\w+>\s*<\/\w+>/, '' ).supplant(data) );
								$('#btn_refresh_balance').click();
								$(document).trigger('succes_betcart');
							} else {
								if (data.state == "error") {
									switch (data.desc) {
										case "msg":
											_alert(data.msg);
											break;
										case "odds_changed":
											_alert( o.message["odds_changed"], updateOddByOid( data.odds_changed ) );
											break;
										case "not_available":
											_alert("not available", function(){
												for (var i = 0, n = data.not_available.length; i < n; i++) {
													var mid = data.not_available[i];
													$("#" + options.idTo + " li.mid" + mid).each(function(){
														$(this).css("color", "red").addClass("not-available");
													});
												}
												$("#" + options.idTo + " .not-available").fadeOut("fast", function(){
													$(this).each(function(){
														var cl = $(this).attr("class"), mid = cl.replace(/.*\bmid(\d+)\b.*/, '$1') , oid = cl.replace(/.*\boid(\d+)\b.*/, '$1');
														self.remove({
															"mid": mid,
															"oid": oid
														});
													});
												});
											});
											break;
										case "trigger_limit":
											var rLimits = data["trigger_limit"];
											_alert(o.message["trigger_limit"], function() {
												if( rLimits[0].oid == 0 ) {
													context.$element
														.find("input.stake")
														.addClass("trigger_limits")
														.val( rLimits[0].limit )
														.triggerHandler('keyup')
													;
												}
												for( var i = 0, n = rLimits.length; i < n; i++ ) {
													
													var $stake = context.$element.find( ".oid" + rLimits[i].oid + " .betcart-pane-event-stake input");
													
													if( !$stake.size() ) {
														$stake = context.$element.children('.betcart-pane-bottom').find('.betcart-pane-bottom-stake input');
													}
													
													$stake
														.addClass("trigger_limits")
														.val( rLimits[i].limit )
														.triggerHandler('keyup')
													;
												}
											});
											break;
										default:
											break;
									}
								} else {
									_alert(_("Internal server error. Please try again"));
								}
							}
						},
						error: function() {
							_alert(_("Internal server error. Please try again"), function(){
								$buttons.removeClass('betcart-pane-action-item-disabled');
								$betCart.removeClass("post-data");
							});
						},
						dataType: "json"
					});
				});
							
			};
		
			function init() {
				var subsec = $.extend(o.subsec, {});
				self = this;
				this.countEvents = 0;
				this.active = [];
				this.disabled = [];
				this.enabled = [];
				this.countTabs = 0;
				this.minItem = Number.MAX_VALUE;
				this.maxItem = Number.MIN_VALUE;
				this.betCartHTML = {
					nav: ['<ul '+ templates.betCartNavAttr +'>'],
					pane: []
				};

				for( var i = 0, n = templates.tabs.length; i < n; i++ ) {
					
					var nav = templates.tabs[i].nav.supplant(subsec);
					
					if( /id="tab-nav-item-{[^}]+}"/.test( nav ) ) {continue;}
					
					this.active.push(i);
					this.betCartHTML.nav.push( nav.supplant( {index : i+1} ) );
					if(o.userForm && !o.subsec.form) {
						o.subsec.form = o.userForm;
					}
					this.betCartHTML.pane.push( templates.tabs[i].pane.supplant( o.subsec ) );
					
					if ( templates.tabs[i].minItems !== 0) {
						this.disabled.push(this.countTabs);
					} else {
						this.enabled.push(this.countTabs);
					}

					if( this.minItem > templates.tabs[i].minItems ){
						this.minItem = templates.tabs[i].minItems;
					}
					if( this.maxItem < templates.tabs[i].minItems ){
						this.maxItem = templates.tabs[i].minItems;
					}
					this.countTabs++;
				}
				this.betCartHTML.nav.push( '</ul>' );
				
				this.betCartHTML = this.betCartHTML.nav.join('')+ this.betCartHTML.pane.join('');
				
				$("#"+o.idTo).html( templates.betCart.supplant({ title: templates.betCartTitle, betcart: this.betCartHTML.supplant({currency: o.currency}) }) ).removeClass('g-hidden').removeClass('betcard__deinit');
				$betCart = $("#"+options.idTo+"-body").addClass('betcart-body').tabs({
					select: this.enabled[0],
					disabled: this.disabled
				});
				
				if( o.userForm ) { this.$userForm = o.initUserForm instanceof Function ? o.initUserForm() : null ; }
				
				$tabsNav = $("ul.ui-tabs-nav", $betCart);
				$betCartPane = $betCart.children(".betcart-pane");
				$buttons = $(".betcart-pane-action-item", $betCart);
					
				createButtons({
					clear: $buttons.filter(".betcart-pane-action-clear"),
					send: $buttons.filter(".betcart-pane-action-send"),
					change: $buttons.filter(".betcart-pane-action-change"),
					confirm: $buttons.filter(".betcart-pane-action-confirm")
				});
				
				$betCart.attr("init", true);
				
				if ( o.bankersEnabled ) {
					$betCart.addClass("betcart-bankers-enabled");
				}
				
				o.teaser.index = getType( o.subsec.teaser ).index;
				
				o.buypoints = o.buypoints && o.type == "US";
				
				this.insert = function(data) {
					
					if (this.countEvents === o.maxevent) {
						_alert(o.message.maxevent);
						return false;
					}
					
					this.countEvents++;
					if ( data.event_status === "inprogress" ) {
						birs[data.oid] = ~~data.bir_delay;
					}

					$betCartPane.each(function(i) {
						
						if (self.countEvents >= templates.tabs[self.active[i]].minItems && self.active[i] !== o.teaser.index ) {
							$betCart.tabs('enable', i);
						} else if ( self.active[i] === o.teaser.index ) {
							if( !self.Teaser ) {
								self.Teaser = new Teaser(this);
							}
							
							self.Teaser.setEnabled( self.Teaser.isTeaser(data) );
							
							if( self.Teaser.isEnabled() ) {

								if ( self.countEvents >= templates.tabs[ o.teaser.index ].minItems && self.Teaser.isDisabled() ) {
									self.Teaser.enable();
								} else if( self.countEvents < templates.tabs[ o.teaser.index ].minItems && !self.Teaser.isDisabled() ) {
									self.Teaser.disable();
								}
															
							} else if( !self.Teaser.isDisabled() ) {
								self.Teaser.disable();
							}
						}
						
						this.$element = $(this);
						this.elementName = $(this).attr("id");
						this.elementType = getType( this.elementName );
						this.$eventList = $('#' + this.elementType.name + '-pane-events');
						data.currency = o.currency;
						data.coeff = o.type == 'EU' || o.type == 'HK' ? d2( Math.round( transformCoeff( data.odds, o.type ) * 100) / 100 ) :  transformCoeff( data.odds, o.type );
						
						if (data.type == '1x2' || data.type == '12') {
							data.event_type = _('Match Win');
							data.event_pick = data.beton;
						} else if (data.type == 'ou') {
							data.event_type = _('Over/Under');
							data.event_pick = data.beton + ' ' + data.beton_val;
						} else  if (data.type == 'ah') {
							data.event_type = _('Handicap');
							data.event_pick = '<div class="betcart-pane-event-pick-ah-team">' + data.beton + '</div><div class="betcart-pane-event-pick-ah-coeff">' + '(' + data.beton_val + ')' + '</div>';
						} else if (data.type == 'cs') {
							data.event_type = _('Correct Score');
							data.event_pick = data.beton_val;
						} else if (data.type == 'hf') {
							data.event_type = _('Half Time / Full Time');
							data.event_pick = data.beton;
						} else if (data.type == 'tg') {
							data.event_type = _('Total Goals');
							data.event_pick = data.beton;
						} else if (data.type == 'tga') {
							data.event_type = _('Away team total Goals');
							data.event_pick = data.beton;
						} else if (data.type == 'tgh') {
							data.event_type = _('Home team total Goals');
							data.event_pick = data.beton;
						} else if (data.type == 'ng') {
							data.event_type = _('Number of goals');
							data.event_pick = data.beton;
						} else if (data.type == 'nga') {
							data.event_type = _('Away team number of goals');
							data.event_pick = data.beton;
						} else if (data.type == 'ngh') {
							data.event_type = _('Home team number of goals');
							data.event_pick = data.beton;
						} else if ( /^out/.test(data.type) ) {
							data.event_type = data.beton.split("::")[0];
							data.event_pick = (data.beton+"::"+data.beton).split("::")[1];
						} else if (data.type == 'dc') {
							data.event_type = _('Double Chance');
							data.event_pick = data.beton;
						} else if (data.type == '1x2ah') {
							data.event_type = _('Three-way handicap');
							data.event_pick = '<div class="betcart-pane-event-pick-ah-team">' + data.beton + ' (' + data.beton_val + ')' + '</div>';
						};
						
//						data.first_half = /\(first-half\)/.test(data.event);
						data.first_half = data.scope != 'fe';
						
						if( !data.first_half && (data.type == 'ou' || data.type == 'ah') && o.buypoints && self.active[i] !== o.teaser.index && Teaser.isTeaserSport( data.sport) ) {

							data.beton_val *= 1;
							var buypoints_select = ['<div class="betcart-pane-event-buypoints"><select>'],
								american_coeff = transformCoeff(data.odds, o.type) + o.buypoints_charge,
								decimal_coeff = data.odds,
								nbsp = reFloatQ.test(data.beton_val) ? '&nbsp;&nbsp;&nbsp;' : '&nbsp;&nbsp;',
								/* @TODO: modify condition */
								sign = data.beton.toLowerCase() === 'over' ? -1 : 1;

							
							for(var j = data.beton_val, n = data.beton_val + sign*o.buypoints_spread; sign*(j - n) <=0; j += sign*o.buypoints_step ) {
								
								american_coeff -= o.buypoints_charge;

								
								if( o.buypoints_extra && j != data.beton_val && Math.abs( data.beton_val ) == 3 && data.sport == 'rg' && data.type == 'ah' ) {
									american_coeff -= o.buypoints_charge;
								}

								if( Math.abs(american_coeff) < 100 ) {
									american_coeff -= 200;
								}
								
								decimal_coeff = transformCoeff(american_coeff, o.type, true);
								
								var allowance = j > 0 && data.type == 'ah' ? '+' + j : j;
								
								if( !/\./.test(allowance) ) {
									allowance += nbsp;
								}
								
								buypoints_select.push( ('<option value="' + decimal_coeff + '#' + sign*( j - data.beton_val) / o.buypoints_step + '">'+ allowance +'&nbsp;' + american_coeff + '</option>').replace(/-/g, '&minus;') );
								
							}
							
							buypoints_select.push('</select></div>');
							
							data.event_pick = '<div class="betcart-pane-event-pick-'+data.type+'-team">' + data.beton + '</div>';
							data.coeff = buypoints_select.join('');
								
						}
						
						data.first_half *= 1;
						data.pure_event = $.trim(data.event.replace(/\(first-half\)/, ''));
						
						data.index = self.countEvents - 1;
						data.ifbet = 1 === self.countEvents ? 'ifbet="true"': '';
							
						this.tmpBetOnVal = data.beton_val != undefined ? data.beton_val : 3.33;
						data.beton_val = 100 * Math.abs( this.tmpBetOnVal );
						
//						if ( data.scope ) {
//                            data.event += (', ' + data.scope).toUpperCase();
//                            delete data.scope;
//						}
						
						this.elementHTML = templates.tabs[self.active[i]].item.supplant(data);

						if(this.tmpBetOnVal){
							data.beton_val = this.tmpBetOnVal;
							this.tmpBetOnVal = null;
						}
						
						var $eventListItem = $(this.elementHTML).appendTo(this.$eventList);
						$eventListItem.find("a.oid"+data.oid).bind('click', function(e){
							e.preventDefault();
							self.remove(data);
						}).removeClass("oid"+data.oid);
						
						if ( o.conflict_mod_outright && /^out/.test(data.type) ) {
							$eventListItem.addClass("outright");
						}
						
						if( self.countEvents === 1 || !this.$eventList.children('.betcart-pane-event:first-child').hasClass('betcart-pane-event-first-child') ) {
							this.$eventList.children('.betcart-pane-event:first-child').addClass('betcart-pane-event-first-child');	
						}
						
						this.$eventList.children('.betcart-pane-event:last-child').addClass('betcart-pane-event-last-child').prev().removeClass('betcart-pane-event-last-child');
						this.$eventListConflict = this.$eventList.children( ".mid" + data.mid );

						if( o.conflict_mod == 'disable_only_mn_sp' && this.$eventListConflict.size() > 1 ) {
							var SPORTS = { 'ba': 1, 'rg': 1, 'bb': 1 };
							var TYPES = { '12': 1, '1x2': 1, 'ah': 1, 'ou' : 1 };

							var 
								sole = parseInt((new Date()).getTime()).toString(36).toUpperCase(),
								spread = spread1H = spreadFT = false,
								total1H = totalFT = false,
								moneline = false;
							;

							this.$eventListConflict.addClass('conflict'+sole).each(function() {
								var $item = $j(this);
								var 
									params = this.className,
									type = params.replace(/.*type(\S+).*/, '$1'),
									sport = params.replace(/.*sport(\S+).*/, '$1'),
									scope = params.replace(/.*scope(\S+).*/, '$1')
								;
								if( sport in SPORTS ) {
									
									$item.removeClass('conflict'+sole);
									
									spread = type == 'ah';
									if( spread ) {
										$item.addClass('spread'+sole);	
									}
									spread1H = type == 'ah' && scope != 'fe';
									if( spread1H ) {
										$item.addClass('spread1H'+sole);	
									}
									
									spreadFT = type == 'ah' && scope == 'fe';
									if( spreadFT ) {
										$item.addClass('spreadFT'+sole);	
									}
									
									total1H = type == 'ou' && scope != 'fe';
									if( total1H ) {
										$item.addClass('total1H'+sole);	
									}
											
									totalFT = type == 'ou' && scope == 'fe';
									if( totalFT ) {
										$item.addClass('totalFT'+sole);	
									}
									
									moneline = type == '1x2' || type == '12';
									if( moneline ) {
										$item.addClass('moneline'+sole);	
									}

                                                                        moneline1H = (type == '1x2' || type == '12') && scope != 'fe';
                                                                        if( moneline1H ) {
                                                                                $item.addClass('moneline1H'+sole);
                                                                        }
                                                                        monelineFT = (type == '1x2' || type == '12') && scope == 'fe';
                                                                        if( monelineFT ) {
                                                                                $item.addClass('monelineFT'+sole);
                                                                        }

									
								} 
							});

							var items = this.$eventListConflict;

							var spreadItems = items.filter('.spread'+sole);
							var monelineItems = items.filter('.moneline'+sole);
							
							if( spreadItems.size() && monelineItems.size() ) {
								spreadItems.removeClass('spread'+sole).addClass('conflict'+sole);
								monelineItems.removeClass('moneline'+sole).addClass('conflict'+sole);
							} 

							var spread1HItems = spreadItems.filter('.spread1H'+sole);
							var spreadFTItems = spreadItems.filter('.spreadFT'+sole);

							if( spread1HItems.size() && spreadFTItems.size() ) {
								spread1HItems.removeClass('spread1H'+sole).addClass('conflict'+sole);
								spreadFTItems.removeClass('spreadFT'+sole).addClass('conflict'+sole);
							}

							var total1HItems = items.filter('.total1H'+sole);
							var totalFTItems = items.filter('.totalFT'+sole);

							if( total1HItems.size() && totalFTItems.size() ) {
								total1HItems.removeClass('total1H'+sole).addClass('conflict'+sole);
								totalFTItems.removeClass('totalFT'+sole).addClass('conflict'+sole);
							} 

                                                        var moneline1HItems = items.filter('.moneline1H'+sole);
                                                        var monelineFTItems = items.filter('.monelineFT'+sole);


                                                        if( moneline1HItems.size() && monelineFTItems.size() ) {
                                                                 moneline1HItems.removeClass('total1H'+sole).addClass('conflict'+sole);
                                                                 monelineFTItems.removeClass('totalFT'+sole).addClass('conflict'+sole);
//								  moneline1HItems.removeClass('monelineFT'+sole).addClass('conflict'+sole);
//								  moneline1HItems.removeClass('moneline1H'+sole).addClass('conflict'+sole);
								

                                                        }

							this.$eventListConflict = this.$eventListConflict.filter('.conflict'+sole).removeClass('conflict'+sole);
						};
						
						if (o.conflict_mod == 'disable_small_odd') {
							
							if ( this.$eventListConflict.size() > 1 ) {
								
								var 
									sole = parseInt((new Date()).getTime()).toString(36).toUpperCase(),
									monelineFT = moneline1H = false;
								;
	
								this.$eventListConflict.addClass('conflict'+sole).each(function() {
									var $item = $j(this);
									var 
										params = this.className,
										type = params.replace(/.*type(\S+).*/, '$1'),
										scope = params.replace(/.*scope(\S+).*/, '$1')
									;
										
									$item.removeClass('conflict'+sole);
										
									moneline1H = (type == '1x2' || type == '12') && scope != 'fe';
									if( monelineFT ) {
										$item.addClass('moneline1H'+sole);	
									}
									monelineFT = (type == '1x2' || type == '12') && scope == 'fe';
									if( monelineFT ) {
										$item.addClass('monelineFT'+sole);	
									}
										
								});
	
								var items = this.$eventListConflict;

								var moneline1HItems = items.filter('.moneline1H'+sole);
								var monelineFTItems = items.filter('.monelineFT'+sole);
	
								if( moneline1HItems.size() && monelineFTItems.size() ) {
									moneline1HItems.removeClass('total1H'+sole).addClass('conflict'+sole);
									monelineFTItems.removeClass('totalFT'+sole).addClass('conflict'+sole);
								} 
	
								this.$eventListConflict = this.$eventListConflict.filter('.conflict'+sole).removeClass('conflict'+sole);
								
							}
							
							var $last = this.$eventList.children('.betcart-pane-event:last-child');
							if ( $last.find('input.data-odds').val() <= 1.2 ) {
								$last.addClass("betcart-pane-event-conflict-item");
								this.$eventList.addClass("betcart-pane-event-conflict");
								if( o.allowConflict ) { this.$eventList.addClass("betcart-pane-event-conflict-allow"); }
							}
							$last = null;
						}
						
						if ( !this.elementType.single ) {
							if ( this.$eventListConflict.length > 1 ) {
								this.$eventListConflict.addClass("betcart-pane-event-conflict-item");
								this.$eventList.addClass("betcart-pane-event-conflict");
								if ( o.allowConflict ) { this.$eventList.addClass("betcart-pane-event-conflict-allow"); }
							}
							if ( o.conflict_mod_outright && (this.$eventListConflictOutright = this.$eventList.children( ".outright" )).length ) {
								this.$eventListConflictOutright.addClass("betcart-pane-event-conflict-item");
								this.$eventList.addClass("betcart-pane-event-conflict");
								if ( o.allowConflict ) { this.$eventList.addClass("betcart-pane-event-conflict-allow"); }
							}
						}

						if( self.active[i] === o.teaser.index && self.Teaser.isEnabled() ) {
							new calculate(this);
						} else if ( self.active[i] !== o.teaser.index ) {
							new calculate(this);	
						}

					});

					o.onInsert.call(this, $betCart, this.countEvents);
				
				};
				this.update = function(data) {
					if ( data.event_status === "inprogress" ) {
						birs[data.oid] = ~~data.bir_delay;
					}
					
					$betCart.find('.mid' + data.mid+ ".type" + data.type + ".allowance" + ( data.beton_val != undefined ? 100 * Math.abs(data.beton_val) : 333 ) ).each(function(i) {
						var $this = $(this);
						
						if ( i == 0) {
							delete birs[ /oid(\d+)/.exec(this.className)[1] ];
						}

						this.className = this.className.replace(/oid\d+/, 'oid' + data.oid);

						var buypoints = false;

						if (data.type == '1x2' || data.type == '12') {
							data.event_type = _('Match Win');
							data.event_pick = data.beton;
						} else if (data.type == 'ou') {
							data.event_type = _('Over/Under');
							data.event_pick = data.beton + ' ' + data.beton_val;
						} else  if (data.type == 'ah') {
							data.event_type = _('Handicap');
							data.event_pick = '<div class="betcart-pane-event-pick-ah-team">' + data.beton + '</div><div class="betcart-pane-event-pick-ah-coeff">' + '(' + data.beton_val + ')' + '</div>';
						} else if (data.type == 'cs') {
							data.event_type = _('Correct Score');
							data.event_pick = data.beton_val;
						} else if (data.type == 'hf') {
							data.event_type = _('Half Time / Full Time');
							data.event_pick = data.beton;
						} else if (data.type == 'tg') {
							data.event_type = _('Total Goals');
							data.event_pick = data.beton;
						} else if (data.type == 'tga') {
							data.event_type = _('Total Goals');
							data.event_pick = data.beton;
						} else if (data.type == 'tgh') {
							data.event_type = _('Total Goals');
							data.event_pick = data.beton;
						} else if (data.type == 'ng') {
							data.event_type = _('Number of goals');
							data.event_pick = data.beton;
						} else if (data.type == 'nga') {
							data.event_type = _('Away team number of goals');
							data.event_pick = data.beton;
						} else if (data.type == 'ngh') {
							data.event_type = _('Home team number of goals');
							data.event_pick = data.beton;
						} else if (data.type == 'out') {
							data.event_type = data.beton.split("::")[0];
							data.event_pick = (data.beton+"::"+data.beton).split("::")[1];
						} else if (data.type == 'dc') {
							data.event_type = _('Double Chance');
							data.event_pick = data.beton;
						} else if (data.type == '1x2ah') {
							data.event_type = _('Three-way handicap');
							data.event_pick = '<div class="betcart-pane-event-pick-ah-team">' + data.beton + '</div><div class="betcart-pane-event-pick-ah-coeff">' + '(' + data.beton_val + ')' + '</div>';
						};

						data.first_half = data.scope != 'fe';

						if( !data.first_half && (data.type == 'ou' || data.type == 'ah') && o.buypoints && self.active[i] !== o.teaser.index && Teaser.isTeaserSport( data.sport) ) {

							buypoints = true;
							data.beton_val *= 1;
							var buypoints_select = ['<div class="betcart-pane-event-buypoints"><select disabled="disabled">'],
								american_coeff = transformCoeff(data.odds, o.type) + o.buypoints_charge,
								decimal_coeff = data.odds,
								nbsp = reFloatQ.test(data.beton_val) ? '&nbsp;&nbsp;&nbsp;&nbsp;' : '&nbsp;&nbsp;';
								sign = data.beton.toLowerCase() === 'over' ? -1 : 1;

							
							for(var j = data.beton_val, n = data.beton_val + sign*o.buypoints_spread; sign*(j - n) <=0; j += sign*o.buypoints_step ) {								
								
								american_coeff -= o.buypoints_charge;
								
								
								if( o.buypoints_extra && j != data.beton_val && Math.abs( data.beton_val ) == 3 && data.sport == 'rg' ) {
									american_coeff -= o.buypoints_charge;
								}

								if( Math.abs(american_coeff) < 100 ) {
									american_coeff -= 200;
								}
								
								decimal_coeff = transformCoeff(american_coeff, o.type, true);
								
								var allowance = j > 0 && data.type == 'ah' ? '+' + j : j;
								
								if( !/\./.test(allowance) ) {
									allowance += nbsp;
								}

								buypoints_select.push( ('<option value="' + decimal_coeff + '#' +  sign * ( j - data.beton_val) / o.buypoints_step + '">'+ allowance +'&nbsp;' + american_coeff + '</option>').replace(/-/g,'&minus;') );
								
							}

							buypoints_select.push('</select></div>');

							data.event_pick = '<div class="betcart-pane-event-pick-'+data.type+'-team">' + data.beton + '</div>';
							data.coeff = buypoints_select.join('');

						}

						if( !buypoints ) {
							data.coeff = o.type == 'EU' || o.type == 'HK' ? d2( Math.round( transformCoeff( data.odds, o.type ) * 100) / 100 ) :  transformCoeff( data.odds, o.type );
						}

						$this.find(".betcart-pane-event-coeff").html( data.coeff );
						$this.find(".betcart-pane-event-pick").html( data.event_pick );
						$this.find("input.data-oid").val(data.oid);
						$this.find("input.data-odds").val(data.odds).attr("default", data.odds);
						$this.find("a.betcart-pane-event-remove").unbind('click').bind('click', function(e){
							e.preventDefault();
							self.remove(data);
						});
						
			
						if ( self.active[i] === o.teaser.index ) {
							
							if ( self.Teaser.isEnabled() ) {
								self.Teaser.setEnabled( self.Teaser.isTeaser(data) );
							} else {
								self.Teaser.setDefault();
								self.Teaser.setEnabled( self.Teaser.isTeasers() );
							}
							
							if( self.Teaser.isEnabled() ) {
	
								if ( self.countEvents >= templates.tabs[ o.teaser.index ].minItems && self.Teaser.isDisabled() ) {
									self.Teaser.enable();
								} else if( self.countEvents < templates.tabs[ o.teaser.index ].minItems && !self.Teaser.isDisabled() ) {
									self.Teaser.disable();
								}
															
							} else if( !self.Teaser.isDisabled() ) {
								self.Teaser.disable();
							}
						}
						
						if( self.active[i] === o.teaser.index && self.Teaser.isEnabled() ) {
							new calculate( $betCartPane[i] );
						} else if ( self.active[i] !== o.teaser.index ) {
							new calculate( $betCartPane[i] );	
						}
						
					});
				};
				this.remove = function(data) {
					
					$betCart.find('.oid'+data.oid).remove();
					
					if ( data.oid in birs ) {
						delete birs[ data.oid ];
					}
					
					this.countEvents--;
					
					if( 0 === this.countEvents ) {
						deinit();
						return;
					}
					
					var siblingIndex = this.enabled[0];	
					
					
					$betCartPane.each(function(i) {
						
						
						if( self.countEvents < templates.tabs[self.active[i]].minItems && self.active[i] !== o.teaser.index ) {
							if( $tabsNav.find("li:eq(" + i + ")").hasClass("ui-state-active") ){
								$betCart.tabs("select", siblingIndex );
							}
							$betCart.tabs( "disable", i );	
						} else if ( self.active[i] === o.teaser.index ) {
						
							if ( !self.Teaser.isEnabled() || (self.Teaser.isEnabled() && self.Teaser.isMixed() ) ) {
								self.Teaser.setDefault();
								self.Teaser.setEnabled( self.Teaser.isTeasers() );
							} 
						
							if( self.Teaser.isEnabled() ) {
	
								if ( self.countEvents >= templates.tabs[ o.teaser.index ].minItems && self.Teaser.isDisabled() ) {
									self.Teaser.enable();
								} else if( self.countEvents < templates.tabs[ o.teaser.index ].minItems && !self.Teaser.isDisabled() ) {
									self.Teaser.disable();
								}
															
							} else if( !self.Teaser.isDisabled() ) {
								self.Teaser.disable();
							}
						} else {
							siblingIndex = i;
						}	

						this.$element = $(this);
						this.elementName = $(this).attr("id");
						this.elementType = getType( this.elementName );
						this.$eventList = $('#' + this.elementType.name + '-pane-events');
						this.$eventListConflict = this.$eventList.children(".mid" + data.mid);
						
						if ( this.$eventList.hasClass('betcart-pane-event-conflict') ) {
							if ( this.$eventListConflict.length == 1 ) {
								this.$eventListConflict.removeClass('betcart-pane-event-conflict-item');
							}
							if ( !this.$eventList.children('.betcart-pane-event-conflict-item').length ) {
								this.$eventList.removeClass('betcart-pane-event-conflict');
								if( o.allowConflict ) { this.$eventList.removeClass("betcart-pane-event-conflict-allow"); }
							}
						}
						
						if( self.countEvents === 1 || !this.$eventList.children('.betcart-pane-event:first-child').hasClass('betcart-pane-event-first-child') ) {
							this.$eventList.children('.betcart-pane-event:first-child').addClass('betcart-pane-event-first-child');	
						}
						
						this.$eventList.children('.betcart-pane-event:last-child').addClass('betcart-pane-event-last-child').prev().removeClass('betcart-pane-event-last-child');

						
						if( self.active[i] === o.teaser.index && self.Teaser.isEnabled() ) {
							new calculate(this);
						} else if ( self.active[i] !== o.teaser.index ) {
							new calculate(this);	
						}
											
					});
					
				};
			};
			
			function updateOddByOid ( data ) {
				
				if( !$.isArray( data ) ) { data = [data]; }
				
				for (var i = 0, len = data.length; i < len; i++) {
					
					$betCart.find('.oid' + data[i].oid).each(function(j) {
						var $this = $(this);
						var buypoints = false;
						data[i].first_half = this.className.replace(/.*scope(\S+).*/, '$1') != 'fe';
						data[i].type = this.className.replace(/.*type(\S+).*/, '$1');
						data[i].beton_val = this.className.replace(/.*allowance(\S+).*/, '$1') / 100;
						
						var _$coeff = $this.find(".betcart-pane-event-coeff"),
							_$select = _$coeff.find('select'),
							_index = _$select.size() ? _$select.children().index( _$select.children(':selected') ) : -1;
						
						if( _$select.size() && !data[i].first_half && (data[i].type == 'ou' || data[i].type == 'ah') && o.buypoints && self.active[j] !== o.teaser.index ) {
							data[i].beton = $this.find('.betcart-pane-event-pick').get(0).firstChild.innerHTML;
							buypoints = true;
							data[i].beton_val *= 1;
							var buypoints_select = ['<div class="betcart-pane-event-buypoints"><select>'],
								american_coeff = transformCoeff(data[i].new_odds, o.type) + o.buypoints_charge,
								decimal_coeff = data[i].new_odds,
								nbsp = reFloatQ.test(data[i].beton_val) ? '&nbsp;&nbsp;&nbsp;&nbsp;' : '&nbsp;&nbsp;';
								sign = data[i].beton.toLowerCase() === 'over' ? -1 : 1;
							for(var k = data[i].beton_val, n = data[i].beton_val + sign*o.buypoints_spread; sign*(k - n) <=0; k += sign*o.buypoints_step ) {								
								american_coeff -= o.buypoints_charge;
								if( o.buypoints_extra && k != data[i].beton_val && Math.abs( data[i].beton_val ) == 3 && data[i].sport == 'rg' ) {
									american_coeff -= o.buypoints_charge;
								}
								if( Math.abs(american_coeff) < 100 ) {
									american_coeff -= 200;
								}
								decimal_coeff = transformCoeff(american_coeff, o.type, true);
								var allowance = k > 0 && data[i].type == 'ah' ? '+' + k : k;
								if( !/\./.test(allowance) ) {
									allowance += nbsp;
								}
								var step = sign * ( k - data[i].beton_val) / o.buypoints_step;
								buypoints_select.push( ('<option '+ ( step == _index ? ' selected="selected"' : '' ) +'value="' + decimal_coeff + '#' +  step + '">'+ allowance +'&nbsp;' + american_coeff + '</option>').replace(/-/g,'&minus;') );
							}
							buypoints_select.push('</select></div>');
							data[i].coeff = buypoints_select.join('');
						}
						
						if( !buypoints ) {
							data[i].coeff = o.type == 'EU' || o.type == 'HK' ? d2( Math.round( transformCoeff( data[i].new_odds, o.type ) * 100) / 100 ) :  transformCoeff( data[i].new_odds, o.type );
						}
						
						_$coeff.html( data[i].coeff );
						$this.find("input.data-odds").attr( 'default', data[i].new_odds ).val( data[i].new_odds );
				
						if( i < len - 1 ) { return; }
						
						if( self.active[j] === o.teaser.index && self.Teaser.isEnabled() ) {
							new calculate( $betCartPane[j] );
						} else if ( self.active[j] !== o.teaser.index ) {
							new calculate( $betCartPane[j] );	
						}
						
					});
				
				};
				
			};
			
			function deinit(s) {
				if(typeof s === "undefined" ) { 
					$("#"+o.idTo).addClass('g-hidden');
					s = ""; 
				} else {
					$("#"+o.idTo).addClass('betcard__deinit');
				}				
				$betCart.tabs('destroy').removeAttr( "init" ).html(s);
			};
			
			var resultWin = {
				'dirty': function ( coeff ) {
					return coeff;
				},
				'pure' : function ( coeff ) {
					return coeff - 1;
				}
			};
			
			var calculate = function( element ) {
				
				if( typeof element === "undefined") {
					$betCartPane.each(function(i){
						new calculate(this);	
					});
					return;
				}
				
				this.$element = $(element);
				this.elementName = this.$element.attr("id"); 
				this.elementType = getType( this.elementName );
				this.$eventList = $('#' + this.elementType.name + '-pane-events');
				
				this.$element.bottom 			=	$('#' + this.elementType.name + '-pane-bottom');
				this.$element.checkboxList		=	$('#' + this.elementType.name + '-pane-checkbox');
				
				this.$element.odds 				=	this.$element.find("input.data-odds");
				this.$element.buypoints			= 	this.$element.find('.betcart-pane-event-coeff select');
				this.$element.eventPotential 	=	this.$element.find(".betcart-pane-event-potential");
				this.$element.select 			=	this.$element.bottom.children(".betcart-pane-bottom-select").find('select');
				this.$element.count 			=	this.$element.bottom.children(".betcart-pane-bottom-count");
				this.$element.total 			=	this.$element.bottom.children(".betcart-pane-bottom-total");		
				this.$element.potential 		=	this.$element.bottom.children(".betcart-pane-bottom-potential");
				
				this.$elementBindEvents[ this.elementType.name ].apply(this);
			};
			
			calculate.prototype = {
				$elementBindEvents: {
					single: function() {
						var context = this;
						context.$element.stake = context.$eventList.find('.betcart-pane-event-stake input');
						context.$elementCalculate.single.apply(context);
						context.$elementShow.single.apply(context);
						context.$element.stake
							.unbind('keyup focus blur')
							.bind('keyup', function( e, autoupdate ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
							
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.oldValue = _value;
								
								if ( this.timer ) { clearTimeout( this.timer ); }
								
								if( autoupdate ) {
									context.$elementCalculate.single.apply(context);
									context.$elementShow.single.apply(context);
								} else {
									this.timer = setTimeout( function(){
										context.$elementCalculate.single.apply(context);
										context.$elementShow.single.apply(context);
									} , 400);
								}
							})
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
						;
						context.$element.odds
							.unbind('keyup focus blur')
							.bind('keyup', function( e, autoupdate ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.oldValue = _value;
								
								if ( this.timer ) { clearTimeout( this.timer ); }
								
								if( autoupdate ) {
									context.$elementCalculate.single.apply(context);
									context.$elementShow.single.apply(context);
								} else {
									this.timer = setTimeout( function(){
										context.$elementCalculate.single.apply(context);
										context.$elementShow.single.apply(context);
									} , 400);
								}
							})
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
						;
						context.$element.eventPotential.find('input')
							.unbind('keyup focus blur')
							.bind('keyup', function( e ){
								
								if ( e.target.readOnly || e.target.disabled ) { return; }

								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.viewValue = e.target.oldValue = _value;
								
								var $this = $(this),
									$parent = $this.closest('.betcart-pane-event'),							
									odds = $parent.find('input.data-odds').val();
								
								if ( this.timer ) {
									clearTimeout( this.timer );
								}
								this.timer = setTimeout(function() {
									$parent.find('.betcart-pane-event-stake input')
										.val( d2(reFloat.test(_value) ? parseFloat(d2(_value))/resultWin[o.resultWin](odds) : 0) )
										.triggerHandler('keyup', [true]);
								}, 400);
							})
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
							.triggerHandler('blur')
						;
						
						context.$element.buypoints.unbind('change').bind('change', function(){
							var $this = $(this),
								$parent = $this.closest('.betcart-pane-event'),							
								$odds = $parent.find('input.data-odds'),
								$buypoints = $parent.find('input.data-buypoints');

								$odds.val( $this.val().split('#')[0] );	
								$buypoints.val( $this.val().split('#')[1] );
								context.$element.odds = context.$element.find("input.data-odds");							
								
								context.$elementCalculate.single.apply(context);
								context.$elementShow.single.apply(context);
							
						});
					},
					combined: function(){
						var context= this;
						context.$element.stake = context.$element.bottom.children(".betcart-pane-bottom-stake").find('input');
						context.$elementCalculate.combined.apply(context);
						context.$elementShow.combined.apply(context);
	
						context.$element.stake
							.unbind('keyup focus blur')
							.bind('keyup', function( e, autoupdate ){
								
								if ( e.target.readOnly || e.target.disabled ) { return; }
								
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.oldValue =_value;
								
								context.$element.data.p = resultWin[o.resultWin] ( context.$element.data.t ) * (reFloat.test(_value) ? parseFloat( _value ) : 0);
								
								if ( this.timer ) { clearTimeout( this.timer ); }
								
								if( autoupdate ) {
									context.$elementShow.combined.apply(context);
								} else {
									this.timer = setTimeout( function(){
										context.$elementShow.combined.apply(context);
									} , 400);
								}
		
							})
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
						;
						
						context.$element.potential.find('input')
							.unbind('keyup focus blur')
							.bind('keyup', function( e ){
								
								if ( e.target.readOnly || e.target.disabled ) { return; }
							
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.viewValue = e.target.oldValue = _value;
								
								if (this.timer) {
									clearTimeout(this.timer);
								}
								this.timer = setTimeout(function(){
									context.$element.stake
										.val( d2(reFloat.test(_value) ? parseFloat( d2(_value) )/resultWin[o.resultWin] ( context.$element.data.t ) : 0) )
										.triggerHandler('keyup', [true]);
								}, 400);
								
							})
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
							.triggerHandler('blur')
						;
						context.$element.buypoints.unbind('change').bind('change', function(){
							var $this = $(this),
								$parent = $this.closest('.betcart-pane-event'),							
								$odds = $parent.find('input.data-odds'),
								$buypoints = $parent.find('input.data-buypoints');

								$odds.val( $this.val().split('#')[0] );	
								$buypoints.val( $this.val().split('#')[1] );
								context.$element.odds = context.$element.find("input.data-odds");							
								
								context.$elementCalculate.combined.apply(context);
								context.$elementShow.combined.apply(context);
							
						});
					},
					system: function() {
						var context = this;
						context.$element.stake = context.$element.bottom.children(".betcart-pane-bottom-stake").find('input');
						var countOdds =  context.$element.odds.length;
						if ( o.bankersEnabled ) {
							context.$element.bankersActivator = $("#bankers-activate-checkbox");
							context.$element.bankers = $("input:checkbox", context.$eventList);
							context.$element.bankersCountCheck = context.$element.bankers.filter(":checked").length;
							context.$element.bankersMaxCount = countOdds - 2;
							context.$element.bankerIndexes = context.$element.bankers.map(function () { return this.checked; }).get();
//							context.$element.bankerOdds =  context.$element.odds.map(function ( index ) { return context.$element.bankerIndexes[index] ? this.value : 1; }).get();
						}
						context.methods = {
							eliminated: function (arr, e) {
								var summ = 0, i;
								for (i = arr.length; i--; ) { summ += arr[i]; }
								for (i = e.length; i--; ) { if ( e[i] == 0 && summ == i + 1 ) { return true; } }
								return false;
							},
							product : function (elements, e) {
								var n = elements.size(), b = [], p = 0;
								for (i = 0; i < n; i++) {
									b[i] = 0;
								}
								var cf = 0;
								while (true) {
									var i = 0;
									while (b[i] == 1) { b[i] = 0; i++; }
									if (i == n) { break; }
									b[i] = 1;
									if (e != null && this.eliminated(b, e)) { continue; }
									p = 1;
									for (i = 0; i < n; i++) { if (b[i] == 1) {p *= parseFloat(elements[i].value); } }
									cf += resultWin[o.resultWin] ( p );
								}
								return cf;
							}
						};
						
						context.$elementCalculate.system.apply(context);
						context.$elementShow.system.apply(context);
						
						var countCheck = countOdds - context.$element.bankersCountCheck,
							iteration = 1,
							outHTML = [],
							bankersTitle = ""
							;
						
						outHTML[ 0 ] = templates.tabs[ context.elementType.index ].checkboxTitle;
					
						for ( var i = 0; i < countOdds; i++ ) {
							if ( context.$element.bankerIndexes[i] ) { continue; }
							var title = o.w[ iteration - 1 ] + (iteration == countCheck ? '' : 's');
							if ( context.$element.bankersCountCheck ) {
								bankersTitle = context.$element.bankersCountCheck + " Banker"+ (context.$element.bankersCountCheck > 1 ? "s" : "") + " + ";
								title = bankersTitle + title;
							}
							outHTML[ outHTML.length ] = 
								templates.tabs[ context.elementType.index ].checkbox.supplant({
									count: Math.combination(iteration, countCheck),
									title: title,
									val: (reFloat.test($.trim(context.$element.stake.val())) ? d2($.trim(context.$element.stake.val())) : d2(0)),
									currency: o.currency,
									index: iteration - 1,
									iteration: iteration,
									total: countCheck,
									bankersTitle: bankersTitle
								});
							iteration++;
						}
						context.$element.checkboxList.html(outHTML.join(''));
						context.$element.checkboxListValue = null;
						
						context.$elementCalculate.system.apply(context);
						var stakeTrimValue = $.trim(context.$element.stake.val()),
							stakeValue = reFloat.test(stakeTrimValue) ? parseFloat(stakeTrimValue) : 0;
						
						context.$element.data.val = stakeValue;
						context.$elementShow.system.apply(context);
					
						context.$element.checkboxList.find('a, input[type="checkbox"]').unbind('click').bind('click', function(e) {
							
							e.preventDefault();
							
							var $this = $(this).closest('.betcart-pane-checkbox-item').toggleClass('betcart-pane-checkbox-item-active');
							
							var stakeTrimValue = $.trim(context.$element.stake.val()),
								stakeValue = reFloat.test(stakeTrimValue) ? parseFloat(stakeTrimValue) : 0;
							
							context.$elementCalculate.system.apply(context);
							context.$element.data.val = stakeValue;						
							context.$elementShow.system.apply(context);
							
						});
						
						if ( o.bankersEnabled ) {
							context.$element.bankersActivator.unbind('click').bind('click', function(e) {
								var label = e.target.previousSibling;
								if ( e.target.checked ) {
									context.$element.bankers.parent().show();
									if ( label && (" " + label.className + " ").indexOf(" checked ") < 0 ) {
										label.className = $.trim( label.className + " checked" );
									}
								} else {
									if ( label ) {
										label.className = $.trim( (" " + label.className + " ").replace(" checked ", " ") );
									}
									var reCalc = false;
									context.$element.bankers
										.each(function(){ 
											reCalc = reCalc || this.checked;
											this.checked = false;
										})
										.siblings(".checked")
										.removeClass("checked")
										.end()
										.parent()
										.hide()
									;
									if ( reCalc ) {
										context.$elementBindEvents.system.call(context);
									}
								}
							}).triggerHandler("click");
							
							context.$element.bankers.unbind('click').bind('click', function(e) {
								if ( e.target.readOnly || e.target.disabled ) { 
									e.preventDefault();
									return; 
								}
								var label = e.target.previousSibling;
								if ( e.target.checked ) {
									if ( context.$element.bankersCountCheck < context.$element.bankersMaxCount ) {
										context.$element.bankersCountCheck++;
										if ( (" " + label.className + " ").indexOf(" checked ") < 0 ) {
											label.className = $.trim(label.className + " checked");
										}
										if ( context.$element.bankersCountCheck == context.$element.bankersMaxCount ) {
											context.$element.addClass("betcart-pane-bankers-readonly");
										}
									} else {
										e.target.checked = false;
									}
								} else {
									if ( context.$element.bankersCountCheck == context.$element.bankersMaxCount ) {
										context.$element.removeClass("betcart-pane-bankers-readonly");
									}
									context.$element.bankersCountCheck--;
									label.className = $.trim((" " + label.className + " ").replace(" checked ", " "));
								}
								context.$element.checkboxListValue = context.$element.checkboxList.children(".betcart-pane-checkbox-item").map(function() { return ~~($(this).hasClass('betcart-pane-checkbox-item-active')); });
								context.$elementBindEvents.system.call(context);
							});
						}
						
					
						context.$element.stake
							.unbind('keyup focus blur')
							.bind('keyup', function( e, autoupdate ) {
								
								if ( e.target.readOnly || e.target.disabled ) { return; }
							
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.oldValue = _value;
								
								context.$element.data.val = reFloat.test( _value ) ? parseFloat( _value ) : 0;
								
								if (this.timer) { clearTimeout(this.timer); }
								
								if( autoupdate ) {
									context.$elementShow.system.apply(context);
								} else {
									this.timer = setTimeout(function(){ 
										context.$elementShow.system.apply(context);
									}, 400);
								}
							})
							.bind('focus', function( e ) {
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseInt(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ) {
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
						;
						
						context.$element.potential.find('input')
							.unbind('keyup focus blur')
							.bind('keyup', function( e ) {
								if ( e.target.readOnly || e.target.disabled ) { return; }
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.viewValue = e.target.oldValue = _value;
	
								if (this.timer) { clearTimeout(this.timer); }
								this.timer = setTimeout(function(){ 
									context.$element.stake
										.val( d2( (reFloat.test( _value ) ? parseFloat( d2( _value ) ) : 0) / context.$element.data.p ) )
										.triggerHandler('keyup', [true])
									;
								}, 400);
							})
							.bind('focus', function( e ) {
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
							.triggerHandler('blur')
						;
	
						context.$element.buypoints.unbind('change').bind('change', function(){
							var $this = $(this),
								$parent = $this.closest('.betcart-pane-event'),							
								$odds = $parent.find('input.data-odds'),
								$buypoints = $parent.find('input.data-buypoints');

								$odds.val( $this.val().split('#')[0] );	
								$buypoints.val( $this.val().split('#')[1] );
								context.$element.odds = context.$element.find("input.data-odds");							
								
								context.$elementCalculate.system.apply(context);
								
								stakeTrimValue = $.trim(context.$element.stake.val());
								stakeValue = reFloat.test(stakeTrimValue) ? parseFloat(stakeTrimValue) : 0;
								context.$element.data.val = stakeValue;
								
								context.$elementShow.system.apply(context);
							
						});
					},
					roundrobin: function() {
						var context = this;
						context.$element.stake = context.$element.bottom.children(".betcart-pane-bottom-stake").find('input');
						context.methods = {
							eliminated: function (arr, e) {
								var summ = 0;
								for (i = 0; i < arr.length; i++) { summ += arr[i]; }
								for (i = 0; i < e.length; i++) { if (e[i] == 0 && summ == i + 1) { return true; } }
								return false;
							},
							product : function (elements, e) {
								var n = elements.size(), b = [], p = 0;
								for (i = 0; i < n; i++) {
									b[i] = 0;
								}
								var cf = 0;
								while (true) {
									var i = 0;
									while (b[i] == 1) { b[i] = 0; i++; }
									if (i == n) { break; }
									b[i] = 1;
									if (e != null && this.eliminated(b, e)) { continue; }
									p = 1;
									for (i = 0; i < n; i++) { if (b[i] == 1) {p *= parseFloat(elements[i].value); } }
									cf += resultWin[o.resultWin] ( p );
								}
								return cf;
							}
						};
						
						context.$elementCalculate.roundrobin.apply(context);
						context.$elementShow.roundrobin.apply(context);
						
						for (var i = 0, n = context.$element.odds.size(), arr = []; i < n; i++) {
							arr.push(
								templates.tabs[ context.elementType.index ].checkbox.supplant({
									count: Math.combination(i + 1, n),
									title: o.w[i] + ( (i + 1 == n) ? '' : 's'),
									val: (reFloat.test($.trim(context.$element.stake.val())) ? d2($.trim(context.$element.stake.val())) : d2(0)),
									currency: o.currency,
									index: i,
									iteration: i+1
								})
							);
						}
						
						arr.unshift( templates.tabs[ context.elementType.index ].checkboxTitle );
						context.$element.checkboxList.html(arr.join('')).find('.betcart-pane-checkbox-item:first').removeClass('betcart-pane-checkbox-item-active').css('display','none');
						
						context.$elementCalculate.roundrobin.apply(context);
						var stakeTrimValue = $.trim(context.$element.stake.val()),
							stakeValue = reFloat.test(stakeTrimValue) ? parseFloat(stakeTrimValue) : 0;
						
						context.$element.data.val = stakeValue;
						context.$elementShow.roundrobin.apply(context);
					
						context.$element.checkboxList.find('a, input[type="checkbox"]').unbind('click').bind('click', function(e) {
							
							e.preventDefault();
							
							var $this = $(this).closest('.betcart-pane-checkbox-item').toggleClass('betcart-pane-checkbox-item-active');
							
							var stakeTrimValue = $.trim(context.$element.stake.val()),
								stakeValue = reFloat.test(stakeTrimValue) ? parseFloat(stakeTrimValue) : 0;
							
							context.$elementCalculate.roundrobin.apply(context);
							context.$element.data.val = stakeValue;
							context.$elementShow.roundrobin.apply(context);
							
						});
					
						context.$element.stake
							.unbind('keyup focus blur')
							.bind('keyup', function( e, autoupdate ) {
								
								if ( e.target.readOnly || e.target.disabled ) { return; }
								
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.oldValue = _value;
								
								context.$element.data.val = reFloat.test( _value ) ? parseFloat( _value ) : 0;
								
								if ( this.timer ) { clearTimeout(this.timer); }
								
								if( autoupdate ) {
									context.$elementShow.roundrobin.apply(context);
								} else {
									this.timer = setTimeout(function(){ 
										context.$elementShow.roundrobin.apply(context);
									}, 400);
								}
								
							})
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
						;
						
						context.$element.potential.find('input')
							.unbind('keyup')
							.bind('keyup', function( e ) {
								
								if ( e.target.readOnly || e.target.disabled ) { return; }
								
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.viewValue = e.target.oldValue = _value;
								
								if ( this.timer ) { clearTimeout(this.timer); }
								
								this.timer = setTimeout(function(){ 
									context.$element.stake
										.val( d2( (reFloat.test( _value ) ? parseFloat( _value ) : 0) /context.$element.data.p) )
										.triggerHandler('keyup', [true])
									;
								}, 400);
							})
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
							.triggerHandler('blur')
						;
						
						context.$element.buypoints.unbind('change').bind('change', function(){
							var $this = $(this),
								$parent = $this.closest('.betcart-pane-event'),							
								$odds = $parent.find('input.data-odds'),
								$buypoints = $parent.find('input.data-buypoints');

								$odds.val( $this.val().split('#')[0] );	
								$buypoints.val( $this.val().split('#')[1] );
								context.$element.odds = context.$element.find("input.data-odds");							
								
								context.$elementCalculate.roundrobin.apply(context);
								
								stakeTrimValue = $.trim(context.$element.stake.val());
								stakeValue = reFloat.test(stakeTrimValue) ? parseFloat(stakeTrimValue) : 0;
								context.$element.data.val = stakeValue;
								
								context.$elementShow.roundrobin.apply(context);
							
						});
	
					},
					ifbet: function() {
						var context = this;
						context.$element.stake = context.$eventList.find('.betcart-pane-event-stake input');
						context.$elementCalculate.ifbet.apply(context);
						context.$elementShow.ifbet.apply(context);
						
						var fnKeyupEvent = function( e, autoupdate ) {
							
							if ( e.target.readOnly || e.target.disabled ) { return; }
							
							var _value = $.trim( e.target.value );
							
							if( _value === e.target.oldValue ) { return; }
							
							e.target.oldValue = _value;
							
							var $this = $(this),
								$parentElement = $this.closest(".betcart-pane-event");
								
							if ( ($parentElement.prev().size() && $parentElement.prev().attr('ifbet') && parseFloat ( $parentElement.prev().find('.betcart-pane-event-stake input').val() ) > 0) 
								|| ( !$parentElement.prev()[0] && !$parentElement.attr('ifbet') ) ){
								$parentElement.attr('ifbet', true );
							}
							
							if( !$parentElement.attr('ifbet') ){
								$this.val( d2(0) );
								return;
							}
							
							if( 0 === parseFloat( $this.val() ) ) {
								$parentElement.nextAll('.betcart-pane-event').removeAttr('ifbet');
							} else {
								$parentElement.next('.betcart-pane-event').attr('ifbet', true);
							}
							
							if ( this.timer ) {
								clearTimeout( this.timer );
							}
							
							if( autoupdate ) {
								context.$elementCalculate.ifbet.apply(context);
								context.$elementShow.ifbet.apply(context);
							} else {
								this.timer = setTimeout(function() {
									context.$elementCalculate.ifbet.apply(context);
									context.$elementShow.ifbet.apply(context);
								}, 400);
							}
							
						};
						
						var fnUpdateValue = function() {
							var context = this;
							context.$elementCalculate.ifbet.apply(context);
							for(var i = 0, n = context.$element.stake.size(); i < n; i++) {
								var $element = $( context.$element.stake[i] ),
									$parentElement = $element.closest(".betcart-pane-event");
								
								if( !$parentElement.attr('ifbet') ){
									$element.val(0);
								}
								
								if( 0 == $element.val() ) {
									$parentElement.nextAll('.betcart-pane-event').removeAttr('ifbet');
								}
							
							}
						};
						
						var fnChangeTabIndex = function( $firstElement, $secondElement ){
							var tempTabIndex = $firstElement.attr( 'tabindex' );
							$firstElement.attr( 'tabindex', $secondElement.attr('tabindex') );
							$secondElement.attr( 'tabindex', tempTabIndex );
						};
						
						context.$element.stake
							.unbind('keyup focus blur')
							.bind('keyup', fnKeyupEvent )
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
						;
						
						context.$element.eventPotential.find('input')
							.unbind('keyup focus blur')
							.bind('keyup', function( e ) {
								
								if ( e.target.readOnly || e.target.disabled ) { return; }
								
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.viewValue = e.target.oldValue = _value;
								
								var $this = $(this),
									$parentElement = $this.closest('.betcart-pane-event');
								
								if( !$parentElement.attr('ifbet') ){
									$this.val( d2(0) );
									return;
								}
								
								if( 0 === parseFloat( $this.val() ) ) {
									$parentElement.nextAll('.betcart-pane-event').removeAttr('ifbet');
								} else {
									$parentElement.next('.betcart-pane-event').attr('ifbet', true);
								}
								
								if ( this.timer ) {
									clearTimeout( this.timer );
								}
								
								this.timer = setTimeout(function() {
									$parentElement
										.find('.betcart-pane-event-stake input')
										.val( d2( _value / resultWin[o.resultWin]( $parentElement.find('input.data-odds').val() ) ) )
										.triggerHandler('keyup', [true])
									;
								}, 400);
							})
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
							.triggerHandler('blur')
						;
					
						context.$element.select.unbind('change').bind('change', function(){
							fnUpdateValue.apply(context);
							context.$elementCalculate.ifbet.apply(context);
							context.$elementShow.ifbet.apply(context);
						});
					
						context.$element.find('a.betcart-pane-event-arrow-up').die().live('click', function(e) {
							
							e.preventDefault();
							
							this.$element = $(this).closest('.betcart-pane-event');
							this.$prevElement = this.$element.prev();
							this.$beforeElement = this.$element.clone(true);
							this.$element.remove();
							
							this.$beforeElement.insertBefore( this.$prevElement );
							
							fnChangeTabIndex( this.$prevElement.find('.betcart-pane-event-stake input'), this.$beforeElement.find('.betcart-pane-event-stake input') );
							
							if( this.$prevElement.hasClass('betcart-pane-event-first-child') ) {
								this.$prevElement.removeClass('betcart-pane-event-first-child').prev().addClass('betcart-pane-event-first-child');
							}
							
							if( this.$beforeElement.hasClass('betcart-pane-event-last-child') ) {
								this.$beforeElement.removeClass('betcart-pane-event-last-child').next().addClass('betcart-pane-event-last-child');
							}
							
							if( this.$prevElement.attr('ifbet') && !this.$beforeElement.attr('ifbet') ) {
								this.$beforeElement.attr('ifbet', true);
							}
							
							context.$element.stake = context.$element.find('.betcart-pane-event-stake input');
							context.$element.odds = context.$element.find("input.data-odds");
							context.$element.eventPotential = context.$element.find(".betcart-pane-event-potential");
							
							context.$element.stake.unbind('keyup').bind('keyup', function() {
								fnKeyupEvent.apply(this);
							});
							
							fnUpdateValue.apply(context);
							context.$elementCalculate.ifbet.apply(context);
							context.$elementShow.ifbet.apply(context);
						});
						
						context.$element.find('a.betcart-pane-event-arrow-down').die().live('click', function(e) {
							
							e.preventDefault();
							
							this.$element = $(this).closest('.betcart-pane-event');
							this.$nextElement = this.$element.next();
							this.$afterElement = this.$element.clone(true);
							this.$element.remove();
							
							this.$afterElement.insertAfter( this.$nextElement );
							
							this.$afterElement = this.$nextElement.next();
							
							fnChangeTabIndex( this.$afterElement.children('.betcart-pane-event-stake').find('input'), this.$nextElement.children('.betcart-pane-event-stake').find('input') );
							
							if( this.$nextElement.hasClass('betcart-pane-event-last-child') ) {
								this.$nextElement.removeClass('betcart-pane-event-last-child').next().addClass('betcart-pane-event-last-child');
							}
							
							if( this.$afterElement.hasClass('betcart-pane-event-first-child') ) {
								this.$afterElement.removeClass('betcart-pane-event-first-child').prev().addClass('betcart-pane-event-first-child');
							}
							
							if( !this.$nextElement.attr('ifbet') && this.$afterElement.attr('ifbet') ) {
								this.$nextElement.attr('ifbet', true);
							}
							
							context.$element.stake = context.$element.find('.betcart-pane-event-stake input');
							context.$element.odds = context.$element.find("input.data-odds");
							context.$element.eventPotential = context.$element.find(".betcart-pane-event-potential");
							
							context.$element.stake.unbind('keyup').bind('keyup', function() {
								fnKeyupEvent.apply(this);
							});
							
							fnUpdateValue.apply(context);
							context.$elementCalculate.ifbet.apply(context);
							context.$elementShow.ifbet.apply(context);
	
						});
				
						context.$element.buypoints.unbind('change').bind('change', function(){
							var $this = $(this),
								$parent = $this.closest('.betcart-pane-event'),							
								$odds = $parent.find('input.data-odds'),
								$buypoints = $parent.find('input.data-buypoints');

								$odds.val( $this.val().split('#')[0] );	
								$buypoints.val( $this.val().split('#')[1] );
								context.$element.odds = context.$element.find("input.data-odds");							
								
								context.$elementCalculate.ifbet.apply(context);
								context.$elementShow.ifbet.apply(context);
							
						});
					},
					reverse: function() {
						var context = this;
						context.$element.stake = context.$element.bottom.children(".betcart-pane-bottom-stake").find('input');
						
						context.$elementCalculate.reverse.apply(context);
						
						var stakeTrimValue = $.trim(context.$element.stake.val()),
							stakeValue = reFloat.test(stakeTrimValue) ? parseFloat(stakeTrimValue) : 0;
						
						context.$element.data.val = stakeValue;
						context.$elementShow.reverse.apply(context);
						
						context.$element.stake
							.unbind('keyup focus blur')
							.bind('keyup', function( e, autoupdate ) {
							
								if ( e.target.readOnly || e.target.disabled ) { return; }
							
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.oldValue = _value;
								
								context.$element.data.val = reFloat.test( _value ) ? parseFloat( _value ) : 0;
								
								if (this.timer) { clearTimeout(this.timer); }
								
								if( autoupdate ) {
									context.$elementShow.reverse.apply(context);
								} else {
									this.timer = setTimeout(function(){ 
										context.$elementShow.reverse.apply(context);
									}, 400);
								}
								
							})
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
						;						
						context.$element.potential.find('input')
							.unbind('keyup focus blur')
							.bind('keyup', function( e ) {
							
								if ( e.target.readOnly || e.target.disabled ) { return; }
							
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.viewValue = e.target.oldValue = _value;
									
								if ( this.timer ) { clearTimeout(this.timer); }
	
								this.timer = setTimeout(function(){ 
									context.$element.stake
										.val( d2 ( (reFloat.test( _value ) ? parseFloat( _value ) : 0) / context.$element.data.p ) )
										.triggerHandler('keyup', [true]);
								}, 400);
							})
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
							.triggerHandler('blur')
						;
						
						context.$element.buypoints.unbind('change').bind('change', function(){
							var $this = $(this),
								$parent = $this.closest('.betcart-pane-event'),							
								$odds = $parent.find('input.data-odds'),
								$buypoints = $parent.find('input.data-buypoints');

								$odds.val( $this.val().split('#')[0] );	
								$buypoints.val( $this.val().split('#')[1] );
								context.$element.odds = context.$element.find("input.data-odds");							
								
								context.$elementCalculate.reverse.apply(context);
								
								stakeTrimValue = $.trim(context.$element.stake.val());
								stakeValue = reFloat.test(stakeTrimValue) ? parseFloat(stakeTrimValue) : 0;
								context.$element.data.val = stakeValue;
								
								context.$elementShow.reverse.apply(context);
							
						});
	
					},
					teaser: function() {
						var context = this;
						context.$element.stake = context.$element.bottom.children(".betcart-pane-bottom-stake").find('input');
						context.$elementCalculate.teaser.apply(context);
						context.$elementShow.teaser.apply(context);
						var selectHTML = templates.tabs[o.teaser.index].option.supplant({'value': self.Teaser.decimalCoeff,'text':'Select'})+ self.Teaser.value().join('');
						context.$element.select.html( selectHTML ).unbind('change').bind('change', function(){
							context.$elementCalculate.teaser.apply(context);
							context.$elementShow.teaser.apply(context);
						});
					
						context.$element.stake
							.unbind('keyup')
							.bind('keyup', function( e, autoupdate ) {
								
								if ( e.target.readOnly || e.target.disabled ) { return; }
								
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.oldValue = _value;
								
	//							this.newStakeValue = reFloat.test( _value ) ? parseFloat( _value ) : 0;
								
								if (this.timer) { clearTimeout(this.timer); }
								
								if( autoupdate ) {
									context.$elementCalculate.teaser.apply(context);
									context.$elementShow.teaser.apply(context);
								} else {
									this.timer = setTimeout(function() { 
										context.$elementCalculate.teaser.apply(context);
										context.$elementShow.teaser.apply(context);
									}, 400);
								}
								
							})
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
						;						
						context.$element.potential.find('input')
							.unbind('keyup')
							.bind('keyup', function( e ) {
								
								if ( e.target.readOnly || e.target.disabled ) { return; }
								
								var _value = $.trim( e.target.value );
								
								if( _value === e.target.oldValue ) { return; }
								
								e.target.viewValue = e.target.oldValue = _value;
								
								if( context.$element.data.t == 0 ) {
									this.value = d2(0);
									return;
								}
								
								if (this.timer) { clearTimeout(this.timer); }
								
								this.timer = setTimeout(function() { 
									context.$element.stake
										.val( d2( (reFloat.test( e.target.value ) ? parseFloat( e.target.value ) : 0) / resultWin[o.resultWin]( context.$element.data.t ) ) )
										.triggerHandler('keyup', [true]);
								}, 400);
							})
							.bind('focus', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( parseFloat(e.target.value) ) { return; }
								e.target.value = '';
							})
							.bind('blur', function( e ){
								if ( e.target.readOnly || e.target.disabled ) { return; }
								if ( $.trim(e.target.value) ) { return; }
								e.target.value = d2(0);
							})
							.triggerHandler('blur')
						;
					}

				},
				$elementCalculate: {
					single: function() {
						var context = this, elements = context.$element.stake;
						var length = elements.size(), total = 0, prod = 0, vector = [];
						if (length == 0) {
							context.$element.data = {
								l: length,
								t: total,
								p: prod,
								v: vector
							};
							return;
						}
						elements.each(function(i) {
							var $this = $(this), trimValue = $.trim($this.val()),
								value = reFloat.test(trimValue) ? parseFloat(trimValue) : 0;
							total += value;
							vector[i] = value * resultWin[o.resultWin]( $this.closest('.betcart-pane-event').find("input.data-odds").val() );
							prod += vector[i];
						});
						context.$element.data = {
							l: length,
							t: total,
							p: prod,
							v: vector
						};
						return;
					},
					combined: function() {
						var context = this, elements = context.$element.odds;
						var length = elements.size(), total = 1, prod = 0;
						if (length == 0) {
							context.$element.data = {
								l: length,
								t: total,
								p: prod
							};
							return;
						}
						elements.each(function(i) {
							total *= this.value;
						});
						
						total = transformCoeff( transformCoeff(total, o.type), o.type, true );
						
						var trimValue = $.trim(context.$element.stake.val());
						var value = reFloat.test(trimValue) ? d2(trimValue) : 0;
						prod = value * resultWin[o.resultWin] ( total );
						context.$element.data = {
							l: length,
							t: total,
							p: prod
						};
						return;
					},
					system: function() {
						var context = this, 
							methods = context.methods,
							$odds = context.$element.odds,
							bankersChecked = false,
							hasBankers = "bankers" in context.$element;
						
						if ( hasBankers ) {
							context.$element.bankerIndexes = context.$element.bankers.map(function () { return this.checked; }).get();
							bankersChecked = context.$element.bankerIndexes.filter(function(){return this;}).length;
						}
							
						if ( bankersChecked ) {
							$odds = $odds.filter(function( index ){ return !context.$element.bankerIndexes[index] });
						}
						
						var size = $odds.length,
							length = 0, 
							total = 0, 
							prod = 0, 
							li = context.$element.checkboxList.children(".betcart-pane-checkbox-item")
						;
						if ( !size ) {
							context.$element.data = {
								n: countCheck,
								l: length,
								t: total,
								p: prod
							};
							return;
						}
						
						var e = li.map(function(i) {
							return ~~($(this).hasClass('betcart-pane-checkbox-item-active'));
						});
						
						$odds.each(function(i){ 
							length = e[i] == 1 ? length + Math.combination(i + 1, size) : length; 
						});
						
						var trimValue = $.trim(context.$element.stake.val());
						var value = reFloat.test(trimValue) ? parseFloat(trimValue) : 0;
						total = length * value;
						prod = methods.product($odds, e);
						if ( bankersChecked ) {
							for ( var bankerIndex = context.$element.bankerIndexes.length; bankerIndex--; ) {
								if ( context.$element.bankerIndexes[ bankerIndex ] ) {
									prod *= context.$element.odds.eq( bankerIndex ).val();
								}
							}
						}
						
						context.$element.data = {
							n: size,
							l: length,
							t: total,
							p: prod
						};
						return;
					},
					roundrobin: function() {
						var context = this, methods = context.methods;
						var size = context.$element.odds.size(), length = 0, total = 0, prod = 0, e = [], li = context.$element.checkboxList.children(".betcart-pane-checkbox-item");
						if (size == 0) {
							context.$element.data = {
								n: size,
								l: length,
								t: total,
								p: prod
							};
							return;
						}
						li.each(function(i) {
							e[i] = $(this).hasClass('betcart-pane-checkbox-item-active') ? 1 : 0;
						});
						context.$element.odds.each(function(i){ length = e[i] == 1 ? length + Math.combination(i + 1, size) : length;  });
						var trimValue = $.trim(context.$element.stake.val());
						var value = reFloat.test(trimValue) ? parseFloat(trimValue) : 0;
						total = length * value;
						prod = methods.product(context.$element.odds, e);						
						context.$element.data = {
							n: size,
							l: length,
							t: total,
							p: prod
						};
						return;
					},
					ifbet: function() {
						var context = this, elements = context.$element.stake;
						var ifbetType =  context.$element.select.val();
						var length = elements.size(), total = 0, prod = 0, vector = [], maxval = Number.MAX_VALUE;
						if (length == 0) {
							context.$element.data = {
								l: length,
								t: total,
								p: prod,
								v: vector
							};
						}
						elements.each(function(i) {
							var $this = $(this), 
								trimValue = $.trim($this.val()),
								value = reFloat.test(trimValue) ? parseFloat(trimValue) : 0,
								odds = $this.closest('.betcart-pane-event').find("input.data-odds").val();
								
								if( i === 0 ) {
									total = value;
								}
								
								$this.attr( 'maxval', maxval );
								
								if( i && value > maxval ) {
									$this.val( d2( maxval ) );
									value = maxval;
									var _potentialInput = $this.closest('.betcart-pane-event').find('.betcart-pane-event-potential input').get(0),
										_potentialValue = d2( maxval * resultWin[o.resultWin]( odds ) );
									_potentialInput.viewValue = _potentialInput.value =  _potentialValue;
								}
								
								vector[i] = value * resultWin[o.resultWin]( odds );
								prod += vector[i];
								maxval = ifbetType == 0 ? value * odds : total;
						});
						context.$element.data = {
							l: length,
							t: total,
							p: prod,
							v: vector
						}; 
						return;
					},
					reverse: function() {
						var context = this, methods = this.methods;
						var size = context.$element.odds.size(), length = 0, total = 0, prod = 0;
						if (size == 0) {
							context.$element.data = {
								n: size,
								l: length,
								t: total,
								p: prod
							};
							return;
						}
						length = 2 * Math.combination(2, size);
						var trimValue = $.trim(context.$element.stake.val());
						var value = reFloat.test(trimValue) ? parseFloat(trimValue) : 0;
						total = length * value;
						
						context.$element.odds.each(function(i){ prod += resultWin[o.resultWin]( 1.00 * context.$element.odds[i].value ); });
						prod = 2*( size - 1 ) * prod;
						
						context.$element.data = {
							n: size,
							l: length,
							t: total,
							p: prod
						};
						return;
					},
					teaser: function() {
						var context = this;
						var length = context.$element.odds.size(), total = 0, prod = 0;
						if (length == 0) {
							context.$element.data = {
								l: length,
								t: total,
								p: prod
							};
							return;
						}
//						total += context.$element.odds.val() * context.$element.select.val();
						total = context.$element.select.val();
						var trimValue = $.trim(context.$element.stake.val());
						var value = reFloat.test(trimValue) ? d2(trimValue) : 0;
						prod = value * resultWin[o.resultWin] (total);
						context.$element.data = {
							l: length,
							t: total,
							p: prod > 0 ? prod : 0
						};
						return;
					}
				},
				$elementShow: {
					single: function() {
						var $el = this.$element;
						$el.count.find("var").text( $el.data.l );
						$el.total.find("var").text( d2($el.data.t) );
						if(o.payout) {
							$el.potential.find("var").text( d2($el.data.p) );
						} else {
							$el.potential.find("input").val( d2($el.data.p) );
						}
						$el.eventPotential.each(function(i){
							if(o.payout) { return $(this).find('var').text( d2($el.data.v[i]) ); } 
								
							var input = this.getElementsByTagName('input')[0];
							if( input.viewValue !== 0 ) {
								input.value = input.viewValue || '';
								input.viewValue = 0;
								input.realValue = d2( $el.data.v[i] );
							} else {
								input.realValue = input.value = d2( $el.data.v[i] );
							}
							
						});
					},
					combined: function() {
						var $el = this.$element;
						$el.count.find("b").text( o.w[$el.data.l - 1] );
						var transCoeff = transformCoeff($el.data.t, o.type);
						if( (transCoeff+"").indexOf(".") > -1 ) {
							transCoeff = d2(transCoeff);
						}
						$el.total.find("var").text( transCoeff );
						if(o.payout) {
							$el.potential.find("var").text( d2($el.data.p) );
						} else {
							
							var input = $el.potential.find('input').get(0);
							if( input.viewValue !== 0 ) {
								input.value = input.viewValue || '';
								input.viewValue = 0;
								input.realValue = d2( $el.data.p );
							} else {
								input.realValue = input.value = d2( $el.data.p );
							}
							
						}
					},
					system: function() {
						var $el = this.$element;
						$el.checkboxList.children(".betcart-pane-checkbox-item-active").find(".betcart-pane-checkbox-item-stake var").text( d2($el.data.val) );
						$el.count.find("var").text($el.data.l);
						$el.total.find("var").text(d2($el.data.l*$el.data.val));
						if(o.payout) {
							$el.potential.find("var").text(d2($el.data.p*$el.data.val));
						} else {
							
							var input = $el.potential.find('input').get(0);
							if( input.viewValue !== 0 ) {
								input.value = input.viewValue || '';
								input.viewValue = 0;
								input.realValue = d2( $el.data.p*$el.data.val );
							} else {
								input.realValue = input.value = d2( $el.data.p*$el.data.val );
							}
							
						}

					},
					roundrobin: function() {
						var $el = this.$element;
						$el.checkboxList.children(".betcart-pane-checkbox-item-active").find(".betcart-pane-checkbox-item-stake var").text( d2($el.data.val) );
						$el.count.find("var").text($el.data.l);
						$el.total.find("var").text(d2($el.data.l*$el.data.val));
						if(o.payout) {
							$el.potential.find("var").text(d2($el.data.p*$el.data.val));
						} else {
							
							var input = $el.potential.find('input').get(0);
							if( input.viewValue !== 0 ) {
								input.value = input.viewValue || '';
								input.viewValue = 0;
								input.realValue = d2( $el.data.p*$el.data.val );
							} else {
								input.realValue = input.value = d2( $el.data.p*$el.data.val );
							}
							
						}
					},
					ifbet: function() {
						var $el = this.$element;
						$el.total.find("var").text(d2($el.data.t));
						if(o.payout) {
							$el.potential.find("var").text(d2($el.data.p));
						} else {
							$el.potential.find("input").val(d2($el.data.p));
						}
						$el.eventPotential.each(function(i){
							if(o.payout) {
								 return $(this).find('var').text( d2($el.data.v[i]) );
							}
							
							var input = this.getElementsByTagName('input')[0];
							
							if( input.viewValue !== 0 ) {
								input.value = input.viewValue || '';
								input.viewValue = 0;
								input.realValue = d2($el.data.v[i]);
							} else {
								input.realValue = input.value = d2($el.data.v[i]);
							}
								
						});
					},
					reverse: function() {
						var $el = this.$element;
						$el.count.find("var").text($el.data.l);
						$el.total.find("var").text(d2($el.data.l*$el.data.val));
						if(o.payout) {
							$el.potential.find("var").text(d2($el.data.p*$el.data.val));
						} else {
							
							var input = $el.potential.find('input').get(0);
							if( input.viewValue !== 0 ) {
								input.value = input.viewValue || '';
								input.viewValue = 0;
								input.realValue = d2( $el.data.p * $el.data.val );
							} else {
								input.realValue = input.value = d2( $el.data.p * $el.data.val );
							}
							
						}
					},
					teaser: function() {
						var $el = this.$element;
						$el.count.find("b").text( o.w[$el.data.l - 1] );
						var transCoeff = transformCoeff($el.data.t, o.type);
						if( (transCoeff+"").indexOf(".") > -1 ) {
							transCoeff = d2(transCoeff);
						}
						$el.total.find("var").text( transCoeff );
						if(o.payout) {
							$el.potential.find("var").text( d2($el.data.p) );
						} else {

							var input =$el. potential.find('input').get(0);
							if( input.viewValue !== 0 ) {
								input.value = input.viewValue || '';
								input.viewValue = 0;
								input.realValue = d2( $el.data.p );
							} else {
								input.realValue = input.value = d2( $el.data.p );
							}
							
						}
					}
				}
			};
			
			var Teaser = function(element) {
				this.$element = $(element);
				this.$tab = $("#tab-nav-item-"+o.subsec.teaser);
				this.setDefault();
			};
			
			Teaser.isTeaserSport = function(id){
				return id in o.teaser.table; 
			};
			
			Teaser.prototype = {
				setDefault: function(){
					this.data = null;
					this.sport = null;
					this.coeff = null;
					this.decimalCoeff = null;
					this.single = false;
					this.singleName = null;
					this.singleTitle = null;
					this.possibleMixed = o.teaser.mixed && this.intersection( o.teaser.table['football'] || [], o.teaser.table['basketball'] || [] );
					this.mixed = false;
					this.mixedTitle = null;
					this.mixedTable = null;
					this.enabled = true;
				},
				enable: function(){
					$betCart.tabs( 'enable', this.$tab.parent().children().index(this.$tab) );
				},
				isEnabled: function(){
					return this.enabled;
				},
				setEnabled: function( flag ) {
					this.enabled = this.enabled && flag;
				},
				disable: function(){
					var currentTab = this.$tab,
						indexTab = this.$tab.parent().children().index(this.$tab);
					if ( currentTab.hasClass("ui-state-active") ) {
						var siblingIndex  = indexTab;
						do{
							--siblingIndex;
							currentTab = currentTab.prev();
						}
						while( currentTab.hasClass("ui-state-disabled") );
						$betCart.tabs( 'select', siblingIndex );
					};
					$betCart.tabs( 'disable', indexTab );
				},
				isDisabled: function(){
					return this.$tab.hasClass("ui-state-disabled");
				},
				isTeaser: function( data ) {
					if( data.type != 'ah' && data.type != 'ou' ){
						return false;
					}
					if( data.type == 'ah' && reFloatQ.test(data.beton_val) ) {
						return false;
					}
					if( data.scope != 'fe' ) {
						return false;
					}
										
					if( !Teaser.isTeaserSport( data.sport ) ) {
						return false;
					}
					
					if( null === this.coeff ) {
						this.coeff = o.teaser.restrictOdd * transformCoeff( data.odds, o.type );
						this.decimalCoeff = data.odds;
					} else if( o.teaser.restrictOdd * transformCoeff( data.odds, o.type ) !== this.coeff ) {
						return false;
					}
					
					if( null === this.sport ) {
						this.sport = data.sport;
					} else if ( this.sport === data.sport ) {
						if( !this.mixed ) {
							this.single = true;
							if( null === this.singleName ) {
								this.singleName = this.getSingleName(data.sport);
							}
							if ( null === this.singleTitle ) {
								this.singleTitle = this.getSingleTitle(); 
							};
						} 
						return true;
					} else if ( this.possibleMixed ) {
						this.mixed = true;
						this.single = false;
						if( null === this.mixedTitle ) {
							this.mixedTitle = getMixedTitle();
						}
						return true;
					} else {
						return false;
					}
					return true;
				},
				isTeasers: function(){
					this.$eventListItem = this.$element.find('.betcart-pane-event:first');
					var bTest = true;
					while( bTest && this.$eventListItem.is('.betcart-pane-event') ) {
						var eventData = this.$eventListItem.find('div.betcart-pane-event-data');
						bTest = this.isTeaser({
							sport : eventData.children('input.data-sport').val(),
							type  : this.$eventListItem.attr('class').replace(/.*type(\S+).*/, '$1'),
							odds  : eventData.children('input.data-odds').val(),
							scope : this.$eventListItem.attr('class').replace(/.*scope(\S+).*/, '$1')
						});
						this.$eventListItem  = this.$eventListItem.next();
					}
					return bTest;
				},
				getSingleName: function(id) {
					var singleName = null;

					if ( id in o.teaser.table ) {
						singleName = id;
					}
					
					return singleName;
				},
				getSingleTitle: function(){
					return o.teaser.table[this.singleName][0];
				},
				getMixedTitle: function(){
					var constMixedTitle = this.mixedTable[0],
						mixedTitle = [], k = 0;
					for(var prop in o.teaser.table) {
						for (var i = 0, n = constMixedTitle[prop].length; i < n; i++ ) {
							if( typeof mixedTitle[i] !== 'array' ) {
								mixedTitle[i] = [];	
							}
							mixedTitle[i].push( constMixedTitle[prop][i] );
						}
						k++;
					}
					for (var i = mixedTitle.length - 1; i >= 0; i--) {
						mixedTitle[i] = mixedTitle[i].join('-');
					}
					return mixedTitle;
				},
				isMixed: function(){
					return this.possibleMixed && this.mixed;
				},
				intersection: function( Football, Basketball, countEvents,  countOdds ) {
					this.mixedTable = [];
					if(Football.length === 0 || Basketball.length === 0) {
						this.mixedTable = null;
						return false;
					}
					if ( typeof countOdds === 'undefined' ) {
						countOdds = 3;
					}
					if ( typeof countEvents === 'undefined' ) {
						countEvents = 10;
					}
					for(var i = countEvents -1; i > 0; i-- ) {
						this.mixedTable[i] = [];
						for(var j = countOdds - 1; j >= 0; j-- ) {
							if( Football[i][j] !== Basketball[i][j] ) {
								this.mixedTable = null;
								return false;
							}
							this.mixedTable[j] = Basketball[i][j];
						}
					}
					this.mixedTable[0] = {
						'football'		:	[],
						'basketball'	:	[]
					};
					for(var j = countOdds - 1; j >= 0; j-- ) {
						this.mixedTable[0]['football'][j] 	=	Football[0][j];
						this.mixedTable[0]['basketball'][j]	=	Basketball[0][j];
					}
									
					return true;
				},
				value: function(){
					if(this.mixed) {
						
						this.mixedData = this.mixedTable[self.countEvents - 1];
						this.mixedSelect = [];
						
						for( var i = 0, n = this.mixedData.length; i < n; i++ ) {
							this.mixedSelect.push(templates.tabs[o.teaser.index].option.supplant({'value': this.mixedData[i], 'text': 'Mixed Teaser ' + this.mixedTitle[i] +' pts' }));	
						}
						return this.mixedSelect;
					} else if(this.single){
						
						this.singleData = o.teaser.table[this.singleName][self.countEvents - 1];
						this.singleSelect = [];
						
						for( var i = 0, n = this.singleData.length; i < n; i++ ) {
							this.singleSelect.push(templates.tabs[o.teaser.index].option.supplant({'value': this.singleData[i], 'text': this.singleTitle[i] +' pt' }));	
						}
						return this.singleSelect;
					}
					return [];
				}
			};
			
			return new init();
		};
		
		function _alert( message, fn ) {
			var $error_box = $("#betcard_error_panel");
			if( !$error_box.size() ) {
				$error_box = $('#tab-nav').after('<div id="betcard_error_panel" class="betcard-error ' + hiddenClass + '"/>').next();
			}
			$error_box.html('<div class="betcard-error-item">' + message + '</div>').removeClass(hiddenClass);
			if ( $.isFunction( fn ) ) { fn.apply(this); }
		};
		
		function _addCouldown ( fn, couldown, message, couldownClass ) {
			var $couldown_box = $("#betcard_couldown_panel");
			if ( !$couldown_box.length ) {
				$couldown_box = $('#tab-nav').after('<div id="betcard_couldown_panel" class="betcard-couldown"/>').next();
			}
			$("#betcard_couldown_panel").removeAttr("class").addClass("betcard-couldown " + couldownClass).html(  message + " " + couldown + " sec" );
			var start = new Date().getTime();
			var couldown_timer = setInterval(function(){
				var delta = new Date(start + couldown* 1000 - (new Date().getTime())).getSeconds();
				if ( delta < 0 ) { delta = 0; }
				$couldown_box.html( message + " " + delta + " sec" );
				if ( delta == 0 && $.isFunction(fn) ) { 
					clearInterval(couldown_timer);
					$couldown_box.addClass(hiddenClass);
					fn();
				}
			}, 100);
			return couldown_timer;
		};
		
		return this.each(function() {
			var ID = options.idTo, names = options.subsec;
			var $betcart = $("#"+ID), __betcart;
			
			coeff_link = $(this).find(options.coeff).live('click', function(e) {
				
				e.preventDefault();
				
				if($betcart.hasClass("post-data")){
					return false;
				}
				if ( !$betcart || !$betcart.attr("init") ) {
					__betcart = new bet_cart(options);
					$betcart = $("#"+ID+'-body').attr('init', true);
					$(document).trigger('init_betcart');
				}
			
				$betcart.children("div").each(function(index){
					var btn_change = $("#" + this.id + "-button>.betcart-pane-action-change");
					if ( !btn_change.hasClass(hiddenClass) ) { 
						btn_change.triggerHandler('click');
					}
				});
				
				var $this = $(this), _data = eval("(" + $this.attr('rev') + ")");
				
				if ( $betcart.find('.mid' + _data.mid)[0] ) {
					if ( $betcart.find('.oid' + _data.oid)[0] ) {
						__betcart.remove(_data);
						betcart = $("#"+ID+'-body');
					} else 
						if ( $betcart.find('.mid' + _data.mid+ ".type" + _data.type + ".scope" + _data.scope + ".allowance" + ( _data.beton_val != undefined ? 100 * Math.abs(_data.beton_val) : 333 ) )[0] ) {
							__betcart.update(_data);
						} else {
							__betcart.insert(_data);
						}
				} else {
					__betcart.insert(_data);
				}
				return false;
			});
		});
	};
})(jQuery);

