URBAN.Gamerules = new Class({
	initialize: function(allCharacters)
	{
		this.families = new Array();
		this.allCharacters = allCharacters;
		this.initialSetup();
	},
	
	initialSetup: function()
		{
		for (characterId in this.allCharacters )
		{
			var character = this.allCharacters[characterId];
	
			var id_perso = character[0];
			var name = character[1];
			var id_familly = character[2];
			var familly = character[3];
			var ability_at_level = character[5];	
			var level_min = character[9];		
			var level_max = character[10];
	
			if ( !$chk(this.families[id_familly]) )
			{
				this.families[id_familly] = new Object();
				this.families[id_familly].characters = new Array();
				this.families[id_familly].id = id_familly;
				this.families[id_familly].name = familly;
			}
	
			this.families[id_familly].characters.push({
				'name': name,
				'id': id_perso,
				'ability_at_level': ability_at_level,
				'level_min': level_min,
				'level_max': level_max
			});
		}

		$("character0FamillySelect").add( new Option( _("Select"), 0 ), undefined );
		$("character1FamillySelect").add( new Option( _("Select"), 0 ), undefined );

		this.families.forEach( function (familly) {
				if ( $chk(familly) )
				{
					var famillyOption = new Option( familly.name, familly.id );
					$("character0FamillySelect").add( famillyOption, undefined );
			
					var famillyOption = new Option( familly.name, familly.id );
					$("character1FamillySelect").add( famillyOption, undefined );
				}
			}
		);
		
		$("character0FamillySelect").addEvent("change", this.updateCharacterList.pass(0, this) );
		$("character1FamillySelect").addEvent("change", this.updateCharacterList.pass(1, this) );

		$("character0Select").addEvent("change", this.updateCharacterLevelList.pass(0, this) );
		$("character1Select").addEvent("change", this.updateCharacterLevelList.pass(1, this) );

		$("calculateStatsButton").addEvent("click", this.calculateStats );
	},
	
	getFamilly: function(id_familly)
	{
		var output = false;
		
		this.families.forEach( 
			function(familly)
			{
				if ( $chk(familly) && (familly.id == id_familly) )
				{
					output = familly;
				}
			}
		);
		
		return output;
	},
	
	getCharacter: function(id_familly, id_character)
	{
		var output = false;
		
		this.getFamilly(id_familly).characters.forEach(
			function(character) 
			{
				if ( $chk(character) && (character.id == id_character) )
				{
					output = character;
				}
			}
		);
		
		return output;
	},
		
	updateCharacterList: function(characterIndex)
	{
		var myCharacterSelector = $("character" + characterIndex + "Select");
		myCharacterSelector.options.length = 0;
	
		var myCharacterLevelSelector = $("character" + characterIndex + "LevelSelect");
		myCharacterLevelSelector.options.length = 0;
		
		var myCharacterFamillySelector = $("character" + characterIndex + "FamillySelect");

		$("character" + characterIndex + "Select").add( new Option( _("Select"), 0 ), undefined );

		if ( this.value == 0 ) return;

		var id_familly = myCharacterFamillySelector.value;

		this.getFamilly( id_familly ).characters.forEach( function (character) {
				if ( $chk(character) )
				{
					var characterOption = new Option( character.name, character.id );
					myCharacterSelector.add( characterOption, undefined );
				}
			}
		);
	},
	
	updateCharacterLevelList: function(characterIndex)
	{
		var myCharacterSelector = $("character" + characterIndex + "Select");
		var myCharacterFamillySelector = $("character" + characterIndex + "FamillySelect");
		var myCharacterLevelSelector = $("character" + characterIndex + "LevelSelect");
		
		myCharacterLevelSelector.options.length = 0;

		$("character" + characterIndex + "LevelSelect").add( new Option( _("Select"), 0 ), undefined );

		if ( this.value == 0 ) return;
	
		var id_familly = myCharacterFamillySelector.value;
		var id_character = myCharacterSelector.value;
		
		var myCharacter = this.getCharacter( id_familly, id_character );
		
		for (var i = myCharacter.level_min; i <= myCharacter.level_max; ++i)
		{
			var label = _("Level") + " " +i;
			if ( myCharacter.ability_at_level != 0 && myCharacter.ability_at_level <= i ) label += " (*)";
		
			var characterLevelOption = new Option( label, i );
			myCharacterLevelSelector.add( characterLevelOption, undefined );
		}

	},
		
	calculateStats: function()
	{
		if (
			$("character0FamillySelect").value < 1 || $("character0Select").value < 1 || $("character0LevelSelect").value < 1
		||
			$("character1FamillySelect").value < 1 || $("character1Select").value < 1 || $("character1LevelSelect").value < 1
		)
		{
			alert(_("You must select 2 characters and their levels to calculate the altered stats."));
		}
		else
		{
			new Request({
				'url': "/ajax/rules/check_round_stats.php",
				'data': {
					id_character_0: $("character0Select").value,
					id_character_1: $("character1Select").value,
					level_character_0: $("character0LevelSelect").value,
					level_character_1: $("character1LevelSelect").value,
					pillz_character_0: $("character0PillzSelect").value,
					pillz_character_1: $("character1PillzSelect").value,
					teammates_character_0: $("character0TeammatesSelect").value,
					teammates_character_1: $("character1TeammatesSelect").value,
					is_fury_character_0: $("character0Fury").checked?1:0,
					is_fury_character_1: $("character1Fury").checked?1:0						
					},
				'onComplete': function (responseText)
				{
					var newStats = JSON.decode(responseText);
					if ( $("outputStatsDiv") ) $("outputStatsDiv").dispose();
					
					var outputStats = new Element("div", {id: "outputStatsDiv"});

					outputStatsContent = "<table border=0 cellspacing=0 cellpadding=0 width=50% style=\"margin-top: 10px;\"><tr><td>";
					outputStatsContent += "<b>" + $("character0Select").options[$("character0Select").selectedIndex].text + "</b>";
					outputStatsContent += "<br/>";
					outputStatsContent += "<img src=" + staticsHost + "/img/v2/icons/cardstats/10x10/ability.gif /> " + _("Ability") + ": " + (newStats[0].ability_activated?"ON":"OFF");
					outputStatsContent += "<br/>";
					outputStatsContent += "<img src=" + staticsHost + "/img/v2/icons/cardstats/10x10/bonus.gif /> " + _("Bonus") + ": " + (newStats[0].bonus_activated?"ON":"OFF");
					outputStatsContent += "<br/>";
					outputStatsContent += "<img src=" + staticsHost + "/img/v2/icons/cardstats/10x10/power.gif /> " + _("power") + ": " + newStats[0].ph;
					outputStatsContent += "<br/>";
					outputStatsContent += "<img src=" + staticsHost + "/img/v2/icons/cardstats/10x10/damage.gif /> " + _("damage") + ": " + (parseInt(newStats[0].pdd) + parseInt(newStats[0].round_extra_damage));
					outputStatsContent += "<br/>";
					outputStatsContent += "<img src=" + staticsHost + "/img/v2/icons/cardstats/10x10/attack.gif /> " + _("attack") + ": " + (newStats[0].fo);

					outputStatsContent += "</td><td>";
					
					outputStatsContent += "<b>" + $("character1Select").options[$("character1Select").selectedIndex].text + "</b>";
					outputStatsContent += "<br/>";				
					outputStatsContent += "<img src=" + staticsHost + "/img/v2/icons/cardstats/10x10/ability.gif /> " + _("Ability") + ": " + (newStats[1].ability_activated?"ON":"OFF");
					outputStatsContent += "<br/>";
					outputStatsContent += "<img src=" + staticsHost + "/img/v2/icons/cardstats/10x10/bonus.gif /> " + _("Bonus") + ": " + (newStats[1].bonus_activated?"ON":"OFF");
					outputStatsContent += "<br/>";
					outputStatsContent += "<img src=" + staticsHost + "/img/v2/icons/cardstats/10x10/power.gif /> " + _("power") + ": " + newStats[1].ph;
					outputStatsContent += "<br/>";
					outputStatsContent += "<img src=" + staticsHost + "/img/v2/icons/cardstats/10x10/damage.gif /> " + _("damage") + ": " + (parseInt(newStats[1].pdd) + parseInt(newStats[1].round_extra_damage));
					outputStatsContent += "<br/>";
					outputStatsContent += "<img src=" + staticsHost + "/img/v2/icons/cardstats/10x10/attack.gif /> " + _("attack") + ": " + (newStats[1].fo);

					outputStatsContent += "</td></tr></table>";
					
					outputStats.set('html',  outputStatsContent );
					
					$("charactersStatsCalculator").adopt(outputStats);
				}
			}).send();
		}
	}
});