//© dowedo.net 2010
var NS = document.layers;var IE = document.all;var NEWB = document.getElementById;var IE4 = IE && !NEWB;var IE5 = IE && NEWB;var NS6 = NEWB && !IE;var MAC = (navigator.appVersion.indexOf("Mac") != -1);
var helpWind;var gridPix = 26;var curSpace = 15;var saved = false;var popInstruct = new Array();var xlayout;var timerID = null;var baseUrl="sitedata/data_feed.php";var thsCrossId;var arrShadedBoxes = new Array();var bustcachevar=1;var loadedobjects="";var rootdomain="http://"+window.location.hostname;var bustcacheparameter="";var arrXwTest;

function init(){
		cursR = getElObject("crossContenta").style;
		cursD = getElObject("crossContentb").style;
		cont = getElObject("control").style;
		messageBox = getElObject("message").style;
		
lyrR = cursR;lyrD = cursD;lyrR.xpos = curSpace;lyrR.ypos = 1;lyrD.xpos = curSpace;lyrD.ypos = 1;		
thsCrossId = document.crossdata.thscrossid.value;
popInstruct = (document.crossdata.xpopInstruct.value).split(",");
xlayout = parseInt(document.crossdata.xtype.value);
cluePos(parseInt(document.crossdata.cursorposition.value),1);
getPageData(baseUrl+"?cwd="+thsCrossId);
if (xlayout == 13) getElObject("control").style.top = 483+"px";
hide (cursD);
show (cursR);
show(cont);

}

function mov(evt){
evt = (evt) ? evt : event
hide(messageBox);
hide(getObject("test_message"));
for (l=65; l<=90; l++){
if (navigator.appName == "Netscape"){
if (evt.which == l){
fillBox(String.fromCharCode(l));
}
}
if (navigator.appName == "Microsoft Internet Explorer"){
if (event.keyCode == l){
fillBox(String.fromCharCode(l));
}
}
}
if (navigator.appName == "Netscape"){
  if (evt.which == 38 && lyrD.ypos > 1) udlr(1);
   if (evt.which == 40 && lyrD.ypos < ((xlayout-1)*gridPix)+1) udlr(2);
    if (evt.which == 37 && lyrR.xpos > curSpace) udlr(3);
     if (evt.which == 39 && lyrR.xpos < ((xlayout-1)*gridPix)+curSpace) udlr(4);
 	  if (evt.which == 8 ) fillBox(1);
	    if (evt.which == 46) fillBox(0);
		if (evt.which == 8) {
        evt.preventDefault();
    }   
  }

if (navigator.appName == "Microsoft Internet Explorer"){
  if (event.keyCode == 38 && lyrD.ypos > 1) udlr(1); 
   if (event.keyCode == 40 && lyrD.ypos < ((xlayout-1)*gridPix)+1) udlr(2);
    if (event.keyCode == 37 && lyrR.xpos > curSpace) udlr(3);
     if (event.keyCode == 39 && lyrR.xpos < ((xlayout-1)*gridPix)+curSpace) udlr(4); 
	 if (event.keyCode == 8 ) fillBox(1);
	 if (event.keyCode == 46) fillBox(0); 
  if (event.keyCode == 8) {
        
        window.event.cancelBubble = true;
        window.event.returnValue = false;
        return false;
   }
}

}



function position(xx,yy,stopToggle){
hide(getObject("test_message"));
var positionNow = getPosition();
var cursorDirection = (checkVis() == "h") ? "across" : "down";

lyrR.ypos = ((yy*gridPix)+1);
lyrR.xpos = ((xx*gridPix)+curSpace);
lyrD.ypos = ((yy*gridPix)+1);
lyrD.xpos = ((xx*gridPix)+curSpace);
lyrR.left = lyrR.xpos+"px"; 
lyrR.top = lyrR.ypos+"px";
lyrD.left = lyrD.xpos+"px";
lyrD.top = lyrD.ypos+"px";
allowType = true;


var newCursDir = fixCursorPos();

if(newCursDir == "both"){
 if (!stopToggle && ((xx+1) + (yy*xlayout)) == positionNow){
	 newCursDir = toggleCursor(newCursDir); 
 }else newCursDir = cursorDirection;
}
if (stopToggle){
  newCursDir = (stopToggle == 1) ? toggleCursor("across") : toggleCursor("down"); 
}

highlightRowCol(newCursDir);

}


function cluePos(clue,ident,arrIndex){
for (var c=0; c<=((xlayout*xlayout)-1); c++){
		if (clue == popInstruct[c]){
		var theCluePos = c+1
	}
}
var yy = Math.ceil(theCluePos / xlayout)-1;
var xx = xlayout-(((yy*xlayout)-theCluePos)+xlayout)-1;

position (xx,yy,ident);
}

