
var focusFigure = -1
var BOARDSIZE = 9
var BOARDSQUARE = 81
var BLOCKSIZE = 3
var solved = 0;
var ra = 'ABCDEFGHI';
var ca = '123456789';

var clrRed = '#ffdddd';
var clrGreen = '#ddffdd';
var clrBlue = '#cceeff';
var colourMode = false;
var figureCount = new Array;

function getBlock( row, col )
{
	block = Math.floor( row / BLOCKSIZE ) * BLOCKSIZE + Math.floor( col / BLOCKSIZE );
	return block;
}

function changeBoard()
{
/*	resetColours(); */
	checkBoard();
}

function checkBoard()
{
	if( preSolved )
		return;
	inRow = new Array();
	inCol = new Array();
	inBlk = new Array();
	hasErrors = 0;
	for( i = 0;  i < BOARDSIZE;  i ++ ) {
		inRow[i] = '';
		inCol[i] = '';
		inBlk[i] = '';
		figureCount[i] = 0;
	}
	finished = 1;
	re = /^[1-9]$/;
	for( r = 0; r < BOARDSIZE;  r ++ ) {
		for( c = 0; c < BOARDSIZE;  c ++ ) {
			b = getBlock( r, c );
			elm = document.getElementById( ra.charAt(r) + ca.charAt(c) );
			if( elm.value.match( re )) {
				figureCount[elm.value-1] ++;
				if( inRow[r].indexOf( elm.value ) == -1 ) {
					inRow[r] += elm.value
				} else {
					hasErrors = 1;
				}
				if( inCol[c].indexOf( elm.value ) == -1 ) {
					inCol[c] += elm.value
				} else {
					hasErrors = 1;
				}
				if( inBlk[b].indexOf( elm.value ) == -1 ) {
					inBlk[b] += elm.value
				} else {
					hasErrors = 1;
				}
			} else {
				finished = 0;
			}
		}
	}
	for( c = 0; c < BOARDSIZE;  c ++ ) {
		if( figureCount[c] == BOARDSIZE ) {
			elm = document.getElementById( 'T' + ca.charAt(c) );
			elm.style.textDecoration = 'underline';
			elm.attributes.title.nodeValue = allFoundTitle.replace( '%d', ca.charAt(c) );
		}
	}
	if( finished == 1 ) {
		if( hasErrors ) {
			alert( errorMessage );
		} else if( solved == 0 ) {
			solved = 1;
			alert( solvedMessage );
		}
	}
}

function addEvent( elm, evType, fn, useCapture )
{
	if( elm.addEventListener ) {
		elm.addEventListener( evType, fn, useCapture );
		return true;
	} else if (elm.attachEvent ) {
		var r = elm.attachEvent( 'on' + evType, fn );
		return r;
	} else {
		elm[ 'on' + evType ] = fn;
	}
}

function setStyle( elm )
{
	re = /^[1-9]?$/;
	if( elm.value.match( re )) {
		elm.style.fontSize = '2em';
		elm.style.textAlign = 'center';
		elm.style.fontWeight ='bold';
	} else {
		elm.style.fontSize = '1em';
		elm.style.textAlign = 'left';
		elm.style.fontWeight ='normal';
		elm.style.color ='#0099cc';
	}
}

function changeListener( e ) {
	var t = window.event ? window.event.srcElement :
		e ? e.target : null;
	switch( e.keyCode ) {
		case 37 :
			c= ca.indexOf( t.id.charAt(1) );
			if( t.value.length <= 1 && c > 0 ) {
				t = document.getElementById( t.id.charAt(0) + ca.charAt( c-1) );
				t.focus();
			}
			break;
		case 38 :
			r = ra.indexOf( t.id.charAt(0) );
			if( r > 0 ) {
				t = document.getElementById( ra.charAt(r-1) + t.id.charAt(1) );
				t.focus();
			}
			break;
		case 39 :
			c= ca.indexOf( t.id.charAt(1) );
			if( t.value.length <= 1 && c < BOARDSIZE-1 ) {
				t = document.getElementById( t.id.charAt(0) + ca.charAt( c+1) );
				t.focus();
			}
			break;
		case 40 :
			r = ra.indexOf( t.id.charAt(0) );
			if( r < BOARDSIZE-1 ) {
				t = document.getElementById( ra.charAt(r+1) + t.id.charAt(1) );
				t.focus();
			}
			break;
		default :
			break;
			
	}
	setStyle( t );
}

