/*
 * common.js
 * Provides common functions and definitions for army lists.
 */

/** Returns translated texts for unit.js
 */
function i18n(text) {
  var currentLanguage = "translatedLanguage";

  if( currentLanguage == "German" ) {
    if( text == "points" )
      return "Punkte";
    else if( text == "lords" )
      return "Kommandanten";
    else if( text == "heroes" )
      return "Helden";
    else if( text == "core" )
      return "Kern";
    else if( text == "special" )
      return "Elite";
    else if( text == "rare" )
      return "Selten";
    else if( text == "Add new unit" )
      return "Neue Einheit hinzufügen";
    else if( text == "Add sub unit" )
      return "Neue Untereinheit hinzufügen";
  } else {
    return text;
  }
}


// Function to sort items by points value
function pointsSort(a, b) {
	return (b[2] - a[2]);
}

/**
 * Returns a variant of an options array that is sorted and only contains unique items.
 * The first encountered item is kept.
 * @arg As an optional argument a maximum value of the options can ge given.
 */
Array.prototype.optSort = function() {
  // note: array.uniq is not supported everywhere.
  
  // -- unique
  var res = [];
  var l = this.length;

  o: for (var i = 0; i < l; i++) {
      for (var j = res.length-1; j >= 0; j--) {
         if (res[j][0] == this[i][0])
           continue o;
      }

      if( arguments.length > 0 && this[i][2] > arguments[0] )
        continue o;

      res.push(this[i]);
  }

  // -- sort
  return res.sort(pointsSort);
};


// Ensures that a unit only has "one of" a particular option
function maxOneOf(unit, optionName, count, changeFunc) {
	if (count == 0) {
		return;
	}
	
	// Go through all the options in a group and deselect others
	unit.forAllSelectedOptions(
		function(option, count) { 
			var optionOptions = option[3];
			if (optionOptions && optionOptions.changeFunction == changeFunc && option[0] != optionName) {
				unit.options[option[0]] = 0;
				$(unit.getId() + '_' + option[0]).checked = false;
			}
		});
}

/**
 *  A deployment function gets a unit and fills the given map with arrays.
 *  Usually this function should add icons at the give positions.
 *
 *  @param unit The unit for which the positions array should be filled out.
 *  @param positions A map containing front, middle, back, bottom, top, left, right
 */
function normalDeployment(unit, positions) {

  var unitStruct = unit.definition;
  var unitIcons = unitStruct.icons;

  // Look for some special options (and icons)
  unit.forAllSelectedOptions(
	function(option, count) { 
		var optionOptions = option[3];
		if (optionOptions != null && optionOptions.icons != null) {
			if (option[0].charAt() == 'i' || option[0].charAt() == 'm') {
				unitIcons = optionOptions.icons;
			}
			// Maybe a special addition
			else if (option[0].charAt() == 's') {
				for(var i = 0; i < count; i++) {
					positions.left.push(optionOptions.icons);
				}
			}
		}
	});
	
	if (unit.options.Champ) {
		unit.addOptionIcons(positions.front, 'Champ');
	}
	if ( unit.options.Std) {
		unit.addOptionIcons(positions.front, 'Std');
	}
	if (unit.options.Music) {
		unit.addOptionIcons(positions.front, 'Music');
	}
	
	if (unitIcons) {
		for (var i = 0; i < unit.count - positions.front.length; i++) {
			positions.middle.push(unitIcons);
		}
	}
	
	return positions;
}

/**
 *  Special deployment function that leaves some spaces
 *
 *  @param unit The unit for which the positions array should be filled out.
 *  @param positions A map containing front, middle, back, bottom, top, left, right
 */
function spreadDeployment(unit, positions) {
	normalDeployment(unit, positions);
	
	for (var i = positions.middle.length - 1; i > 0; i -= 2) {
		positions.middle.splice(i, 0, null); // Add some empty spaces in the middle
	}
	
	return positions;
}

function maxOneOfBanner( unit, optionName, count ) {
  return maxOneOf( unit, optionName, count, maxOneOfBanner );
}

function maxOneOfWep(unit, optionName, count) {
	return maxOneOf(unit, optionName, count, maxOneOfWep);
}

function maxOneOfMWep(unit, optionName, count) {
	return maxOneOf(unit, optionName, count, maxOneOfMWep);
}

