// Bob Hanson hansonr@stolaf.edu 6:57 PM 12/20/2008
// ex.js for manyexamples.htm 

var datadiv
var sdata
var C=[]
var Data = []
var Clues = []
var i0 = 0
var thistype=""
var s = document.location.search
var thispuzzle = s
var thisselect = ""
var nPuz = 10

// ?n=30  // 30 puzzles
// ?puzzle=i520.447.18  // specific examples
// ?search=2x3          // specific search
// ?TRANSPOSE		// switch rows for columns in Sudoku Assistant
// ?NOALSCOLUMNS	// no ALS columns in Sudoku Assistant
// ?ALSLARGE		// allow large ALS 

itransposemarks = (s.indexOf("TRANSPOSE") >= 0)
idonoalscolumns = (s.indexOf("NOALSCOLUMNS") >= 0)
idoalslarge = (s.indexOf("ALSLARGE") >= 0)
noHint = (s.indexOf("NOHINT") >= 0)

showHint = true

var nPuz = parseInt((s+"n=10").split("n=")[1].split("&")[0])
if (isNaN(nPuz) || nPuz < 1)nPuz = 1

if (s.indexOf("search=") >= 0) {
  thisselect = s.split("search=")[1].split("&")[0]
  thispuzzle = ""
}
if (s.indexOf("puzzle=") >= 0)
	thispuzzle = s.split("puzzle=")[1].split("&")[0]
else if (thispuzzle.length > 1)
	thispuzzle = "=" + thispuzzle.substring(1) + "&"


function fixLink(s, key, value){
	return s.split("?")[0] + "?" + key + "=" + value
}

function fixNLinks() {
 	var n=document.getElementById("nPuzzles").value
	showHint = document.getElementById("chk_hint").checked
	fixLinks("n",n  + (showHint ? "" : "&NOHINT"))
}

function fixLinks(key, value){
	var Links = document.getElementsByName("ex")
	for (var i = 0; i < Links.length;i++)
		Links[i].href=fixLink(Links[i].href,key,value)
}

function exInit() {
 document.getElementById("nPuzzles").value = nPuz
 if (noHint)document.getElementById("chk_hint").checked = false
 datadiv=document.getElementById("thedata")
 // MSIE bug: data cannot start with one or more comments -- initial comments will be ignored
 // MSIE takes forever for the next line because it has to convert back from DOM:
 sdata = datadiv.innerHTML
 // 
 if (thispuzzle && (pt=sdata.indexOf(thispuzzle)) >= 0) {
	sdata = "index.htm"+exGetTag(sdata.substring(pt),"a").split(".htm")[1].split("'")[0].split("\"")[0]
	setTimeout("document.location.replace(sdata)",100)
	return
 }
 var pt = -1
 while ((pt = sdata.indexOf("<!-- TYPE -->",pt+1))>=0)Data.push(pt)
 Data.push(sdata.length)
 if (thistype) document.getElementById("what").innerHTML = "<a href=index.htm>Sudoku Assistant</a> -- " + (Data.length-1) + " Method Examples (" + thistype + ")"
 var prevtype=""
 var nexamples = 0
 var pt2 = 0
 pt = 0
 for (var i = Data.length - 1; --i >= 0;)
	if (!thisselect || (pt=sdata.indexOf(thisselect,Data[i])) >= 0 && pt < Data[i+1]) {
		nexamples++
		C.push(i)
	}
 var divs = (nexamples == 0 ? "Click a method code to see puzzles of that sort." :  nexamples + " puzzle boards -- click on a link to load that specific board into the <a href=index.htm>Sudoku Assistant</a>.")+ "<br /><br />"
 divs+="<div id=div1></div>"
 document.getElementById("puz").innerHTML=divs
 randomize(C)
 fixNLinks()
 setTimeout("showPuzzles(0)",100)
}

function randomize(A) {
	if (A.length <= 10)return
	for (var p = A.length * 2; --p >= 0;){
		var i = Math.floor(Math.random()*A.length)
		var j = Math.floor(Math.random()*A.length)
		var k = A[i]
		A[i] = A[j]
		A[j] = k
	}
}

