/*********************************************************************
 ************************** DEFINICOES *******************************
 *********************************************************************/
function Reino(nome){
	this.nome = nome;
	this.nicks = new Array();
	this.classes = new Array();
	
	this.addNick = function(nick){
		this.nicks[this.nicks.length] = nick;
		nick.grupo = this;
	}
	
	this.addClasse = function(classe){
		this.classes[this.classes.length] = classe;
		classe.reino = this;
	}
}

function Classe(nome){
	this.nome = nome;
	this.nicks = new Array();
	
	this.addNick = function(nick){
		this.nicks[this.nicks.length] = nick;
		nick.grupo = this;
	}
}

function Nick(){
	this.personagem = null;
	this.situacao = null;
	this.usuario = null;
	this.ficha = null;
	this.grupo = null;
	this.isprimario = false;
	this.iscoadjuvante = false;
}

function Usuario(nome,link){
	this.nome = nome;
	this.link = link;
	this.primario = null;
	this.secundario = null;
}

function Status(title,color){
	this.title = title;
	this.color = color;
	this.nicks = new Array();
	this.addNick = function(nick){
		this.nicks[this.nicks.length] = nick;
		nick.situacao = this;
	}
}

var reinos = new Array();
var usuarios = new Array();
var statusCoadjuvante = new Array();
var statusPrimario = new Array();
var sse = null;

var nicks = new Array();

/*********************************************************************
 **************************** EXECUCAO *******************************
 *********************************************************************/

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 : "lista.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(){
	
	var usuariosXML = sse.getElementsByTagName("usuario");
	for(var i = 0; i < usuariosXML.length; i++){
		var u = usuariosXML[i];
		
		var usuario = new Usuario(u.getAttribute("nome"),u.getAttribute("link"));
		
		if(usuario.nome && usuario.nome != ""){
			usuarios[usuario.nome] = usuario;
		}
	}
	
	
	var statusXML = sse.getElementsByTagName("situacao");
	for(var i = 0; i < statusXML.length; i++){
		var x = statusXML[i];
		
		var s = new Status(formataTexto(x.getAttribute("title")),x.getAttribute("color"));

		if(!statusPrimario[s.title] && x.getAttribute("coadjuvante") != "true"){
			statusPrimario[s.title] = s;
		}
		
		if(!statusCoadjuvante[s.title] && x.getAttribute("coadjuvante") == "true"){
			statusCoadjuvante[s.title] = s;
		}
		
		nicks[nicks.length] = s;
	}
	
	var reinosXML = sse.getElementsByTagName("reino");
	for(var i = 0; i < reinosXML.length; i++){
		var r = reinosXML[i];
		
		var reino = new Reino(r.getAttribute("nome"));
		
		reino.classes = getClasses(r.getElementsByTagName("classe"));
		var xml = r.getElementsByTagName("nick");
		
		var nicksXML = new Array();
		for(var j = 0; j < xml.length; j++){
			if(xml[j].parentNode == r){
				nicksXML[nicksXML.length] = xml[j];
			}
		}
		
		reino.nicks = getNicks(nicksXML);
		
		if(reino.nome && reino.nome != ""){
			reinos[reinos.length] = reino;
		}
	}
	
}

function formataTexto(text){
	var s = text.split(" ");
	var result = "";
	for(var i = 0; i < s.length; i++){
		result += s[i].substring(0,1).toUpperCase() + s[i].substring(1,s[i].length).toLowerCase() + " ";
	}
	
	return result;
}

function getClasses(classesXML, reino){
	
	var classes = new Array();
	
	for(var i = 0; i < classesXML.length; i++){
		var c = classesXML[i];
		
		var classe = new Classe(c.getAttribute("nome"));
		classe.reino = reino;
		
		classe.nicks = getNicks(c.getElementsByTagName("nick"));
		
		if(classe.nome && classe.nome != ""){
			classes[classes.length] = classe;
		}
	}
	
	return classes;
}

function getSituacao(nick,title){
	var s = statusPrimario[title];
	if(nick.iscoadjuvante == true){
		s = statusCoadjuvante[title];
	}
	
	return s;
}

function getNicks(nicksXML, grupo){
	
	var array = new Array();
	
	for(var i = 0; i < nicksXML.length; i++){
		var n = nicksXML[i];
		
		var nick = new Nick();
		nick.personagem = n.getAttribute("personagem");
		nick.usuario = usuarios[n.getAttribute("usuario")];
		nick.ficha = n.getAttribute("ficha");
		nick.grupo = grupo;
		nick.isprimario = (n.getAttribute("primario") == "true");
		nick.iscoadjuvante = (n.getAttribute("coadjuvante") == "true");
		try{
			getSituacao(nick,formataTexto(n.getAttribute("situacao"))).addNick(nick);
		} catch(e) { /*alert(nick.personagem + " ## " + formataTexto(n.getAttribute("situacao")) + " ## " + e); */}
		
		if(nick.usuario)
		if(nick.isprimario){
			nick.usuario.primario = nick;
		} else {
			nick.usuario.secundario = nick;
		}
		
		if(nick.personagem && nick.personagem != ""){
			array[array.length] = nick;
		}
		
	}
	
	return array;
}


