var direction = 0; //0-Horizontal 1-Vertical
var wordsDef = new Array();

function getWordIndex(x, y, dir) {
	var i;
 	for (i = 0; i < words.length; i++) {
 		if ((dir == 0) && (wordsDir[i] == 0)) {
 			if ((y == wordsY[i]) && (x >= wordsX[i]) && (x < (wordsX[i] + words[i].length))) {
 				return i;
 			}
 		}
 		if ((dir == 1) && (wordsDir[i] == 1)) {
 			if ((x == wordsX[i]) && (y >= wordsY[i]) && (y < (wordsY[i] + words[i].length))) {
 				return i;
 			}
 		}
 	}
 	return -1;
}

function getDirection(x, y) {
	if (dirs[y].charAt(x) == '-') return 0;
	if (dirs[y].charAt(x) == '|') return 1;
	if (dirs[y].charAt(x) == '+') return 2;
}

function readTypedWord(t) {
	var ret = "";
	var x = wordsX[t];
	var y = wordsY[t];
 	if (wordsDir[t] == 0) {
	 	for (i = wordsX[t]; i < (wordsX[t]+words[t].length); i++) {
	 		if (document.getElementById(i + "_" + y).value == "")
	 			ret = ret + "~";
	 		else
		 		ret = ret + document.getElementById(i + "_" + y).value;
	 	}	 	
	}
	if (wordsDir[t] == 1) {
	 	for (i = wordsY[t]; i < (wordsY[t]+words[t].length); i++) {
	 		if (document.getElementById(x + "_" + i).value == "")
	 			ret = ret + "~";
	 		else
	 			ret = ret + document.getElementById(x + "_" + i).value;
	 	}
	}
	return ret;
}

function checkWord(x, y, dir) {
	//log("checkWord("+x+","+y+","+dir+")");
	var t = getWordIndex(x, y, dir);
	if (t == -1) return;
	var s = readTypedWord(t);	
	log("check "+s+" and "+words[t]);
	if (s.toUpperCase() == words[t].toUpperCase()) {
		log("words are equal");
		var i;
 		if (wordsDir[t] == 0) {
	 		for (i = wordsX[t]; i < (wordsX[t]+words[t].length); i++) {
	 			document.getElementById(i + "_" + y).className = "checked";
		 	}	 	
		}
		if (wordsDir[t] == 1) {
		 	for (i = wordsY[t]; i < (wordsY[t]+words[t].length); i++) {
		 		document.getElementById(x + "_" + i).className = "checked";
		 	}
		}		
	} else {
		log("words are NOT equal");
		var i;
 		if (wordsDir[t] == 0) {
	 		for (i = wordsX[t]; i < (wordsX[t]+words[t].length); i++) {
	 			if (document.getElementById(i + "_" + y).className.indexOf("checked") >= 0)
	 				if (words[t].charAt(i - wordsX[t]).toUpperCase() != s.charAt(i - wordsX[t]).toUpperCase())
	 					document.getElementById(i + "_" + y).className = "letter";
		 	}	 	
		}
		if (wordsDir[t] == 1) {
		 	for (i = wordsY[t]; i < (wordsY[t]+words[t].length); i++) {
	 			if (document.getElementById(x + "_" + i).className.indexOf("checked") >= 0)
	 				if (words[t].charAt(i - wordsY[t]).toUpperCase() != s.charAt(i - wordsY[t]).toUpperCase())
	 					document.getElementById(x + "_" + i).className = "letter";
		 	}
		}	
		return;			
//		var i;
// 		if (wordsDir[t] == 0) {
//	 		for (i = wordsX[t]; i < (wordsX[t]+words[t].length); i++) {
//	 			document.getElementById(i + "_" + y).className = "letter";
//		 	}	 	
//		}
//		if (wordsDir[t] == 1) {
//		 	for (i = wordsY[t]; i < (wordsY[t]+words[t].length); i++) {
//		 		document.getElementById(x + "_" + i).className = "letter";
//		 	}
//		}		
	}
}

 function onKeyUp(event) {
	if (!event) { 
 		event = window.event;
 	}
 	var source = getSource(event);
 	log("onKeyUp for " + source.id);
 	var xy = source.id.split("_");
 	var x = xy[0];
 	var y = xy[1];
	//сheckWord(x, y, direction);
 	switch (event.keyCode) {
		case 37: //Лево
			if (getDirection(x,y) != 1) direction = 0;
			if (direction == 0) {
				x--;
			}
			break;
		case 38: //Вверх
			if (getDirection(x,y) != 0) direction = 1;
			if (direction == 1) {
				y--;
			}
			break;
		case 39: //Право
			if (getDirection(x,y) != 1) direction = 0;
			if (direction == 0) {
				x++;
			}
			break;
		case 40: //Вниз
			if (getDirection(x,y) != 0) direction = 1;
			if (direction == 1) {
				y++;
			}
			break;
		case 8: //Backspace
			if (direction == 0) x--; else y--;		
			break;
 	}
 	log(event.keyCode);
 	var ltrs = new Array(186, 188, 190, 191, 192, 219, 221, 222, 59, 1046, 1069, 1061, 1066, 1041, 1070);
 	for (var i = 0; i < ltrs.length; i++) {
 		if (event.keyCode == ltrs[i]) {
 			if (direction == 0) x++; else y++;
	 		break;
 		}
 	}
 	if ((event.keyCode >= 65) && (event.keyCode <= 90)) {
 		if (direction == 0) x++; else y++;
	}
 	
 	var next = document.getElementById(x + "_" + y);
 	if (next != null) {
		log(x+ "_" + y+".focus");
 		next.focus();
 		next.select();
		checkWord(x, y, direction);
 		highlight(x, y, direction);
 	} else {
 		source.select();
		checkWord(xy[0], xy[1], direction);
 		highlight(xy[0], xy[1], direction);
 	}
 }
 
 function onFocus(event) {
	if (!event) { 
 		event = window.event;
 	}
 	var source = getSource(event);
 	source.select();
 	log("focus on "+source.id);
 	//highlight(x, y, direction);
 }
 
