// 	Battle Generator main file
//	Michael Laumer

//Functions
function MakeRoster (Game, Player1, Player2, Player3, Player4, Player5, Player6, Player7, Player8, winRounds, fightRounds, tagBattle, same, cpu) {
	
	var playerNames = new Array(0);
	var gameName = Game;
	Player1 ? playerNames.push(Player1) : "";
	Player2 ? playerNames.push(Player2) : "";
	Player3 ? playerNames.push(Player3) : "";
	Player4 ? playerNames.push(Player4) : "";
	Player5 ? playerNames.push(Player5) : "";
	Player6 ? playerNames.push(Player6) : "";
	Player7 ? playerNames.push(Player7) : "";
	Player8 ? playerNames.push(Player8) : "";
	MakeTournament(gameName, playerNames, winRounds, fightRounds, tagBattle, same, cpu);
}

function MakeTournament(gameName, playerNames, winRounds, fightRounds, tagBattle, same, cpu) {			
	
	var roster = new Array(0);				//wird per Fisher Yates gemischt und hat roster als Inhalt
	var fighter;							//bekommt durch nen Array Shift einen Kämpfer zugewiesen	
	var fights = new Array(1, 2);			//wird für getNextBout benötigt um alle Kampf-Kombinationen zu erhalten wenn mehr als zwei Spieler
	var actualRound = 0;					//in welcher Runde befinden wir uns
	var oneTwoThree = 1	;					//zählt alle möglichen Kombinationen der Spielerkämpfe mit
	var rowsPerBattle = fightRounds;  		//Wieviel 1vs1 Kämpfe soll es pro Runde geben
	//wieviel Kampfe muss es geben, damit in einer Runde jeder mal mit jedem gespielt hat A = N!/((N-k)!*k!)
	var rowsPerBout;
	(playerNames.length == 1 || tagBattle == 1) ? rowsPerBout = 1 : rowsPerBout = fakultaet(playerNames.length)/(fakultaet(playerNames.length - 2) * fakultaet(2));
	var rows = parseInt(winRounds) * rowsPerBattle * rowsPerBout;
	var columns = playerNames.length + 1;
	//Für den Fall, dass nur ein Spieler angegeben wurde oder alle gleichzeitig spielen
	var player;
	if (playerNames.length == 1)
	{
		player = 1;
	}
	else if (tagBattle == 1)
	{
		player = playerNames.length;
	}
	else
	{
		player = 2;
	}	

	//Hinweis anzeigen und alte Tabelle entfernen
	var divRoster = document.getElementById("roster");
	
	divRoster.style.display = 'block';
	(!divRoster.lastChild) ? "" : divRoster.removeChild(divRoster.lastChild);
	
	//Beginn der neuen Tabelle
	var rTable = document.createElement("table");
	var rTbody = document.createElement("tbody");
	var rThead = document.createElement("thead");
	var rTfoot = document.createElement("tfoot");
	var rTr, rTh, rTd, colgroup, col;    
	//create colgroup and table Header 
	rTr = document.createElement("tr");
	colgroup = document.createElement("colgroup");
	for (var h = -1; h < playerNames.length; h++)
	{
		var width = parseInt((97)/playerNames.length) + "%";
		col = document.createElement("col");
		rTh = document.createElement("th");		
		(h == -1) ? rTh.appendChild(document.createTextNode("#")) : rTh.appendChild(document.createTextNode(playerNames[h]));
		(h == -1) ? col.width = '3%' : col.width = width;
		rTr.appendChild(rTh);
		colgroup.appendChild(col);
	}
	rTable.appendChild(colgroup);
    rThead.appendChild(rTr);
    rTable.appendChild(rThead);
    //create table footer 
	rTr = document.createElement("tr");
	for (var h = -1; h < playerNames.length; h++)
	{
		rTd = document.createElement("td");
		(h == -1) ? rTd.appendChild(document.createTextNode("#")) : rTd.appendChild(document.createTextNode("Stats"));
		rTr.appendChild(rTd);
	}
	rTfoot.appendChild(rTr);
    rTable.appendChild(rTfoot);
    //Anzahl der Reihen
    for (var i = 0; i < rows; i++)
    {
    	rTr = document.createElement("tr");
    	//Runden werden abgefangen 1 , 2, 3, 4...
    	(i % (rowsPerBattle*rowsPerBout) == 0) ? actualRound++ : "";
    	if ((i % rowsPerBattle) == 0)
    	{    		
    		roster = fillRoster(gameName, player, cpu);
    		fisherYates(roster);
    		//drei Kämpfe pro Runde
	    	for (var j = 0; j < columns; j++)
	    	{
	    		rTd = document.createElement("td");
	    		if (j == 0)
	    		{	    			
	    			rTd.rowSpan = rowsPerBattle;
	    			rTd.className = 'round';
	    			rTd.appendChild(document.createTextNode(actualRound+"."+oneTwoThree));
	    			(oneTwoThree < rowsPerBout) ? oneTwoThree++ : oneTwoThree = 1;
	    		}
	    		else if (j == fights[0] || j == fights[1] || tagBattle == 1)
	    		{
	    			try
    				{
		    			(same == 0) ? fighter = roster.shift() : fighter = roster[Math.round(Math.random() * (roster.length - 1))];
		    			if (fighter.search(/^Gegner.+/) != -1)
		    			{
		    				var tmp;
		    				(same == 0) ? tmp = roster.shift() : tmp = roster[Math.round(Math.random() * (roster.length - 1))];
		    				while ((tmp.search(/^Eigenen.+/) != -1) || (tmp.search(/^Kämpfer.+/) != -1))
		    				{
		    					tmp = roster.shift()
		    				}
		    				rTd.appendChild(document.createTextNode(fighter+" ("+tmp+")"));
		    				rTd.className = 'bout';
		    			}
		    			else
		    			{
		    				rTd.appendChild(document.createTextNode(fighter));
		    				rTd.className = 'bout';
		    			}
		    		}
		    		catch(err)
		    		{
		    			report(gameName, err, player);
		    			return false;		    			
		    		}
		    		
	    		}
	    		else
	    		{	    			
	    			rTd.rowSpan = rowsPerBattle;
	    			rTd.className = 'pause';
	    			rTd.appendChild(document.createTextNode("Pause"));
	    		}	    		
	    		rTr.appendChild(rTd)	    	
	    	}
	    	(playerNames.length > 2) ? getNextBout(fights, playerNames.length) : "";
    	}
    	else
    	{
    		for (var j = 0; j < player; j++)
	    	{	    		
	    		rTd = document.createElement("td");
	    		rTd.className = 'bout';
	    		try
	    		{
		    		(same == 0) ? fighter = roster.shift() : fighter = roster[Math.round(Math.random() * (roster.length - 1))];
		    		if (fighter.search(/^Gegner.+/) != -1)
	    			{
	    				var tmp;
	    				(same == 0) ? tmp = roster.shift() : tmp = roster[Math.round(Math.random() * (roster.length - 1))];
	    				while ((tmp.search(/^Eigenen.+/) != -1) || (tmp.search(/^Kämpfer.+/) != -1) || (tmp.search(/^Gegnerischen.+/) != -1))
		    			{
		    				tmp = roster.shift()
		    			}
	    				rTd.appendChild(document.createTextNode(fighter+" ("+tmp+")"));    				
	    			}
	    			else
	    			{
	    				rTd.appendChild(document.createTextNode(fighter));
	    			}	    		
		    		rTr.appendChild(rTd);
		    	}
		    	catch(err)
		    	{
		    		report(gameName, err, player);
		    		return false;
		    	}
	    	}	    	
	    }    		
    	rTbody.appendChild(rTr);
    }
    rTable.appendChild(rTbody);
    divRoster.appendChild(rTable);
}

