/*
 * 
 * Placar - Script para manipulação dos placares de campeonatos do canal de esporte - UOL
 * Version 1.0.7
 * Date 2009-04-16
 * @requires jQuery v1.2.6
 * 
 * Desenvolvido por Elav
 * 
 */

/* Elimina os conflitos do jQuery com variáveis $ */
jQuery.noConflict();

/* Ao invéz de usar o simbolo $, usamos o simbolo j */
var j = jQuery;

var simulador = simulador || {};
simulador.DESLOC_CONTAINER = 302;
simulador.PAGEVIEW_URL = false;

simulador.data = {};
simulador.times = {};

simulador.currentIdJogo = '';
simulador.currentIdTime1 = '';
simulador.currentIdTime2 = '';

simulador.numRodadas = 0;
simulador.rodadaAtual = 0;

simulador.colors = {};

simulador.currentFieldValue = '';

/* função para carregamento do arquivo de jogos (tabela em html) */
simulador.init = function() {
	/* carrega o arquivo de jogos em um div temporario */
	simulador.DADOS_JOGOS = configJogos;
	
	if (typeof configPageview == 'string') {
		simulador.PAGEVIEW_URL = configPageview;
	}
	
	j('#wrapperTempData').html('<iframe id="frameGameTable"></iframe>');
	j('#frameGameTable')
		.attr('src',simulador.DADOS_JOGOS+'?r='+(new Date().getTime()))
		.load(function() {
			/* inicia a extração dos dados do iframe após o arquivo ter sido carregado completamente */
			var idata = j('#frameGameTable').contents().find('body');
			var idJogo = idTime = 1;
			var tmpTeams = {};
			
			/* faz o parse da configuração de cores */
			
			if (typeof colorCfg != 'undefined') {
				for (var idxColor in colorCfg) {
					var colors = idxColor.split('-');
					var c1 = parseFloat(colors[0]);
					var c2 = parseFloat(colors[1]);
					for (var iColor = c1; iColor <= c2; iColor++) {
						simulador.colors[iColor] = colorCfg[idxColor];
					}
				}
			}
			
			/* varre todas as tabelas de jogos (div.tabelajogo table) */
			idata.find('div.tabelajogo table').each(function() {
				var rodadaDados = j(this).find('tr.rodada td');
				
				/* pega o numero da rodada e a data */
				var rodadaNum = rodadaDados.text().replace(/^([0-9]+).*$/,'$1');
				var rodadaData = rodadaDados.find('.data').text();
				
				/* cria o objeto da rodada caso nao exista */
				if (typeof simulador.data[rodadaNum] == 'undefined') {
					simulador.data[rodadaNum] = [];
				}
				
				/* cria o objeto da data da rodada e a variavel que contera os jogos */
				var objData = {};
				objData.data = rodadaData;
				objData.jogos = [];
				
				/* varre os jogos da rodada */
				j(this).find('tbody tr').each(function() {
					
					// cria o objeto temporario que será inserido nos dados
					var tmpObj = {};
					
					// pega os nomes dos times
					tmpObj.time1 = j.trim(j(this).find('td.time1 a').text());
					tmpObj.time2 = j.trim(j(this).find('td.time2 a').text());
					if (!tmpObj.time1) {
						tmpObj.time1 = j.trim(j(this).find('td.time1').text())
					}
					if (!tmpObj.time2) {
						tmpObj.time2 = j.trim(j(this).find('td.time2').text())
					}
					
					// pega os links dos times
					tmpObj.linkTime1 = j.trim(j(this).find('td.time1 a').attr('href'));
					tmpObj.linkTime2 = j.trim(j(this).find('td.time2 a').attr('href'));
					
					// Cria uma nova entrada na variavel de cache para o time 1 e time 2 caso não existam ainda
					if (typeof tmpTeams[tmpObj.time1] == 'undefined') {
						tmpTeams[tmpObj.time1] = idTime;
						simulador.times[idTime] = {idtime:idTime,time:tmpObj.time1,link:tmpObj.linkTime1,pg:0,j:0,v:0,gp:0,gc:0,sg:0,jogos:{}};
						idTime++;
					}
					if (typeof tmpTeams[tmpObj.time2] == 'undefined') {
						tmpTeams[tmpObj.time2] = idTime;
						simulador.times[idTime] = {idtime:idTime,time:tmpObj.time2,link:tmpObj.linkTime2,pg:0,j:0,v:0,gp:0,gc:0,sg:0,jogos:{}};
						idTime++;
					}
					
					tmpObj.idTime1 = tmpTeams[tmpObj.time1];
					tmpObj.idTime2 = tmpTeams[tmpObj.time2];
					
					tmpObj.idJogo = idJogo;
					idJogo++;

					// pega os gols e checa se há resultado.
					var gols = j.trim(j(this).find('td.resultado a').text()).toLowerCase();
					
					if (gols == '') { // Não há gols, então é um jogo futuro.
						tmpObj.gol1 = -1;
						tmpObj.gol2 = -1;
						tmpObj.locked = false;
						if (simulador.rodadaAtual == 0) {
							simulador.rodadaAtual = rodadaNum;
						}
					} else { // Gols vieram setados, entao o jogo já foi realizado
						var tmpGols = gols.split(' x ');
						tmpObj.gol1 = parseFloat(tmpGols[0]);
						tmpObj.gol2 = parseFloat(tmpGols[1]);
						tmpObj.locked = true;
						
						simulador.times[tmpObj.idTime1].j++;
						simulador.times[tmpObj.idTime2].j++;
						
						simulador.times[tmpObj.idTime1].gp = simulador.times[tmpObj.idTime1].gp+tmpObj.gol1;
						simulador.times[tmpObj.idTime1].gc = simulador.times[tmpObj.idTime1].gc+tmpObj.gol2;
						simulador.times[tmpObj.idTime1].sg = simulador.times[tmpObj.idTime1].gp-simulador.times[tmpObj.idTime1].gc;

						simulador.times[tmpObj.idTime2].gp = simulador.times[tmpObj.idTime2].gp+tmpObj.gol2;
						simulador.times[tmpObj.idTime2].gc = simulador.times[tmpObj.idTime2].gc+tmpObj.gol1;
						simulador.times[tmpObj.idTime2].sg = simulador.times[tmpObj.idTime2].gp-simulador.times[tmpObj.idTime2].gc;

						if (tmpObj.gol1 > tmpObj.gol2) {
							simulador.times[tmpObj.idTime1].v++;
							simulador.times[tmpObj.idTime1].pg = simulador.times[tmpObj.idTime1].pg+3;
						} else if (tmpObj.gol2 > tmpObj.gol1) {
							simulador.times[tmpObj.idTime2].v++;
							simulador.times[tmpObj.idTime2].pg = simulador.times[tmpObj.idTime2].pg+3;
						} else {
							simulador.times[tmpObj.idTime1].pg = simulador.times[tmpObj.idTime1].pg+1;
							simulador.times[tmpObj.idTime2].pg = simulador.times[tmpObj.idTime2].pg+1;
						}
					}
					tmpObj.relato = j.trim(j(this).find('td.relato').html());
					objData.jogos.push(tmpObj);
					simulador.times[tmpObj.idTime1].jogos[tmpObj.idJogo] = tmpObj;
					simulador.times[tmpObj.idTime2].jogos[tmpObj.idJogo] = tmpObj;
				});
				simulador.data[rodadaNum].push(objData);
				simulador.numRodadas = rodadaNum;
			});
			simulador.rebuildTable();
			simulador.buildGameList();
		});
	// anula todos os tabs
	j('body').keypress(function(e) {
		if (e.keyCode == 9) {
			return false;
		}
	})
};

