
function setValue(element, value)
{
   var palikka=document.getElementById(element);
   if(palikka) palikka.innerHTML=value;
   
}

function pushNode(x, y, score, movecost)
{

  function arsort(a,b)
  {
   if(a[2]<b[2]) return -1;
   else return 1;
  }
  node.push(Array(x, y, score, movecost));
  node.sort(arsort);

}

function popNode(x, y)
{
   for(var i=0;i<node.length;i++)
   {
     if(node[i][0]==x && node[i][1]==y)
     {
       node.splice(i,1);      
       return;
     }
   }
   
}

function getNode(fail)
{
    if(node.length>0)
    {
      fail=0;
      return node[0];        
    }
    return Array(0,0,0,0);
}


function datat(xy)
{
   
   //var iy=Math.floor(xy/w);
     
   //var ix=xy-iy*w;
   //var palikka=elementsxy[xy];//document.getElementById(ix+'-'+iy);
   //if(palikka)
   //{
   //   if(palikka.innerHTML=='&nbsp;')
   //      return ' ';
   //   return palikka.innerHTML;
   //}
   //return 'A';
   return map.charAt(xy);   
   
}

function dataset(xy, mapchar)
{
  var tempmap=map.slice(0,xy)+mapchar+map.slice(xy+1,map.length);
  map=tempmap;
}

function drawRoute(x1, y1, x2, y2)
{
   route_x=Array();
   route_y=Array();
   routelen=0;
   node=Array(Array());
   
   var cur_x=x1;
   var cur_y=y1;

   var parent=Array();
   var suljetut=Array();
   var avoimet=Array();
   var scoret=Array();

   var size_x=80;
   var size_y=30;
   var xx=Array(1, 0, -1, 0);
   var yy=Array(0, 1, 0, -1);
   avoimet[x1+y1*w]=true;

   parent[cur_x+cur_y*w]=0;
 
   var movecost=0;
   var done=false;
   var i;
   var iter=30000;
   while(!done)
   {
      iter--;
      for(i=0;i<4;i++)
      {  
         if(cur_x==x2 && cur_y==y2)
         { 
            done=true;
            break;
         }
         var temptemp=cur_x+xx[i]+(cur_y+yy[i])*w;
         var dat=datat(temptemp);
         if(cur_x+xx[i]<size_x && cur_y+yy[i]<size_y 
            && cur_x+xx[i]>=0 && cur_y+yy[i]>=0
            && (dat=='#' || dat=='.')
            && !suljetut[temptemp]
            && fog[temptemp] )
         {
            
             if(avoimet[temptemp])
             {  
                  var costi=(10.0*(Math.abs(cur_x+xx[i]-x2) + Math.abs(cur_y+yy[i]-y2)));
                  if(scoret[temptemp]>costi+movecost+10)
                  {          
                    
                    parent[temptemp]=cur_x+cur_y*w;
                    var H = costi;
                    var G = movecost+10;
                    scoret[temptemp]=(H+G);
                    popNode(cur_x+xx[i],cur_y+yy[i]);
                    pushNode(cur_x+xx[i],cur_y+yy[i],(H+G),G);
                    
                  }
                
             }
             else
             {         
               
               parent[temptemp]=cur_x+cur_y*w;
               var H = (10.0*(Math.abs(cur_x+xx[i]-x2) + Math.abs(cur_y+yy[i]-y2)));
               var G = movecost+10;
               //if(datat(temptemp)=='#') G-=9;
               scoret[temptemp]=(H+G);
               avoimet[temptemp]=true;
               pushNode(cur_x+xx[i], cur_y+yy[i], (H+G), movecost+10);
               
              }
         }
      
      }
      
      fail=false;
      var noodi=Array();
      noodi=getNode(fail);
      if(noodi[2]==0)
      {
         done=true;
         routefound=false;
      }
      
      if(!done && (noodi[0]!=0||noodi[1]!=0))
      {
        routefound=true;
        cur_x=noodi[0];
        cur_y=noodi[1];
        movecost=noodi[3];
        avoimet[cur_x+cur_y*w]=false;
        suljetut[cur_x+cur_y*w]=true;
        popNode(cur_x, cur_y);
        
        suljetut[cur_x+cur_y*w]=true;
   
      }
      
   }
   
 var xy=cur_x+cur_y*w;
 var jee=0;

   while(parent[xy]!=0)
   {
     
     var iy=Math.floor(xy/w);
     
     var ix=xy-iy*w;
     route_x[routelen]=ix;
     route_y[routelen]=iy;
     routelen++;
     if((parent[xy]==x1+y1*w))
     {
         break;      
     }
     
     xy=parent[xy];
  
   }   
   info('routelen: '+routelen);
}

