/**
  alle Funktionen zur Steuerung und Navigation in der Karte
 */ 

/* hauptschleife fuer rollover, navi ueber windrose */ 
function mainloop(){
  clearTimeout(mltimeout);

  if( qbdir ){
    switch( qbdir ){
      case 'nw': movemap( -qbspeed, -qbspeed ); break;
      case 'n': movemap( 0, -qbspeed ); break;
      case 'ne': movemap( qbspeed, -qbspeed ); break;
      case 'w': movemap( -qbspeed, 0 ); break;
      case 'e': movemap( qbspeed, 0 ); break;
      case 'sw': movemap( -qbspeed, qbspeed ); break;
      case 's': movemap( 0, qbspeed ); break;
      case 'se': movemap( qbspeed, qbspeed ); break;
    }
  }

  // trigger image re-loading every once in a while, just in case something 
  // was missed
   if( i%15 == 0 && moving==-1 && !qbdir ){
 	  redraw_tiles = 1; redrawmap();
   }
  
  mltimeout = setTimeout(mainloop,100);
}

/* Karte initialisieren */

function initmap(){
  mapwidth = winwidth;
  mapheight = winheight;

  tiles_x = Math.ceil( mapwidth / tilewidth ) + 1;
  tiles_y = Math.ceil( mapheight / tileheight ) + 1;

  // alle evtl. vorhandenen kartenteile entfernen 
  for( var i = $('mapimages').childNodes.length ; i > 0 ; i -- )
    $('mapimages').removeChild($('mapimages').firstChild);

  // neue kartenteile erzeugen
  var i = 0; 
  maptiles = Array();
  var x = 0; 
  var i = 0; 
  for( var x = 0; x < tiles_x ; x ++ ){
    maptiles[x] = Array();
    for( var y = 0; y < tiles_y ; y ++ ){
       var ndiv = document.createElement("img");
       ndiv.style.width = ""+tilewidth+"px";
       ndiv.style.height = ""+tileheight+"px";
       ndiv.style.position = "absolute";
       ndiv.style.display = "block";
       ndiv.style.left = ""+ (x * tilewidth) + "px";
       ndiv.style.top = ""+ (y * tileheight) + "px";
       ndiv.src = "data/map/"+aktzoom+"/"+(x+mapx)+"-"+(y+mapy)+".gif";
       $('mapimages').appendChild( ndiv );
       maptiles[x][y] = i++;
    }
  }
  updateqbox();
}

function startmove(e){
  if( moving == 1) return;
  closedetails();
  moving = 1;
  e = e || event; 
  mstartx = e.clientX;
  mstarty = e.clientY;
}

function stopmove( e ){
  moving = -1;
}

function mmove(e){
  e = e || event;
  mousex = e.clientX;
  mousey = e.clientY; 

  if( self.moving == 1 ){
    movemap( mstartx-mousex, mstarty-mousey );
    mstartx = mousex;
    mstarty = mousey;
  }
  else if( self.moving == -1 ){
	  var tx = (e.clientX + viewx + mapx*tilewidth)/aktscale;
	  var ty = (e.clientY + viewy + mapy*tileheight)/aktscale;
	  var nr = locate(tx,ty);
	  if( nr != undefined ){
		 if( akthigh && akthigh != $("highlight"+l[nr][1]) ) akthigh.style.display="none";
	    $("highlight"+l[nr][1]).style.left=Math.ceil(x[nr]*aktscale-mapx*tilewidth-viewx-anw/2)+"px";
	    $("highlight"+l[nr][1]).style.top=Math.ceil(y[nr]*aktscale-mapy*tileheight-viewy-anh/2)+"px";
	    $("highlight"+l[nr][1]).style.display="block";
		 akthigh = $("highlight"+l[nr][1]);
	  } else { 
	    if( !detailakt && akthigh ) akthigh.style.display="none";
     }
  }
}

function setzoom( stufe ){
  closedetails();

  if(stufe==aktzoom) return;

  var mittelpunktx = Math.round(mapx  * tilewidth + viewx + mapwidth / 2 ) / aktscale; 
  var mittelpunkty = Math.round(mapy  * tileheight + viewy + mapheight / 2) / aktscale; 

  aktzoom = stufe; aktscale = aktzoom/100.0;

  mittelpunktx = parseInt(Math.round(mittelpunktx*aktscale - mapwidth / 2));
  mittelpunkty = parseInt(Math.round(mittelpunkty*aktscale - mapheight / 2));

  viewx = mittelpunktx % tilewidth;
  viewy = mittelpunkty % tileheight;
  mittelpunktx -= viewx; 
  mittelpunkty -= viewy;
  mapx = mittelpunktx / tilewidth;
  mapy = mittelpunkty / tileheight;

  redraw_tiles = 1; 
  redrawmap();

  $("zoom"+aktzoom).checked="checked";
}