/* função para recálculo e rebuild da tabela de classificação */
simulador.rebuildTable = function() {
	var dados = simulador.sortTableData(); // pega os dados ordenados
	var buff = '';
	var oldColor = '';
	for (var iTime = 0; iTime < dados.length; iTime++) { // Monta a tabela
		var color = 'C1C2B1';
		if (typeof simulador.colors[(iTime+1)] == 'string') {
			color = simulador.colors[(iTime+1)];
		}
		
		var extraClass = '';
		if ((oldColor != '' && oldColor != simulador.colors[iTime+2]) || (iTime+1) == dados.length) {
			extraClass = 'endPoint';
		}
		
		oldColor = simulador.colors[iTime+2];
		buff += ''+
			'<tr class="'+extraClass+'" id="tableTeam'+dados[iTime].idtime+'">'+
			'	<td class="tc-team"><p class="position" style="background-color:#'+color+';">'+(iTime+1)+'</p><p>'+(dados[iTime].link ? '<a href="'+dados[iTime].link+'" target="_blank">'+dados[iTime].time+'</a>' : dados[iTime].time)+'</p></td>'+
			'	<td class="tc-pg">'+dados[iTime].pg+'</td>'+
			'	<td class="tc-j">'+dados[iTime].j+'</td>'+
			'	<td class="tc-v">'+dados[iTime].v+'</td>'+
			'	<td class="tc-gp">'+dados[iTime].gp+'</td>'+
			'	<td class="tc-gc">'+dados[iTime].gc+'</td>'+
			'	<td class="tc-sg">'+dados[iTime].sg+'</td>'+
			'</tr>';
	}
	j('#simTable tbody').html(buff); //injeta a tabela no container

	j('tr#tableTeam'+simulador.currentIdTime1).addClass('currentUpd');
	j('tr#tableTeam'+simulador.currentIdTime2).addClass('currentUpd');
}

