var caps = {
  cra: {c_agi: [50,100,150,200,9999], c_cha: [20,40,60,80,9999], c_int: [50,150,250,350,9999], c_str: [50,150,250,350,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  ecaflip: {c_agi: [50,100,150,200,9999], c_cha: [20,40,60,80,9999], c_int: [20,40,60,80,9999], c_str: [100,200,300,400,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  eniripsa: {c_agi: [20,40,60,80,9999], c_cha: [20,40,60,80,9999], c_int: [100,200,300,400,9999], c_str: [-1,50,150,250,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  enutrof: {c_agi: [20,40,60,80,9999], c_cha: [100,150,230,330,9999], c_int: [20,60,100,150,9999], c_str: [50,150,250,350,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  feca: {c_agi: [20,40,60,80,9999], c_cha: [20,40,60,80,9999], c_int: [100,200,300,400,9999], c_str: [-1,50,150,250,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  iop: {c_agi: [20,40,60,80,9999], c_cha: [20,40,60,80,9999], c_int: [20,40,60,80,9999], c_str: [100,200,300,400,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  masqueraider: {c_agi: [100,200,300,400,9999], c_cha: [100,200,300,400,9999], c_int: [100,200,300,400,9999], c_str: [100,200,300,400,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  osamodas: {c_agi: [20,40,60,80,9999], c_cha: [100,200,300,400,9999], c_int: [100,200,300,400,9999], c_str: [-1,50,150,250,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  pandawa: {c_agi: [50,200,9999], c_cha: [50,200,9999], c_int: [50,200,9999], c_str: [50,200,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  rogue: {c_agi: [50,200,9999], c_cha: [50,200,9999], c_int: [50,200,9999], c_str: [50,200,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  sacrier: {c_agi: [-1,-1,100,150,9999], c_cha: [-1,-1,100,150,9999], c_int: [-1,-1,100,150,9999], c_str: [-1,-1,100,150,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  sadida: {c_agi: [20,40,60,80,9999], c_cha: [100,200,300,400,9999], c_int: [100,200,300,400,9999], c_str: [50,250,300,400,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  sram: {c_agi: [100,200,300,400,9999], c_cha: [20,40,60,80,9999], c_int: [-1,50,150,250,9999], c_str: [100,200,300,400,9999], c_vit: [9999], c_wis: [-1,-1,9999]},
  xelor: {c_agi: [20,40,60,80,9999], c_cha: [20,40,60,80,9999], c_int: [100,200,300,400,9999], c_str: [-1,50,150,250,9999], c_vit: [9999], c_wis: [-1,-1,9999]}
};

var names = ['agi', 'cha', 'int', 'str', 'vit', 'wis'];
var cap = {};
var is_sacrier = false;
var stages = [];
var numstage = 0;
var curstage = 0;

var stages_factory = {
  make: function() {
    return {
      stat: {c_agi: 0, c_cha: 0, c_int: 0, c_str: 0, c_vit: 0, c_wis: 0},
      level: 1,
      points: 0,

      set_table: function() {
        for (var i = 0; i < names.length; i++) {
          var n = names[i];
          var v = 0;
          eval('v=this.stat.c_'+n+';');
          $('#'+names[i]+'_stat').html(''+v);
        }
      },

      get_stat: function(stat) {
        eval('var res = this.stat.c_'+stat+';');
        return res;
      },

      set_stat: function(stat, val) {
        eval('this.stat.c_'+stat+'='+val+';');
      }
    }
  },

  copy: function(ostage) {
    var stage = this.make();
    stage.stat.c_agi = ostage.stat.c_agi;
    stage.stat.c_cha = ostage.stat.c_cha;
    stage.stat.c_int = ostage.stat.c_int;
    stage.stat.c_str = ostage.stat.c_str;
    stage.stat.c_vit = ostage.stat.c_vit;
    stage.stat.c_wis = ostage.stat.c_wis;
    stage.level = ostage.level;
    stage.points = ostage.points;
    return stage;
  }
};

var boost = {
  level: function() {
    var oldlvl = stages[curstage].level;
    var prelvl = stages[curstage-1].level;
    var curlvl = $('#boost_lvl_val').val();
    if (!curlvl.match(/^[1-9]$|^[1-9][0-9]$|^1[0-9]{2}$|^200$/)) {
      $('#boost_lvl_val').val(oldlvl);
      alert('Level has to be integer value within range of 1 to 200.');
      $('#boost_lvl_val').select();
      return;
    }
    curlvl = parseInt(curlvl);
    if (curlvl <= prelvl) {
      $('#boost_lvl_val').val(oldlvl);
      alert('Level has to be higher than previous stage level.');
      $('#boost_lvl_val').select();
      return;
    }
    numstage = curstage + 1;
    stages[numstage] = stages_factory.copy(stages[curstage]);
    curstage++;
    var points = (curlvl - stages[curstage].level) * 5 + stages[curstage].points;
    stages[curstage].level = curlvl;
    var cap_i = 0;
    var statname = $('#stat_to_boost').val();
    var stat = stages[curstage].get_stat(statname);
    eval('var capc=cap.c_'+statname+';');
    while (points > 0) {
      while (stat >= capc[cap_i]) cap_i++;
      if (points < cap_i+1) break;
      points -= (cap_i+1);
      if (is_sacrier && (statname == 'vit')) stat++;
      stat++;
    }
    stages[curstage].set_stat(statname, stat);
    stages[curstage].points = points;
    display_num(curstage, numstage, stages[curstage].level, stages[curstage].points);
    stages[curstage].set_table();
  },

  stat: function(do_stat) {
    var statname = $('#stat_to_boost').val();
    var oldval = stages[curstage].get_stat(statname);
    var preval = stages[curstage-1].get_stat(statname);
    var curval = do_stat != '' ? ''+do_stat : $('#boost_stat_val').val();
    if (!curval.match(/^[0-9]$|^[1-9][0-9]{1,3}$/)) {
      $('#boost_stat_val').val(oldval);
      alert('Statistic has to be integer value within range of 0 to 9999.');
      $('#boost_stat_val').select();
      return;
    }
    curval = parseInt(curval);
    if (curval <= preval) {
      $('#boost_stat_val').val(oldval);
      alert('Statistic value has to be higher than previous stage value.');
      $('#boost_stat_val').select();
      return;
    }
    numstage = curstage + 1;
    stages[numstage] = stages_factory.copy(stages[curstage]);
    curstage++;
    var stat = oldval;
    var points = stages[curstage].points;
    var cap_i = 0;
    var level = stages[curstage].level;
    eval('var capc=cap.c_'+statname+';');
    while (stat < curval) {
      while (stat >= capc[cap_i]) cap_i++;
      var done = false;
      while (points < cap_i+1) {
        if (level < 200) {
          level++;
          points += 5;
        } else {
          alert('Maximum level reached. Statistic value can\'t be higher than '+stat+'.');
          done = true;
          break;
        }
      }
      if (done) break;
      points -= (cap_i+1);
      if (is_sacrier && (statname == 'vit')) stat++;
      stat++;
    }
    stages[curstage].set_stat(statname, stat);
    stages[curstage].points = points;
    stages[curstage].level = level;
    display_num(curstage, numstage, stages[curstage].level, stages[curstage].points);
    stages[curstage].set_table();
  },

  scroll: function() {
    var statname = $('#stat_to_boost').val();
    var oldval = stages[curstage].get_stat(statname);
    var preval = stages[curstage-1].get_stat(statname);
    var curval = $('#boost_scroll_val').val();
    if (parseInt(preval) >= 101) {
      alert('This statistic can\'t be scrolled anymore.');
      return;
    }
    if (!curval.match(/^[1-9]$|^[1-9][0-9]$|^10[01]$/)) {
      $('#boost_scroll_val').val(oldval);
      alert('"Scroll to" has to be integer value within range of 1 to 101.');
      $('#boost_scroll_val').select();
      return;
    }
    curval = parseInt(curval);
    if (curval <= preval) {
      $('#boost_scroll_val').val(oldval);
      alert('"Scroll to" value has to be higher than current statistic value.');
      $('#boost_scroll_val').select();
      return;
    }
    numstage = curstage + 1;
    stages[numstage] = stages_factory.copy(stages[curstage]);
    curstage++;
    stages[curstage].set_stat(statname, curval);
    display_num(curstage, numstage, stages[curstage].level, stages[curstage].points);
    stages[curstage].set_table();
  },

  max: function() {
    this.stat(9999);
  },

  cap: function() {
    var statname = $('#stat_to_boost').val();
    eval('var capc=cap.c_'+statname+';');
    var stat = stages[curstage].get_stat(statname);
    var cap_i = 0;
    while (stat >= capc[cap_i]) cap_i++;
    this.stat(capc[cap_i]);
  }
}

function display_num(cur, max, lvl, pts) {
  $('#curstage').html(''+cur);
  $('#numstage').html(''+max);
  $('#curlevel').html(''+lvl);
  $('#pointsleft').html(''+pts);
}

function reset_all() {
  $('#char_class').removeAttr('disabled');
  $('#char_class')[0].selectedIndex = 0;
  $('#char_start').removeAttr('disabled');
  $('#char_reset').attr('disabled', 'disabled');
  is_sacrier = false;
  stages = [];
  numstage = 0;
  curstage = 0;
  $('#results').hide();
  $('#body').show();
}

$(document).ready(function() {
  reset_all();

  $('#char_start').click(function() {
    if ($('#char_class').val() == '0') {
      alert('Please select class first!');
      return;
    }
    $('#char_class').attr('disabled', 'disabled');
    $('#char_start').attr('disabled', 'disabled');
    $('#char_reset').removeAttr('disabled');

    stages = [];
    stages[numstage++] = stages_factory.make();
    stages[numstage] = stages_factory.make();
    stages[numstage].set_table();
    curstage = 1; 
    display_num(1, 1, 1, 0);
    eval('cap=caps.'+$('#char_class').val()+';');
    is_sacrier = $('#char_class').val() == 'sacrier';

    $('#results').show();
  });

  $('#boost_do').click(function() {
    if ($('#boost_lvl').attr('checked')) boost.level();
    if ($('#boost_stat').attr('checked')) boost.stat('');
    if ($('#boost_cap').attr('checked')) boost.cap();
    if ($('#boost_max').attr('checked')) boost.max();
    if ($('#boost_scroll').attr('checked')) { boost.scroll(); return; }
  });

  $('#stage_prev').click(function() {
    if (curstage == 1) return;
    curstage--;
    display_num(curstage, numstage, stages[curstage].level, stages[curstage].points);
    stages[curstage].set_table();
  });

  $('#stage_next').click(function() {
    if (curstage == numstage) return;
    curstage++;
    display_num(curstage, numstage, stages[curstage].level, stages[curstage].points);
    stages[curstage].set_table();
  });

  $('#char_reset').click(function() {
    reset_all();
  });

  $('#boost_lvl_val').focus(function() { $('#boost_lvl').attr('checked', 'checked'); });
  $('#boost_stat_val').focus(function() { $('#boost_stat').attr('checked', 'checked'); });
  $('#boost_scroll_val').focus(function() { $('#boost_scroll').attr('checked', 'checked'); });
});