function ignoreArrows( e ) {
	var t = window.event ? window.event.srcElement :
		e ? e.target : null;
	alert( e.keyCode );
	if( e.keyCode == 37 || e.keyCode == 38 || e.keyCode == 39 || e.keyCode == 40 ) {
		if( window.event && window.event.cancelBubble ) {
			window.event.cancelBubble = true;
		}
		if( e && e.stopPropagation ) {
			e.stopPropagation();
		}
		if( window.event && window.event.returnValue ) {
			window.event.returnValue = false;
		}
		if( e && e.preventDefault ) {
			e.preventDefault();
		}
	}
}

function ignoreAction( e ) {
	var t = window.event ? window.event.srcElement :
		e ? e.target : null;
	if( window.event && window.event.cancelBubble ) {
		window.event.cancelBubble = true;
	}
	if( e && e.stopPropagation ) {
		e.stopPropagation();
	}
	if( window.event && window.event.returnValue ) {
		window.event.returnValue = false;
	}
	if( e && e.preventDefault ) {
		e.preventDefault();
	}
}

function changeFocus( e ) {
	var t = window.event ? window.event.srcElement :
		e ? e.target : null;
	if( !colourMode )
		t.parentNode.style.backgroundColor = '#eeeeee';
}

function changeBlur( e ) {
	var t = window.event ? window.event.srcElement :
		e ? e.target : null;
	if( !colourMode ) {
		setBackground( t );
	}
}

function setBackground( elm )
{
	if( elm.value == focusFigure ) {
		elm.parentNode.style.backgroundColor = '#ffff99';
	} else if( elm.value.indexOf( focusFigure ) != -1 ) {
		elm.parentNode.style.backgroundColor = '#ffffcc';
	} else {
		elm.parentNode.style.backgroundColor = 'transparent';
	}
}

function showFigure( e ) {
	var t = window.event ? window.event.srcElement :
		e ? e.target : null;
/*	resetColours(); */
	if( focusFigure == t.innerHTML ) {
		hideFigures()
	} else {
		focusFigure = t.innerHTML;
		for( r=0;  r < BOARDSIZE;  r++  ) {
			elm = document.getElementById( 'T' + (r+1) );
			elm.style.color = '#ffffff';
			for( c=0; c < BOARDSIZE; c++ ) {
				elm = document.getElementById( ra.charAt(r) + ca.charAt(c) );
				elm.oldValue = elm.value;
				if( !colourMode ) {
					setBackground( elm );
				}
			}
		}
		t.style.color = '#ffff00';
	}
}

function hideFigures( ) {
	if( focusFigure > 0 ) {
		focusFigure = -1;
		for( r=0;  r < BOARDSIZE;  r++  ) {
			elm = document.getElementById( 'T' + (r+1) );
			elm.style.color = '#ffffff';
			for( c=0; c < BOARDSIZE; c++ ) {
				elm = document.getElementById( ra.charAt(r) + ca.charAt(c) );
				if( !colourMode )
					elm.parentNode.style.backgroundColor = 'transparent';
			}
		}
	}
}

function setColour( elm, clr )
{
	elm.parentNode.style.backgroundColor = clr;
}

function changeMouse( e )
{
	var t = window.event ? window.event.srcElement :
		e ? e.target : null;
	if( e.shiftKey ) {
		if( focusFigure > 0 && t.className != 'fixed') {
			if( t.value == t.oldValue ) {
				if( e.ctrlKey ) {
					t.value = t.value.replace( focusFigure, '' );
				} else {
					t.value = focusFigure;
				}
				checkBoard();
			} else {
				t.value = t.oldValue;
			}
			setStyle( t );
			if( t.colourState == 0 || !colourMode ) {
				setBackground( t );
			}
		}
	} else if( e.ctrlKey ) {
		colourMode = true;
		switch( t.colourState ) {
			case 0 :
				t.colourState = 1;
				setColour( t, clrGreen );
				break;
			case 1 :
				t.colourState = 2;
				setColour( t, clrBlue );
				break;
			case 2 :
				t.colourState = 0;
				setBackground( t );
				break;
		}
	}
}

function resetColours()
{
	if( colourMode ) {
		colourMode = false;
		for( r=0;  r < BOARDSIZE;  r++  ) {
			for( c=0; c < BOARDSIZE; c++ ) {
				elm = document.getElementById( ra.charAt(r) + ca.charAt(c) );
				elm.colourState = 0;
				setBackground( elm );
			}
		}
	}
}