/** Haupt-Kartensteuerung **/ 
function movemap( dx, dy ){
  closedetails();
  r = clip_coords( mapx*tilewidth+viewx+dx, mapy*tileheight+viewy+dy ); 
  setmap( r[0] - mapx*tilewidth, r[1] - mapy*tileheight );
}
function setmap( x, y ){
    var flipped = 0;
    if( y >= 0 && y <= tileheight )
	    viewy = y;
    else if( y < 0 ){
		flip_up(); flipped = 1;
		y += tileheight;
		viewy = y % tileheight;
    } else if ( y >= tileheight ){
		flip_down(); flipped = 1;
		y -= tileheight;
		viewy = y % tileheight;
    }
    if( x >= 0 && x < tilewidth )
	    viewx = x; 
    else if( x < 0 ){
		flip_left(); flipped = 1;
		x += tilewidth;
		viewx = x % tilewidth;
    } else if( x >= tilewidth ){
		flip_right(); flipped = 1;
		x -= tilewidth;
		viewx = x % tilewidth;
    }
   if(!flipped){
		$("mapimages").style.top=(-viewy)+"px";
		$("mapimages").style.left=(-viewx)+"px";
   } else {
    redrawmap();
   }
}

function settile( x, y, mx, my ){
	var nimg = $("mapimages").childNodes.item(maptiles[x][y]).cloneNode(false);
	nimg.src = "data/map/"+aktzoom+"/"+(mx)+"-"+(my)+".gif";
   nimg.style.left=(x*tilewidth)+"px";
	nimg.style.top=(y*tileheight)+"px";
	$("mapimages").replaceChild( nimg, $("mapimages").childNodes.item(maptiles[x][y]));
}

function flip_right(){
  mapx++
  var firstcol = Array();
  for( var y = 0 ; y < tiles_y ; y ++ ){
	  firstcol[y] = maptiles[0][y];
  }
  for( var x = 0 ; x < tiles_x - 1 ; x ++ ){
	  for( var y = 0 ; y < tiles_y ; y ++ ){	  
		  maptiles[x][y] = maptiles[x+1][y];
	  }
  }
  for( var y = 0 ; y < tiles_y ; y ++ ){	  
	  maptiles[tiles_x-1][y] = firstcol[y];
  }  
  for( var y = 0 ; y < tiles_y ; y ++ ){
	settile(tiles_x-1,y,mapx+tiles_x-1,y+mapy);
  }
}
function flip_left(){
  mapx--;
  var lastcol = Array();
  for( var y = 0 ; y < tiles_y ; y ++ ){
	  lastcol[y] = maptiles[tiles_x-1][y];
  }
  for( var x = tiles_x - 1 ; x > 0  ; x -- ){
	  for( var y = 0 ; y < tiles_y ; y ++ ){	  
		  maptiles[x][y] = maptiles[x-1][y];
	  }
  }
  for( var y = 0 ; y < tiles_y ; y ++ ){	  
	  maptiles[0][y] = lastcol[y];
  }  
  for( var y = 0 ; y < tiles_y ; y ++ ){
	settile(0,y,mapx,y+mapy);
  }
}
function flip_up(){
  mapy--;
  var lastrow = Array();
  for( var x = 0 ; x < tiles_x ; x ++ ){
	  lastrow[x] = maptiles[x][tiles_y-1];
  }
  for( var y = tiles_y - 1 ; y > 0  ; y -- ){
	  for( var x = 0 ; x < tiles_x ; x ++ ){	  
		  maptiles[x][y] = maptiles[x][y-1];
	  }
  }
  for( var x = 0 ; x < tiles_x ; x ++ ){	  
	  maptiles[x][0] = lastrow[x];
  }  
  for( var x = 0 ; x < tiles_x ; x ++ ){
	settile(x,0,x+mapx,mapy);
  }
}
function flip_down(){
  mapy++;
  var toprow = Array();
  for( var x = 0 ; x < tiles_x ; x ++ ){
	  toprow[x] = maptiles[x][0];
  }
  for( var y = 0 ; y < tiles_y - 1 ; y ++ ){
	  for( var x = 0 ; x < tiles_x ; x ++ ){	  
		  maptiles[x][y] = maptiles[x][y+1];
	  }
  }
  for( var x = 0 ; x < tiles_x ; x ++ ){	  
	  maptiles[x][tiles_y-1] = toprow[x];
  }  
  for( var x = 0 ; x < tiles_x ; x ++ ){
	settile(x,tiles_y-1,x+mapx,mapy+tiles_y-1);
  }
}

