/**********************************************************
*
*	FIND WORDS: START
*
***********************************************************/

var findWord_currentClickX = -1;
var findWord_currentClickY = -1;
function findWord_SetItem(prefix, x, y, matrixDimension, newClassName){
	if(x >= 0 && x < matrixDimension && y >= 0 && y < matrixDimension){
		var currentObjId = prefix + "_" + x + "_" + y;
		document.getElementById(currentObjId).className = newClassName;
	}
}
function findWord_ShowWord(prefix, matrixDimension, s){
	var arrDef = s.split(":");
	var defX = parseInt(arrDef[0]);	var defY = parseInt(arrDef[1]);
	var defX2 = parseInt(arrDef[2]);var defY2 = parseInt(arrDef[3]);
	var answer = arrDef[4];
	var coefX = defX2 - defX;	var coefY = defY2 - defY;
	if(coefX != 0) coefX = coefX / Math.abs(coefX);
	if(coefY != 0) coefY = coefY / Math.abs(coefY);
	for(var j=0; j<answer.length; j++){
		findWord_SetItem(prefix, defX + coefX*j, defY + coefY*j, matrixDimension, "findWordsBgGreen");
	}
}
function findWord_UpdateTable(prefix, dataArray, flagArray, matrixDimensions){
	var i,j;
	for(i=0; i<matrixDimensions; i++){
		for(j=0; j<matrixDimensions; j++){
			var currentObjId = prefix + "_" + i + "_" + j;
			document.getElementById(currentObjId).className = "findWordsBgNone";
		}
	}
	for(i=0; i<dataArray.length; i++){
		if(flagArray[i] == 1) findWord_ShowWord(prefix, matrixDimensions, dataArray[i]);
	}
	findWord_ShowClues(prefix, dataArray, flagArray);
}
function findWord_ClickItem(prefix, x, y, dataArray, flagArray, matrixDimensions){
	if(findWord_currentClickX < 0){
		findWord_SetItem(prefix, x, y, matrixDimensions, "findWordsBgRed");
		findWord_currentClickX = x;	findWord_currentClickY = y;
	}else{
		for(var i=0; i<dataArray.length; i++){
			//	"0:2:0:7:monkey:monkey"
			var arrDef = dataArray[i].split(":");
			var defX = parseInt(arrDef[0]);	var defY = parseInt(arrDef[1]);
			var defX2 = parseInt(arrDef[2]);var defY2 = parseInt(arrDef[3]);
			var answer = arrDef[4];
			if(findWord_currentClickX == defX && findWord_currentClickY == defY && x == defX2 && y == defY2) flagArray[i] = 1;
		}
		findWord_UpdateTable(prefix, dataArray, flagArray,matrixDimensions);
		findWord_currentClickX = -1; findWord_currentClickY = -1;
	}
}
function findWord_ShowClues(prefix, dataArray, flagArray){
	var objId = prefix + "_clues";
	var obj = document.getElementById(objId);
	var s = " :: ";
	var showCongrats = true;
	for(var i=0; i<dataArray.length; i++){
		var arrDef = dataArray[i].split(":");
		var defX = parseInt(arrDef[0]);	var defY = parseInt(arrDef[1]);
		var defX2 = parseInt(arrDef[2]);var defY2 = parseInt(arrDef[3]);
		var answer = arrDef[4];
		var clue = arrDef[5];
		
		var sAction = "javascript:findWord_ClickItem('findWords'," + defX + "," + defY + ", findWordItems, foundWordItems, 12)";
		
		if(flagArray[i] == 1){
			s += "<span style=\"text-decoration: line-through;\">" + answer + " (" + clue + ")</span> :: ";
		}else{
			s += "<span onclick=\"" + sAction + "\" style=\"cursor:pointer;\">" + answer + " (" + clue + ")</span> :: ";
			showCongrats = false;
		}
	}
	if(showCongrats){
		document.getElementById("findWordsCongratulations").style.display = '';
	}
	obj.innerHTML = s;
}

/**********************************************************
*
*	FIND WORDS: END
*
***********************************************************/

/**********************************************************
*
*	CROSSWORD: START
*
***********************************************************/

