	var HIDDEN=0;
    var GREYED=1;
    var NORMAL=2;
    var SELECTED=3;
        
	var endTime;
    var clock;
    var boardSize=5;
    var mainBoard;
    var path=[];
    var depth=0;
    var ispathValid=[];
    var words=[];
    var inGame=false;
    var currWord="";
    var myWords=[];
    var myScore=0;
    var points=[0,0,0,0,1,2,3,5,11,11,11,11,11,11,11,11,11];
    var pointMap="abcdefghijklmnopqrst";
    var solverSortOrder=[0,0];
    
function UB() {
    	$.unblockUI({ fadeOut: 200 });
    }
    
$().ajaxStop(UB);    

function WordClick() {
	var url = 'http://www.gtoal.com/cgi-bin/juez.cgi';
	var cForm = document.createElement('form');
	cForm.target = 'cnecTarget';
	cForm.method = 'POST';
	cForm.action = url;
	var iPalabra = document.createElement('input');
	iPalabra.type = 'hidden';
	iPalabra.name = 'palabra' ;
	iPalabra.value = $(this).html();
	cForm.appendChild(iPalabra);
	var iShowroot = document.createElement('input');
	iShowroot.type = 'hidden';
	iShowroot.name = 'showroot';
	iShowroot.value = 'Y';
	cForm.appendChild(iShowroot);
	document.getElementsByTagName("body")[0].appendChild(cForm);
	mywin=window.open(cForm.action,cForm.target,"menubar=0,resizable=1,width=350,height=400");
	cForm.submit();
//	var newWindow = window.open('');
//	newWindow.$.post("http://www.gtoal.com/cgi-bin/juez.cgi", { palabra: "John", showroot: "Y" } ); 
}

    
function letter(value,col,row)
{
this.value=value;
this.visited= [];
this.col=col;
this.row=row;
this.newState=GREYED;
this.currState=NORMAL;
this.pathCount=0;
}

function board()
{
this.letters=[];
}

function paintBoard() {
	var i;
	var ind;
	var ltr;
	var tile;
	
	for (i=0;i<mainBoard.letters.length;i++) {
		ltr=mainBoard.letters[i];
		ind="#c" + ltr.col.toString() + ltr.row.toString();
		if(ltr.newState!=ltr.currState) {
	    	ltr.currState=ltr.newState;
	    	tile=$(ind);
			switch (ltr.currState) {
				case HIDDEN:
				tile.hide();
				break;	
				case NORMAL:
				tile.show();
				tile.css("background","white");
				tile.css("color","black");
				break;
				case GREYED:
				tile.css("background","white");
				tile.css("color","#AAAAAA");
				break;
				case SELECTED:
				tile.css("background","#AAAAAA");
			}
		}
		if ((ltr.currState==NORMAL) ||(ltr.currState==SELECTED)) {
		    //alert(ltr.col.toString() +ltr.row.toString());
			ltr.newState=GREYED;
		}
	}
	ltr=null;
	tile=null;
}

function wordInWordList(w,wl) {
	var ret;
	var i;
	ret=false;
	for (i=0;i<wl.length;i++){
		if (w==wl[i]){
			ret=true;
			break;
		}
	}
	return ret;
}

function resetBoard() {
	var i;
	var j;
	var w=[];
	var table;
	$("#mensaje").show();
	$("#mensaje").html("");
    if (IE!==true) {
    	$("#mensaje").corner("14px");
   	}
	if (currWord.length>3) {
		if (wordInWordList(currWord,words)) {
			
		 if (!wordInWordList(currWord,myWords)) {
			myWords[myWords.length]=currWord;
			myScore=myScore+points[currWord.length];
			$("#Score").html(myScore);
			for (i=myWords.length-1;i>=0;i--) {
				w[myWords.length-i-1]="<td class='law'>"+ myWords[i]+"</td><td class='ra'>"+ points[myWords[i].length] + "</td>";
			}
			table="<tbody><tr>" + w.join("</tr><tr>") + "</tr><tr><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr></tbody>";
			$("#tWordList tbody").replaceWith(table);		
            $("#mensaje").html(currWord + "<br>" + points[currWord.length] + " puntos");
	      }
	      else {
	      	$("#mensaje").html(currWord + "<br>" + "ya la has escrito")
	      }
	    }
	    else {

	    	$("#mensaje").html(currWord + "<br>" + "no es v&aacute;lida")	
	    }
    }
    else {
    	$("#mensaje").html(currWord + "<br>" + "es demasiado corta")
    }
    for (i=0;i<path.length;i++){
      if (path[i]!==null) {
          for (j=0;j<path[i].length;j++) {
			path[i][j]=null;
          }
		  path[i]=null;
		  delete path[i];

      }
    }
    path.length=0;
    for (i=0;i<depth;i++){
    	$("#l"+i.toString()).hide();
    }
    depth=0;
    for (i=0;i<mainBoard.letters.length;i++) {
        mainBoard.letters[i].newState=NORMAL;
        mainBoard.letters[i].visited.length=0;
       	mainBoard.letters[i].pathCount=0;
    }
    currWord="";
    $(".law").click(WordClick);
 	paintBoard();
}


