// Xsum Javascript Player 1.1
// (c) 2005 www.numberpuzzles.com Inc. All rights reserved.  
//
// Version History
//  2005-05-13 1.0 - Initial version
//  2005-06-24 1.1 - cleanup
//  2005-08-05 add timer function
//  2005-08-14 add numeric keypad support
//
// Global variables
//
var XS_maxX;				// width, derived from puzzle data
var XS_maxY;				// height, derived from puzzle data
var XS_soln;				// string representing solution in LR,TB order (first=0)
var XS_mask;				// string representing cell type (B or W)
var XS_currcell;			// id of currently selected white cell; possibly -1
var XS_perfect;				// flag for no reveals or errors
var XS_startTime;			// used by elapsed timer function


// Global variables "XS_customerID" and "XS_puzzleID" will be provided by the customer web site.
// Based on these variables, a script will set up XP_data.
if (window.XS_data == null) {
	XS_data = "*0000*0010*0004,*12009000030000,*08007000010000.";
}

// Global variable "XS_sounds_url" MAY be provided by the customer web site.  If not, default.
if (window.XS_sounds_url == null) {
	XS_sounds_url = "http://www.numberpuzzles.com/web/sounds/";
}
if (window.XS_images_url == null) {
	XS_images_url = "http://www.numberpuzzles.com/web/images/";
}
// The following global variables MAY be provided by the customer web site.  If not, default.

if (window.XS_zero_errors_text == null) {
	XS_zero_errors_text = "Congratulations! You solved the puzzle without any mistakes!";	// Default to English
}
if (window.XS_some_errors_text == null) {
	XS_some_errors_text = "Congratulations! You solved the puzzle!";	// Default to English
}
if (window.XS_reward_url == null) {
	XS_reward_url = "";
}

// Build the form table
function XS_buildForm(){

	var out_html = '<form><center>\n<table border=1 bgcolor="#888888" cellpadding=0 cellspacing=0>\n <tr>';
	var x = 0; var y = 1;	// initialize local/globals output vars
	XS_maxX = 0; XS_maxY = 0; XS_soln=""; XS_mask="";

	var pos = 0;
	while (pos < XS_data.length) {
		switch (XS_data.charAt(pos)) {
		case ".":
			pos++;
			XS_maxX = x;
			out_html += " </tr>\n"
			break
		case ",":
			y++; if (y>XS_maxY) XS_maxY = y;
			x=0;
			pos++;
			out_html += " </tr><tr>\n"
			break
		case "*":
			var chunk = XS_data.substring(pos,pos+5);
			pos+=5;
			XS_soln += "*";
			XS_mask += "B";
			out_html += XS_buildBlackCell(chunk.substring(1,3),chunk.substring(3,5));
			x++;
			break
		case "1":
		case "2":
		case "3":
		case "4":
		case "5":
		case "6":
		case "7":
		case "8":
		case "9":
			var chunk = XS_data.substring(pos,pos+5);
			pos+=5;
			XS_soln += chunk.substring(0,1);
			XS_mask += "W";
			out_html += XS_buildWhiteCell(XS_soln.length-1);
			x++;
			break
		default:
			var c = XS_data.charAt(pos);
			alert('Data errorc=' + c + ' pos=' + pos);
			break
		}
	}
	
	out_html+='<tr><td colspan="'+XS_maxX+'" class="XScopy">'+XS_puzzleID+' &copy; 2010 www.numberpuzzles.com Inc.</td></tr>\n';
	out_html+='</table>\n';
	out_html+='<p><input type="button" value="Check Answer" onClick="checkSolution();">\n';
	out_html+='</center></form>\n';

	return out_html;
}


// Subroutine - Build a black cell
function XS_buildBlackCell(rowsum,colsum){
	var res = "";
	res+='  <td><table border=0 cellpadding=0 cellspacing=0><tr>'; 
	res+='<td><img src="'+XS_images_url+'bdiv.gif"></td>';
	res+='<td><img src="'+XS_images_url+'b'+parseInt(rowsum,10)+'.gif"></td></tr><tr>';
	res+='<td><img src="'+XS_images_url+'b'+parseInt(colsum,10)+'.gif"></td>';
	res+='<td><img src="'+XS_images_url+'bdiv.gif"></td>';
	res+='</tr></table></td>\n';
	return res;
}

// Subroutine - Build a white cell
function XS_buildWhiteCell(idx){
	var res = "";
	res+='  <td><input class="XSnorm" type="text" id="c' + idx + '" value=" " size="1" readonly onclick="XS_place(' + idx + ');"></td>\n';
	return res;
}



// Javascript-encoded HTML for number puzzle form

var XS_form = XS_buildForm();
// + '<embed src="' + XS_sounds_url + 'TADA.wav" autostart=false hidden=true id="NP_tada"'
// + ' enablejavascript="true">\n'
// + '<embed src="' + XS_sounds_url + 'BoinkLo.wav" autostart=false hidden=true id="NP_boing"'
// + ' enablejavascript="true">\n';