/* faz o sort dos dados armazenados anteriormente */
simulador.sortTableData = function() {
	var tmpData = []; // variavel temporaria que será retornada com os dados ordenados.
	
	// Retorna todos os times na nova variável para facilitar o sort por array
	for (var time in simulador.times) {
		tmpData.push(simulador.times[time]);
	}

	// faz o sort
	tmpData.sort(function(a,b) {
		if (a.pg > b.pg) { //Primeira condição: pontos ganhos (PG)
			return -1;
		} else if (a.pg < b.pg) {
			return 1;
		} else {
			if (a.v > b.v) { // Segunda confição: vitorias (V)
				return -1;	
			} else if (a.v < b.v) {
				return 1;	
			} else {
				if (a.sg > b.sg) { // Terceira condição: saldo de gols (SG)
					return -1;
				} else if (a.sg < b.sg) {
					return 1;
				} else {
					if (a.gp > b.gp) { // Quarta condição: gols pró (GP)
						return -1;
					} else if (a.gp < b.gp) {
						return 1;
					} else { // Processo de checagem de confronto direto 
						var aPg = bPg = aV = bV = aSg = bSg = aGp = bGp = 0;
						var aId = a.idtime;
						var bId = b.idtime;
						for (idxjogo in a.jogos) {
							var jogo = a.jogos[idxjogo];
							if (jogo.idTime1 == aId && jogo.idTime2 == bId) {
								if (jogo.gol1 > jogo.gol2) {
									aPg =+ 3;
									aV += 1;
									aSg += (jogo.gol1 - jogo.gol2);
									aGp += jogo.gol1;
								} else if (jogo.gol1 < jogo.gol2) {
									bPg =+ 3;
									bV += 1;
									bSg += (jogo.gol2 - jogo.gol1);
									bGp += jogo.gol2;
								} else {
									aPg =+ 1;
									bPg =+ 1;
									aGp += jogo.gol1;
									bGp += jogo.gol2;
								}
							} else if (jogo.idTime1 == bId && jogo.idTime2 == aId) {
								if (jogo.gol1 > jogo.gol2) {
									bPg =+ 3;
									bV += 1;
									bSg += (jogo.gol1 - jogo.gol2);
									bGp += jogo.gol1;
								} else if (jogo.gol1 < jogo.gol2) {
									aPg =+ 3;
									aV += 1;
									aSg += (jogo.gol2 - jogo.gol1);
									aGp += jogo.gol2;
								} else {
									aPg =+ 1;
									bPg =+ 1;
									aGp += jogo.gol2;
									bGp += jogo.gol1;
								}
							}
						}
						
						if (aPg > bPg) {
							return -1;
						} else if (aPg < bPg) {
							return 1;
						} else {
							if (aV > bV) {
								return -1;
							} else if (aV < bV) {
								return 1;
							} else {
								if (aSg > bSg) {
									return -1;
								} else if (aSg < bSg) {
									return 1;
								} else {
									if (aGp > bGp) {
										return -1;
									} else if (aGp < bGp) {
										return 1;
									} else {
										return 0;
									}
								}
							}
						}
					}
				}
			}
		}
	});
	return tmpData;
}

