var CONTROL_ENABLE = 1;
var CONTROL_DISABLE = 0;
var MODE_SUBSTITUTION = 1;
var MODE_TRANSFER = 2;

var Field = {
	
	/* Конструктор поля игроков */
	initialize: function(tournament_id, season_id, team_id, show_controls, mode, base_url, sport_name )
	{
		Field.mode = mode;
		Field.baseUrl = base_url;		
		Field.sportName = sport_name;		
		
		Field.layer1 = $('field_team_khl_1'); 		// слой с полем первой пятерки
		Field.layer2 = $('field_team_khl_2'); 		// слой с полем второй пятерки
		if (sport_name == 'hockey')
		{
			Field.layer3 = $('field_team_khl_3');		// слой с полем третьей пятерки
		}
				
		Field.tableLayer = $('team_table');			// слой-контейнер для таблиц
		Field.tableContainer = $('players_table');	// таблица основных игроков
		
		Field.showControls = show_controls;			// 1 - показывать кнопки управления, 0 - нет
		Field.TeamId = team_id;						// ID команды для JSON-запроса
		Field.tournamentId = tournament_id;			// ID турнира
		Field.seasonId = season_id;			// ID сезона

		Field.rowPreffix = 'field_row_';		// префикс рядов игроков на поле
		Field.loadFieldUrl = Field.baseUrl + '/team/json/' + team_id + '.json';    // URL запроса игроков
		Field.loadTransferUrl = Field.baseUrl + '/team/json/' + team_id + '.json?tour=0';   // URL запроса игроков для трансферов
		Field.loadToursUrl = Field.baseUrl + '/team/json/' + team_id + '/';   // URL запроса туров
		Field.saveFieldUrl = Field.baseUrl + '/team/json/save/' + team_id + '.json';	// URL сохранения игроков на сервер
		Field.teamsUrl = Field.baseUrl + '/team/create/';
								
		if (sport_name == 'hockey')
		{
			Field.defaultPlayerImg = Field.baseUrl + '/skin/images/dplayer-khl.gif';
			Field.rowAmount = 9;						// Количество линий игроков на поле
			Field.rowTransferAmount = 6;				// Количество линий игроков на поле трансферов
			Field.transferMax = $A([2, 6, 9] );			// Максимальное количество игроков по линиям [вр,защ,пзщ,нап]
			Field.rowTopPx = 37;						// Отступ от верхнего края первой линии
			Field.rowStepPx = 14;						// Промежуток между линиями
			Field.deltaThirdPx = 80;					// Дополнительный отступ для третьей линии
			Field.maxPlayersInClub = 3;
			Field.playersMax = 17;
		}
		
		if (sport_name == 'basketball')
		{
			Field.defaultPlayerImg = Field.baseUrl + '/skin/images/dplayer-nba.gif';
			Field.rowAmount = 6;						// Количество линий игроков на поле
			Field.rowTransferAmount = 5;				// Количество линий игроков на поле трансферов
			Field.transferMax = $A([2, 2, 2, 2, 2] );	// Максимальное количество игроков по линиям [вр,защ,пзщ,нап]
			Field.rowTopPx = 37;						// Отступ от верхнего края первой линии
			Field.rowStepPx = 14;						// Промежуток между линиями
			Field.deltaThirdPx = 80;					// Дополнительный отступ для третьей линии
			Field.maxPlayersInClub = 2;
			Field.playersMax = 10;
		}
		
		Field.players = new Array();				// Массив всех игроков
		Field.ampluas = new Array();				// Массив всех амплуа
		
		$('tab_table').observe('click', Field.switchTabs );
		$('tab_field').observe('click', Field.switchTabs );
		
		Field.loadAmpluas();				
		
		if(Field.mode == MODE_SUBSTITUTION )
		{
			
			Field.loadTourSelector();
			$('fan_points_select').observe('change', function(event )
				{
					var el = Event.element(event );
					var opt = el.options[el.options.selectedIndex];
					Field.load(opt.value);
				}
			);
			Field.load(0);
		}
		else if(Field.mode == MODE_TRANSFER )
		{	
			Field.loadTransfer();			
		}
	},
	
	showSavePreloader: function()
	{
		if ($('preload-img-button'))
		{
			$('preload-img-button').setStyle({'display': 'inline'});
		}
	},
	
	/* Метод загрузки игроков на поле из JSON-источника */
	load: function(tour)
	{		
		var loadRequest = new Ajax.Request(Field.loadFieldUrl + '?tour=' + tour,
		{
			method: 'get',
			onComplete: Field.evalPlayers
		});
		},
	
	/* Метод загрузки игроков на поле из JSON-источника */
	loadTransfer: function()
	{
		var loadRequest = new Ajax.Request(Field.loadTransferUrl+'&rnd='+Math.ceil(1000000*Math.random()),
		{
			method: 'get',
			onComplete: Field.evalTransferPlayers
		});
	},
	
	loadAmpluas: function()
	{
		if(!Field.tournamentId )
		{
			return;
		}
		
		var loadRequest = new Ajax.Request(Field.teamsUrl + Field.tournamentId + '/ampluas.json',
		{
			method: 'get',
			onComplete: Field.setAmpluas
		});
	},
	
	setAmpluas: function(transport )
	{
		if(transport.status != 200 )
		{
			Field.showError('Не удалось загрузить список амплуа. Попробуйте обновить страницу.');
			return;
		}
		
		var data = transport.responseText.evalJSON();
		for(var id in data.ampluas )
		{
			if(!id )
			{
				continue;
			}
			var amplua = data.ampluas[id];
			
			Field.ampluas[id] = amplua;
		}
	},
	
	/* Метод сохранения игроков на сервере в виде JSON-строки */
	save: function()
	{
		if (Field.saveFlag) return false;
		
		var players_json = Field.players.toJSON();
		Field.saveFlag = true;
		$('field_submit_btn').disable();
		Field.showSavePreloader();
		
		var saveRequest = new Ajax.Request(Field.saveFieldUrl,
		{
			method: 'post',
			parameters: {
				team_id: Field.TeamId,
				players: players_json
			},
			onComplete: function(transport )
			{				
				if((transport.status != 200) && (transport.status != 201) && (transport.status != 304))
				{
					Field.showError('Не удалось сохранить настройки команды. Попробуйте еще раз.');
				}
				if (transport.status == 304)
				{
					window.location.href = Field.baseUrl + '/team/' + Field.TeamId + '.html';
				} 
				else 
				{				
					window.location.reload();
				}
				
				$('field_submit_btn').enable();
				Field.saveFlag = false;
			}
		});
	},
	
	/* Метод очистки поля и построения необходимым слоев для размещения игроков */
	clear: function()
	{
		Field.players = new Array();
		Field.layer1.update();
		Field.layer2.update();
		
		if (Field.sportName == 'hockey')
		{
			Field.layer3.update();		
		}
		
		Field.tableContainer.update();
		
		var top_px = Field.rowTopPx;
		
		for(var i = 1; i <= Field.rowAmount; i++ )
		{
			var id = i;
			
			if ((id == 1) || (id == 4) || (id == 7))
			{
				top_px = Field.rowTopPx;
			}
			if (id == 8)
			{
				top_px += Field.deltaThirdPx;
			}
			
			var row = new Element('div'); 
			Element.extend(row );
			row.addClassName('fan-player-row');
			row.id = Field.rowPreffix + id;
			
			var row2 = new Element('div'); 
			Element.extend(row2 );
			row2.addClassName('fan-player-row2');
			
			row2.insert({bottom: row});

			var row3 = new Element('div');
			Element.extend(row3 );
			row3.addClassName('fan-player-row3');
			row3.setStyle({
				top: top_px + 'px'
			});
			row3.insert({bottom: row2});
			
			if (id < 4)
			{
				Field.layer1.insert({bottom: row3});
			}
			else if (id < 7)
			{
				Field.layer2.insert({bottom: row3});
			}
			else
			{
				Field.layer3.insert({bottom: row3});
			}
			top_px += Field.rowStepPx;
		}
	},
	
	/* Метод очистки поля и построения необходимым слоев для размещения игроков */
	clearTransfer: function()
	{
		Field.layer1.update();
		
		Field.tableContainer.update();
		
		var top_px = Field.rowTopPx;
					
		for(var i = 1; i <= Field.rowTransferAmount; i++ )
		{
			var id = i;
			
			if (id == 1)
			{
				top_px = Field.rowTopPx;
			}
			
			var row = new Element('div'); 
			Element.extend(row );
			row.addClassName('fan-player-row');
			row.id = Field.rowPreffix + id;
			
			var row2 = new Element('div'); 
			Element.extend(row2 );
			row2.addClassName('fan-player-row2');
			
			row2.insert({bottom: row});

			var row3 = new Element('div');
			Element.extend(row3 );
			row3.addClassName('fan-player-row3');
			row3.setStyle({
				top: top_px + 'px'
			});
			row3.insert({bottom: row2});
			
			if (Field.sportName == 'hockey')
			{
				Field.layer1.insert({bottom: row3});
			}
			
			if (Field.sportName == 'basketball')
			{
				Field.layer1.insert({bottom: row2});
			}

			top_px += Field.rowStepPx;
		}
		
		if(Field.showControls && Field.mode == MODE_TRANSFER )
		{
			$('fan_transfer_controls').update('');
			var save_transfer_btn = new Element('input');
			Element.extend(save_transfer_btn );
			save_transfer_btn.id = 'field_submit_btn';
			save_transfer_btn.type = 'button';
			save_transfer_btn.disabled = true;
			save_transfer_btn.value = 'сохранить';
			save_transfer_btn.observe('click', function(event ){
				var el = Event.element(event );
				if(el.disabled ) return;
				Field.save();
			});
			
			var im = new Element('img');
			Element.extend(im);		
			im.id = 'preload-img-button';
			im.src = 'http://www.sports.ru/i/preload.gif';		
			im.addClassName('preload-img-button');			
			im.setStyle({'display': 'none'});
			$('fan_transfer_controls').insert({bottom: save_transfer_btn } );
			$('fan_transfer_controls').insert({bottom: im } );
		}
	},
	
	/* Метод загрузки списка туров */
	loadTourSelector: function()
	{
		$('fan_points_select').update('<option value="0">последний тур</option>');
		
		var TourRequest = new Ajax.Request(Field.loadToursUrl + Field.seasonId + '/tours.json', 
			{
				method: 'get',
				onComplete: function(transport )
				{
					if(transport.status != 200 )
					{
						Field.showError('Не удалось получить туры. Попробуйте обновить страницу.');
					}
					else
					{
						var data = transport.responseText.evalJSON();
						for(var id in data.tours )
						{
							var tour = data.tours[id];
							if(!tour.id ) continue;
							var opt = new Element('option');
							opt.value = tour.id;
							opt.update(tour.name );
							$('fan_points_select').insert({bottom: opt });
						}
					}
				}
			}
		);
	},
	
	/* Метод обработки загруженных игроков */
	evalPlayers: function(transport )
	{
		Field.clear();
		
		if(transport.status != 200 )
		{
			Field.showError('Не удалось получить список игроков. Попробуйте обновить страницу.');
		}
		else
		{
			var data = transport.responseText.evalJSON();			
			for(var id in data.players )
			{
				var player = data.players[id];
				
				if(!player.id )
				{
					continue;
				}
				
				var player_obj = new Player(
					player.id, 
					player.name,
					player.club,
					player.amplua, 
					player.img,
					Field.sportName
				)

				player_obj.setPrice(player.price );
				player_obj.setPoints(player.points );
				player_obj.setRow(player.row );
				player_obj.setOrder(player.order );
				
				Field.players.push(player_obj );
			}						
			Field.placePlayers(Field.players, 1 );
		}
	},
	
	/* Метод обработки загруженных игроков */
	evalTransferPlayers: function(transport )
	{
		
		if(transport.status != 200 )
		{
			Field.showError('Не удалось получить список игроков. Попробуйте обновить страницу.');
		}
		else
		{
			var data = transport.responseText.evalJSON();
			for(var id in data.players )
			{
				var player = data.players[id];
				if(!player.id )
				{
					continue;
				}
				
				var player_obj = new Player(
					player.id, 
					player.name,
					player.club,
					player.amplua, 
					player.img,
					Field.sportName
				)
				
				if (player.now_id == 0)
				{
					// Field.showError(player.name + ' больше не играет в этом чемпионате.');
				}
				
				player_obj.setPrice(player.price );
				player_obj.setPoints(player.points );
				player_obj.setRow(player.amplua );
				player_obj.setLock(player.lock );
				Field.players.push(player_obj );
			}
			Field.placeTransferPlayers( );
		}
	},
	
	/* Метод размещения массива игроков на поле и в таблице */
	placePlayers: function(players, is_table )
	{
		var num_row_1 = 0;
		var num_row_2 = 0;
		var num_row_3 = 0;
		var num_row_4 = 0;
		var num_row_5 = 0;
		
		var row_num = 0;
		
		var el_space = new Element('div');
		Element.extend( el_space );
		el_space.addClassName('fan-player-space');
		var el_space2 = new Element('div');
		Element.extend( el_space2 );
		el_space2.addClassName('fan-player-space');
		
		var el_space_wide = new Element('div');
		Element.extend( el_space_wide );
		el_space_wide.addClassName('fan-player-space2');
		var el_space_wide2 = new Element('div');
		Element.extend( el_space_wide2 );
		el_space_wide2.addClassName('fan-player-space2');
		
		var insert_space_1 = true;
		var insert_space_2 = true;
		var insert_space_3 = true;
		var insert_space_4 = true;
								
		for(var id = 0; id < players.length; ++id)		
		{			
			var player = players[id];					
		
			if(!player.id )
			{
				continue;
			}			
			
			if (Field.sportName == 'hockey')
			{
				if (player.row == 1)
				{
					row_num = 1 + 3 * num_row_1;
					num_row_1++;
				}
				else if (player.row == 2)
				{
					row_num = 2 + 3 * Math.floor(num_row_2 / 2);
					num_row_2++;
				}
				else if (player.row == 3)
				{
					row_num = 3 + 3 * Math.floor(num_row_3 / 3);
					num_row_3++;
				}
			}
						
			if (Field.sportName == 'basketball')
			{				
				if (player.row == 1)
				{
					row_num = 3 + 3 * Math.floor(num_row_1 / 1);					
					num_row_1++;
				}
				else if (player.row == 2)
				{
					row_num = 2 + 3 * Math.floor(num_row_2 / 1);
					num_row_2++;
				}
				else if (player.row == 3)
				{
					row_num = 2 + 3 * Math.floor(num_row_3 / 1);
					num_row_3++;
				}
				else if (player.row == 4)
				{
					row_num = 1 + 3 * Math.floor(num_row_4 / 1);
					num_row_4++;
				}
				else if (player.row == 5)
				{
					row_num = 1 + 3 * Math.floor(num_row_5 / 1);
					num_row_5++;
				}
			}
						
			
			if(!$(Field.rowPreffix + row_num) )			
			{								
				continue;
			}
							
			
			$(Field.rowPreffix + row_num).insert({bottom: player.genCard(Field.showControls ) } );
						
			if (Field.sportName == 'basketball')
			{
				if (num_row_4 == 1 && insert_space_1)
				{
					$(Field.rowPreffix + row_num).insert({bottom: el_space } );
					insert_space_1 = false;
				}
				
				if (num_row_4 == 2 && insert_space_2)
				{
					$(Field.rowPreffix + row_num).insert({bottom: el_space2 } );
					insert_space_2 = false;
				}
				
				if (num_row_2 == 1 && insert_space_3)
				{
					$(Field.rowPreffix + row_num).insert({bottom: el_space_wide } );					
					insert_space_3 = false;
				}
				
				if (num_row_2 == 2 && insert_space_4)
				{
					$(Field.rowPreffix + row_num).insert({bottom: el_space_wide2 } );
					insert_space_4 = false;
				}
			}
			if(is_table == 1 )
			{
				Field.tableContainer.insert({bottom: player.genTableRow(Field.showControls ) } );
			}
		}				
		
		for(var i = 0; i < Field.transferMax.size(); i++ )
		{
			var max = Field.transferMax[i];
			var row = parseInt(i) + 1;			
			
			if(Field.getPlayersNumberInRow( row ) < max )
			{				
				var delta = max - Field.getPlayersNumberInRow(row);
				for(var k = 0; k < delta; k++ )
				{
					Field.tableContainer.insert({bottom: player.genDefaultTableRow() } );					
				}
			}
		}
				
	},
	
	/* Метод размещения массива игроков на поле и в таблице */
	placeTransferPlayers: function()
	{		
		Field.clearTransfer();
		var rows = $A([0,0,0,0,0,0]);
		
		for(var id in Field.players )
		{
			var player = Field.players[id];
			
			if(!player.id ) continue;
			if(!$(Field.rowPreffix + player.row) ) continue;
			
			if (Field.sportName == 'basketball')
			{				
				
				if (rows[player.row] == 1)
				{
					var el_space = new Element('div');
					Element.extend( el_space );
					el_space.addClassName('fan-player-space');
					$(Field.rowPreffix + player.row).insert({bottom: el_space } );
				}
				
				rows[player.row]++;							
				$(Field.rowPreffix + player.row).insert({bottom: player.genCard(Field.showControls ) } );
				
			}
			if (Field.sportName == 'hockey')
			{
				$(Field.rowPreffix + player.row).insert({bottom: player.genCard(Field.showControls ) } );
			}
			Field.tableContainer.insert({bottom: player.genTableRow(Field.showControls ) } );
		}
		
		var player = new Player();
		
		for(var i = 0; i < Field.transferMax.size(); i++ )
		{
			var max = Field.transferMax[i];
			var row = parseInt(i) + 1;
			if(Field.getPlayersNumberInRow( row ) < max )
			{
				var pos = Field.getPlayersNumberInRow(row);
				var delta = max - pos;
				for(var k = 0; k < delta; k++ )
				{
					if (pos+k>0 && Field.sportName == 'basketball') 
					{
						var el_space = new Element('div');
						Element.extend( el_space );
						el_space.addClassName('fan-player-space');
						$(Field.rowPreffix +row).insert({bottom: el_space } );
					}
					$(Field.rowPreffix + row ).insert({bottom: Field.genDefaultCard(row ) } );					
					
					Field.tableContainer.insert({bottom: player.genDefaultTableRow() } );
				}
			}
		}				
	},
	
	genDefaultCard: function(row )
	{
		var card_el = new Element('div');
		Element.extend(card_el );
		card_el.addClassName('fan-player-card');
				
		// Добавляем картинку с формой игрока
		var img_el = new Element('img');
		Element.extend(img_el );			
		
		img_el.src = Field.defaultPlayerImg;
		img_el.alt = 'игрок';
		img_el.title = img_el.alt;
		card_el.insert({bottom: img_el});
		
		// Добавляем поле с именем игрока
		var amplua_el = new Element('p');		
		Element.extend(amplua_el );
		amplua_el.update(Field.ampluas[row] );
		card_el.insert({bottom: amplua_el });
		
		return card_el;
	},
		
	/* Метод переключения табов между таблицей и полем */
	switchTabs: function(event )
	{
		var el = Event.element(event );
		if(el.id == 'tab_field' || el.up().id == 'tab_field' )
		{
			$('tab_field').removeClassName('off');
			$('tab_table').addClassName('off');
			$('field').show();
			$('table').hide();
		}
		else{
			$('tab_field').addClassName('off');
			$('tab_table').removeClassName('off');
			$('field').hide();
			$('table').show();			
		}
	},
	
	/* Метод выборки игрока из массива по ID */
	getPlayerById: function(player_id )
	{
		for(var id in Field.players )
		{
			var player = Field.players[id];
			if(player.id && player.id == player_id )
			{
				return Field.players[id];
			}
		}
		
		return false;
	},
	
	/* Метод подсчета количества игрока в линии */
	getPlayersNumberInRow: function(row)
	{
		var sum = 0;
		for(var id in Field.players )
		{
			var player = Field.players[id];
			if(!player.id) continue;
			if(parseInt(player.row ) == parseInt(row ) )
			{
				sum++;
			}
		}
		return sum;
	},
	
	getPlayersNumberInClub: function(club)
	{
		var sum = 0;
		for(var id in Field.players )
		{
			var player = Field.players[id];
			if(!player.id) continue;
			if(player.club == club )
			{
				sum++;
			}
		}
		return sum;
	},
	
	addPlayer: function(player )
	{
		if (player.lock > 0)
		{
			Field.showError('Игрок ' + player.name + ' заблокирован. Попробуйте выбрать его позже.');
			return 0;
		}
		if(Field.getPlayerById(player.id ) )
		{
			Field.showError('Игрок ' + player.name + ' уже добавлен в вашу команду. Выберите другого игрока.');
			return 0;
		}
		if(Field.getPlayersNumberInRow(player.row ) == Field.transferMax[parseInt(player.row ) - 1 ] )
		{			
			Field.showError('Слишком много игроков в линии  "' + player.selectAmpluaName() + '". Выберите другого игрока.');
			return 0;
		}
		if(Field.getPlayersNumberInClub(player.club ) >= Field.maxPlayersInClub )
		{
			Field.showError('В вашей команде не может быть больше ' + Field.maxPlayersInClub + ' игроков из клуба  "' + player.club + '". Выберите другого игрока.');
			return 0;
		}
		if(!Transfer.allowMoney(player ) )
		{
			Field.showError('Недостаточно денег для трансфера. Выберите другого игрока.');
			return 0;			
		}
		if(!Transfer.allowCount(player ) )
		{
			Field.showError('У вас нет больше трансферов.');
			return 0;			
		}

		Transfer.transfer(player );
		Field.players.push(player );
		Field.placeTransferPlayers();
		Field.checkSaveBtn();
		
		return 1;		
	},
	
	deletePlayer: function(player )
	{
		Transfer.back(player );
		for(var i in Field.players)
		{
			var p = Field.players[i];
			if(!p.id)
			{
				continue;
			}
			if(p.id == player.id )
			{
				Field.players.splice(i, 1 );
			}
		}
		Field.placeTransferPlayers();
		Field.checkSaveBtn();
	},
	
	checkSaveBtn: function()
	{
		if($A(Field.players).size() == Field.playersMax )
		{
			$('field_submit_btn').enable();
		}
		else{
			$('field_submit_btn').disable();
		}
	},
	
	/* Метод оповещения пользователя об ошибке */
	showError: function(str )
	{
		alert(str);
	}
}