function MoveAndWorkCrossword(obj, temps)
{
    var x = parseInt(obj.getAttribute('cwX'));
    var y = parseInt(obj.getAttribute('cwY'));
    if(IAmInDebugMode) alert("KP: x = " + x + ", y = " + y);

    //  write the value    
    if(IAmInDebugMode) alert("KP: temps = " + temps);
    if(obj.getAttribute('cwCellValue') == temps)	//	highlight the letter in red if the char is wrong
    {
        obj.style.color = 'black';
    }
    else
    {
        obj.style.color = 'red';
    }
    obj.value = temps;	//	write the value

    //  object on right
    var testObjH = null;
	var testObjId = "cwCell" + (x+1) + "_" + y;
    testObjH = document.getElementById(testObjId);
    if(IAmInDebugMode) alert("KP: testObjHId = " + testObjId + ", testObjH = " + testObjH);
    
    //  object below
    var testObjV = null;
    testObjId = "cwCell" + x + "_" + (y+1);
    testObjV = document.getElementById(testObjId);
    if(IAmInDebugMode) alert("KP: testObjVId = " + testObjId + ", testObjH = " + testObjV);
    
    obj = null;
    if((testObjH != null) && (testObjV != null))	//	if both elements exist
    {
		if(IAmInDebugMode) alert("KP: 1");
        if(lastAutoMovementDirection == 'V')	//	check last movement direction
        {
            obj = testObjV;
        }
        else
        {
            obj = testObjH;
        }
    }
    else if((testObjH != null) && (lastAutoMovementDirection == 'H' || lastAutoMovementDirection == ''))
    {
		if(IAmInDebugMode) alert("KP: 2");
        obj = testObjH;
        lastAutoMovementDirection = 'H';
    }
    else if((testObjV != null) && (lastAutoMovementDirection == 'V' || lastAutoMovementDirection == ''))
    {
		if(IAmInDebugMode) alert("KP: 3");
        obj = testObjV;
        lastAutoMovementDirection = 'V';
    }
    else if((testObjH != null) && (lastAutoMovementDirection == 'V'))
    {
        obj = testObjH;
        lastAutoMovementDirection = 'H';
    }
    else if((testObjV != null) && (lastAutoMovementDirection == 'H'))
    {
        obj = testObjV;
        lastAutoMovementDirection = 'V';
    }
    else
    {
		if(IAmInDebugMode) alert("KP: 4");
        obj = null;
    }
    
    if(obj != null)
    {
		if(IAmInDebugMode) alert("KP: setting focus for " + obj.id);

        obj.focus();
        //obj.select();
    }
}

//////////////////////////////////////////////////////////
//		Char pressed - write the value and move
//////////////////////////////////////////////////////////
function cwOnKeyPress(obj, evt)
{
    if(IAmInDebugMode) alert("KP: OnKeyPress()");
	var thisIsIE = false;
    var keyCode;
    if(window.event) {
		keyCode = event.keyCode;
		thisIsIE = true;
	}else if(evt) {
        keyCode = evt.which;
    }
	if(keyCode == 0) {
		evt.returnValue = false;
		return false;
	}
	//alert("KP: keyCode = " + keyCode);
    var temps = String.fromCharCode(keyCode);
    temps = temps.toUpperCase();
     
    MoveAndWorkCrossword(obj, temps);   
        
    if(obj != null)
    {
		if(thisIsIE) {
			event.returnValue = false;
			event.cancelBubble = true;
		}else{
			evt.returnValue = false;
			evt.cancelBubble = true;
		}
    }
}

///////////////////////////////////////////////
//		Check arrow keys
///////////////////////////////////////////////
function cwOnKeyDown(obj, evt)
{
    if(IAmInDebugMode) alert("KD: OnKeyDown()");

	var thisIsIE = false;
	var tempAutoMovementDirection = '';
    var keyCode;
    if(window.event)    //  IE
    {
        keyCode = event.keyCode;
        thisIsIE = true;
    }
    else if(evt)
    {
        keyCode = evt.which;
    }
    if(keyCode != 37 && keyCode != 38 && keyCode != 39 && keyCode != 40) return;
    //alert("KD: keyCode = " + keyCode);
    
    var x = parseInt(obj.getAttribute('cwX'));
    var y = parseInt(obj.getAttribute('cwY'));
    
    //alert(keyCode);
    var nextObjId = '';
    
    if(keyCode == 37) {
		nextObjId = "cwCell" + (x-1) + "_" + y;	//	left
		tempAutoMovementDirection = 'H';
	}
    if(keyCode == 38) {
		nextObjId = "cwCell" + x + "_" + (y - 1);	//	up
		tempAutoMovementDirection = 'V';
	}
    if(keyCode == 39) {
		nextObjId = "cwCell" + (x+1) + "_" + y;	//	right
		tempAutoMovementDirection = 'H';
    }
    if(keyCode == 40) {
		nextObjId = "cwCell" + x + "_" + (y + 1);	//	down
		tempAutoMovementDirection = 'V';
	}
	
	if(nextObjId != ''){
		if(IAmInDebugMode) alert("KD: nextObjId = " + nextObjId);
		var nextObj = document.getElementById(nextObjId);
		if(nextObj != null)
		{
			if(tempAutoMovementDirection != ''){
				lastAutoMovementDirection = tempAutoMovementDirection;	//	change direction only if cell exists
			}
			
			nextObj.focus();	//	set focus
			//nextObj.select();	//	select the text in input field
		}
				
		if(thisIsIE) {
			event.returnValue = false;
			event.cancelBubble = true;
		}else{
			evt.returnValue = false;
			evt.cancelBubble = true;
			return false;
		}
	}
}

