
var sse = null;
var juizes = new Array();
var jogadores = new Array();
var lutas = new Array();
var sagas = new Array();
var admins = new Array();

var rankingGeral = new Array();
var rankingLutas = new Array();
var rankingSagas = new Array();

var premiadosGeral = new Array();
var premiadosLutas = new Array();
var premiadosSagas = new Array();

function Admin(nome){
	this.nome = nome;
}

function Saga(nome){
	this.nome = nome;
	this.grupos = new Array();
	this.posts = new Array();
	
	this.addPost = function(post){
		this.posts[this.posts.length] = post;
		post.saga = this;
	}
	
	this.addGrupo = function(grupo){
		this.grupos[this.grupos.length] = grupo;
	}
}

function Post(jogador,data){
	this.jogador = jogador;
	this.data = data;
	this.saga = null;
	this.grupo = null;
	this.local;
	this.comentario = null;
	this.jogador.addPost(this);
}

function Luta(juiz,data){
	this.jogadores = new Array();
	this.juiz = juiz;
	this.data = data;
	this.grupo = new Array();
	this.abandonada = false;
	
	this.isJulgada = function(){
		for(var j in this.jogadores){
			if(this.jogadores[j].plutas.somatorio() > 0){ return true; }
		}
		
		for(var j in this.grupos){
			var grupo = this.grupos[j];
			for(var m in grupo.jogadores){
				if(grupo.jogadores[m].plutas.somatorio() > 0){ return true; }
			}
		}
	}
	
	this.addJogador = function(jogador){
		this.jogadores[this.jogadores.length] = jogador;
	}
	
	this.addGrupo = function(grupo){
		this.grupo[this.grupo.length] = grupo;
	}
}

function Grupo(nome){
	this.nome = nome;
	this.jogadores = new Array();
	this.addJogador = function(jogador){
		this.jogadores[this.jogadores.length] = jogador;
	}
	
	this.posts = new Array();
	
	this.addPost = function(post){
		this.posts[this.posts.length] = post;
		post.grupo = this;
	}
}

function PontosSagas(){
	this.coerencia = 0;
	this.desenvolvimento = 0;
	this.narrativa = 0;
	this.criatividade = 0;
	
	this.media = 0;
	
	this.somatorio = function(){
		return getNumber(this.coerencia) + getNumber(this.desenvolvimento) + getNumber(this.narrativa) + getNumber(this.criatividade);
	}
}

function PontosLutas(){
	this.inicial = 0;
	
	this.somatorio = function(){
		return getNumber(this.inicial + this.coerencia + this.desenvolvimento + this.narrativa + this.criatividade);
	}
	
	this.vitoria = 0;
	this.derrota = 0;
	this.empate = 0;
	this.quase = 0;
	
	this.pontuacao = function(){
		return getNumber(this.vitoria*3) + getNumber(this.empate) + getNumber(this.quase);
	}
}

PontosLutas.prototype = new PontosSagas();

function Jogador(nome){
	this.nome = nome;
	
	this.psagas = new PontosSagas();
	this.plutas = new PontosLutas();
	this.personagem = null;
	this.lutas = new Array();
	this.posts = new Array();
	this.lutasJulgadas = null;
	this.lutasAbandonadas = new Array();
	this.lutasCanceladas = new Array();
	this.abandonou = false;
	
	this.isAdmin = function(){
		if(admins[this.nome])
			return true;
		
		return false;
	}
	
	this.addPost = function(post){
		this.posts[this.posts.length] = post;
	}
	
	this.addLuta = function(luta){
		this.lutas[this.lutas.length] = luta;
	}
	
	this.countLutasJulgadas = function(){
		if(this.lutasJulgadas){
			return this.lutasJulgadas;
		}
		this.lutasJulgadas = 0;
		for(var i in this.lutas){
			if(this.lutas[i].isJulgada()){
				this.lutasJulgadas++;
			}
		}
		
		return this.lutasJulgadas;
	}
	
	this.mediaLutas = function(){
		return getNumber(this.plutas.somatorio()/this.countLutasJulgadas());
	}
	
	this.pontuacaoLutas = function(){
		return getNumber(this.plutas.pontuacao() + this.mediaLutas() - (this.lutasAbandonadas.length*10));
	}
	
	this.mediaSagas = function(){
		return getNumber(this.psagas.somatorio()/this.posts.length);
	}
	
	this.pontuacao = function(){
		return this.mediaSagas() + this.pontuacaoLutas();
	}
}