//Array Shuffle
function fisherYates (myArray) {
  var i = myArray.length;
  if ( i == 0 ) return false;
  while ( --i ) {
     var j = Math.floor( Math.random() * ( i + 1 ) );
     var tempi = myArray[i];
     var tempj = myArray[j];
     myArray[i] = tempj;
     myArray[j] = tempi;
   }
}
//aktive Kämpfer bestimmen
function getNextBout(myArray, fightercount) {
	
	if (myArray[1] != fightercount)
	{
		myArray[1]++;
	}
	else if ((myArray[1] == fightercount) && (myArray[1]-myArray[0] != 1))
	{
		myArray[0]++;
		myArray[1] = myArray[0]+1;
	}
	else
	{
		myArray[0] = 1;
		myArray[1] = 2;
	}
}
function fakultaet(n) {
	if (n == 1 || n == 0)
	{
		return 1;
	}
	else
	{
		return fakultaet(n-1)*n;
	}
}
function report(gameName, error, player) {
	tmpRoster = fillRoster(gameName, player)	
	alert("Alle "+tmpRoster.length+" Möglichkeiten von "+gameName+" ausgenutzt. Reduziere die Anzahl der Kämpfe pro Runde, deaktiviere die Option -Alle Spieler gleichzeitig-, falls sie gesetzt ist oder aktiviere die Option -Wiederholung erlauben-.\n\nFehlerbeschreibung:\n" + error);
}

function copyhint() {
	var footerText = document.createTextNode("Alle Marken- und Warenzeichen sind Eigentum ihrer jeweiligen Inhaber.");
	var footerDiv = document.getElementById("copyhint");
	
	footerDiv.appendChild(footerText);
}