function redrawmap(){
  $("mapimages").style.top=(-viewy)+"px";
  $("mapimages").style.left=(-viewx)+"px";
  for( var x = 0; x < tiles_x ; x ++ )
    for( var y = 0; y < tiles_y ; y ++ ){
       var s = $("mapimages").childNodes.item(maptiles[x][y]).style;
       s.left = parseInt(x*tilewidth) + "px";
       s.top = parseInt(y*tileheight) + "px";
       if( redraw_tiles == 1 ){
			settile(x,y,x+mapx,y+mapy);
       }
  }
  if( redraw_tiles == 1 ) redraw_tiles = 0; 
  updateqbox();
}


function fahrzulager( nr ){

  if( !x[nr] ){
    $("mapimages").style.display="none";
  }
  else{
    $("mapimages").style.display="block";
  }

  detailx = 422;
  detaily = 160;

  $("lagerdetails").style.left = ""+detailx+"px";
  $("lagerdetails").style.top = ""+detaily+"px";

  if( !x[nr] ){
	if( akthigh ) akthigh.style.display="none";
   $("zacke").style.display="none";
   return;
  }

  if( akthigh && akthigh != $("highlight" + l[nr][1] ) ) akthigh.style.display="none";

  $("highlight" + l[nr][1] ).style.left=(385-anw/2)+"px";
  $("highlight" + l[nr][1] ).style.top=(228-anh/2)+"px";
  $("highlight" + l[nr][1] ).childNodes.item(0).src="data/icons-high/"+l[nr][1]+".gif";
  $("highlight" + l[nr][1] ).style.display="block";
  akthigh = $("highlight" + l[nr][1] );
  $("zacke").style.display="block";

  var tx = parseInt(Math.round(x[nr] * aktscale - 385));
  var ty = parseInt(Math.round(y[nr] * aktscale - 228));

  mapx = Math.floor( tx / tilewidth ); mapy = Math.floor( ty / tileheight );
  viewx = tx % tilewidth; viewy = ty % tileheight;

  redraw_tiles = 1; 
  redrawmap();
}

function setqbox( e ){
  e = e || event;

  closedetails();

  var p = findPos($("qboxmap"));

  var qbx = e.clientX - p[0] - 12;
  var qby = e.clientY - p[1] - 12;

  var mx = Math.round((qbx*(hhmaxx-hhminx)/150+hhminx)*aktscale)+winwidth/2;
  var my = Math.round((qby*(hhmaxy-hhminy)/150+hhminy)*aktscale)+winheight/2;

  r = clip_coords( mx, my );
  mx = r[0]; my = r[1]; 

  mapx = parseInt(mx / tilewidth); 
  mapy = parseInt(my / tileheight); 

  viewx = mx % tilewidth;
  viewy = my % tileheight;

  redraw_tiles = 1;
  redrawmap();
}

function updateqbox(){
  var qbx = Math.round( 150 * ((mapx*tilewidth+viewx)/aktscale - hhminx) / (hhmaxx-hhminx) );
  var qby = Math.round( 150 * ((mapy*tileheight+viewy)/aktscale - hhminy) / (hhmaxy-hhminy) );
  $("qbmarker").style.left=""+qbx+"px";
  $("qbmarker").style.top=""+qby+"px";
}

function clip_coords( mx, my ){
	var r = Array();
	r[0] = mx; r[1] = my;
	if( mx < hhminx*aktscale ) r[0] = hhminx*aktscale;
	else if( mx > hhmaxx*aktscale - winwidth ) r[0] = hhmaxx*aktscale - winwidth;
	if( my < hhminy*aktscale ) r[1] = hhminy*aktscale;
	else if( my > hhmaxy*aktscale - winheight ) r[1] = hhmaxx*aktscale - winheight;
	return r; 
}