simulador.recalcTeamGames = function(gameId,teamId1,teamId2,gol1,gol2) {
	if (gol1.length > 0 && gol2.length > 0) {
		simulador.times[teamId1].jogos[gameId].gol1 = parseFloat(gol1);
		simulador.times[teamId1].jogos[gameId].gol2 = parseFloat(gol2);
		simulador.times[teamId2].jogos[gameId].gol1 = parseFloat(gol1);
		simulador.times[teamId2].jogos[gameId].gol2 = parseFloat(gol2);
	} else {
		simulador.times[teamId1].jogos[gameId].gol1 = -1;
		simulador.times[teamId1].jogos[gameId].gol2 = -1;
		simulador.times[teamId2].jogos[gameId].gol1 = -1;
		simulador.times[teamId2].jogos[gameId].gol2 = -1;
	}
	
	simulador.times[teamId1].gc = 0;
	simulador.times[teamId1].gp = 0;
	simulador.times[teamId1].j  = 0;
	simulador.times[teamId1].pg = 0;
	simulador.times[teamId1].sg = 0;
	simulador.times[teamId1].v  = 0;
	
	simulador.times[teamId2].gc = 0;
	simulador.times[teamId2].gp = 0;
	simulador.times[teamId2].j  = 0;
	simulador.times[teamId2].pg = 0;
	simulador.times[teamId2].sg = 0;
	simulador.times[teamId2].v  = 0;
	
	for (var idxJogo in simulador.times[teamId1].jogos) {
		var tmpJogo = simulador.times[teamId1].jogos[idxJogo];
		var gp = gc = 0;
		if (tmpJogo.idTime1 == teamId1) {
			gp = tmpJogo.gol1;
			gc = tmpJogo.gol2;
		} else {
			gp = tmpJogo.gol2;
			gc = tmpJogo.gol1;
		}
		
		if (gp > gc) {
			simulador.times[teamId1].gc += gc;
			simulador.times[teamId1].gp += gp;
			simulador.times[teamId1].j++;
			simulador.times[teamId1].pg += 3;
			simulador.times[teamId1].sg += (gp-gc);
			simulador.times[teamId1].v++;
		} else if (gp < gc) {
			simulador.times[teamId1].gc += gc;
			simulador.times[teamId1].gp += gp;
			simulador.times[teamId1].j++;
			simulador.times[teamId1].sg += (gp-gc);
		} else if (gp > -1 && gc > -1) {
			simulador.times[teamId1].gc += gc;
			simulador.times[teamId1].gp += gp;
			simulador.times[teamId1].j++;
			simulador.times[teamId1].pg += 1;
			simulador.times[teamId1].sg += (gp-gc);
		}
	}
	
	for (var idxJogo in simulador.times[teamId2].jogos) {
		var tmpJogo = simulador.times[teamId2].jogos[idxJogo];
		var gp = gc = 0;
		if (tmpJogo.idTime1 == teamId2) {
			gp = tmpJogo.gol1;
			gc = tmpJogo.gol2;
		} else {
			gp = tmpJogo.gol2;
			gc = tmpJogo.gol1;
		}
		
		if (gp > gc) {
			simulador.times[teamId2].gc += gc;
			simulador.times[teamId2].gp += gp;
			simulador.times[teamId2].j++;
			simulador.times[teamId2].pg += 3;
			simulador.times[teamId2].sg += (gp-gc);
			simulador.times[teamId2].v++;
		} else if (gp < gc) {
			simulador.times[teamId2].gc += gc;
			simulador.times[teamId2].gp += gp;
			simulador.times[teamId2].j++;
			simulador.times[teamId2].sg += (gp-gc);
		} else if (gp > -1 && gc > -1) {
			simulador.times[teamId2].gc += gc;
			simulador.times[teamId2].gp += gp;
			simulador.times[teamId2].j++;
			simulador.times[teamId2].pg += 1;
			simulador.times[teamId2].sg += (gp-gc);
		}
	}
	return true;
}