function getSource(event) {
	var source;
	if (event.target) {
		source = event.target;
	} else if (event.srcElement) {
		source = event.srcElement;
	}
	if (source.nodeType == 3) {
		source = source.parentNode; //fix Safari bug
	}
	return source;
}
 
 function highlight(x, y, dir) {
 	var i, t = -1;
 	//находим слово, чтобы подсветить
 	t = getWordIndex(x, y, dir);
 	if (t == -1) return;
	//сначала надо все unhighlight
 	var inputs = document.getElementById("crossword").getElementsByTagName("input");
 	for (i = 0; i < inputs.length; i++) {
 		if (inputs[i].className.indexOf("_") >= 0) {
 			inputs[i].className = inputs[i].className.split("_")[0];
 			inputs[i].parentNode.className = "letter";
 		}
 		//log(inputs[i].id+ ": "+inputs[i].className);
	 }
 	log("highlighting word "+words[t]);
 	if (dir == 0) {
	 	for (i = wordsX[t]; i < (wordsX[t]+words[t].length); i++) {
	 		//log("h "+i + "_" + y);
	 		document.getElementById(i + "_" + y).className = document.getElementById(i + "_" + y).className + "_highlight";
	 		document.getElementById(i + "_" + y).parentNode.className = "highlight";
	 	}	 	
	}
	if (dir == 1) {
	 	for (i = wordsY[t]; i < (wordsY[t]+words[t].length); i++) {
	 		document.getElementById(x + "_" + i).className = document.getElementById(x + "_" + i).className + "_highlight";
	 		document.getElementById(x + "_" + i).parentNode.className = "highlight";
	 		//log("h "+x + "_" + i+ " " + document.getElementById(x + "_" + i));
	 	}
	 } 	
 }
 
 function onClick(event) {
	if (!event) { 
 		event = window.event;
 	}
 	var source = getSource(event);
 	source.select();
 	log("click on "+source.id);
 	var xy = source.id.split("_");
 	var x = xy[0];
 	var y = xy[1];
 	if (dirs[y].charAt(x) != "|") {
 		direction = 0;
 	} else {
 		direction = 1;
 	}
 	highlight(x, y, direction); 	
 }
 
 function onDblClick(event) {
	if (!event) { 
 		event = window.event;
 	}
 	var source = getSource(event);
 	source.select();
 	log("dblclick on "+source.id);
 	var xy = source.id.split("_");
 	var x = xy[0];
 	var y = xy[1];
 	if (dirs[y].charAt(x) == "+") {
 		direction = 1 - direction;
 	}
 	highlight(x, y, direction);
 }
 
 function goToWord(event) {
	if (!event) { 
 		event = window.event;
 	}
 	var source = getSource(event);
 	log(source.id.substr(3,10));
 	var k = source.id.substr(3,10);
 	log("goToWord "+k+" at "+wordsX[k] +":"+wordsY[k]);
 	direction = wordsDir[k];
 	document.getElementById(wordsX[k]+"_"+wordsY[k]).focus();
 	highlight(wordsX[k], wordsY[k], direction);
 }
 
 function emphasizeListItem(event) {
	if (!event) { 
 		event = window.event;
 	}
 	var source = getSource(event);
 	log("over on " + source.id);
 	source.className = "emphasized";
 }
 
  function unemphasizeListItem(event) {
	if (!event) { 
 		event = window.event;
 	}
 	var source = getSource(event);
 	source.className = "";
 }
 
 function initialize() {
	var hlist = document.getElementById("hor_def_list");
	var item = hlist.firstChild;
	for (var i = 0; i < words.length; i++) {
		if (wordsDir[i] == 0) {
			wordsDef[i] = item.innerHTML;
			item.onclick = goToWord;
			item.onmouseover = emphasizeListItem;
			item.onmouseout = unemphasizeListItem;
			item.id = "def"+i;
			item = item.nextSibling;
		}	
	}
	var vlist = document.getElementById("ver_def_list");
	item = vlist.firstChild;
	for (var i = 0; i < words.length; i++) {
		if (wordsDir[i] == 1) {
			wordsDef[i] = item.innerHTML;
			item.onclick = goToWord;
			item.onmouseover = emphasizeListItem;
			item.onmouseout = unemphasizeListItem;
			item.id = "def"+i;
			item = item.nextSibling;
		}	
	}
	
	var c = document.getElementById("crossword").rows;
	var w = dirs.length;
	for (var i = 0; i < w; i++) {
		for (var j = 0; j < dirs[i].length; j++) {
			if (dirs[i].charAt(j) != noletter) {
				var input = c[i].cells[j].firstChild;				
				input.id=j+"_"+i;
				input.onkeyup = onKeyUp;
				//input.onkeypress = onKeyUp;
				input.onfocus = onFocus;
				input.ondblclick = onDblClick;
				input.onclick = onClick;
				input.maxLength = 1;
				input.title = "";
				input.className = "letter";
				var vlist = document.getElementById("ver_def_list");
				var item;
				var t = getWordIndex(j, i, 0);
				if (t != -1) {
					input.title = "По горизонтали: \n" + wordsDef[t] + "\n";					
				}
				t = getWordIndex(j, i, 1);
				if (t != -1) {
					input.title = input.title + "По вертикали: \n" + wordsDef[t];
				}				
				log(input.nodeType+" "+input.id + " " + input.className);
			}			
		}
	}
	
	log("initialization finished");
	inputs = document.getElementsByTagName("input");
	for (var i = 0; i< inputs.length; i++)
	  log(inputs[i].id + ": "+inputs[i].className);
	//log(document.getElementById("1_1"));
 }
 
 function log(str) {
 	var logger = document.getElementById("logger");
 	if (logger != null) {
 		logger.innerHTML = str + "<br>" + logger.innerHTML;
 	}
 }