function udlr(direct){
var cursorDirection = (checkVis() == "h") ? "across" : "down";
var posToggle = toggleButtons(direct,cursorDirection);
var newCursDir;
 
if (!posToggle){
 
buttonMove(direct);

var newCursDir = fixCursorPos();
if (newCursDir == "both") newCursDir = cursorDirection;

}else{
newCursDir = posToggle;
}

highlightRowCol(newCursDir);

}

function buttonMove(direct){

  switch (direct){
 	case 1:
 	  		lyrD.ypos -= gridPix; 
	  		lyrD.top = lyrD.ypos+"px";
    break;
 	case 2:
 	  		lyrD.ypos += gridPix; 
	  		lyrD.top = lyrD.ypos+"px";
    break;
 	case 3:
 	  		lyrR.xpos -= gridPix; 
	  		lyrR.left = lyrR.xpos+"px";
    break;
    case 4:
 	  		lyrR.xpos += gridPix; 
	  		lyrR.left = lyrR.xpos+"px";
    break;	  
}

lyrR.top = lyrD.top;
lyrD.left = lyrR.left;
if (checkBlack(getPosition())) buttonMove(direct);
if (lyrD.ypos < 1) buttonMove(2); 
if (lyrD.ypos > ((xlayout-1)*gridPix)+1) buttonMove(1);
if (lyrR.xpos < xlayout) buttonMove(4);
if (lyrR.xpos > ((xlayout-1)*gridPix)+curSpace) buttonMove(3); 
}

function toggleButtons(direct,cursorDirection){

	var cursorPos = getPosition();
	var chkCode = checkTop(cursorPos).toString() + checkRight(cursorPos).toString() + checkBott(cursorPos).toString() + checkLeft(cursorPos).toString();
    
    var downOnly = Array ("0101","1101","0111");
	var acrossOnly = Array ("1010","1011","1110");
	
	if (!isInArray(downOnly,chkCode) && !isInArray(acrossOnly,chkCode)){
		
		if (direct < 3 && cursorDirection == "across"){
	        var cursPos = toggleCursor("down");
		    return cursPos;
	    }
		if (direct > 2 && cursorDirection == "down"){
	        var cursPos = toggleCursor("across");
		    return cursPos;

	    }
	}
	
return false;
}

function fixCursorPos(){
	
	var cursorPos = getPosition();
	var chkCode = checkTop(cursorPos).toString() + checkRight(cursorPos).toString() + checkBott(cursorPos).toString() + checkLeft(cursorPos).toString();
    
	var downOnly = Array ("0101","1101","0111");
	var acrossOnly = Array ("1010","1011","1110");

    if (isInArray(downOnly,chkCode)){
		var cursPos = toggleCursor("down");
		return cursPos;
	}

	if (isInArray(acrossOnly,chkCode)){
		var cursPos = toggleCursor("across");
		return cursPos;
	}
	
	return "both";

}

function toggleCursor(thsDir){
var cursorDirection = (checkVis() == "h") ? "across" : "down";

switch(thsDir){

  case "across":
      show(cursR);
	  hide(cursD);
	  return "across";
  break;
  case "down":
      show(cursD);
	  hide(cursR);
	  return "down";
  break;
  case "both":
	  if (cursorDirection == "across"){
	    show(cursD);
		hide(cursR);
		return "down";
      }else{
	    show(cursR);
		hide(cursD);
		return "across";
	  }
  break;
}
}


function highlightRowCol(cursorDirection){
var cursorPos = getPosition();

clearShadeBoxes();

switch(cursorDirection){

  case "across":
  	  var intRowCol = 1;
  break;
  
  case "down":
      var intRowCol = xlayout;
  break;

}
var startFound = false;
var backPos = cursorPos;
var shadedBoxes = new Array();
var counter = 0;
while (!startFound){
	  getObject("outer"+backPos).backgroundColor = "#d5d5d5";
	  // speed up clear boxes for IE remove one cursor position 
	  if (backPos != cursorPos){
	  	 counter += 1;
	  	 shadedBoxes[counter] = backPos;
	  }
	  var startBox = (cursorDirection == "across") ? checkLeft(backPos).toString() : checkTop(backPos).toString();
	  if (startBox == "1"){
	  	 var startClueNum = popInstruct[backPos-1];
		 var theCluePos = backPos; 
	     startFound = true;
	  
	  }
	  backPos -= intRowCol;
}
var endFound = false;
var forwardPos = cursorPos;
while (!endFound){
	  getObject("outer"+forwardPos).backgroundColor = "#d5d5d5";
	  // speed up clear boxes for IE
	  counter += 1;
	  shadedBoxes[counter] = forwardPos;
	  var startBox = (cursorDirection == "across") ? checkRight(forwardPos).toString() : checkBott(forwardPos).toString();
	  if (startBox == "1")endFound = true;
	  forwardPos += intRowCol;
}
arrShadedBoxes = shadedBoxes;
getObject("outer"+cursorPos).backgroundColor = "#b2afe8";

var directCode = (cursorDirection == "across") ? 1 : 2;

}