simulador.buildGameList = function() {
	var buff = '<div class="rodadaContainer" style="width:'+((simulador.numRodadas*simulador.DESLOC_CONTAINER)+50)+'px">';
	var rodadaLocked = {};
	for (var iRodada in simulador.data) {
		buff += '<div class="rodada" id="rodada_'+iRodada+'">';
		for (var iData in simulador.data[iRodada]) {
			buff += '<p>'+simulador.data[iRodada][iData].data+'</p><table cellpadding="0" cellspacing="0">';
			for (var idxJogo in simulador.data[iRodada][iData].jogos) {
				var jogo = simulador.data[iRodada][iData].jogos[idxJogo];
				buff += ''+
					'<tr>'+
					'	<td class="gameTeam1">'+simulador.times[jogo.idTime1].time+'</td>'+
					'	<td class="gameResult"><strong>'+(jogo.locked ? jogo.gol1 : '<input type="text" id="data-'+jogo.idTime1+'-'+jogo.idJogo+'-'+jogo.idTime2+'-1" />')+'</strong> X <strong>'+(jogo.locked ? jogo.gol2 : '<input type="text" id="data-'+jogo.idTime1+'-'+jogo.idJogo+'-'+jogo.idTime2+'-2" />')+'</strong></td>'+
					'	<td class="gameTeam2">'+simulador.times[jogo.idTime2].time+'</td>'+
					'	<td class="gameLinks">'+(jogo.relato ? jogo.relato : '&nbsp;')+'</td>'+
					'</tr>';
				if (!jogo.locked) {
					rodadaLocked[iRodada] = true;
				}
			}
			buff += '</table>';
		}
		buff += '</div>';
	}
	
	buff += '<div id="lnkRodadas" style="display:none;"><h4>Rodada:</h4><ul>';
	for (var iRodada = 1; iRodada <= simulador.numRodadas; iRodada++ ) {
		var cssRodada = '';
		if (typeof rodadaLocked[iRodada] == 'undefined') {
			cssRodada = ' locked';
		}
		buff += '<li class="linkrodada_'+iRodada+cssRodada+'"><a href="#'+iRodada+'">'+iRodada+'</a></li>';
	}
	buff += '</ul></div>';
	
	buff += '</div>';
	j('#wrapperLeft')
		.append(buff)
		.find('input')
			.focus(function() {
				j('#simTable .currentUpd').removeClass('currentUpd');
				var gameDataParts = j(this).attr('id').split('-');
				simulador.currentIdTime1 = gameDataParts[1];
				simulador.currentIdJogo = gameDataParts[2];
				simulador.currentIdTime2 = gameDataParts[3];
				j('tr#tableTeam'+simulador.currentIdTime1).addClass('currentUpd');
				j('tr#tableTeam'+simulador.currentIdTime2).addClass('currentUpd');
				j(this).removeClass('fieldError');
				simulador.currentFieldValue = j(this).val();
			})
			.blur(function(e) {
				simulador.parseRebuild(j(this),true);
			})
			.keypress(function(e) {
				if (e.which >= 48 && e.which <= 57) {
					if (j(this).val().length > 1) {
						return false;
					}
					simulador.parseRebuild(j(this));
					return true;
				} else if (e.keyCode == 8 || e.keyCode == 37 || e.keyCode == 38 || e.keyCode == 39 || e.keyCode == 40 || e.keyCode == 46) {
					return true;
				}
				return false;
			});

	j('#lnkRodadas li a').click(function(e) {
		e.stopPropagation();
		e.preventDefault();
		simulador.setCurrentRound(j(this).html());
	});
	
	j('.nav-prev a').click(function(e) {
		e.stopPropagation();
		e.preventDefault();
		if (!j('ul.navigation li.nav-prev a').hasClass('disabled')) {
			simulador.setCurrentRound((simulador.rodadaAtual-1));
		}
	});
	j('.nav-next a').click(function(e) {
		e.stopPropagation();
		e.preventDefault();
		if (!j('ul.navigation li.nav-next a').hasClass('disabled')) {
			simulador.setCurrentRound((parseFloat(simulador.rodadaAtual)+1));
		}
	});
	
	if (simulador.rodadaAtual == 0) {
		simulador.rodadaAtual = 1;
	}
	
	simulador.setCurrentRound(simulador.rodadaAtual);
	
	j('#wrapperLeft table a').attr('target','_blank');
}

