var math_type = '+';
var range     = [1,2,3,4,5,6,7,8,9,10];
var srange    = [11,12,13,14,15,16,17,18,19,20];
var md_range  = [1,2,3,4,5,6,7];
// srange.unshift(range);
function random(range) {
  return Math.floor(range * Math.random());
} 
function rand_array(subtract_array) {
  var picked    = [];
  var output    = [];
  var tmp_array = subtract_array || range;
  var range_length = tmp_array.length;
  for(var i = 0; i < range_length; i++) picked[i] = false;
  for(var i = 0; i < range_length; i++) {
    var r = 0;
    while( picked[(r=random(range_length))] ) ; // ";" is mandatory here!
    output[i] = tmp_array[r];
    picked[r] = true;
  }
  return output;
}
function first_row(hor) {
  var r1 = '<tr><th>' + math_type + '</th>';
  for (var i=0 ; i < hor.length; i++) {
    r1 += '<th>' + hor[i] + '</th>';
  }
  return  r1 += '<th>' + math_type + '</th></tr>';
}
function do_add_sub_mult(hor, vert) {
  var thead = '<tr><th>' + math_type + '</th>';
  for (var i=0 ; i < hor.length; i++) {
    thead += '<th>' + hor[i] + '</th>';
  }
  thead += '<th>' + math_type + '</th></tr>';
  var result  = '';
  var r = '';
  for (var i=0 ; i < vert.length; i++) {
    r += '<tr><td class="vresult">' + vert[i] + '</td>';
    for (var j = 0; j < hor.length; j++) {
      switch (math_type) {
        case '+':
          result = hor[j] + vert[i];
          break;
        case '-':
          result = hor[j] - vert[i];
          break;
        case 'x':
          result = hor[j] * vert[i];
          break;
      }
      r += "<td><input class='math' result='" + result + "' /></td>";
    }
    r += '<td class="vresult">' + vert[i] + '</td></tr>';
  }
  return thead + r + thead;
}

function do_div() {
  var r = '';
  for (var tmp=0; tmp < md_range.length; tmp++) {
    var hor   = rand_array(md_range);
    var vert  = rand_array(md_range);
    r += '<tr>';
    for (var i=0 ; i < vert.length; i++) {
      r += '<td><strong>'
        + hor[i] * vert[i] 
        + '&#247;' + vert[i]
        + "</strong></td><td><input class='math' result='"
        + hor[i]
        + "' /></td>";
    }
    r += '</tr>';
  }
  return r;
}
function doit() {
  $('#jq_result').empty();
  var horizontal  = null;
  var vertical    = null;
  var is_division = false;
  switch (math_type) {
    case '+':
      horizontal  = rand_array();
      vertical    = rand_array();
      break;
    case '-':
      horizontal  = rand_array(srange);
      vertical    = rand_array();
      break;
    case 'x':
      horizontal  = rand_array(md_range);
      vertical    = rand_array(md_range);
      break;
    case '0':
      is_division = true;
      break;
  }

  var table_body = !is_division
    ? do_add_sub_mult(horizontal, vertical)
    : do_div();
  $('#jq_result').append(table_body).css({fontSize:'0.4em'});
  $('.vresult').css({padding:'2px 4px'});
  $('input.math').attr('maxlength', 2).css({width:25});
}
function checkit() {
  var errors = 0;
  $(':text[result]').each(function() {
    if ( $.trim( $(this).val() ) != $(this).attr('result') ) {
      ++errors;
      if ( !$(this).hasClass('err') ) $(this).addClass('err');
      // return confirm('continue?');
    }
    else {
      if ( $(this).hasClass('err') ) $(this).removeClass('err');
    }
  });
  if (!errors && !$('#perfect').text() )
    $('#results').after("<h1 id='perfect'>PERFECT</h1>");
}
// ----------------------------------------------------------------------------
// document ready!
// ----------------------------------------------------------------------------
$(function() {
  doit();
  $('#check_all').click(function(){
    checkit();
    return false;
  });
  $('#new').click(function(){
    $('#perfect').empty();
    doit();
    return false;
  });
  $('.math_type').click(function(){
    $('#perfect').empty();
    math_type = $(this).attr('type');
    doit();
    return false;
  });
});