///////////////////////////////////////////////
//		Show clue
///////////////////////////////////////////////
function cwOnFocus(obj)
{
    if(IAmInDebugMode) alert("OF: OnFocus()");
	currentInputFieldName = obj.id;
	var currentCharHint = obj.getAttribute("cwCellValue");

	obj.select();
	
    var clues = obj.getAttribute('cwCellClues');
    //alert("clues = " + clues);
    var currentClueSpanObj = document.getElementById('spanCWClue');
    //alert("currentClueSpanObj = " + currentClueSpanObj);
    var currentClue = currentClueSpanObj.innerHTML;
    //alert("currentClue = " + currentClue);
    
    var temps = "|" + currentClue + "|";
    var tempInt = clues.indexOf(temps);
    //alert(temps + " " + clues + " " + tempInt);
    if(currentClue == "" || clues.indexOf("|" + currentClue + "|") < 0){    //  | is separator
        //  find the right clue if there is match with two clues (that is first one)
        currentClue = GetFirstNonEmptyString(clues, '|');
        //alert("newClue = " + currentClue);
        currentClueSpanObj.innerHTML = currentClue;
        
        //  highlight the line (vertical or horizontal)
        //  if the line is highlighted than remember the line as last known direction
        var cellObjs = document.getElementsByName('cwCell');
        var thereIsError = false;
        var lastX = -1;
        for(var i=0; i<cellObjs.length; i++){
            var tempObj = cellObjs[i];
            
            if(tempObj.getAttribute('cwCellClues').indexOf("|" + currentClue + "|") < 0){
                tempObj.style.backgroundColor = "#ffffff";
            }else{
                tempObj.style.backgroundColor = "#e3e3e3";
                if(lastX >= 0)  //  I allready set it
                {
                    //alert(tempObj.id);
                    var currentX = parseInt(tempObj.getAttribute("cwX"));
                    if(currentX > lastX)
                    {
                        lastAutoMovementDirection = 'H';
                    }
                    else
                    {
                        lastAutoMovementDirection = 'V';
                    }
                }
                else
                {
                    lastX = parseInt(tempObj.getAttribute("cwX"));
                    //alert(tempObj.id);
                }
            }
        }
    }
    
    var letterHintObj = document.getElementById("spanLetterHint");
    if(null != letterHintObj)
    {
		letterHintObj.innerHTML = "<span title='" + currentCharHint + "'>(hover for letter hint?)</span>";
    }
}

/**********************************************************
*
*	CROSSWORD: END
*
***********************************************************/

/**********************************************************
*
*	MEMORY: START
*
***********************************************************/

function memoryGame_CloseOpenCells()
{
    if(gameStarted == 0) return;    //  user must start the game

    if((open1 > -1) && (open2 > -1)){
        var cellObjId1 = "memoryCell" + open1;
        var spanObjId1 = "memoryCellSpan" + open1;        
        var cellObj1 = document.getElementById(cellObjId1);
        var spanObj1 = document.getElementById(spanObjId1);

        var cellObjId2 = "memoryCell" + open2;
        var spanObjId2 = "memoryCellSpan" + open2;        
        var cellObj2 = document.getElementById(cellObjId2);
        var spanObj2 = document.getElementById(spanObjId2);

		var pairValue1 = cellObj1.getAttribute("pairValue");
		var pairValue2 = cellObj2.getAttribute("pairValue");

        if(pairValue1 == pairValue2){
            if(cellObj1.className == "picMemoryGameFront")
            {
                cellObj1.onclick = "";
            }
            if(cellObj2.className == "picMemoryGameFront")
            {
                cellObj2.onclick = "";
            }
        }else{
            if(cellObj1.className == "picMemoryGameFront")
            {
                cellObj1.className = "picMemoryGameBack";
                spanObj1.style.display = "none";
            }
                        
            if(cellObj2.className == "picMemoryGameFront")
            {
                cellObj2.className = "picMemoryGameBack";
                spanObj2.style.display = "none";
            }
        }
    }
    
    open1 = -1;
    open2 = -1;
}

function memoryGame_MemoryFlip(memoryCellId)
{
    if(gameStarted == 0) return;    //  user must start the game

    if(open1 > -1 && open2 > -1) {  //  if two are open, and user clicks on a third - reset the timer
        clearTimeout(timeoutVar);
        memoryGame_CloseOpenCells();
    }

    var cellObjId = "memoryCell" + memoryCellId;
    var spanObjId = "memoryCellSpan" + memoryCellId;

    var cellObj = document.getElementById(cellObjId);
    var spanObj = document.getElementById(spanObjId);

    if(cellObj.className == "picMemoryGameBack")
    {
        cellObj.className = "picMemoryGameFront";
        spanObj.style.display = "";

        if(open1 == -1){
            open1 = memoryCellId;
        }else if(open2 == -1){
            open2 = memoryCellId;
            timeoutVar = window.setTimeout("memoryGame_CloseOpenCells()", 1500);
        }
    }
}

/**********************************************************
*
*	MEMORY: END
*
***********************************************************/