function maxOneOfMount(unit, optionName, count) {
	return maxOneOf(unit, optionName, count, maxOneOfMount);
}

function maxOneOfMArm(unit, optionName, count) {
	return maxOneOf(unit, optionName, count, maxOneOfMArm);
}
function maxOneOfMArc(unit, optionName, count) {
	return maxOneOf(unit, optionName, count, maxOneOfMArc);
}

var commonLores = [
	["optLoreFire", "Lore of Fire", 0, {oneOf: "Lore"}],
	["optLoreBeasts", "Lore of Beasts", 0, {oneOf: "Lore"}],
	["optLoreHeavens", "Lore of Heavens", 0, {oneOf: "Lore"}],
	["optLoreMetal", "Lore of Metal", 0, {oneOf: "Lore"}],
	["optLoreLight", "Lore of Light", 0, {oneOf: "Lore"}],
	["optLoreLife", "Lore of Life", 0, {oneOf: "Lore"}],
	["optLoreShadow", "Lore of Shadow", 0, {oneOf: "Lore"}],
	["optLoreDeath", "Lore of Death", 0, {oneOf: "Lore"}]
];

var commonMagicWep = [
	["mBlGiant", "Giant Blade", 60, {changeFunction: maxOneOfMWep}],
	["mSwBlood", "Sword of Bloodshed", 60, {changeFunction: maxOneOfMWep}],
	["mBlObsidian", "Obsidian Blade", 50, {changeFunction: maxOneOfMWep}],
	["mBlOgre", "Ogre Blade", 40, {changeFunction: maxOneOfMWep}],
	["mSwStrife", "Sword of Strife", 40, {changeFunction: maxOneOfMWep}],
	["mBlFencers", "Fencer's Blades", 35, {changeFunction: maxOneOfMWep}],
	["mSwAHeroes", "Sword of Anti-Heroes", 30, {changeFunction: maxOneOfMWep}],
	["mSpellTh", "Spellthieving Sword", 25, {changeFunction: maxOneOfMWep}],
	["mSwSwift", "Sword of Swift Slaying", 25, {changeFunction: maxOneOfMWep}],
	["mSwBattle", "Sword of Battle", 20, {changeFunction: maxOneOfMWep}],
	["mSwBersk", "Berserker Sword", 20, {changeFunction: maxOneOfMWep}],
	["mSwMight", "Sword of Might", 20, {changeFunction: maxOneOfMWep}],
	["mSwGSigil", "Gold Sigil Sword", 15, {changeFunction: maxOneOfMWep}],
	["mSwStrike", "Sword of Striking", 15, {changeFunction: maxOneOfMWep}],
	["mBlBiting", "Biting Blade", 10, {changeFunction: maxOneOfMWep}],
	["mSwRelic", "Relic Sword", 10, {changeFunction: maxOneOfMWep}],
	["mBlShriek", "Shrieking Blade", 10, {changeFunction: maxOneOfMWep}],
	["mSwTorment", "Tormentor Sword", 5, {changeFunction: maxOneOfMWep}],
	["mWarrBane", "Warrior Bane", 5, {changeFunction: maxOneOfMWep}]
];

var commonMagicArm = [
	["mArmDestiny", "Armour of Destiny", 50, {changeFunction: maxOneOfMArm}],
	["mHlmTricksters", "Trickster's Helm", 50, {changeFunction: maxOneOfMArm}],
	["mArmSlvrSteel", "Armour of Silvered Steel", 45, {changeFunction: maxOneOfMArm}],
	["mArmFortune", "Armour of Fortune", 35, {changeFunction: maxOneOfMArm}],
	["mHlmDiscord", "Helm of Discord", 30, {changeFunction: maxOneOfMArm}],
	["mSclGlittering", "Glittering Scales", 25, {changeFunction: maxOneOfMArm}],
	["mShPtolos", "Shield of Ptolos", 25, {changeFunction: maxOneOfMArm}],
	["mShSpell", "Spellshield", 20, {changeFunction: maxOneOfMArm}],
	["mArmGamblers", "Gambler's Armour", 20, {changeFunction: maxOneOfMArm}],
	["mHlmDragon", "Dragonhelm", 10, {changeFunction: maxOneOfMArm}],
	["mShEnchanted", "Enchanted Shield", 5, {changeFunction: maxOneOfMArm}],
	["mShCharmed", "Charmed Shield", 5, {changeFunction: maxOneOfMArm}]
];