function sortSolver(col) {
	var table;
	var w=[];
	
	if (col===0) {	
		words.sort();
		solverSortOrder[1]=0;
		if (solverSortOrder[0]!=1){
			solverSortOrder[0]=1;
		}else {
			solverSortOrder[0]=-1;
			words.reverse();
		}
		for (i=0;i<words.length;i++) {
			if (wordInWordList(words[i],myWords)) {
				w[i]="<td class='lah'>"+ words[i]+"</td><td class='rah'>"+ points[words[i].length] + "</td>";
			}
			else {
				w[i]="<td class='law'>"+ words[i]+"</td><td class='ra'>"+ points[words[i].length] + "</td>";
			}
			
		}
	table="<tbody><tr>" + w.join("</tr><tr>") + "</tr><tr><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr></tbody>";
		$("#tWordList tbody").replaceWith(table);
   }else{
		for (i=0;i<words.length;i++) {
		    if (wordInWordList(words[i],myWords)) {
				w[i]="<td id='p" + pointMap.charAt(words[i].length-1) + "' class='lah'>"+ words[i]+"</td><td class='rah'>"+ points[words[i].length] + "</td>";
		    }
		    else {
				w[i]="<td id='p" + pointMap.charAt(words[i].length-1) + "' class='law'>"+ words[i]+"</td><td class='ra'>"+ points[words[i].length] + "</td>";
		    	
		    }
		    
		}
		w.sort();
		solverSortOrder[0]=0;
		if (solverSortOrder[1]!=1){
			solverSortOrder[1]=1;
		}else {
			solverSortOrder[1]=-1;
			w.reverse();
		}
	table="<tbody><tr>" + w.join("</tr><tr>") + "</tr><tr><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr></tbody>";
		$("#tWordList tbody").replaceWith(table);
   }
   $(".law").click(WordClick);
   $(".lah").click(WordClick);
}

function updateRecords(data){
        
       	  var i;
       	  var p=[];
          var records=data.records;
          if (records!=null) {
	          var table;
	          for (i=0;i<records.length;i++) {
				p[i]="<td class='ra'>" + (i+1) + "<td class='ra'>" + records[i][0]+"</td><td class='la'>" + records[i][1]+"</td><td class='ra'>"+ records[i][2] + "</td>";
			  }
			table="<tbody><tr>" + p.join("</tr><tr>") + "</tr><tr><td class='lr'>&nbsp;</td><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;</td><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr></tbody>";
			$("#tRecords tbody").replaceWith(table);
          }
        
}

function updateRecordsClick(){
    $.blockUI({ message: '<img src="./img/wait.gif" /> Recuperando records...', fadein:0 }); 
	$.getJSON("getrecords.php",updateRecords);
}


function updatePlayers(data){
        
       	  var i;
       	  var p=[];
          var players=data.players;
          if (players!=null) {
	          var table;
	          for (i=0;i<players.length;i++) {
				p[i]="<td class='ra'>" + players[i][0]+"</td><td class='ra'>" + players[i][1]+"</td><td class='la'>"+ players[i][2]+"</td><td class='ra'>"+ players[i][3] + "</td>";
			  }
			table="<tbody><tr>" + p.join("</tr><tr>") + "</tr><tr><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;</td><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;</td><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr></tbody>";
			$("#tJugadas tbody").replaceWith(table);
          }
        updateRecords(data);
}

function updatePlayersClick(){
    $.blockUI({ message: '<img src="./img/wait.gif" /> Recuperando últimas partidas...', fadein:0 }); 
	$.getJSON("getplayers.php",updatePlayers);
}