function getRequest(){
	
	var request = null;
	if(window.XMLHttpRequest){
		request = new XMLHttpRequest();
	} else if(window.ActiveXObject){
		request = new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	return request;
}

function abreXML(link,listener){
	
	var r = getRequest();
	
	link = link ? link : "ranking2010.xml";
	r.onreadystatechange = function(){

		if(r.readyState == 4){
			if(window.ActiveXObject){
				var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.loadXML(r.responseText);
				xmlDoc.resolveExternals = false;
				xmlDoc.async = false;
				sse = xmlDoc.documentElement;
			} else {
				sse = r.responseXML;
			}
			lerDados();
			if(listener)
				listener();
		}
	};
	r.open("GET",link+"?a="+new Date().getTime(),true);
	r.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	r.send(null);
}

function lerDados(){
	lerAdmins();
	lerLutas();
	lerSagas();
	
	var count = 0;
	for(var i in jogadores){
		var j = jogadores[i];
		
		if(j.lutas.length > 0) rankingLutas[rankingLutas.length] = j;
		if(j.posts.length > 0) rankingSagas[rankingSagas.length] = j;
		rankingGeral[rankingGeral.length] = j;
		
		count++;
	}
	
	rankingLutas.sort(sortPlacarLutas);
	rankingSagas.sort(sortPlacarSagas);
	rankingGeral.sort(sortGeral);
	
	if(count >= 3){
		for(var i = 0; i < rankingGeral.length && premiadosGeral.length < 3; i++){
			if(!rankingGeral[i].isAdmin()){
				rankingGeral[i].rankingGeral = true;
				premiadosGeral[premiadosGeral.length] = rankingGeral[i];
			}
		}
		
		for(var i = 0; i < rankingSagas.length && premiadosSagas.length < 3; i++){
			if(!rankingSagas[i].rankingGeral && !rankingSagas[i].isAdmin()){
				rankingSagas[i].rankingSaga = true;
				premiadosSagas[premiadosSagas.length] = rankingSagas[i];
			}
		}
		
		for(var i = 0, j = 0; i < rankingLutas.length && premiadosLutas.length < 3; i++){
			if(!rankingLutas[i].rankingGeral && !rankingLutas[i].rankingSaga && !rankingLutas[i].isAdmin()){
				rankingLutas[i].rankingLuta = true;
				premiadosLutas[premiadosLutas.length] = rankingLutas[i];
			}
		}
	}
}

function lerAdmins(){
	var ads = sse.getElementsByTagName("admin");
	
	for(var i = 0; i < ads.length; i++){
		var admin = new Admin(ads[i].getAttribute("nome"));
		
		admins[admin.nome] = admin;
	}
}

function getElement(element,child){
	if(element && element.getElementsByTagName(child)
			&& element.getElementsByTagName(child).item(0)
			&& element.getElementsByTagName(child).item(0).firstChild){
		
		return element.getElementsByTagName(child).item(0).firstChild.data;
	}
	
	return null;
}

function lerSagas(){
	var sagasXML = sse.getElementsByTagName("saga");
	
	for(var i = 0; i < sagasXML.length; i++){
		
		var saga = new Saga(sagasXML[i].getAttribute("nome"));
		
		var posts = sagasXML[i].getElementsByTagName("post");
		
		for(var j = 0; j < posts.length; j++){
			
			var pl = posts[j];
			
			var nome = pl.getAttribute("nome");
			var personagem = pl.getAttribute("personagem");
			
			var jogador = new Jogador(nome);
			jogador.personagem = personagem;
			// Node com os pontos do jogador
			var node = pl;
			
			var post = new Post(jogador,pl.getAttribute("data"));
			post.local = node.getAttribute("local");
			post.link = node.getAttribute("link");
			post.comentario = node.getAttribute("comentario");
			saga.addPost(post);
			
			// Pega os pontos para o jogador
			jogador.psagas.coerencia = getNumber(node.getAttribute("coerencia"));
			jogador.psagas.desenvolvimento = getNumber(node.getAttribute("desenvolvimento"));
			jogador.psagas.narrativa = getNumber(node.getAttribute("narrativa"));
			jogador.psagas.criatividade = getNumber(node.getAttribute("criatividade"));
			
			// Pegar o jogador geral
			if(jogadores[nome] == null){
				// Inicializa pontos
				jogadores[nome] = new Jogador(nome);
			}
			
			jogadores[nome].psagas.coerencia += jogador.psagas.coerencia
			jogadores[nome].psagas.desenvolvimento += jogador.psagas.desenvolvimento
			jogadores[nome].psagas.narrativa += jogador.psagas.narrativa
			jogadores[nome].psagas.criatividade += jogador.psagas.criatividade
			
			jogadores[nome].addPost(post);
			// Verifica se faz parte de um grupo
			if(pl.parentNode.tagName == "grupo"){
				// Pega o grupo inteiro
				var parent = pl.parentNode;
				// Pega o grupo ja referenciado
				var grupo = getGrupo(saga,parent);
				// Caso o grupo nao exista
				if(grupo == null){
					// entao cria-se
					var index = saga.grupos.length;
					saga.addGrupo(new Grupo(parent.getAttribute("nome")));
					grupo = saga.grupos[index];
					if(!isIE()){
						parent.index = index;
					}
				}
				
				grupo.addPost(post);
			}
		}
		
		sagas[saga.nome] = saga;
	}
}

function getGrupo(saga,node){
	if(!isIE()){
		return saga.grupos[node.index];
	}
	var nome = node.getAttribute("nome");
	for(var i in saga.grupos){
		if(saga.grupos[i].nome == nome){
			return saga.grupos[i];
		}
	}
}

function isIE(){
	return window.ActiveXObject != null;
}

function lerLutas(){
	var lutasXML = sse.getElementsByTagName("luta");
	this.lutasAbandonadas = new Array();
	for(var i = 0; i < lutasXML.length; i++){
		
		var luta = new Luta(lutasXML[i].getAttribute("juiz"),lutasXML[i].getAttribute("data"));
		luta.link = getElement(lutasXML[i],"link");
		luta.julgamento = getElement(lutasXML[i],"julgamento");
		
		var players = lutasXML[i].getElementsByTagName("jogador");
		
		for(var j = 0; j < players.length; j++){
			
			var pl = players[j];
			
			var nome = pl.getAttribute("nome");
			var personagem = pl.getAttribute("personagem");
			
			if(nome == ""){
				continue;
			}
			
			var jogador = new Jogador(nome);
			jogador.personagem = personagem;
			// Node com os pontos do jogador
			var node = pl;
			// Verifica se faz parte de um grupo
			if(pl.parentNode.tagName == "grupo"){
				// Pega o grupo inteiro
				var parent = pl.parentNode;
				// Pega o grupo ja referenciado
				var grupo = luta.grupo[parent.index];
				// Caso o grupo nao exista
				if(grupo == null){
					// entao cria-se
					var index = luta.grupo.length;
					luta.addGrupo(new Grupo());
					grupo = luta.grupo[index];
					parent.index = index;
				}
				// Node com os pontos do grupo
				node = pl.parentNode;
				// Adiciona o jogador ao grupo
				grupo.addJogador(jogador);
				
			// Caso nao faca parte de um grupo
			} else {
				// Adiciona o jogadora a lista de jogadores da luta
				luta.addJogador(jogador);
			}
			
			jogador.abandonou = node.getAttribute("abandonou") == "true";
			if(jogador.abandonou){
				luta.abandonada = true;
			}
			//alert(luta.abandonada + " " + jogador.abandonou);
			
			// Pega os pontos para o jogador
			jogador.plutas.inicial = getNumber(node.getAttribute("inicial"));
			jogador.plutas.coerencia = getNumber(node.getAttribute("coerencia"));
			jogador.plutas.desenvolvimento = getNumber(node.getAttribute("desenvolvimento"));
			jogador.plutas.narrativa = getNumber(node.getAttribute("narrativa"));
			jogador.plutas.criatividade = getNumber(node.getAttribute("criatividade"));
			
			// Pegar o jogador geral
			if(jogadores[nome] == null){
				// Inicializa pontos
				jogadores[nome] = new Jogador(nome);
			}
			
			jogadores[nome].plutas.inicial += jogador.plutas.inicial
			jogadores[nome].plutas.coerencia += jogador.plutas.coerencia
			jogadores[nome].plutas.desenvolvimento += jogador.plutas.desenvolvimento
			jogadores[nome].plutas.narrativa += jogador.plutas.narrativa
			jogadores[nome].plutas.criatividade += jogador.plutas.criatividade
			jogadores[nome].addLuta(luta);
		}
		
		var parts = new Array();
		for(var m in luta.jogadores){
			parts[parts.length] = luta.jogadores[m];
		}
		
		for(var m in luta.grupo){
			parts[parts.length] = luta.grupo[m];
		}
		
		// Verifica quem venceu e quem perdeu
		if(parts.length == 2){
			
			var a = parts[0];
			var b = parts[1];
			
			var j1 = null;
			var j2 = null;
			
			if(a.jogadores){ j1 = a.jogadores[0]; } else { j1 = a; }
			if(b.jogadores){ j2 = b.jogadores[0]; } else { j2 = b; }
			
			if(j1.abandonou){
				jogadores[j1.nome].lutasAbandonadas[jogadores[j1.nome].lutasAbandonadas.length] = luta;
				jogadores[j2.nome].lutasCanceladas[jogadores[j2.nome].lutasCanceladas.length] = luta;
				luta.abandonada = true;
			} else if(j2.abandonou){
				jogadores[j2.nome].lutasAbandonadas[jogadores[j2.nome].lutasAbandonadas.length] = luta;
				jogadores[j1.nome].lutasCanceladas[jogadores[j1.nome].lutasCanceladas.length] = luta;
				luta.abandonada = true;
			}
			
			var somaA = j1.plutas.somatorio();
			var somaB = j2.plutas.somatorio();
			
			if(somaA > somaB){
				
				somaVitoria(a);
				if(somaA - somaB <= 5){
					somaEmpateTecnico(b);
				} else {
					somaDerrota(b);
				}
				
			} else if(somaA < somaB){
				
				somaVitoria(b);
				if(somaB - somaA <= 5){
					somaEmpateTecnico(a);
				} else {
					somaDerrota(a);
				}
				
			} else if(somaA != 0 || somaB != 0){
				
				somaEmpate(a);
				somaEmpate(b);
			}
		}
		
		// Só adiciona a luta se houverem dois jogadores e/ou grupo
		if(parts.length == 2){
			lutas[lutas.length] = luta;
		}
	}
}

/* SOMA VITORIA */
function somaVitoria(player){
	if(player.jogadores){
		for(var i in player.jogadores){
			jogadores[player.jogadores[i].nome].plutas.vitoria++;
		}
	} else {
		jogadores[player.nome].plutas.vitoria++;
	}
}
/* SOMA DERROTA */
function somaDerrota(player){
	if(player.jogadores){
		for(var i in player.jogadores){
			jogadores[player.jogadores[i].nome].plutas.derrota++;
		}
	} else {
		jogadores[player.nome].plutas.derrota++;
	}
}
/* SOMA EMPATE TECNICO */
function somaEmpateTecnico(player){
	if(player.jogadores){
		for(var i in player.jogadores){
			jogadores[player.jogadores[i].nome].plutas.quase++;
		}
	} else {
		jogadores[player.nome].plutas.quase++;
	}
}
/* SOMA EMPATE */
function somaEmpate(player){
	if(player.jogadores){
		for(var i in player.jogadores){
			jogadores[player.jogadores[i].nome].plutas.empate++;
		}
	} else {
		jogadores[player.nome].plutas.empate++;
	}
}


/*
 * Organiza pelas datas
 */
function sortByData(a,b,acceptZero){
	
	var result = acceptZero ? 0 : -1;
	
	if(!a.data && !b.data){
		return result;
	} else if(!a.data){
		return -1;
	} else if(!b.data){
		return 1;
	}
	
	var da = a.data.split("/");
	var db = b.data.split("/");
	
	if(getNumber(da[2]) > getNumber(db[2])){
		result = 1;
	} else if(getNumber(da[2]) < getNumber(db[2])){
		result = -1;
	} else if(getNumber(da[1]) > getNumber(db[1])){
		result = 1;
	} else if(getNumber(da[1]) < getNumber(db[1])){
		result = -1;
	} else if(getNumber(da[0]) > getNumber(db[0])){
		result = 1;
	} else if(getNumber(da[0]) < getNumber(db[0])){
		result = -1;
	}
	
	return result*-1;
}

function sortPost(a,b){
	
	var result = sortByData(a,b,true);
	
	if(result != 0){ return result; }
	
	return compareNumbers(a.link.substring(a.link.indexOf("&p="),a.link.length),b.link.substring(b.link.indexOf("&p="))) * -1;
}

//http://www.cdz.com.br/sse/index.php?s=&showtopic=1726&view=findpost&p=19481
//http://www.cdz.com.br/sse/index.php?s=&showtopic=1726&view=findpost&p=19461

function compareNumbers(v1,v2){
	v1 = parseFloat(v1);
	v2 = parseFloat(v2);
	if(v1 > v2){
		return 1;
	} else if(v1 < v2){
		return -1;
	}
	
	return 0;
}

/*
 * Organizador por pontos e vitorias
 */
function sortPlacarLutas(a,b) {
	
	// Jogador A e B tem mesma quantidade de pontos
	// media
	var result = 0;
	if((result = compareNumbers(a.mediaLutas(),b.mediaLutas())) == 0)
	if((result = compareNumbers(a.pontuacaoLutas(),b.pontuacaoLutas())) == 0)
	if((result = compareNumbers(a.plutas.coerencia,b.plutas.coerencia)) == 0)
	if((result = compareNumbers(a.plutas.desenvolvimento,b.plutas.desenvolvimento)) == 0)
	if((result = compareNumbers(a.plutas.narrativa,b.plutas.narrativa)) == 0)
	if((result = compareNumbers(a.plutas.criatividade > b.plutas.criatividade)) == 0)
		result = 1;
	
	return result*-1;
}

function sortPlacarSagas(a,b) {
	
	var result = 0;
	if((result = compareNumbers(a.mediaSagas(),b.mediaSagas())) == 0)
	if((result = compareNumbers(a.psagas.somatorio(),b.psagas.somatorio())) == 0)
	if((result = compareNumbers(a.psagas.coerencia,b.psagas.coerencia)) == 0)
	if((result = compareNumbers(a.psagas.desenvolvimento,b.psagas.desenvolvimento)) == 0)
	if((result = compareNumbers(a.psagas.narrativa,b.psagas.narrativa)) == 0)
	if((result = compareNumbers(a.psagas.criatividade > b.psagas.criatividade)) == 0)
	if((result = compareNumbers(a.posts.length > b.posts.length)) == 0)
		result = 1;
		
	return result*-1;
}

function sortGeral(a,b) {
	
	var result = 0;
	if((result = compareNumbers(a.pontuacao(),b.pontuacao())) == 0)
	if((result = compareNumbers(a.plutas.coerencia + a.psagas.coerencia,b.plutas.coerencia + b.psagas.coerencia)) == 0)
	if((result = compareNumbers(a.plutas.desenvolvimento + a.psagas.desenvolvimento,b.plutas.desenvolvimento + b.psagas.desenvolvimento)) == 0)
	if((result = compareNumbers(a.plutas.narrativa + a.psagas.narrativa,b.plutas.narrativa + b.psagas.narrativa)) == 0)
	if((result = compareNumbers(a.plutas.criatividade + a.psagas.criatividade,b.plutas.criatividade + b.psagas.criatividade)) == 0)
		result = 1;
		
	return result*-1;
}


function getNumber(value){

	if(value)
	while(value.length > 1 && value.charAt(0) == "0"){
		value = value.substring(1,value.length);
	}

	var n = parseFloat(value);
	
	if(isNaN(n)) return 0;
	
	return n;
}
	

