function auto_do() {
  if (g_auto_ids.length>0) {
    var id0=g_auto_ids.pop();
    // check temp
    for (var i=0;i<4;i++) {
      var id=g_temp_col[i];
      if (id==id0) {
        g_temp_col[i]=-1;
        auto_place(id); draw();
        break;
      }
    }
    // check main
    for (var c=1;c<9;c++) {
      var ids=g_main_cols[c];
      var id=last_card(ids);
      if (id==id0) {
        g_main_cols[c].pop();
        auto_place(id); draw();
        break;
      }
    }
    setTimeout(auto_do,400);
  }
}
function auto() {
  var save_temp=Copy_array(g_temp_col);
  var save_main=Copy_array(g_main_cols);
  g_auto_ids=[];
  for (var v=2;v<14;v++) {
    for (var i=0;i<4;i++) {
      var id=g_temp_col[i];
      if (id>-1) {
        if (value(id)==v) {
          g_auto_ids.push(id);
          g_temp_col[i]=-1;
        }
      }
    }
    for (var i=1;i<9;i++) {
      var ids=g_main_cols[i];
      // allow for equal values
      for (var j=0;j<4;j++) {
        var id=last_card(ids);
        if (value(id)==v) {
          g_auto_ids.push(id);
          ids.pop();
        }
      }
    }
  }
  g_temp_col=Copy_array(save_temp);
  g_main_cols=Copy_array(save_main);
  g_auto_ids.reverse(); // so we can use pop
  auto_do();
}
function auto_check() {
  var ok=true;
  for (var c=1;c<9;c++) {
    var ids=g_main_cols[c];
    if (ids.length>0) {
      var v0=value(ids[0]);
      for (var j=1;j<ids.length;j++) {
        var v1=value(ids[j]);
        if (v1>v0) {
          ok=false; break;
        } else {
          v0=v1;
        }
      }
      if (!ok) break;
    }
  }
  return ok;
}
function block_max() {
  var n=1;
  for (var i=0;i<4;i++) {
    if (g_temp_col[i]==-1) n++;
  }
  for (var i=1;i<9;i++) {
    if (g_main_cols[i].length==0) n*=2;
  }
  return n;
}
function card_clicked(card) {
  if (g_click_card==-1) { // first click
    if (check_first(card)) {
      g_click_card=card; // remember
      card.classList.add('highlight');
    }
  } else { // second click
    g_click_card.classList.remove('highlight');
    if (card==g_click_card) { // same card
      g_click_card=-1; // forget it
    } else { // process g_click_card & card
      if (check_second(card)) {
        move(g_click_card,card);
        draw();
      }
      g_click_card=-1; // forget first card
    }
  }
}
function check_first(card) {
  var ok; g_seq=[];
  if (klass(card)=='final') {
    ok=false;
  } else if (empty(card)) {
    ok=false;
  } else {
    if (klass(card)=='temp') {
      ok=true;
    } else { // must be main
      var c=card.style.gridColumnStart; // column #
      var r=card.style.gridRowStart; // row #
      if (last(card)) {
        g_seq=[parseInt(card.id)]; // used by move()
        ok=true; // is last in column
      } else { // check for sequence
        var arr=[]; var ids=g_main_cols[c];
        for (var i=r-1;i<ids.length;i++) {
          arr.push(ids[i]);
        }
        if (check_sequence(arr)) {
          if (arr.length>block_max()) {
            ok=false;
          } else {
            g_seq=arr; ok=true;
          }
        } else {
          ok=false;
        }
      }
    }
  }
  return ok;
}
function check_second(card) {
  var ok;
  if (empty(card)) {
    ok=true;
    if (klass(card)=='back_row' && g_seq.length>(block_max()/2)) {
      ok=false;
    }
    if (klass(card)=='temp' && g_seq.length>1) {
     ok=false;
    }
  } else {
    if (klass(card)=='temp') {
      ok=false;
    } else if (klass(card)=='final') {
      if (g_seq.length>1) {
        ok=false;
      } else {
        var i=card.id-200;
        var v0=g_final_col[i];
        var v1=first_card_value();
        ok=false;
        if ((v0+1)==v1) ok=true;
      }
    } else { // must be main
      if (last(card)) { // check for sequence
        // convert strings to numbers
        var n1=parseInt(card.id);
        var n2=first_card_value();
        var arr=[n1,n2];
        ok=check_sequence(arr);
      } else {  // is not last in column
        ok=false;
      }
    }
  }
  return ok;
}
function deal() {
  var cards=[];
  for (var i=1;i<52;i++) {
    if (i!=13 && i!=26 && i!=39) cards.push(i);
  }
  for (var c=1;c<9;c++) g_main_cols[c]=[];
  Shuffle(cards);
  var i=0;
  for (var c=1;c<9;c++) {
    for (var r=1;r<7;r++) {
      var id=cards[i]; i++;
      g_main_cols[c].push(id);
    }
  }
  g_temp_col=[-1,-1,-1,-1];
  g_final_col=[0,13,26,39];
}
function draw() {
  // temp
  for (var i=0;i<4;i++) {
    var el=document.getElementById(100+i);
    var j=g_temp_col[i];
    if (j==-1) {
      el.src='cards/empty.png';
    } else {
      el.src='cards/'+j+'.png';
    }
  }
  // main
  Hide_class('main')
  for (var c=1;c<9;c++) {
    var ids=g_main_cols[c];
    for (var i=0;i<ids.length;i++) {
      var id=ids[i]; var r=i+1;
      var el=document.getElementById(id);
      el.style.gridRowStart=r;
      el.style.gridColumnStart=c;
      el.style.zIndex=g_z; g_z++;
      Show(id);
    }
  }
  // final
  for (var i=0;i<4;i++) {
    var el=document.getElementById(200+i);
    var j=g_final_col[i];
    el.src='cards/'+j+'.png';
  }
}
function info() {
  var el=document.getElementById('help');
  var vis=el.style.visibility;
  var v='hidden';
  if (vis==v) v='visible';
  el.style.visibility=v;
}
function move(card1,card2) {
  var c1=card1.style.gridColumnStart;
  var c2=card2.style.gridColumnStart;
  if (klass(card1)=='temp') {
    // temp → main or final
    var id=card1.id; var i=id-100;
    var j=g_temp_col[i];
    if (klass(card2)=='final') {
      var id=card2.id; var i2=id-200;
      g_final_col[i2]=j;
    } else {
      g_main_cols[c2].push(j);
    }
    g_temp_col[i]=-1;
  } else if (klass(card2)=='temp') {
     // main → temp
    var id=g_main_cols[c1].pop();
    var id2=card2.id; var i=id2-100;
    g_temp_col[i]=id;
  } else if (klass(card2)=='final') {
     // main → final
    var id=g_main_cols[c1].pop();
    var id2=card2.id; var i=id2-200;
    g_final_col[i]=id;
  } else {
    // main → main
    g_seq.reverse();
    var l=g_seq.length;
    for (var i=0;i<l;i++) {
      g_main_cols[c1].pop();
      var id=g_seq.pop();
      g_main_cols[c2].push(id);
    }
  }
  save_state();
  if (auto_check()) {
    var el=document.getElementById('main_panel');
    el.style.backgroundColor='brown';
    auto();
  }
}
function redeal() {
  highlight_off();
  g_z=50;
  g_saves=[];
  var el=document.getElementById('main_panel');
  el.style.backgroundColor='green';
  deal(); draw();  save_state();
}
function save_state() {
  var arr=[];
  arr.push(Copy_array(g_temp_col));
  arr.push(Copy_array(g_main_cols));
  arr.push(Copy_array(g_final_col));
  g_saves.push(Copy_array(arr));
}
function setup_main() {
  var s1="<img src='cards/empty.png' class='back_row' onclick='card_clicked(this);' style='grid-row-start:1; grid-column-start:";
  var s2=";'>";
  for (var i=1;i<9;i++) {
    document.write(s1+i+s2);
  }
  var s1="<img src='cards/";
  var s2=".png' class='main' id='";
  var s3="' onclick='card_clicked(this);'>";
  for (var i=1;i<52;i++) {
    if (i!=13 && i!=26 && i!=39) {
      document.write(s1+i+s2+i+s3);
    }
  }
}
function setup_temp() {
  var s1="<img src='cards/empty.png' class='temp' id='10";
  var s2="' onclick='card_clicked(this);'>";
  for (var i=0;i<4;i++) {
    document.write(s1+i+s2);
  }
}
function setup_final() {
  var s1="<img src='cards/empty.png' class='final' id='20";
  var s2="' onclick='card_clicked(this);'>";
  for (var i=0;i<4;i++) {
    document.write(s1+i+s2);
  }
}
function undo() {
  if (g_saves.length>1) {
    highlight_off();
    g_saves.pop(); // discard current state
    var arr=g_saves.pop(); // get previous state
    g_temp_col=Copy_array(arr[0]);
    g_main_cols=Copy_array(arr[1]);
    g_final_col=Copy_array(arr[2]);
    draw();
    save_state();
  }
}
