/*
 * Copyright (c) 2005-6, killersudokuonline.com
 * All Rights Reserverd.  
 * With the exception of the function getArgs, dhtmlLoadScript, 
 * defineNodeConstants.
 * Use of this code requires prior permission from webmaster@killersudokuonline.com
 * 
 */

var sumsrcs = new Array(2, 4, 8, 6, 16, 10, 32, 12, 18, 64, 20, 34, 14, 128, 24, 36, 
			66, 22, 256, 40, 68, 130, 26, 38, 512, 48, 72, 132, 28, 258, 42, 70, 
			80, 136, 260, 44, 514, 50, 74, 134, 30, 96, 144, 264, 516, 52, 76, 82, 
			138, 262, 46, 160, 272, 520, 56, 84, 140, 98, 146, 266, 518, 54, 78, 192, 
			288, 528, 88, 100, 148, 268, 162, 274, 522, 58, 86, 142, 320, 544, 104, 152, 
			164, 276, 524, 60, 194, 290, 530, 90, 102, 150, 270, 384, 576, 112, 168, 280, 
			196, 292, 532, 92, 322, 546, 106, 154, 166, 278, 526, 62, 640, 176, 200, 296, 
			536, 324, 548, 108, 156, 386, 578, 114, 170, 282, 198, 294, 534, 94, 768, 208, 
			304, 328, 552, 388, 580, 116, 172, 284, 642, 178, 202, 298, 538, 326, 550, 110, 
			158, 224, 336, 560, 392, 584, 120, 644, 180, 204, 300, 540, 770, 210, 306, 330, 
			554, 390, 582, 118, 174, 286, 352, 400, 592, 648, 184, 772, 212, 308, 332, 556, 
			226, 338, 562, 394, 586, 122, 646, 182, 206, 302, 542, 416, 608, 656, 776, 216, 
			312, 228, 340, 564, 396, 588, 124, 354, 402, 594, 650, 186, 774, 214, 310, 334, 
			558, 448, 672, 784, 232, 344, 568, 356, 404, 596, 652, 188, 418, 610, 658, 778, 
			218, 314, 230, 342, 566, 398, 590, 126, 704, 800, 240, 360, 408, 600, 420, 612, 
			660, 780, 220, 316, 450, 674, 786, 234, 346, 570, 358, 406, 598, 654, 190, 832, 
			368, 424, 616, 664, 452, 676, 788, 236, 348, 572, 706, 802, 242, 362, 410, 602, 
			422, 614, 662, 782, 222, 318, 896, 432, 624, 456, 680, 792, 708, 804, 244, 364, 
			412, 604, 834, 370, 426, 618, 666, 454, 678, 790, 238, 350, 574, 464, 688, 712, 
			808, 248, 836, 372, 428, 620, 668, 898, 434, 626, 458, 682, 794, 710, 806, 246, 
			366, 414, 606, 480, 720, 816, 840, 376, 900, 436, 628, 460, 684, 796, 466, 690, 
			714, 810, 250, 838, 374, 430, 622, 670, 736, 848, 904, 440, 632, 468, 692, 716, 
			812, 252, 482, 722, 818, 842, 378, 902, 438, 630, 462, 686, 798, 864, 912, 472, 
			696, 484, 724, 820, 844, 380, 738, 850, 906, 442, 634, 470, 694, 718, 814, 254, 
			928, 488, 728, 824, 740, 852, 908, 444, 636, 866, 914, 474, 698, 486, 726, 822, 
			846, 382, 960, 496, 744, 856, 868, 916, 476, 700, 930, 490, 730, 826, 742, 854, 
			910, 446, 638, 752, 872, 920, 932, 492, 732, 828, 962, 498, 746, 858, 870, 918, 
			478, 702, 880, 936, 964, 500, 748, 860, 754, 874, 922, 934, 494, 734, 830, 944, 
			968, 504, 756, 876, 924, 882, 938, 966, 502, 750, 862, 976, 760, 884, 940, 946, 
			970, 506, 758, 878, 926, 992, 888, 948, 972, 508, 978, 762, 886, 942, 952, 980, 
			764, 994, 890, 950, 974, 510, 984, 996, 892, 954, 982, 766, 1000, 956, 986, 998, 
			894, 1008, 988, 1002, 958, 1004, 1010, 990, 1012, 1006, 1016, 1014, 1018, 1020, 1022, 0);