function clearShadeBoxes(){
   for(i=1; i<arrShadedBoxes.length; i++){
	   getObject("outer"+arrShadedBoxes[i]).backgroundColor = "#FFFFFF";
   }
}


function fillBox(theHit){
saved = false;
var theLett = theHit;
var isVis = checkVis();
var theBoxPos = getPosition()-1;

	if (theHit == 0 || theHit ==1)theLett = "&nbsp;";

	getElObject("box"+(theBoxPos+1)).innerHTML = theLett;
    
	switch (parseInt(theHit)){ 
	case 0:
	  
	break;	
	case 1:
	   isVis == ("h")? udlr(3): udlr(1);
	break;	
	default:
	   isVis == ("h")? udlr(4): udlr(2);
	break;
	}	
}

function populateGrid(popList) {
	
	var addD=0;
	
	for (i = 0; i < popList.length; i++){
		var lrgNum = (popList[i] == 0) ? "&nbsp;" :  popList[i];
    	var smalNum = (popInstruct[i] == 0) ? "&nbsp;&nbsp;" : popInstruct[i];
	
		if (smalNum == lrgNum)lrgNum = "&nbsp;";
		if (!checkBlack(i+1)){
		   getElObject("box"+(i+1)).innerHTML = lrgNum;
		}
	}		  
}



//**********Button / Command functions***************

function saveWork(){
var workData = rbc();
var expiry = new Date();
expiry.setTime(expiry.getTime() + (13*24*60*60*1000));
document.cookie = thsCrossId+"="+escape(workData)+";"
+"expires=" +expiry.toGMTString()+";";
okShow();
saved = true;
}	


function loadWork(){
data = new Array();
var rePop="";
if (document.cookie){
var cookieData = unescape(document.cookie);
var crossData = cookieData.split(";");
for (c=0; c<crossData.length; c++){
var data = crossData[c].split("=");
if (data[0] == thsCrossId || data[0] == " "+thsCrossId){
rePop = data[1].split("");

}
}
if (rePop >"") {
 	goLoad = true;
	populateGrid(rePop);
 	}		
 }

}


function okShow(){
getElObject("ok_text").innerHTML = "Saved Ok";
show(messageBox);
timerID = setTimeout("okHide()",5000);
}

function okHide(){
hide(messageBox);
clearTimeout(timerID);
}

function popHelp() {
if (helpWind && helpWind.open && !helpWind.closed) helpWind.close();
helpWind = window.open("help_pop.php","","top=50,left=10,width=780,height=500,scrollbars,resizable");
}


function home(){
	if (!saved){
	var asksave = confirm ("All changes that are not saved will be lost.\n\nDo you wish to save your crossword now?");
		
		if (asksave){
		   saveWork();
		   
		}else self.window.location = "http://www.dowedo.co.uk/";
	
	}else self.window.location = "http://www.dowedo.co.uk/";
	
}

function setForPrnt(){
hide (cont);
hide (getElObject("test_message"));
parent.print();
show (cont);

}

function revealLetter(){
var thsPos = getPosition();
getElObject("box"+thsPos).innerHTML = arrXwTest[thsPos-1];
}

function revealWord(){
  for(i=1; i<arrShadedBoxes.length; i++){
	   getElObject("box"+arrShadedBoxes[i]).innerHTML = arrXwTest[arrShadedBoxes[i]-1];
  }
}

function revealAll(){
 var askReveal = confirm ("Are you sure you want to show all answers?\n\nClick Cancel to abort this operation.");
		
		if (askReveal){
		    populateGrid(arrXwTest);
		}
 
 

}

function testAnswers(){
var strTestAnswer = rbc(1);
var strXwTest = arrXwTest.join();
var objTestMess = getElObject("test_message");
var cntTop = ((xlayout*gridPix)/2)+125-102;
var cntLeft = ((xlayout*gridPix)/2)+15-122;
objTestMess.style.top = cntTop+"px";
objTestMess.style.left = cntLeft+"px";
if (strTestAnswer == strXwTest){
   getElObject("test_message").innerHTML = "<img src='images/test_right.png' style='width:245px; height:204px; border:0;' alt='Well Done. All answers correct' />";   
}else{
   getElObject("test_message").innerHTML = "<img src='images/test_wrong.png' style='width:245px; height:204px; border:0;' alt='Sorry there are some errors' />";   
}
show(getObject("test_message"));
}