function showSolution() {
	var i;
	var table;
	var w=[];
	$("#mensaje").hide();
	$("#mensaje").html("");
	$("#WordTitle").html("Todas las palabras")
	for (i=0;i<words.length;i++) {
		if (wordInWordList(words[i],myWords)) {
			w[i]="<td class='lah'>" + words[i]+"</td><td class='rah'>"+ points[words[i].length] +"</td>";
		}
		else {
			w[i]="<td class='law'>" + words[i]+"</td><td class='ra'>"+ points[words[i].length] +"</td>";
		}
	}
	table="<tbody><tr>" + w.join("</tr><tr>") + "</tr><tr><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td class='lr'>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr></tbody>";
	$("#tWordList tbody").replaceWith(table);	
		
   t=null;
   $("#tWordListHead thead tr th:first").click(function() {sortSolver(0);});
   $("#tWordListHead thead tr th:last").click(function() {sortSolver(1);});
   
   $.getJSON("getplayers.php?puntos=" + myScore + "&userName=" + userName, updatePlayers);
   $(".law").click(WordClick);
   $(".lah").click(WordClick);   
}


function updateClock ( )
{
  var currentTime = new Date ( );
  var ck;
  
  var secondsLeft=parseInt((endTime.getTime()-currentTime.getTime())/1000,10);
  var currentSeconds = secondsLeft %60;
  var currentMinutes = (secondsLeft-currentSeconds)/60;

  // Pad the minutes and seconds with leading zeros, if required
  currentMinutes = ( currentMinutes < 10 ? "0" : "" ) + currentMinutes;
  currentSeconds = ( currentSeconds < 10 ? "0" : "" ) + currentSeconds;


  // Compose the string for display
  var currentTimeString = currentMinutes + ":" + currentSeconds;
  
  // Update the time display
  ck=$("#clock");
  if (secondsLeft<=0) {
  	ck.html("00:00");
  	ck.css("background","#FF0000");
  	clearInterval(clock);
  	inGame=false;
	resetBoard();
	showSolution();
	
  }
  else   {
  	ck.html(currentTimeString);
  	if (secondsLeft<=10) {
  		if ((secondsLeft%2)===0){
  			ck.css("background","#FFD42A");
		} else{
			ck.css("background","#DDDDDD");
  		}
  	}
  		
  }
  ck=null;
}


function showWordLetter(l){
	//alert("#l"+depth.toString());
	var ind;
	var tile;
	ind="#l"+depth.toString();
	tile=$(ind);
	tile.html(l.value);
    tile.show();
    if (IE!==true) {
    	tile.corner("7px");
   	}
    tile=null;
}

function highlightNeighbours(ltr) {
	var j;
	var nb;
	nb=ltr.neighbour;
	for (j=0;j<nb.length;j++){
	  	//alert (j+":"+ltr.neighbour[j].value + ltr.neighbour[j].newState + ltr.neighbour[j].currState);
		if (nb[j].newState==GREYED) {
    		nb[j].newState=NORMAL;
    	}  		  	
    }
    nb=null;
}