var sumoffs = new Array(0, 0, 1, 2, 4, 6, 9, 13, 18, 24, 32, 41, 51, 63, 76, 91, 
			108, 126, 145, 166, 187, 209, 232, 255, 278, 301, 323, 344, 365, 384, 402, 419, 
			434, 447, 459, 469, 478, 486, 492, 497, 501, 504, 506, 508, 509, 510, 511);

var digits = "0123456789";
var sumtable = new Array(50);
var sumsalready = 0;
var mydata = sumtable;

function str2mask(str)
{
  var mask = 0;
  var i;
  for (i=1; i<=9; i++) {
    if (str.indexOf(digits.charAt(i)) != -1) {
      mask |= num2mask(i);
    }
  }
  return mask;
}

function num2mask(num)
{
  return (1 << num);
}

function mask2sum(mask)
{
  var total = 0;
  var i;

  for (i=9; i>0; i--) {
    if (mask & (1 << i)) total+=i;
  }
  return total;
}

function mask2str(mask)
{
  var p = "";
  var i;

  for (i=1; i<=9; i++) {
    if (mask & (1 << i)) p = p + String.fromCharCode(i+48);
  }
  return p;
}  

function getMaskCount(mask)
{
  var count = 0;
  var i;

  for (i=1; i<=9; i++)
    if ((1<<i)&mask) count++;
  return count;
}

function Sum(m, n) {
  this.mask = m;
  this.next = n;
}

function makeSum(m, n) {
  return new Sum(m,n);
}

function makeAllSums(upto) {
  //if (opener.sumsalready >= upto) return;
  //i=1+(1*opener.sumsalready);
  if (sumsalready >= upto) return;
  i=1+(1*sumsalready);
  var start;
  var end = sumoffs[i];
  for (; i<=upto; i++) {
    //opener.sumtable[i] = 0;
    sumtable[i] = 0;
    start = end;
    end = sumoffs[i+1];
    for (j=start; j<end; j++) {
      //opener.sumtable[i] = opener.makeSum(sumsrcs[j], opener.sumtable[i]);
      sumtable[i] = makeSum(sumsrcs[j], sumtable[i]);
    }
  }
  //opener.sumsalready = 1*upto;
  sumsalready = 1*upto;
}

function excludenone() {
  for (var i=0; i<9; i++) {
    document.gensums.exclude[i].checked = false;
  }
  showAllSums();
}  
function includeall() {
  for (var i=0; i<9; i++) {
    document.gensums.include[i].checked = false;
  }
  showAllSums();
}  

function filloutto(out, left)
{
  while (left > 0) {
    out.appendChild(document.createTextNode(" "));
    out.appendChild(document.createElement("BR"));
    left--;
  }
}

function showAllSums() {
  var left=7;
  var total=document.gensums.total.value;
  var len=document.gensums.eqlen.value;
  var out=getById("genoutput");
  removeAllChildren(out);
  if ((total < 1)||(total > 45)) {
    out.appendChild(document.createTextNode("计算范围1至45"));
    filloutto(out, left);
    return;
  }
  //if (total > opener.sumsalready) {
  if (total > sumsalready) {
    makeAllSums(total);
  }
  // get exclusions
  var excludemask = 0;
  for (var i=0; i<9; i++) {
    if (document.gensums.exclude[i].checked) {
      excludemask |= num2mask(i+1);
    }
  }
  // get inclusions
  var includemask = 0;
  for (var i=0; i<9; i++) {
    if (document.gensums.include[i].checked) {
      includemask |= num2mask(i+1);
    }
  }
  var desc = "";
  if (excludemask != 0) {
    desc = "不包含 "+mask2str(excludemask);
  }
  if (includemask) {
    if (excludemask == 0) {
      desc = "必包含 "+mask2str(includemask);
    } else {
      desc = desc+" 需包含 "+mask2str(includemask);
    }
  }
  
  var poss=false;
  //for (var s=opener.sumtable[total]; s != 0; s=s.next) {
  for (var s=sumtable[total]; s != 0; s=s.next) {
    if (getMaskCount(s.mask) == len) {
      if (((s.mask & excludemask) == 0)&&((s.mask & includemask)==includemask)) {
	poss=true;
	out.appendChild(document.createTextNode(mask2str(s.mask)));
	out.appendChild(document.createElement("BR"));
	left--;
      }
    }
  }
  if (poss == false) {
    out.appendChild(document.createTextNode("没有这种可能"));
    out.appendChild(document.createElement("BR"));
  }
  if (desc != "") {
    out.appendChild(document.createElement("BR"));
    out.appendChild(document.createTextNode(desc));
    left-=2;
  }
  filloutto(out, left)
}


