// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// power/control.js
//
// copyright (c) 2006-2010 drow <drow@bin.sh>
// all rights reserved.

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// configuration

var form = 'power_form';

var fmt = {
  'table':      '<table class="center">#{header}#{rows}</table>',
  'header':     '<tr><th rowspan="2" class="right">Power Attack</th>'
                  + '<th colspan="11" class="center">Target AC</th></tr>'
                  + '<tr>#{ac}</tr>',
  'th_ac':      '<th class="center">#{title}</th>',
  'row':        '<tr><td class="key ac">-#{power}</td>#{cells}</tr>',
  'cell':       '<td class="right">#{dmg}</td>',
  'cell_opt':   '<td class="right opt">#{dmg}</td>'
};
Object.keys(fmt).each(function (key) {
  fmt[key] = new Template(fmt[key]);
});

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// initialize form

function init_form () {
  client_form(form);

  var form_elem = $(form).elements;
  var prefs = get_cookie('power') || {};

  if (value = prefs.bab) setv(form_elem['bab'],value);
  if (value = prefs.att) setv(form_elem['att'],value);
  if (value = prefs.act) setv(form_elem['act'],value);

  if (value = prefs.dmg_dice) {
    form_elem['dmg_dice'].value = value;
    form_elem['dmg_avg'].value = fmt_dmg(calc_avg(value));
  } else if (value = prefs.dmg_avg) {
    form_elem['dmg_dice'] = '';
    form_elem['dmg_avg'].value = value;
  }
  if (value = prefs.add_dice) {
    form_elem['add_dice'].value = value;
    form_elem['add_avg'].value = fmt_dmg(calc_avg(value));
  } else if (value = prefs.add_avg) {
    form_elem['add_dice'] = '';
    form_elem['add_avg'].value = value;
  }
  if (value = prefs.threat) setv(form_elem['threat'],value);
  if (value = prefs.crit) setv(form_elem['crit'],value);
  if (v = prefs.thw) form_elem['thw'].checked = (v == 1);
  if (value = prefs.ac) form_elem['ac'].value = value;
  if (v = prefs.nocr) form_elem['nocr'].checked = (v == 1);

  bab_reaction();
  repower();
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// set field

function set_field (field) {
  save_prefs('power',field); repower();
}
function set_bab (field) {
  bab_reaction(); set_field(field);
}
function set_damage (field) {
  var form_elem  = $(form).elements;
  var w = /([a-z]+)_([a-z]+)/;

  if (match = w.exec(field.name)) {
    var type = match[1];
    var key = match[2];
    var dice = form_elem[type + '_dice'];
    var avg = form_elem[type + '_avg'];

    if (key == 'dice') {
      avg.value = fmt_dmg(calc_avg(dice.value));

      power_cookie(type + '_dice',dice.value);
      power_cookie(type + '_avg');
    } else {
      dice.value = '';

      var value = parseFloat(avg.value);
      if (isNaN(value)) avg.value = '0';

      power_cookie(type + '_dice');
      power_cookie(type + '_avg',avg.value);
    }
  }
  repower();
}
function power_cookie (key,value) {
  set_chip('power',key,value);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// bab reaction

function bab_reaction () {
  var form_elem = $(form).elements;
  var bab = parseInt(selv(form_elem['bab']));
  var N   = n_attacks(bab);

  if (N == 1) {
    form_elem['act'].disabled = true;
  } else {
    form_elem['act'].disabled = false;
  }
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// calculate optimum power attack

function repower () {
  var text = repower_calc();
  $('attack_table').update(text);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// calculate number of attacks

function n_attacks (bab) {
  var N = Math.floor((bab - 1) / 5) + 1;
    if (N < 1) N = 1;
  return N;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// format damage

function fmt_dmg (damage) {
  damage = Math.floor(damage * 100) / 100.0;

  if (Math.floor(damage) == damage) {
    damage = '' + damage + '.00';
  } else if (Math.floor(damage * 10) == (damage * 10)) {
    damage = '' + damage + '0';
  }
  return damage;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// format table

function fmt_table (pl,acl,td) {
  var obj = {
    'header':   fmt_header(acl),
    'rows':     fmt_rows(pl,acl,td)
  };
  return eval_fmt('table',obj);
}
function fmt_header (acl) {
  return eval_fmt('header',{ 'ac': acl.map(fmt_th).join('') });
}
function fmt_th (ac) {
  return eval_fmt('th_ac',{ 'title': ac });
}
function fmt_rows (pl,acl,td) {
  return pl.map(function (p) { return fmt_row(p,acl,td) }).join('');
}
function fmt_row (p,acl,td) {
  var cells = acl.map(function (ac) { return td[p][ac]; });
  return eval_fmt('row',{ 'power': p, 'cells': cells.join('') });
}
function eval_fmt (fmt_id,obj) {
  return fmt[fmt_id].evaluate(obj);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// showtime

document.observe('dom:loaded',init_form);

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

