maxWord = 21;
wordCount = 0;
wordNS = new Array(maxWord);
maxX = 0;
maxY = 0;
var grid = new Array(25);
var gUsed = new Array(25);
wordUsed = new Array();
letterlist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
line = "hr";
back = "";
tgraph = "";
pid = "";

function makePuzzle() {

        wordCount = 0;

        maxX = document.getWords.width.value;
        maxY = document.getWords.height.value;
        if ((maxX > 0) && (maxX < 26) && (maxY > 0) && (maxY < 26))
        {
window.status = "Clearing grid...";
            for (var x=0;x<=maxX;x++) {
                grid[x] = new Array(maxY);
                gUsed[x] = new Array(maxY);
                for (var y=0;y<=maxY;y++) {
                    grid[x][y] = "";
                    gUsed[x][y] = false;
                }
            }

window.status = "Loading word list...";
	    for (var i=0; i<maxWord; i++) {
                var wd = eval("document.getWords.word" + i + ".value");
                if (wd.length>0) {
                    wordCount = wordCount+1;
                    wordNS[i] = wd.toUpperCase(wd);
                    wordUsed[i] = false;
                }
            }

            GeneratePuzzle();
window.status = "Puzzle generated. Click on 'View Completed Puzzle' or 'View Answer Key'.";
        }
        if ((maxX < 1) || (maxX > 25))
            alert("Width must be between 1 and 25");
        if ((maxY < 1) || (maxY > 25))
            alert("Height must be between 1 and 25");
}


function makePuzzPage(solve) {
    for (var c=0;c<document.getOpts.elements.length;c++)
        if (document.getOpts.elements[c].checked)
        {
            if (document.getOpts.elements[c].name == "line")
            {
                if (document.getOpts.elements[c].value == 0)
                    line = "";
                if (document.getOpts.elements[c].value == "hr")
                    line = "hr";
                if ((document.getOpts.elements[c].value != 0) && (document.getOpts.elements[c].value != "hr"))
                    line = eval("document." + document.getOpts.elements[c].value + ".src");
            }
            if (document.getOpts.elements[c].name == "title")
            {
                if (document.getOpts.elements[c].value == 0)
                if (document.getOpts.elements[c].value == 0)
                if (document.getOpts.elements[c].value == 0)
                    tgraph = "";
                if (document.getOpts.elements[c].value != 0)
                    tgraph = eval("document." + document.getOpts.elements[c].value + ".src");
            }
        }


window.status = "Generating page...";
        if ((maxX * maxY) > 0)
        {
            puzzWin = window.open("", "wordsearch",'toolbar=yes,location=yes,directories=no,status=yes,scrollbars=yes,menubar=yes,resizable=yes,width=600,height=440');
            puzzWin.document.writeln("<head><title>" + document.getWords.title.value + "</title></head>");
            puzzWin.document.write("<body");
            puzzWin.document.writeln(">");

            puzzWin.document.writeln("<font face=\"Arial\"><center><table cellspacing=0 cellpadding=3><tr bgcolor=\"#FFFFFF\"><td>");
            if (tgraph != "")
                puzzWin.document.write("<td><img align=\"middle\" src=\"" + tgraph + "\"></td><td>");
            puzzWin.document.write("<font size=\"+2\"><b>" + document.getWords.title.value + "</b></font>");
            if (tgraph != "")
                puzzWin.document.write("</td><td><img align=\"middle\" src=\"" + tgraph + "\">");
            puzzWin.document.writeln("</td></tr></table></center>");
            if (line == "hr")
                puzzWin.document.writeln("<hr>");
            if (line != "hr")
            {
                if (line != "")
                    puzzWin.document.writeln("<p><center><img src=\"" + line + "\"></center><p>");
                if (line == "")
                    puzzWin.document.writeln("<br><p>");
            }

            puzzWin.document.writeln("<center><table cellspacing=0 cellpadding=6>");
            for (var y=0;y<maxY;y++) {
                puzzWin.document.write("<tr bgcolor='#FFFFFF'>");
                for (var x=0;x<maxX;x++) {
                    puzzWin.document.write("<td><center>");
                    if ((solve) && (gUsed[x][y]))
                        puzzWin.document.write("<b>");
                    puzzWin.document.write(grid[x][y]);
                    if ((solve) && (gUsed[x][y]))
                        puzzWin.document.write("</b>");
                    puzzWin.document.write("</center></td>");
                }
                puzzWin.document.writeln("</tr>");
            }
            puzzWin.document.writeln("</table></center>");

            if (line == "hr")
                puzzWin.document.writeln("<hr>");
            if (line != "hr")
            {
                if (line != "")
                    puzzWin.document.writeln("<p><center><img src=\"" + line + "\"></center><p>");
                if (line == "")
                    puzzWin.document.writeln("<br><p>");
            }
            puzzWin.document.writeln("<center><table cellspacing=0 cellpadding=2><tr bgcolor=\"#FFFFFF\"><td colspan=5><center><b>WORD LIST</b></center></td></tr>");
            puzzWin.document.writeln("<tr bgcolor=\"#000000\"><td width=\"30%\"></td><td width=\"10%\"></td><td width=\"30%\"></td><td width=\"10%\"></td><td width=\"30%\"></td></tr>");
            var col = 0;
            for (var w=0;w<=wordCount;w++)
                if (wordUsed[w])
                {
                    if (col == 0)
                        puzzWin.document.write("<TR bgcolor=\"#FFFFFF\">");
                    puzzWin.document.write("<TD><center>" + wordNS[w] + "</center></TD>");
                    col++;
                    if (col <= 2)
                        puzzWin.document.write("<TD></TD>");
                    if (col > 2)
                    {
                        col = 0;
                        puzzWin.document.writeln("</TR>");
                    }
                }
            if (col > 0)
                puzzWin.document.writeln("</TR>");
            puzzWin.document.writeln("</table></center>");

            puzzWin.document.writeln("<p><p><p>");
            puzzWin.document.writeln("<center><table align=\"center\" border=0><tr bgcolor=\"#FFFFFF\">");
            puzzWin.document.writeln("<td><center><font size=\"-2\">Created on <br>");
            puzzWin.document.writeln("<a href=\"http://www.awesomeclipartforeducators.com/\"><b>AwesomeClipartforEducators.com</b></a></center></td>");

            puzzWin.document.writeln("<table align=\"center\"><tr bgcolor=\"#FFFFFF\"><td><p><center><small><font face=\"courier\">Worksheet ID#" + pid + "</font></small></center></td></tr></table>");

            puzzWin.document.close();
            puzzWin.focus();
        }
        if ((maxX < 1) || (maxX > 25) || (maxY < 1) || (maxY > 25))
            alert("You must click the 'Click Here First to Create Puzzle' button first.");
window.status="";
}