function disableBS(e)
{
	var t = window.event ? window.event.srcElement :
		e ? e.target : null;
	if( e.keyCode != 8 ) {
		return;
	}
	if( t.type ) {
		if( t.type == 'text' || t.type == 'textarea') {
			if( !t.readOnly  )
				return
		}
	}
	if( e.preventDefault) {
		e.preventDefault();
	};
	return false;
}

function setListener()
{
	elm = document.getElementById( 'hdrrow' );
	addEvent( elm, 'mousedown', resetColours, false ); 
	addEvent( document, window.event ? 'keydown' : 'keypress', disableBS, false );
	for( r=0;  r < BOARDSIZE;  r++  ) {
		elm = document.getElementById( 'T' + (r+1) );
		addEvent( elm, 'mousedown', showFigure, false );
		elm.attributes.title.nodeValue = highlightTitle.replace( '%d', r+1 );

		for( c=0; c < BOARDSIZE; c++ ) {
			elm = document.getElementById( ra.charAt(r) + ca.charAt(c) );
			elm.colourState = 0;
			elm.oldValue = elm.value;
			addEvent( elm, 'keyup', changeListener, false );
			addEvent( elm, 'scroll', ignoreAction, false );
			setStyle( elm );
			addEvent( elm, 'focus', changeFocus, false );
			addEvent( elm, 'blur', changeBlur, false );
			addEvent( elm, 'change', changeBoard, false );
			addEvent( elm, 'click', changeMouse, false );
		}
	}
	checkBoard();
	for( i=0;  i <3; i++ ) {
		elm = document.getElementById( 'grade_' + (i+1) );
		if( elm )
			addEvent( elm, 'click', showFBForm, false );
	}
/*	elm=document.getElementById( 'tipafriend' ); */
/*	addEvent( elm, 'click', showTipAFriend, false ); */
/*	elm=document.getElementById( 'tafSubmit' ); */
/*	addEvent( elm, 'click', submitTipAFriend, false ); */
}

function showFBForm()
{
	elm = document.getElementById( 'feedbackHide' );
	elm.style.display = 'block';
}

function askName( form, text) {
	var name = prompt( text + ':', form.saveName.value );
	if( name == null ) {
		return false;
	} else {
		form.saveName.value = name;
	}
	return true;
}

function showTipAFriend()
{
	elm = document.getElementById( 'tafHide' );
	elm.style.display = 'block';
	elm = document.getElementById( 'tafThanks' );
	elm.style.display = 'none';
}

function submitTipAFriend( e )
{
	elm = document.getElementById( 'tafName' );
	alert( elm.value );
	elm = document.getElementById( 'tafFrom' );
	alert( elm.value );
	elm = document.getElementById( 'tafRcpt' );
	alert( elm.value );
	elm = document.getElementById( 'tafHide' );
	elm.style.display = 'none';
	elm = document.getElementById( 'tafThanks' );
	elm.style.display = 'block';
	return 0;
}

function debug(obj, obj_name) {
	var result = '';
	for (var i in obj) {
		if( typeof obj[i] != 'function' )
				result += obj_name + "." + i + " = " + obj[i] + "\r\n";
	}
	var newInfo = document.createElement( 'pre' );
	newInfo.appendChild( document.createTextNode( result ));
	var debugelm = document.getElementById( 'debuginfo' );
	if( debugelm ) {
		debugelm.appendChild( newInfo );
	} else {
		document.body.appendChild( newInfo );
	}
}

function addDomFunction(fn, dependencies)
{
  var counter = 0, collections = {}, timer = setInterval(function()
  {
    var ready = false;
    counter++;

    if (typeof document.getElementsByTagName != 'undefined'
        && (document.getElementsByTagName('body')[0] || document.body))
    {
      ready = true;

      if (typeof dependencies == 'object')
      {
        for (var i in dependencies)
        {
          if (dependencies[i] == 'id' && !document.getElementById(i))
          {
            ready = false;
            break;
          }
          else if (dependencies[i] == 'tag')
          {
            var len = document.getElementsByTagName(i).length;
            if (typeof collections[i] == 'undefined' || collections[i] != len || len < 1)
            {
              collections[i] = len;
              ready = false;
              break;
            }
          }
        }
      }
      if (ready)
      {
        clearInterval(timer);
        fn();
      }
    }

    if (counter >= 40)
    {
      clearInterval(timer);
    }

  }, 250);
}

addDomFunction( setListener, { 'table' : 'id', 'saveName' : 'id' } );
// addEvent( window, 'load', setListener, false );