function processKeydown(e){
      	
      	var i;
      	var ltr;
      	var p;
      	var hn;
      	var k;
      	if (!inGame) {return;}
      	if (e.keyCode==192) {
      		k="Ñ";
   	        e.preventDefault();
		}
		else {
			k=String.fromCharCode(e.keyCode);
		}
		if ((e.keyCode>=65) && (e.keyCode<=90)) {
  			e.preventDefault();
		}
		
      	i=mainBoard.config.search(k); //find if letter is in the board
      	if ((i!=-1)&&(depth<20)) {
         	if (path.length===0){ //first letter
				var d;
        		path[0]=[];
        		ltr=mainBoard.letters[i];
        		path[0][0]=ltr;
        		ltr.visited[0]=true;
        		ltr.pathCount++;
        		ispathValid[0]=true;
        		currWord=ltr.value.toUpperCase();
				d=ltr.duplicate;
				showWordLetter(ltr);
				depth=1;
				if (d===null) { //it's the only letter '
        		  ltr.newState=HIDDEN;
        		  highlightNeighbours(ltr);
	            }
       			else {//there are other letters
       			 ltr.newState=SELECTED;
       			 highlightNeighbours(ltr);
				 p=1;
				 while (d!==null){
			 	  path[p]=[];
			 	  path[p][0]=d;
				  				  
				  d.visited[p]=true;
				  d.pathCount++;
				  ispathValid[p]=true;
			 	  d.newState=SELECTED;
			 	  highlightNeighbours(d);
			 	  p++;
				  d=d.duplicate;
			   	 }
			   }
			   paintBoard();
   			}
  			else
  			{
                 var n;
                 var m;
                 var currentLtr;
                 var l;
                 var matches=0;
                 var pathlength;
                 var ln;
                 var clv;
                             
                 currentLtr=mainBoard.letters[i];
                 for (p=0;p<path.length;p++) { ispathValid[p]=false;}
                 //First step is to check which paths are still valid
                 pathlength=path.length; //to go through existing paths. not new paths created in the loop
                 while (currentLtr!==null){
                 	clv=currentLtr.visited;
					 for (p=0;p<pathlength;p++) { //go through each of the paths and check if the current letter is a neighbour
					 //alert ("pl"+pathlength);
					 	if ((path[p]!==null) && (clv[p]!==true)) {
					 		l=path[p][depth-1]; 
					 		ln=l.neighbour;
						 	for (n=0;n<ln.length;n++){ //go through each of the neighbours
						 	    //alert (n + l.neighbour.length );
						 		if (ln[n]===currentLtr) {
						 			//alert (p);
						 			matches++;
						 			if (depth==path[p].length) { //the first time a match is found for this path
							 			ispathValid[p]=true;
							 			path[p][depth]=currentLtr;
							 			clv[p]=true;
							 			currentLtr.pathCount++;
						 			}
						 			else { //the path already had a match, so we create a new path
						 				//alert ("new path");
						 				path[path.length]=[];
						 				for (m=0;m<depth;m++) {
						 					path[path.length-1][m]=path[p][m];
						 					path[p][m].visited[path.length-1]=true;
						 					path[p][m].pathCount++;
						 				}
						 				path[path.length-1][depth]=currentLtr;
						 				clv[path.length-1]=true;
						 				currentLtr.pathCount++;
						 				ispathValid[path.length-1]=true;
						 			}
						 		}
					 		}
		
					 	} 
					 }
	               currentLtr=currentLtr.duplicate;
	               //alert (currentLtr);
	 			 }
	 			 clv=null;
	 			 ln=null;
				 //remove invalid paths if there is at least one match
				 // and determine the state of the last letter of each path
				 if (matches>0) {
					 for (p=0;p<path.length;p++) {
					 	if ((ispathValid[p]===false)) {
				 		   if (path[p]!==null) {
							 for (m=0;m<path[p].length;m++){
 					 		   path[p][m].pathCount--;
							   path[p][m]=null;
					 		 }
					 	 	 path[p]=null;
				 		   }
						 }
					 }
					 for (p=0;p<path.length;p++){
					 	if (path[p]!==null) {
						  	//pcount++;
	                        //currPath=p;
	                    	for (m=0;m<path[p].length;m++) {
	                    		l=path[p][m];
	                    		if (l.newState!=HIDDEN) {
	                    			if (l.pathCount==matches) {
	                    				l.newState=HIDDEN;
	                    			}else {
	                      				l.newState=SELECTED;
	                   				}
	                      		}
	                    	}
						 	highlightNeighbours(l);
					 	}
					 }
		/*			 if (pcount==1)  {
                        for (p=0;p<path[currPath].length;p++) {
                          path[currPath][p].newState=HIDDEN;
                        }
					 	//alert (ind);
					 }
					 else {

					 	
					 }
			*/	 
                 showWordLetter(l);  
				 depth++;
				 currWord=currWord + l.value.toUpperCase();
     			 paintBoard();
     			 currentLtr=null;
     			 l=null;
				 }
     		}
		}
        else if (e.keyCode==13){
   	        e.preventDefault();
        	resetBoard();
        }
        else if (e.keyCode==8) {
        	e.preventDefault();
        }
	ltr=null;
}


