<!--
var self = null;
function startGame(clr)
{
	self = new PegSolitaire();
    self.initScr(3, clr);
}


function PegSolitaire()
{
	this.jumpPeg = null;
	this.undoPeg = null;
	this.pos = [[0,0], [0,2], [0,3], [0,4], [1,2], [1,3], [1,4], [2,0], [2,1], [2,2], [2,3], [2,4], [2,5], [2,6], [3,0], [3,1], [3,2], [3,3], [3,4], [3,5], [3,6], [4,0], [4,1], [4,2], [4,3], [4,4], [4,5], [4,6], [5,2], [5,3], [5,4], [6,2], [6,3], [6,4]]

	this.pegArr = new Array(34);

	this.VALID = 1; this.FULL = 2;this.EMPTY = 4;
	this.prevId = 0;this.inMove = false;
	this.idArr = new Array();
	this.undoArr = new Array();
	this.pegFullClass = "peg_f_5";

	this.getRandom = function (min,max)
	{
		return min + Math.floor(Math.random()*(max-min+1))
	}

	this.getBacktrackIds = function (n, arr)
	{
		while (arr.length > 0) {arr.pop();}

		var id_1 = this.checkSide(n, 0, -1);var id_2 = 0;
		if ((id_1 & this.VALID) && (id_1 & this.EMPTY)) 
		{
			id_1 = Math.floor(id_1/1000);
			id_2 = this.checkSide(id_1, 0, -1);
			if ((id_2 & this.VALID) && (id_2 & this.EMPTY)) {arr.push([id_1,Math.floor(id_2/1000)]);}
		}

		id_1 = this.checkSide(n, 0, 1);
		if ((id_1 & this.VALID) && (id_1 & this.EMPTY)) 
		{
			id_1 = Math.floor(id_1/1000);
			id_2 = this.checkSide(id_1, 0, 1);
			if ((id_2 & this.VALID) && (id_2 & this.EMPTY)) {arr.push([id_1,Math.floor(id_2/1000)]);}
		}

		id_1 = this.checkSide(n, -1, 0);
		if ((id_1 & this.VALID) && (id_1 & this.EMPTY)) 
		{
			id_1 = Math.floor(id_1/1000);
			id_2 = this.checkSide(id_1, -1, 0);
			if ((id_2 & this.VALID) && (id_2 & this.EMPTY)) {arr.push([id_1,Math.floor(id_2/1000)]);}
		}

		id_1 = this.checkSide(n, 1, 0);
		if ((id_1 & this.VALID) && (id_1 & this.EMPTY)) 
		{
			id_1 = Math.floor(id_1/1000);
			id_2 = this.checkSide(id_1, 1, 0);
			if ((id_2 & this.VALID) && (id_2 & this.EMPTY)) {arr.push([id_1,Math.floor(id_2/1000)]);}
		}
	}

	this.makeRandomPegs = function (rndPeg)
	{
		for (var i = 1; i < 34; i++) {this.pegArr[i] = 0;}; 
		rndPeg.push(17); this.pegArr[17] = 1;   
		var numRnd = this.getRandom(7,13);
		var tries = 0;
		for (var k = 0; k < numRnd;)
		{
			tries++;
			var x = this.getRandom(0,rndPeg.length-1);
			var id = rndPeg[x];
			this.getBacktrackIds(id, this.idArr);
			if (this.idArr.length > 0)
			{
				k++;
				var y  = this.getRandom(0,this.idArr.length-1);
				rndPeg[x] = this.idArr[y][0];
				rndPeg.push(this.idArr[y][1]);
				this.pegArr[id]=0;this.pegArr[this.idArr[y][0]]=1;this.pegArr[this.idArr[y][1]]=1;
			}
			if (tries > 100) {break;}
		}
		while (this.idArr.length > 0) {this.idArr.pop();}
	}

	this.getRndClass = function(idx, rndPegArr)
	{
	    var str = "peg_h";
	    for (var i = 0; i < rndPegArr.length; i++) {if (rndPegArr[i] == idx) {str = this.pegFullClass;break;}}
	    return str;
	}

	this.getRandomBoardStr = function()
	{
		var rndPegArr = new Array();
		this.makeRandomPegs(rndPegArr);
		
		var idx = 1;
		var str = '<div id="seg_t">';
		for (var i = 0;i < 6; i++) {str += '<div class="' + this.getRndClass(idx, rndPegArr) + '" id="p_' + idx + '" onClick="self.touchSpot(' + idx + ');"></div>'; idx++;}
		str += '</div><div id="seg_m">';
		for (var i = 0;i < 10; i++) {str += '<div class="' + this.getRndClass(idx, rndPegArr) + '" id="p_' + idx + '" onClick="self.touchSpot(' + idx + ');"></div>'; idx++;}
		str += '<div class="' + this.getRndClass(idx, rndPegArr) + '" id="p_' + idx + '" onClick="self.touchSpot(' + idx + ');"></div>';idx++;
		for (var i = 0;i < 10; i++) {str += '<div class="' + this.getRndClass(idx, rndPegArr) + '" id="p_' + idx + '" onClick="self.touchSpot(' + idx + ');"></div>'; idx++;}
		str += '</div><div id="seg_b">';
		for (var i = 0;i < 6; i++) {str += '<div class="' + this.getRndClass(idx, rndPegArr) + '" id="p_' + idx + '" onClick="self.touchSpot(' + idx + ');"></div>'; idx++;}
		str += '</div>';
		
		return str;
	}
	
	
	this.getClassicBoardStr = function()
	{
		var idx = 1;
		var str = '<div id="seg_t">';
		for (var i = 0;i < 6; i++) {str += '<div class="' + this.pegFullClass + '" id="p_' + idx + '" onClick="self.touchSpot(' + idx + ');"></div>'; idx++;}
		str += '</div><div id="seg_m">';
		for (var i = 0;i < 10; i++) {str += '<div class="' + this.pegFullClass + '" id="p_' + idx + '" onClick="self.touchSpot(' + idx + ');"></div>'; idx++;}
		str += '<div class="peg_h" id="p_' + idx + '" onClick="self.touchSpot(' + idx + ');"></div>';idx++;
		for (var i = 0;i < 10; i++) {str += '<div class="' + this.pegFullClass + '" id="p_' + idx + '" onClick="self.touchSpot(' + idx + ');"></div>'; idx++;}
		str += '</div><div id="seg_b">';
		for (var i = 0;i < 6; i++) {str += '<div class="' + this.pegFullClass + '" id="p_' + idx + '" onClick="self.touchSpot(' + idx + ');"></div>'; idx++;}
		str += '</div>';

		for (var i = 1; i < 34; i++) {this.pegArr[i] = 1;}; this.pegArr[17] = 0;
		return str;
	}
	
	this.initScr = function(prefType, prefClr)
	{
	    if (prefClr == 0) {prefClr = this.getRandom(1,6);}
		this.pegFullClass = "peg_f_" + prefClr;
	    
	    var str = '';
	    if (prefType == 3) {str = this.getRandomBoardStr();}
	    else {str = this.getClassicBoardStr();}
		
		var o = document.getElementById("pegsolitairebrd"); if (o != null) {o.className = "pegsolitairebrd_c";o.innerHTML = str;}
		
		this.jumpPeg = document.createElement("div");
		this.jumpPeg.className = "peg_j";
		this.jumpPeg.style.left = "0px";
		this.jumpPeg.style.top = "0px";
		this.jumpPeg.style.visibility = "hidden";
		o.appendChild(this.jumpPeg);

		this.undoPeg = document.createElement("div");
		this.undoPeg.id = "undo_id";
		this.undoPeg.className = "undo_f";
		this.undoPeg.onclick = function(){self.undoMove();}
		o.appendChild(this.undoPeg);
	}


	this.undoMove = function()
	{
	    if (this.inMove) {return;}
		if (this.undoArr.length > 0)
		{
		     var x = this.undoArr.pop();
		     this.changeClass(x[0], this.pegFullClass);this.pegArr[x[0]] = 1;
		     this.changeClass(x[1], this.pegFullClass);this.pegArr[x[1]] = 1;
		     this.changeClass(x[2], "peg_h");this.pegArr[x[2]] = 0;		     
		}		
		this.enableUndo();
	}
	
	this.enableUndo = function()
	{
	    if (this.undoArr.length > 0) {this.undoPeg.className = "undo_t";this.inMove = false;}
	    else {this.undoPeg.className = "undo_f";}
	}
	
	this.submitfrm = function()
	{
		var f = document.getElementById("pegsolitairebrd");
		if (f != null) 
		{
			var cnt = 0;
			for (var k = 1; k < 34; k++)
			{
				if (this.pegArr[k] == 1) {cnt++;}
			}

			var str = "Pretty good.<br/>";
			if (cnt == 1) {str = "Congratulations!!<br/>";}
			str += "Pegs left: " + cnt;
			f.innerHTML = "";
			var o = f.appendChild(document.createElement('div'));
			o.innerHTML='<input type="hidden" name="helppage" value="randompeghelp.html" />';
			var o = f.appendChild(document.createElement('div'));
			o.innerHTML='<input type="hidden" name="gamepage" value="randompeg.html" />';
			o = f.appendChild(document.createElement('div'));
			o.innerHTML='<input type="hidden" name="msg" value="' + str + '" />';
		}

		document.randompeg_frm.submit();
	}


	this.changeClass = function(n, c)
	{
		var o = document.getElementById("p_" + n); if (o != null) {o.className = c;}
	}

	this.checkSide = function(n, roff, coff)
	{
		var row = this.pos[n][0] + roff;
		var col = this.pos[n][1] + coff;
		if (row < 0 || row > 6 || col < 0 || col > 6) {return 0;}
		var id = 0;
		for (var i = 1; i < 34; i++) { if (this.pos[i][0] == row && this.pos[i][1] == col) {id = i;break;}}
		if (id == 0) {return 0;}
		var flags = this.VALID;
		if (this.pegArr[id] == 1) {flags |= this.FULL;} else {flags |= this.EMPTY;}
		return id*1000 + flags;
	}

	this.getJumpableIds = function(n, arr)
	{
		while (arr.length > 0) {arr.pop();}

		var id_1 = this.checkSide(n, 0, -1);var id_2 = 0;
		if ((id_1 & this.VALID) && (id_1 & this.FULL)) 
		{
			id_1 = Math.floor(id_1/1000);
			id_2 = this.checkSide(id_1, 0, -1);
			if ((id_2 & this.VALID) && (id_2 & this.EMPTY)) {arr.push([id_1,Math.floor(id_2/1000)]);}
		}

		id_1 = this.checkSide(n, 0, 1);
		if ((id_1 & this.VALID) && (id_1 & this.FULL)) 
		{
			id_1 = Math.floor(id_1/1000);
			id_2 = this.checkSide(id_1, 0, 1);
			if ((id_2 & this.VALID) && (id_2 & this.EMPTY)) {arr.push([id_1,Math.floor(id_2/1000)]);}
		}

		id_1 = this.checkSide(n, -1, 0);
		if ((id_1 & this.VALID) && (id_1 & this.FULL)) 
		{
			id_1 = Math.floor(id_1/1000);
			id_2 = this.checkSide(id_1, -1, 0);
			if ((id_2 & this.VALID) && (id_2 & this.EMPTY)) {arr.push([id_1,Math.floor(id_2/1000)]);}
		}

		id_1 = this.checkSide(n, 1, 0);
		if ((id_1 & this.VALID) && (id_1 & this.FULL)) 
		{
			id_1 = Math.floor(id_1/1000);
			id_2 = this.checkSide(id_1, 1, 0);
			if ((id_2 & this.VALID) && (id_2 & this.EMPTY)) {arr.push([id_1,Math.floor(id_2/1000)]);}
		}
	}

	this.touchSpot = function(n) 
	{
		if (this.inMove) {return;}
		for (var i = 0; i < this.idArr.length; i++) {this.changeClass(this.idArr[i][1], "peg_h");}	
		if (this.prevId > 0)
		{
			if (this.pegArr[this.prevId] == 1) {this.hideJumpPeg(this.prevId);}
			if (this.pegArr[this.prevId] == 1 && this.pegArr[n] == 0)
			{        
				for (var i = 0; i < this.idArr.length; i++) 
				{
					if (this.idArr[i][1] == n) 
					{
						this.showJumpPeg(this.prevId);
						this.startMove(this.prevId, this.idArr[i][0], this.idArr[i][1]);
						this.undoArr.push([this.prevId, this.idArr[i][0], this.idArr[i][1]]);
					}
				}
			}
		}
		while (this.idArr.length > 0) {this.idArr.pop();}
		this.prevId = 0;

		if (this.pegArr[n] == 0) { return; }   

		this.showJumpPeg(n);

		this.getJumpableIds(n, this.idArr);
		if (this.idArr.length == 0) {setTimeout("self.hideJumpPeg(" + n + ")", 100);}
		else if (this.idArr.length == 1)
		{	    
			this.startMove(n, this.idArr[0][0], this.idArr[0][1]);
			this.undoArr.push([n, this.idArr[0][0], this.idArr[0][1]]);
			this.idArr.pop();
		}
		else
		{
			for (var i = 0; i < this.idArr.length; i++) {this.changeClass(this.idArr[i][1], "peg_t");}
			this.prevId = n;
		}
	}

	this.startMove = function(frm, mid, to)
	{
		this.inMove = true;
		this.changeClass(frm, "peg_h"); this.pegArr[frm] = 0;
		setTimeout("self.moveSlow(" + frm + "," + mid + "," + to + ")", 10);//setTimeout(this.moveSlow(frm, mid, to);
	}

	this.isGameOver = function()
	{
		var tstArr = new Array();var done=true;
		for (var k = 1; k < 34 && done; k++)
		{
			if (this.pegArr[k] == 1) {this.getJumpableIds(k, tstArr); if (tstArr.length > 0) {done=false;}}
		}
		return done;
	}

	this.getPegCount = function ()
	{
		var count = 0;
		for (var k = 1; k < 34 && count < 2; k++)
		{
			if (this.pegArr[k] == 1) {count++;}
		}
		return count;
	}

	this.endMove = function(frm, mid, to)
	{
		this.changeClass(mid, "peg_h"); this.pegArr[mid] = 0;
		this.changeClass(to, this.pegFullClass); this.pegArr[to] = 1;
		this.hideJumpPeg(to);
		this.jumpPeg.className = "peg_j";
		if (this.isGameOver()) 
		{
			var infoStr = "No moves possible:";
			if (this.getPegCount() == 1) {infoStr = "Congratulations!!";}
			var str = ('<div style="float:right;"><div class="btntxt">' + infoStr + '&nbsp;&nbsp;</div><div id="lbtn"></div><div id="mbtn" onClick="self.submitfrm();">OK</div><div id="rbtn"></div></div>');
			var o = document.getElementById("btnbrd"); if (o != null) {o.innerHTML = str;}
		}
		else {this.inMove = false;this.enableUndo();}
	}

	this.moveSlow = function(n0, n1, n2)
	{
		var xpos = self.getLeft(n2);
		var ypos = self.getTop(n2);
		var xsign = 1; var ysign = 1; //plus or minus

		var x = parseInt(self.jumpPeg.style.left);
		var y = parseInt(self.jumpPeg.style.top);
		var off_x = xpos - x; if (off_x < 0) {xsign = -1;}; if (Math.abs(off_x) > 5) {off_x = 5 * xsign;}
		var off_y = ypos - y; if (off_y < 0) {ysign = -1;}; if (Math.abs(off_y) > 5) {off_y = 5 * ysign;}
		x += off_x; y += off_y;
		self.jumpPeg.style.left = x + 'px';self.jumpPeg.style.top = y + 'px';
		if ((x != xpos) || (y != ypos)) {setTimeout("self.moveSlow(" + n0 + "," + n1 + "," + n2 + ")", 10);}
		else {self.endMove(n0,n1,n2);}
	}

	this.showJumpPeg = function(n)
	{
		this.changeClass(n,"peg_h");
		this.jumpPeg.style.left = this.getLeft(n) + 0 + "px";
		this.jumpPeg.style.top = this.getTop(n) - 6 + "px";
		this.jumpPeg.innerHTML = '<div class="' + this.pegFullClass + '"></div>';;
		this.jumpPeg.style.visibility = "visible";
	}

	this.hideJumpPeg = function(n)
	{
		this.changeClass(n,this.pegFullClass);
		self.jumpPeg.style.visibility = "hidden";
	}

	this.getLeft = function(n)
	{
		return 14 + 43 * this.pos[n][1];
	}

	this.getTop = function(n)
	{
		return 14 + 43 * this.pos[n][0];
	}
}

-->