function testWord(){

var strTestInput = ""; // chop the input;
var  strTestSol = "";
for(i=1; i < arrShadedBoxes.length; i++){
	  strTestInput += getElObject("box"+arrShadedBoxes[i]).innerHTML;
	  strTestSol += arrXwTest[arrShadedBoxes[i]-1];
}
var objTestMess = getElObject("test_message");
var cntTop = ((xlayout*gridPix)/2)+125-102;
var cntLeft = ((xlayout*gridPix)/2)+15-122;
objTestMess.style.top = cntTop+"px";
objTestMess.style.left = cntLeft+"px";
if (strTestInput == strTestSol){
   getElObject("test_message").innerHTML = "<img src='images/testword_right.png' style='width:245px; height:204px; border:0;' alt='Well Done. All answers correct' />";   
}else{
   getElObject("test_message").innerHTML = "<img src='images/testword_wrong.png' style='width:245px; height:204px; border:0;' alt='Sorry there are some errors' />";   
}
show(getObject("test_message"));
}



//********* Standard / Common Functions**************

function rbc(buildType){
var workData="";
var addComma = "";

for (var s=0; s<=((xlayout*xlayout)-1); s++){

	if (!checkBlack(s+1)){
  	   var inTheBox = getElObject("box"+(s+1)).innerHTML;
  	   if (inTheBox == "&nbsp;" || inTheBox == "") inTheBox = "0";
	}else{
  	   var inTheBox = "b";
	}

    // for checking array
	if (buildType == 1){
   	   var addComma = (s < ((xlayout*xlayout)-1)) ? "," : "";
	}
	
	workData += (inTheBox + addComma);

}
return workData;
}



function getPageData(url){

var page_request = false;
if (window.XMLHttpRequest) // if Mozilla, Safari etc
page_request = new XMLHttpRequest();
else if (window.ActiveXObject){ // if IE
try {
page_request = new ActiveXObject("Msxml2.XMLHTTP");
} 
catch (e){
try{
page_request = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){}
}
}
else
return false;
page_request.onreadystatechange=function(){
loadXwData(page_request);
}
if (bustcachevar) //if bust caching of external page
bustcacheparameter=(url.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime();
page_request.open('GET', url+bustcacheparameter, true);
page_request.send(null);
}

function loadXwData(page_request){

if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1))
var strXwTest = "";
if (typeof(page_request.responseText)!="unknown"){
strXwTest += page_request.responseText;
arrXwTest = strXwTest.split(",");
}
}


function checkTop(thsBox) {
	if (!getElObject("box"+(thsBox-xlayout))) return 1;
	return 0;
}

function checkRight(thsBox){
  	if (!getElObject("box"+(thsBox+1))) return 1;
	if (isEndRow(thsBox)) return 1;
		
	return 0;
}

function checkBott(thsBox){
	 if (!getElObject("box"+(thsBox+xlayout))) return 1;
 
	 return 0;
}

function checkLeft(thsBox){
   if (!getElObject("box"+(thsBox-1))) return 1;
   if (isEndRow(thsBox-1)) return 1;
	
   return 0;
}


function isEndRow(thsBox){
     var intBoxPos = thsBox/xlayout;
	 if (Math.floor(intBoxPos) * xlayout == thsBox)return true;
	 return false;
}

function isInArray(arrInput,strChk){
	for (i=0; i<arrInput.length; i++){
		if (arrInput[i] == strChk) return true;
	}
	
  return false;	
	
}

function clueNumInArray(arrInput,strChk){
	for (i=0; i<arrInput.length; i++){
		arrCheckStr = arrInput[i].split(".");
		if (arrCheckStr[0] == strChk) return i;
	}
	
  return false;	
	
}


function checkBlack(thePos){
	if (popInstruct[thePos-1] == "b") return true;else return false; 
}

function checkVis(){
 var vis = cursD.visibility
	  vis = (vis.toString()).charAt (0);
return (vis);
}	  


function getPosition(){
for (i=0; i < (xlayout+1); i++){
if (lyrR.xpos == (i*gridPix)+curSpace) var xaxis = i+1;
if (lyrD.ypos == (i*gridPix)+1) var yaxis = i * xlayout 
var posy = xaxis + yaxis;
}

return (posy);
}


function show(showobj) {
	showobj.visibility = "visible"
}
function hide(hideobj) {
	hideobj.visibility = "hidden"
}



document.onkeydown = mov;
document.onmousedown = mov;