function processButtonClick2(){
   	   myScore=0;
	   $("#Score").html(myScore);
       $("#tWordList tbody").replaceWith("<tbody></tbody>");
   	   $("#WordTitle").html("Tus palabras")	
   	   $("#tWordListHead thead tr th:first").unbind("click");
   	   $("#tWordListHead thead tr th:last").unbind("click");   	   
		userName=userName.substr(0,10);
		if (userName==="") {
			userName="Jugador"+Math.round(Math.random()*1000);
		}
		$("#userName").html(userName);	
		$.blockUI({ message: '<img src="./img/wait.gif" /> Recuperando tablero...', fadein:0 }); 
        $.getJSON("newboard.php?userName="+userName,
        function(data){
          var c=0;
          var r=0;
          var ind="";
          var brd=data.board;
          var brdNum=data.boardNumber;
          $("#NumeroTablero").html("#Tablero: " + brdNum.toString());
          $("#NumeroTablero").show();
          if (IE!==true) {
          	$("#NumeroTablero").corner("14px");
       	  }
          inGame=true;
          myWords=[];
          var i;
          var j;
          var n;
          var ltr;
          $("#clock").css("background","#DDDDDD");
          $("#Solver").hide();
          $("#tSolver").html("<thead><tr><th>Palabra</th><th>Punt</th></tr></thead>");
          $.each(data.words, function(i,word){
            words[i]=word;
          });

		  mainBoard=new board();
          mainBoard.config=brd;
          for (r=0;r<boardSize;r++) {
            for (c=0;c<boardSize;c++){
              ind="#c" + c.toString() + r.toString();
              ltr=brd.substr(c+r*boardSize,1);
              if (ltr=="Q") {ltr="Qu"};
              $(ind).html(ltr);
              if (IE!==true) {
              	$(ind).corner("14px");
           	  }
              mainBoard.letters[c+r*boardSize]=new letter(ltr,c,r);
              
            }
          }
          for (r=0;r<boardSize;r++) {
            for (c=0;c<boardSize;c++){
              n=0;
			  mainBoard.letters[c+r*boardSize].neighbour=[];
			  i=mainBoard.config.substr(c+r*boardSize+1).search(mainBoard.letters[c+r*boardSize].value);
			  
			  if (i!=-1) { 
			  	mainBoard.letters[c+r*boardSize].duplicate=mainBoard.letters[i+c+r*boardSize+1];
			  	//alert(mainBoard.letters[c+r*boardSize].value + c+r*boardSize + mainBoard.letters[i+c+r*boardSize+1].value +i+c+r*boardSize+1)
			  }
			  else {
			  	mainBoard.letters[c+r*boardSize].duplicate=null;
			  	
			  }	  
              for (j=-1;j<=1;j++){
              	for (i=-1;i<=1;i++) {
      	        	if  (((c+j)>=0)&&((c+j)<boardSize)&&
  	        			 ((r+i)>=0)&&((r+i)<boardSize) && ((j!==0)||(i!==0) )) {
       			 	    mainBoard.letters[c+r*boardSize].neighbour[n]=mainBoard.letters[(c+j)+(r+i)*boardSize];
              			n=n+1;
              		}
              	}
              }
            }
           
          }
          
        endTime=new Date();
        endTime.setTime(endTime.getTime()+180000);
        updateClock(); 
        clock=setInterval(updateClock, 500);  
        });
}




function mycallbackform(v,m,f){
   $(document).keydown(processKeydown);
   if (f!==undefined) {
       userName= f.userNamefield;
       processButtonClick2();
   }
}

function openChatClick(){
	$('#username_field').attr("value",userName);
	$('#chatform').submit();
}

  function processButtonClick(){
  	 $(document).unbind('keydown',processKeydown); 
	if (userName==="") {
		userName="Jugador"+Math.round(Math.random()*1000)
	}
	var msgTxt = 'Entra tu nombre:<br /><input type="text" id="userNamefield" name="userNamefield" value="' + userName +'" /><br>NOTA: Si alguien empezó una partida hace menos de un minuto, usarás su mismo tablero.<br>Si eres el primero en usar un tablero, a todos los jugadores que accedan en el próximo minuto se les asignará el mismo tablero.';

    	if (inGame) {resetBoard();}
			$.prompt(msgTxt,{
      					callback: mycallbackform
		});
   }


    $(function() {
      
      if (IE!==true) {
      	$(".dado").corner("14px");
   	  }
   	  
      $(document).keydown(processKeydown);
	  $("#new_game").click(processButtonClick);
	  $("#chat").click(openChatClick);
	  $("#actualizar_jugadas").click(updatePlayersClick);
	  $("#actualizar_records").click(updateRecordsClick);
	  $("#userName").html(userName);
	});
