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

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

  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 = [
	["mBlRiese", "Riesenklinge", 60, {changeFunction: maxOneOfMWep}],
	["mSwBlood", "Schwert des Blutbades", 60, {changeFunction: maxOneOfMWep}],
	["mBlObsidian", "Obsidianklinge", 50, {changeFunction: maxOneOfMWep}],
	["mBlOgre", "Ogerklinge", 40, {changeFunction: maxOneOfMWep}],
	["mSwStrife", "Schwert des Haders", 40, {changeFunction: maxOneOfMWep}],
	["mBlFencers", "Duellklingen", 35, {changeFunction: maxOneOfMWep}],
	["mSwAHeroes", "Heldentöter", 30, {changeFunction: maxOneOfMWep}],
	["mSpellTh", "Zauberraubklinge", 25, {changeFunction: maxOneOfMWep}],
	["mSwSwift", "Schwert des schnellen Todes", 25, {changeFunction: maxOneOfMWep}],
	["mSwBattle", "Schlachtenklinge", 20, {changeFunction: maxOneOfMWep}],
	["mSwBersk", "Berserkerschwert", 20, {changeFunction: maxOneOfMWep}],
	["mSwMight", "Schwert der Macht", 20, {changeFunction: maxOneOfMWep}],
	["mSwGSigil", "Goldenes Siegelschwert", 15, {changeFunction: maxOneOfMWep}],
	["mSwStrike", "Behände Klinge", 15, {changeFunction: maxOneOfMWep}],
	["mBlBiting", "Reissende Klinge", 10, {changeFunction: maxOneOfMWep}],
	["mSwRelic", "Reliquienschwert", 10, {changeFunction: maxOneOfMWep}],
	["mBlShriek", "Kreischende Klinge", 10, {changeFunction: maxOneOfMWep}],
	["mSwTorment", "Schwert der Pein", 5, {changeFunction: maxOneOfMWep}],
	["mWarrBane", "Kriegerfluch", 5, {changeFunction: maxOneOfMWep}]
];

var commonMagicArm = [
	["mArmDestiny", "Rüstung des Schicksals", 50, {changeFunction: maxOneOfMArm}],
	["mHlmTricksters", "Schrukenhelm", 50, {changeFunction: maxOneOfMArm}],
	["mArmSlvrSteel", "Silberstahlrüstung", 45, {changeFunction: maxOneOfMArm}],
	["mArmFortune", "Rüstung des Glücks", 35, {changeFunction: maxOneOfMArm}],
	["mHlmDiscord", "Helm der Zwietracht", 30, {changeFunction: maxOneOfMArm}],
	["mSclGlittering", "Glitzernde Schuppenrüstung", 25, {changeFunction: maxOneOfMArm}],
	["mShPtolos", "Schilde des Ptolos", 25, {changeFunction: maxOneOfMArm}],
	["mShSpell", "Zauberspruch-Schild", 20, {changeFunction: maxOneOfMArm}],
	["mArmGamblers", "Rüstung des Glücksritters", 20, {changeFunction: maxOneOfMArm}],
	["mHlmDragon", "Drachenhelm", 10, {changeFunction: maxOneOfMArm}],
	["mShEnchanted", "Verzauberter Schild", 5, {changeFunction: maxOneOfMArm}],
	["mShCharmed", "Glücksbringender Schild", 5, {changeFunction: maxOneOfMArm}]
];

var commonMagicEnc = [
	["mWizHat", "Zauberhut", 100],
	["mFozzrik", "Fozzriks faltbare Festung", 100],
	["mArCarpet", "Arabianischer Teppich", 50],
	["mCrCmd", "Krone der Herrschaft", 35],
	["mHealPot", "Heiltrank", 35],
	["mFthTorc", "Flügelfluchreif", 35],
	["mRubyRing", "Rubinring der Zerstörung", 25],
	["mMaskEee", "Die Schreckensmaske von Iek!", 25],
	["mStrPot", "Stärketrank", 20],
	["mToughPot", "Wiederstandstrank", 20],
	["mTrkShrd", "Des anderen Gauners Scherbe", 15],
	["mIroncurse", "Eisenfluch-Ikone", 5],
	["mFoolPot", "Trank der Tollkühnheit", 5],
	["mSpeedPot", "Trank der Geschwindigkeit", 5]
];