// Display number puzzle form
document.write(XS_form);


// display seconds properly
function pad0(v){
	if ((0<=v) && (v<10)) return "0"+v;
	return v;
}

// Get Elapsed Time
function getElapsed() {
	var present, presenttime, elapsed, melapsed , selapsed , timerID;
	present = new Date();
	presenttime = present.getTime();
	elapsed = (presenttime - XS_startTime) / 1000;
	melapsed  = Math.floor(elapsed / 60);
	selapsed  = Math.floor(elapsed -(melapsed * 60));
	return (melapsed +":"+pad0(selapsed));
}

// Once only initialization
function XS_initialize()
{


	// select no cell
	XS_currcell = -1;

	// trap key presses
	document.onkeydown=kbdhandler;

	var startme = new Date();
	XS_startTime = startme.getTime();

	return false;


}

// enter a digit from keyboard
function kbdhandler(e)
{

	if (XS_currcell < 0) {		// discard if nothing selected
		return;
	}

	var pelem=document.getElementById("c"+XS_currcell);

	if (!e) e=window.event;
	var chr = String.fromCharCode(e.keyCode);

	if (('0'<=chr)&&(chr <='9')) {
		var d=chr.charCodeAt(0)-48;
		XS_putdigit(d);
	}
	else if ((96 <= e.keyCode) && (e.keyCode <=105)) {
		var k=(e.keyCode)-96;
		XS_putdigit(k);
	}
	else if ((chr==' ')||(e.keyCode==46)||(e.keyCode==8)) { // Clear
		XS_putdigit(0);
	}
	else if (chr=='\x25') {			// left arrow
		XS_place(XS_nextcell(XS_currcell,-1));
	}
	else if (chr=='\x26') {			// up arrow
		XS_place(XS_nextcell(XS_currcell,-XS_maxX));
	}
	else if (chr=='\x27') {			// right arrow
		XS_place(XS_nextcell(XS_currcell,1));
	}
	else if (chr=='\x28') {			// down arrow
		XS_place(XS_nextcell(XS_currcell,XS_maxX));
	}
	else if (chr=='\x09') {			// TAB
		XS_place(XS_nextcell(XS_currcell,1));
	}

	else if (chr=='\x0D') {			// CR
		XS_place(XS_nextcell(XS_currcell,1));
	}
//	else if (chr==0)
//		alert("Got key code="+e.keyCode);
//	else
//		alert("Got key code="+e.keyCode+" char="+chr);
	pelem.focus();
}

// Advance to next white cell at (or past) target index
function XS_nextcell(idx, delta) {
	var dimsq = XS_soln.length;
	var nxt = idx+delta;
	if (nxt < 0) nxt=nxt+dimsq;
	if (nxt >= dimsq) nxt=nxt-dimsq;
	if (XS_mask.charAt(nxt) == "B") {
		return(XS_nextcell(nxt,delta));
		}
	return nxt;
}

// Accept input into a cell
function XS_putdigit(d) {

	if (XS_currcell < 0) return;	// skip if no current cell

	var pelem=document.getElementById("c"+XS_currcell);
	if ((1<=d)&&(d<=9)) 
		pelem.value = d;
	else
		pelem.value = " ";	
	pelem.focus();

}

// Check Solution
function checkSolution() 	
{
	var i;
	var mistakecount = 0;

	for (i=0;i<XS_soln.length;i++) {
		if (isWhite(i)) {
			var pelem=document.getElementById("c"+i);
// alert(pelem);
			var dig=XS_soln.charAt(i);
			if (pelem.value == dig) {
				pelem.className = "XSnorm";
			} else {
				mistakecount++;
				XS_perfect = false;
				pelem.className = "XSerr";
// alert(pelem.classname);
			}
			
		}
		
	}
	
	var msga ="Congratulations!  You solved the puzzle in "+getElapsed();
	var msgb = (XS_perfect)?" without any mistakes!":"!";
	if (mistakecount == 0) alert(msga+msgb);
}	


//
function isWhite(idx) {
	return((XS_mask.charAt(idx)) == "W");
}




// Select a cell by clicking
function XS_place(idx){

	var pelem=document.getElementById("c"+idx);
	var colour=XS_mask.charAt(idx);

	if (colour == "B") return;
	if (XS_currcell > -1) setcellclass(XS_currcell,"XSnorm");
	XS_currcell = idx;
	pelem.focus();
	setcellclass(XS_currcell,"XShigh");
}

// Set highlighting for a cell
function setcellclass(idx,newclass) {

	if (idx < 0) return;		// ignore if nothing selected

	var pelem=document.getElementById("c"+idx);
	pelem.className = newclass;
}


function setcellclass(idx,newclass) {
	var pelem=document.getElementById("c"+idx);	// Locate the cell
	pelem.className=newclass;			// start the effect
}


XS_initialize();