simulador.parseRebuild = function(obj,isBlur) {
	var field1 = j('#data-'+simulador.currentIdTime1+'-'+simulador.currentIdJogo+'-'+simulador.currentIdTime2+'-1');
	var field2 = j('#data-'+simulador.currentIdTime1+'-'+simulador.currentIdJogo+'-'+simulador.currentIdTime2+'-2');
	
	field1.val(field1.val().replace(/[^0-9]/gim,''));
	field2.val(field2.val().replace(/[^0-9]/gim,''));
	
	var g1 = field1.val();
	var g2 = field2.val();
	
	if (g1 == '' && g2 == '') {
		field1.removeClass('fieldError');
		field2.removeClass('fieldError');
	} else if (typeof isBlur == 'undefined') {
		obj.removeClass('fieldError');
	} else {
		if (g1 == '') {
			field1.addClass('fieldError');
		}
		if (g2 == '') {
			field2.addClass('fieldError');
		}
	}
	
	if (simulador.currentFieldValue != obj.val()) {
		if (simulador.recalcTeamGames(simulador.currentIdJogo,simulador.currentIdTime1,simulador.currentIdTime2,field1.val(),field2.val())) {
			simulador.rebuildTable();
			simulador.pageView();
		}
	}
}

simulador.pageView = function() {
	if (simulador.PAGEVIEW_URL) {
		if (j('#_pageViewContainer').length == 0) {
			j('body').append('<div id="_pageViewContainer" style="display:none;"></div>');
		}
		j('#_pageViewContainer').html('<iframe src="'+simulador.PAGEVIEW_URL+'"></iframe>');
	}
}

simulador.setCurrentRound = function(rodada) {
	simulador.rodadaAtual = rodada;

	var desloc = (simulador.DESLOC_CONTAINER*(rodada-1))*-1;
	
	j('ul.navigation li a.disabled').removeClass('disabled');
	if (simulador.rodadaAtual == '1') {
		j('ul.navigation li.nav-prev a').addClass('disabled');
	} else if (simulador.rodadaAtual == simulador.numRodadas) {
		j('ul.navigation li.nav-next a').addClass('disabled');
	}
	
	j('.nav-info').html(simulador.rodadaAtual+'&ordf; rodada');
	j('.rodadaContainer').css('marginLeft',(desloc)+'px');
	simulador.setFooterLinks(simulador.rodadaAtual);
	
}

simulador.setFooterLinks = function(rodada) {
	rodada = parseFloat(rodada);
	j('#rodada_'+rodada).append(j('#lnkRodadas'));
	j('#lnkRodadas').css('display','block');
	var iStart = iEnd = 0;
	if (rodada <= 6) {
		iStart = 0;
		iEnd = 10;
	} else if ((rodada + 5) > simulador.numRodadas) {
		iStart = simulador.numRodadas-11;
		iEnd = simulador.numRodadas;
	} else {
		iStart = rodada - 6;
		iEnd = rodada + 4;
	}
	
	j('li.current').removeClass('current');
	j('#lnkRodadas li:eq('+(rodada-1)+')').addClass('current');
}

/* inicializa o sistema */
j(document).ready(function() {
	simulador.init();
});