var commonMagicArc = [
	["mArcAshur", "Buch von Ashur", 70, {changeFunction: maxOneOfMArc}],
	["mArcFeedback", "Schriftrolle der Rückkopplung", 50, {changeFunction: maxOneOfMArc}],
	["mArcLeeching", "Schriftrolle des Energieraubs", 50, {changeFunction: maxOneOfMArc}],
	["mArcSivejirs", "Sivejir's Fluchrolle", 50, {changeFunction: maxOneOfMArc}],
	["mArcPower", "Energiespruchrolle", 35, {changeFunction: maxOneOfMArc}],
	["mArcWandJet", "Pechkohlen-Zauberstab", 35, {changeFunction: maxOneOfMArc}],
	["mArcForbidden", "Verbotener Stab", 35, {changeFunction: maxOneOfMArc}],
	["mArcTricksters", "Gauners Scherbe", 25, {changeFunction: maxOneOfMArc}],
	["mArcEarthing", "Erdener Stab", 25, {changeFunction: maxOneOfMArc}],
	["mArcDispel", "Magiebannende Spruchrolle", 25, {changeFunction: maxOneOfMArc}],
	["mArcPowerSt", "Energiestein", 25, {changeFunction: maxOneOfMArc}],
	["mArcSceptre", "Zepter der Stabilität", 15, {changeFunction: maxOneOfMArc}],
	["mArcChannel", "Kanalisierungsstab", 15, {changeFunction: maxOneOfMArc}],
	["mArcShielding", "Spruchrolle des Schutzes", 15, {changeFunction: maxOneOfMArc}]
];

var commonMagicTal = [
	["mTalWard4", "Talisman der Bewahrung", 45],
	["mTalMRes3", "Grosser Obsidian", 45],
	["mTalWard5", "Talisman der Ausdauer", 30],
	["mTalMRes2", "Obsidianamulett", 30],
	["mTalDawnStone", "Dämmerstein", 25],
	["mTalOpal", "Opalamulett", 15],
	["mTalMRes1", "Obsidananhänger", 15],
	["mTalWard6", "Talisman des Schutzes", 15],
	["mTalRegen", "Samen der Wiedergeburt", 10],
	["mTalDrgBane", "Drachenfluchstein", 5],
	["mTalPigeon", "Federrupfanhänger", 5],
	["mTalLuck", "Glücksstein", 5]
];

var commonMagicBan25 = [
	["mStdLiche", "Knochenstandarte", 15, {changeFunction: maxOneOfBanner}],
	["mStdDiscipline", "Standarte der Disziplin", 15, {changeFunction: maxOneOfBanner}],
	["mStdFlame", "Banner der ewigen Flamme", 10, {changeFunction: maxOneOfBanner}],
	["mStdGleaming", "Strahlende Flagge", 5, {changeFunction: maxOneOfBanner}],
	["mStdScarecrow", "Vogelscheuchenbanner", 15, {changeFunction: maxOneOfBanner}]
];

var commonMagicBan50 = [
	["mStdWailing", "Heulenes Banner", 50, {changeFunction: maxOneOfBanner}],
	["mStdRangers", "Waldläuferbanner", 50, {changeFunction: maxOneOfBanner}],
	["mStdRazor", "Klingenstandarte", 45, {changeFunction: maxOneOfBanner}],
	["mStdWar", "Kriegsbanner", 35, {changeFunction: maxOneOfBanner}]
].concat(commonMagicBan25);

var commonMagicBan = [
	["mStdRampagers", "Standarte der Mordlust", 55, {changeFunction: maxOneOfBanner}]
].concat(commonMagicBan50);