function showPuzzles(icontinue) {
	fixNLinks()
	nPuz = parseInt(document.getElementById("nPuzzles").value)
	if (isNaN(nPuz) || nPuz < 1)nPuzzles = 1
	showHint = document.getElementById("chk_hint").checked
	var S=["<table><tr>"]
	if (icontinue)i0+=nPuz
	if (i0 >= C.length)i0 = 0 
	var i1 = i0 + nPuz	
	var n = 0
	for (var i = i0; i < i1 && i < C.length; i++){
		if ((n++)%5==0) {
			S.push("</tr><tr>")
		}
		S.push("<td width=160>")
		var s=sdata.substring(Data[C[i]], Data[C[i]+1])
		var link=exGetTag(s,"a")
		if (itransposemarks)link = link.replace(/MARKS/,"TRANSPOSEMARKS")
		if (idonoalscolumns)link = link.replace(/MARKS/,"NOALSCOLUMNSMARKS")
		if (idoalslarge)link = link.replace(/MARKS/,"ALSLARGEMARKS")
		if (!showHint){
			link = link.replace(/HINT/,"")
			Clues=link.split("MARKS=")[1].split(",")
			for (var j = 0; j < 81; j++)Clues[j] = (Clues[j].length == 1 ? Clues[j] : "0")
		}
		S.push(link + " " + thistype + "<br>")
		exGetView(S,s)
		S.push("</td>")
	}
	S.push("</tr></table>")
 	document.getElementById("div1").innerHTML=S.join("")
}

function exGetField(data,atype) {
	var key =atype + " -->"
	var S = data.split(key)
	if (S.length < 3) return ""
	return S[1].split("<!")[0]
}

function exGetTag(data,atype) {
	if (data.indexOf("<" + atype)<0)atype = atype.toUpperCase()
	if (data.indexOf("<" + atype)<0)return ""
	var key =atype + " -->"
	var s = data.split("<"+atype)[1].split("</"+atype)[0]
	return "<" + atype + s + "</" + atype+">"
}

var width = 3
var height = 10
var margin = 1
var table = "<table border=1 cellpadding=0 cellspacing=0>"
var tr = "<tr height="+height+">"
var td = "<td width="+width+">"
var redlist = ""
var greenlist = ""
var bluelist = ""
var redlistk = ""
var chain1 = ""
var chain2 =""

function exGetView(S,data){
	var type = exGetField(data,"TYPE")
	redlist = exGetField(data,"REDLIST")
	greenlist = exGetField(data,"GREENLIST")
	bluelist = exGetField(data,"BLUELIST")
	redlistk = exGetField(data,"REDLISTK")
	chain1 = exGetField(data,"CHAIN1")
	chain2 = exGetField(data,"CHAIN2")
	var ans = exGetField(data,"ANS")
	if (ans.indexOf(" via ALS")>=0)bluelist+=ans.split(" via ALS")[1]
	if (ans.indexOf("ALS-X")>=0 && !bluelist && !chain1 && !chain2){
		bluelist=greenlist
		greenlist=""
	}
	greenlist+=chain1
	bluelist+=chain2
	S.push(table)
	for (var b = 0; b <= 9; b++) {
		if (b%3==0) {
			if (b != 0)S.push("</tr>")
			if (b == 9)break;
			S.push("<tr>")
		}
		S.push("<td>")
		exAddBlock(S,b)
		S.push("</td>")
	}
	S.push("</table>")
}


function exAddBlock(S,b) {
	S.push(table)
	var r0 = Math.floor(b/3)*3
	var c0 = (b%3)*3
	var r = r0 - 1
	var c = c0
	for (var p = 0; p<=9; p++) {
		if (p%3==0) {
			c = c0 - 1
			r++
			if (p != 0)S.push("</tr>")
			if (p == 9)break;
			S.push(tr)
		}
		c++
		exAddCell(S,r,c)
	}
	S.push("</table>")
	
}

function exAddCell(S,r,c) {
	var rc = (showHint ? "r"+(r+1)+"c"+(c+1) : "xxxxx")
	var color = (redlist.indexOf(rc) >= 0 ? "red":greenlist.indexOf(rc) >= 0 ? "green":bluelist.indexOf(rc) >= 0 ? "blue":"white")
	S.push("<td><table cellspacing=1 cellpadding=0 bgcolor="+color+"><tr><td><table cellpadding=0 cellspacing=0 bgcolor=white>")
	if (showHint) {
		for (var k = 0; k <=9; k++) {
			if (k%3==0) {
				if (k != 0)S.push("</tr>")
				if (k == 9)break;
				S.push("<tr>")
			}
			var rck=rc+"#"+(k+1)
			color = (redlistk.indexOf(rck) >= 0 ? "red":greenlist.indexOf(rck) >= 0 ? "green":bluelist.indexOf(rck) >= 0 ? "blue":"")
			S.push("<td  width="+width + (color?" bgcolor="+color:"") + ">")
			S.push("<span style='font-size:1'>&nbsp;</span>")
			S.push("</td>")
		}
	} else {
		var x = Clues[r*9+c]
		S.push("<tr><td align=center valign=center width=13><span style='font-weight:bold;font-size:8pt;color:" + (x=="0"?"white":"black")+"'>" + x + "</span></td></tr>")
	}
	S.push("</table></td></tr></table></td>")
}