var commonMagicEnc = [
	["mWizHat", "Wizarding Hat", 100],
	["mFozzrik", "Fozzrik's Folding Fortress", 100],
	["mArCarpet", "Arabyan Carpet", 50],
	["mCrCmd", "Crown of Command", 35],
	["mHealPot", "Healing Potion", 35],
	["mFthTorc", "Featherfoe Torc", 35],
	["mRubyRing", "Ruby Ring of Ruin", 25],
	["mMaskEee", "The Terrifying Mask of EEE!", 25],
	["mStrPot", "Potion of Strength", 20],
	["mToughPot", "Potion of Toughness", 20],
	["mTrkShrd", "The Other Trickster's Shard", 15],
	["mIroncurse", "Ironcurse Icon", 5],
	["mFoolPot", "Potion of Foolhardiness", 5],
	["mSpeedPot", "Potion of Speed", 5]
];

var commonMagicArc = [
	["mArcAshur", "Book of Ashur", 70, {changeFunction: maxOneOfMArc}],
	["mArcFeedback", "Feedback Scroll", 50, {changeFunction: maxOneOfMArc}],
	["mArcLeeching", "Scroll of Leeching", 50, {changeFunction: maxOneOfMArc}],
	["mArcSivejirs", "Sivejir's Hex Scroll", 50, {changeFunction: maxOneOfMArc}],
	["mArcPower", "Power Scroll", 35, {changeFunction: maxOneOfMArc}],
	["mArcWandJet", "Wand of Jet", 35, {changeFunction: maxOneOfMArc}],
	["mArcForbidden", "Forbidden Rod", 35, {changeFunction: maxOneOfMArc}],
	["mArcTricksters", "Trickster's Shard", 25, {changeFunction: maxOneOfMArc}],
	["mArcEarthing", "Earthing Rod", 25, {changeFunction: maxOneOfMArc}],
	["mArcDispel", "Dispel Scroll", 25, {changeFunction: maxOneOfMArc}],
	["mArcPowerSt", "Power Stone", 25, {changeFunction: maxOneOfMArc}],
	["mArcSceptre", "Sceptre of Stability", 15, {changeFunction: maxOneOfMArc}],
	["mArcChannel", "Channelling Staff", 15, {changeFunction: maxOneOfMArc}],
	["mArcShielding", "Scroll of Shielding", 15, {changeFunction: maxOneOfMArc}]
];

var commonMagicTal = [
	["mTalWard4", "Talisman of Preservation", 45],
	["mTalMRes3", "Obsidian Lodestone", 45],
	["mTalWard5", "Talisman of Endurance", 30],
	["mTalMRes2", "Obsidian Amulet", 30],
	["mTalDawnStone", "Dawnstone", 25],
	["mTalOpal", "Opal Amulet", 15],
	["mTalMRes1", "Obsidian Trinket", 15],
	["mTalWard6", "Talisman of Protection", 15],
	["mTalRegen", "Seed of Rebirth", 10],
	["mTalDrgBane", "Dragonbane Gem", 5],
	["mTalPigeon", "Pidgeon Plucker's Pendant", 5],
	["mTalLuck", "Luckstone", 5]
];

var commonMagicBan25 = [
	["mStdLiche", "Lichebone Pennant", 15, {changeFunction: maxOneOfBanner}],
	["mStdDiscipline", "Standard of Discipline", 15, {changeFunction: maxOneOfBanner}],
	["mStdFlame", "Banner of Eternal Flame", 10, {changeFunction: maxOneOfBanner}],
	["mStdGleaming", "Gleaming Pennant", 5, {changeFunction: maxOneOfBanner}],
	["mStdScarecrow", "Scarecrow Banner", 15, {changeFunction: maxOneOfBanner}]
];

var commonMagicBan50 = [
	["mStdWailing", "Wailing Banner", 50, {changeFunction: maxOneOfBanner}],
	["mStdRangers", "Ranger's Standard", 50, {changeFunction: maxOneOfBanner}],
	["mStdRazor", "Razor Standard", 45, {changeFunction: maxOneOfBanner}],
	["mStdWar", "War Banner", 35, {changeFunction: maxOneOfBanner}]
].concat(commonMagicBan25);

var commonMagicBan = [
	["mStdRampagers", "Rampager's Standard", 55, {changeFunction: maxOneOfBanner}]
].concat(commonMagicBan50);