function GeneratePuzzle() {
    var dx = 0;
    var dy = 0;
    var x = 0;
    var y = 0;
    var madechange = false;

    if (wordCount * 0.75 > 10)
        var minUse = 10;
    if (wordCount * 0.75 <= 10) 
        var minUse = (wordCount * 0.75);

    var useCount = 0;
    do {
        madechange = false;
        for (var wd=0;wd<wordCount;wd++) {
            wtry=0;
            if (!wordUsed[wd]) {
              while (wtry < (maxX * maxY))
              {
                wtry = wtry + 1;
window.status = "Placing word #" + (useCount +1)+ ": " + wordNS[wd] + " (attempt #" + wtry + " of " + (maxX * maxY) + ")...";
                var ty=0;
                while (ty < (maxX * maxY))
                {
                    do {
                        do {
                            dx = Math.round(Math.random() * 2) - 1;
                            dy = Math.round(Math.random() * 2) - 1;
                        }  while ((dx==0) && (dy==0));
                        x = Math.round(Math.random() * (maxX - (wordNS[wd].length * Math.abs(dx))));
                        y = Math.round(Math.random() * (maxY - (wordNS[wd].length * Math.abs(dy))));
                        if (dx==-1) 
                            x += wordNS[wd].length - 1;
                        if (dy==-1)
                            y += wordNS[wd].length - 1;
                    } while ((x + (dx * wordNS[wd].length) < 0) || (x + (dx * wordNS[wd].length) >= maxX) || (y + (dy * wordNS[wd].length) < 0) || (y + (dy * wordNS[wd].length) >= maxY) || (x < 0) || (x >= maxX) || (y < 0) || (y >= maxY));

                    ok = true;
                    for (var i=0;i<wordNS[wd].length;i++) {
                        if (gUsed[x + (i * dx)][y + (i * dy)]) {
                            if (grid[x + (i * dx)][y + (i * dy)] != wordNS[wd].substring(i,i+1))
                                ok = false;
                        }
                    }

                    if (ok)
                        ty = maxX * maxY;

                    ty++;
                }

                if (ok) {
                    for (var i=0;i < wordNS[wd].length;i++) {
                        grid[x + (i * dx)][y + (i * dy)] = wordNS[wd].substring(i,i+1);
                        gUsed[x + (i * dx)][y + (i * dy)] = true;
                        letterlist += wordNS[wd].substring(i,i+1);
                    }
                    wordUsed[wd] = true;
                    madechange = true;
                    useCount++;
                    wtry = maxX * maxY;
                }
              }
            }
        }
    } while (madechange);

    for (var y=0;y<maxY;y++)
        for (var x=0;x<maxX;x++)
            if (!gUsed[x][y])
            {
                pick = Math.round(Math.random() * (letterlist.length - 1));
                grid[x][y] = letterlist.substring(pick,pick+1);
            }

    var let = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var dt = new Date;
    pid = let.substring(dt.getMonth(),dt.getMonth()+1) + "" + dt.getDate() + "" + let.substring(dt.getHours(),dt.getHours()+1) + ((dt.getMinutes() * 10) + dt.getSeconds());
}
